【Camera專題】手把手?jǐn)]一份驅(qū)動(dòng) 到 點(diǎn)亮Camera

1、手把手?jǐn)]一份驅(qū)動(dòng) 到 點(diǎn)亮 Camera
2竖伯、Camera dtsi 完全解析
3炮车、Camera驅(qū)動(dòng)源碼全解析上
4摧冀、Camera驅(qū)動(dòng)源碼全解析下

一娱仔、說在前頭的話

  • 1.上個(gè)月通過博客認(rèn)識(shí)了Eric壁榕,以前在oppo工作的间涵,正好他是我現(xiàn)在同事兼老鄉(xiāng)-老吳的好朋友法竞,
    于是就一起聚餐了赋焕,看著他們照顧小孩参歹,聽他們講中年危機(jī),未來我也會(huì)跟他們相似隆判。
    最大感觸就是 選擇很重要犬庇,Eric 2012~2013年在OPPO就職僧界,后面選擇離開。
    如果當(dāng)年一直在的話臭挽,現(xiàn)在指不定就財(cái)富自由了捎泻,只道人生如戲,這就是命埋哟!

  • 2.最近家里發(fā)生了事情笆豁,正好趕上公司旅游,旅游的時(shí)間要周六補(bǔ)班補(bǔ)回來赤赊,但是有件小事讓我耿耿于懷闯狱。
    人生苦短,及時(shí)行樂抛计。

  • 3.最近事情多哄孤,家里的,工作上的吹截,讓我焦慮瘦陈、急躁,我也不知道我能干幾年波俄,呆幾年晨逝。
    改一改年輕人的毛病,不急不躁懦铺,走一步算一步捉貌。很久沒寫博客了,繼續(xù)堅(jiān)持積累與分享冬念!

二趁窃、知識(shí)點(diǎn)

1.如何自己寫一份Camera驅(qū)動(dòng)

以前剛?cè)胄袝r(shí),總希望自己手寫一份驅(qū)動(dòng)急前,畢竟自己驅(qū)動(dòng)工程師嘛醒陆,
搬磚一段時(shí)間了,現(xiàn)在正好搞新平臺(tái)裆针,高通官網(wǎng)也下不到驅(qū)動(dòng)代碼刨摩,我們的模組廠也沒有代碼,所以只能自己寫一份了据块。
主要分享思路吧码邻。

1.1 對(duì)比新老平臺(tái)

  • 舊平臺(tái)
    vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/sensor_libs/s5k4h7/
    Android.mk
    s5k4h7_lib.c

  • 高端平臺(tái)
    vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/sensor/libs/s5k2l7/
    Android.mk
    s5k2l7_lib.c
    s5k2l7_lib.h
    s5k2l7_pdaf.h
    由于高端平臺(tái)沒有s5k4h7,我們隨便找一份平臺(tái)本身存在的且類似的,如s5k2l7另假。

變化:
對(duì)比發(fā)現(xiàn)像屋,

1.架構(gòu)變了:

舊平臺(tái)所有的東西都寫在c文件中。
高端平臺(tái)拆分了c文件和h頭文件边篮,并且多了一個(gè)pdaf己莺。

2.函數(shù)實(shí)現(xiàn):
舊平臺(tái)

1.static uint32_t s5k4h7_real_to_register_gain(float real_gain)

2.static float s5k4h7_register_to_real_gain(uint32_t reg_gain)

3.static uint32_t s5k4h7_digital_gain_calc(float real_gain, float sensor_real_gain)

4.int32_t s5k4h7_calculate_exposure(float real_gain, uint32_t line_count,
                                           sensor_exposure_info_t *exp_info)

5.static int32_t s5k4h7_fill_exposure_array(uint16_t gain, uint32_t line,
                                               uint32_t fl_lines,
                                               int32_t luma_avg,
                                               uint32_t fgain, 
                                               struct msm_camera_i2c_reg_setting* reg_setting)

6.void *s5k4h7_open_lib(void)

高端平臺(tái)

1.static unsigned int s5k2l7_real_to_register_gain(float real_gain)

2.static float s5k2l7_register_to_real_gain(unsigned int reg_gain)

3.static unsigned int s5k2l7_digital_gain_calc(float real_gain, float sensor_real_gain)

4.int32_t sensor_calculate_exposure(float real_gain,
  uint32_t line_count, sensor_exposure_info_t *exp_info,
  __attribute__((unused)) float s_real_gain)

5.int32_t sensor_fill_exposure_array(uint32_t gain,
    uint32_t digital_gain, uint32_t line,
    uint32_t fl_lines, __attribute__((unused)) int32_t luma_avg,
    __attribute__((unused)) uint32_t hdr_param,
    struct camera_i2c_reg_setting* reg_setting,
    __attribute__((unused)) unsigned int s_gain,
    __attribute__((unused)) int s_linecount,
    __attribute__((unused)) int is_hdr_enabled)

6.void *sensor_open_lib(void)

所以奏甫,其實(shí)就是框架變了,該實(shí)現(xiàn)的函數(shù)還是不變凌受,我們把s5k2l7全部改成s5k4h7
,把舊平臺(tái)的實(shí)現(xiàn)直接搬過來即可阵子,需要注意的一點(diǎn)就是函數(shù)參數(shù),
例如: attribute((unused)) int is_hdr_enabled胜蛉,這些按照新平臺(tái)寫即可挠进,否則編譯會(huì)報(bào)錯(cuò)。

3.參數(shù)配置
舊平臺(tái):

s5k4h7.c

高端平臺(tái):

s5k2l7_lib.h

這上面只是部分截圖誊册,作為例子领突,參數(shù)配置還報(bào)錯(cuò)res、sensor_slave_info案怯、out_info等等君旦。
這時(shí)候,用Beyondcompare軟件作對(duì)比嘲碱,然后按照新版框架金砍,把8909的配置移到sdm429即可。
當(dāng)然麦锯,會(huì)遇到一些新的配置恕稠,是之前沒有的,例如:
新配置

如果暫時(shí)不知道是什么,就先保留原先的即可离咐。

需要注意的地方
老平臺(tái)

      /* Res 0 */
      {    
        .x_output = 3264,
        .y_output = 2448,
        .line_length_pclk = 3688,
        .frame_length_lines = 2530,
        .vt_pixel_clk = 280000000,
        .op_pixel_clk = 280000000,
        .binning_factor = 1, 
        .min_fps = 7.50,
        .max_fps = 30.0,
        .mode = SENSOR_DEFAULT_MODE,
      },

高端平臺(tái)

      /* Res 0 */
      {    
        .x_output = 4640,
        .y_output = 3488,
        .line_length_pclk = 5088,
        .frame_length_lines = 3668,
        .op_pixel_clk = 585600000,
        .binning_factor = 1, 
        .binning_method = 0, 
        .min_fps = 7.5, 
        .max_fps = 30.0,
        .mode = SENSOR_DEFAULT_MODE,
        .offset_x = 0, 
        .offset_y = 0, 
        .scale_factor = 1.000,
        .is_pdaf_supported = 0, 
        .data_rate = 1500000000ULL * 4, 
      },

對(duì)比發(fā)現(xiàn):新平臺(tái)沒了vt_pixel_clk 谱俭,取而代之的是data_rate,并且多了is_pdaf_supported 宵蛀,
is_pdaf_supported 表面是否支持pdaf,跟af相關(guān)的县貌,前期點(diǎn)亮?xí)r可以先設(shè)置成0术陶。
注意1:data_rate這個(gè)一定要配置,不然會(huì)造成攝像頭無法點(diǎn)亮煤痕,預(yù)覽黑屏梧宫。

注意2:如果預(yù)覽偏紅或者其他顏色, 修改filter_arrangement的值
支持的值
.filter_arrangement = SENSOR_RGGB,
.filter_arrangement = SENSOR_GRBG,
.filter_arrangement = SENSOR_GBRG,
.filter_arrangement = SENSOR_BGGR,
.filter_arrangement = SENSOR_RGGB,

 .sensor_output =
{
.output_format = SENSOR_BAYER,
.connection_mode = SENSOR_MIPI_CSI,
.raw_output = SENSOR_10_BIT_DIRECT,
.filter_arrangement = SENSOR_GRBG,  
 #ifndef FLIP_MIRROR
 .filter_arrangement = SENSOR_GRBG,
 #else
 .filter_arrangement = SENSOR_BGGR,
#endif
  },

到此 驅(qū)動(dòng)就算寫完了摆碉。

2.高端平臺(tái)攝像頭的點(diǎn)亮

想一想舊平臺(tái)點(diǎn)亮一顆攝像頭需要改動(dòng)到哪些地方塘匣。
1.配置device-vendor.mk-編譯需要的so庫(kù)和效果文件
2.在sensor_init.c添加支持的sensor
#define BOARD_SENSORS
"s5k4h7",
"ov5675",
3.添加相應(yīng)的驅(qū)動(dòng)文件和效果文件。
4.kernel下配置dtsi文件

我們就按照這個(gè)思路巷帝,去嘗試修改高端平臺(tái)忌卤。
2.1 device-vendor.mk修改
vendor/qcom/proprietary/common/config/device-vendor.mk

MM_CAMERA += libmmcamera_s5k4h7

為了快速點(diǎn)亮,我沒有自己加效果文件楞泼,而是直接引用存在的效果文件驰徊。
后續(xù)添加效果文件還要加入改動(dòng):


2.2 在xml添加支持的sensor
vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/configs/msm8937_camera.xml

<CameraConfigurationRoot>
···省略
  <CameraModuleConfig>
    <CameraId>1</CameraId>
    <SensorName>s5k4h7</SensorName>
    <!-- <ActuatorName>dw9714_s5k4h7</ActuatorName> -->
    <!--<EepromName>s5k4h7_otp</EepromName>   -->
    <ChromatixName>gc8034_chromatix</ChromatixName>
    <ModesSupported>1</ModesSupported>
    <Position>FRONT</Position>
    <MountAngle>270</MountAngle>
    <CSIInfo>
      <CSIDCore>1</CSIDCore>
      <LaneMask>0x1f</LaneMask>
      <LaneAssign>0x4320</LaneAssign>
      <ComboMode>0</ComboMode>
    </CSIInfo>
    <LensInfo>
      <FocalLength>3.83</FocalLength>
      <FNumber>2.0</FNumber>
      <TotalFocusDistance>1.97</TotalFocusDistance>
      <HorizontalViewAngle>63.2</HorizontalViewAngle>
      <VerticalViewAngle>49.0</VerticalViewAngle>
      <MinFocusDistance>0.1</MinFocusDistance>
    </LensInfo>
  </CameraModuleConfig>
<CameraConfigurationRoot>

需要注意的點(diǎn):
1.CameraConfigurationRoot里面最大只能配置22個(gè)CameraModuleConfig笤闯,超過后直接報(bào)錯(cuò)。
2.配置解析:


*<CameraId>1</CameraId> 表示前攝
*<SensorName>s5k4h7</SensorName> 表示支持的sensor
*<ActuatorName>dw9714_s5k4h7</ActuatorName> 先注釋
*<EepromName>s5k4h7_otp</EepromName>    先注釋
*<ChromatixName>gc8034_chromatix</ChromatixName> 
效果文件棍厂,偷懶颗味,先用存在的,后面還是得自己添加一份s5k4h7_chromatix
*<ModesSupported>1</ModesSupported> 設(shè)置1即可
*<Position>FRONT</Position> 前攝設(shè)置FRONT
*<MountAngle>270</MountAngle> 旋轉(zhuǎn)角度 配錯(cuò)好像也沒關(guān)系
4lane配置
<CSIInfo>
  <CSIDCore>1</CSIDCore>
  <LaneMask>0x1f</LaneMask>
  <LaneAssign>0x4320</LaneAssign>
  <ComboMode>0</ComboMode>
</CSIInfo>

2lane配置
<CSIInfo>
  <CSIDCore>1</CSIDCore>
  <LaneMask>0x13</LaneMask>
  <LaneAssign>0x4320</LaneAssign>
  <ComboMode>0</ComboMode>
</CSIInfo>
<LensInfo>
  <FocalLength>3.83</FocalLength>
  <FNumber>2.0</FNumber>
  <TotalFocusDistance>1.97</TotalFocusDistance>
  <HorizontalViewAngle>63.2</HorizontalViewAngle>
  <VerticalViewAngle>49.0</VerticalViewAngle>
  <MinFocusDistance>0.1</MinFocusDistance>
</LensInfo>

LensInfo就是鏡頭信息牺弹,配錯(cuò)了也不影響點(diǎn)亮浦马,可以找模組廠拿,也可以從以前的驅(qū)動(dòng)文件中移植過來张漂。


8909驅(qū)動(dòng)

2.3 添加相應(yīng)的驅(qū)動(dòng)文件和效果文件
vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/sensor/libs/

s5k4h7文件夾
1. Android.mk
2. s5k4h7_lib.c
3. s5k4h7_lib.h
4. s5k4h7_pdaf.h

為了快速點(diǎn)亮晶默,如果按照的是懶人方法,
xml效果文件配置的是已存在的gc8034_chromatix,那就按不用添加效果文件了鹃锈。
如果配置了s5k4h7_chromatix,那就得添加如下文件:


部分截圖

2.4 kernel下dtsi的修改
kernel/msm-4.9/arch/arm64/boot/dts/qcom/sdm429w-camera-sensor-spyro.dtsi

    qcom,camera@1 {
        cell-index = <1>;
        compatible = "qcom,camera";
        reg = <0x1>;
        qcom,csiphy-sd-index = <1>;
        qcom,csid-sd-index = <1>;
        qcom,mount-angle = <270>;
        cam_vdig-supply = <&pm660_l3>;
        cam_vio-supply = <&pm660_l14>;
        cam_vaf-supply = <&pm660_l19>;
        qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana",
                            "cam_vaf";
        qcom,cam-vreg-min-voltage = <1200000 1800000 2800000 2850000>;
        qcom,cam-vreg-max-voltage = <1200000 1800000 2800000 3200000>;
        qcom,cam-vreg-op-mode = <200000 0 80000 100000>;
        pinctrl-names = "cam_default", "cam_suspend";
        pinctrl-0 = <&cam_sensor_mclk1_default
                &cam_sensor_front_default>;
        pinctrl-1 = <&cam_sensor_mclk1_sleep
                &cam_sensor_front_sleep>;
        gpios = <&tlmm 27 0>,
            <&tlmm 33 0>,
            <&tlmm 66 0>,
            <&tlmm 38 0>;
        qcom,gpio-vana= <1>;
        qcom,gpio-vdig= <2>;
        qcom,gpio-reset = <3>;
        qcom,gpio-req-tbl-num = <0 1 2 3>;
        qcom,gpio-req-tbl-flags = <1 0 0 0>;
        qcom,gpio-req-tbl-label = "CAMIF_MCLK1",
            "CAM_AVDD1",
            "CAM_DVDD1",
            "CAM_RESET1";
        qcom,sensor-position = <0x1>;
        qcom,sensor-mode = <0>;
        qcom,cci-master = <1>;
        clocks = <&clock_gcc clk_mclk1_clk_src>,
                <&clock_gcc clk_gcc_camss_mclk1_clk>;
        clock-names = "cam_src_clk", "cam_clk";
        qcom,clock-rates = <24000000 0>;
    };

用到哪些供電腳荤胁,clk,gpio等等屎债,需要跟硬件溝通仅政,按照自身的硬件去配置。

我用的懶人辦法點(diǎn)亮的攝像頭盆驹,沒添加效果文件圆丹,以下是改動(dòng)截圖:


ok,到此新平臺(tái)就基本搞定躯喇!

Stay Hungry辫封,Stay Foolish!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末廉丽,一起剝皮案震驚了整個(gè)濱河市倦微,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌正压,老刑警劉巖欣福,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異焦履,居然都是意外死亡拓劝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門嘉裤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來郑临,“玉大人,你說我怎么就攤上這事屑宠∠岫矗” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)犀变。 經(jīng)常有香客問我妹孙,道長(zhǎng),這世上最難降的妖魔是什么获枝? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任蠢正,我火速辦了婚禮,結(jié)果婚禮上省店,老公的妹妹穿的比我還像新娘嚣崭。我一直安慰自己,他們只是感情好懦傍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布雹舀。 她就那樣靜靜地躺著,像睡著了一般粗俱。 火紅的嫁衣襯著肌膚如雪说榆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天寸认,我揣著相機(jī)與錄音签财,去河邊找鬼。 笑死偏塞,一個(gè)胖子當(dāng)著我的面吹牛唱蒸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灸叼,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼神汹,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了古今?” 一聲冷哼從身側(cè)響起屁魏,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捉腥,沒想到半個(gè)月后蚁堤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡但狭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了撬即。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片立磁。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖剥槐,靈堂內(nèi)的尸體忽然破棺而出唱歧,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布颅崩,位于F島的核電站几于,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏沿后。R本人自食惡果不足惜沿彭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尖滚。 院中可真熱鬧喉刘,春花似錦、人聲如沸漆弄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)撼唾。三九已至廉邑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間倒谷,已是汗流浹背蛛蒙。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恨锚,地道東北人宇驾。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像猴伶,于是被迫代替她去往敵國(guó)和親课舍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355