【Camera专题】手把手撸一份驱动 到 点亮Camera

1、手把手撸一份驱动 到 点亮 Camera
2、Camera dtsi 完全解析
3、Camera驱动源码全解析上
4、Camera驱动源码全解析下

一、说在前头的话

  • 1.上个月通过博客认识了Eric,以前在oppo工作的,正好他是我现在同事兼老乡-老吴的好朋友,
    于是就一起聚餐了,看着他们照顾小孩,听他们讲中年危机,未来我也会跟他们相似。
    最大感触就是 选择很重要,Eric 2012~2013年在OPPO就职,后面选择离开。
    如果当年一直在的话,现在指不定就财富自由了,只道人生如戏,这就是命

  • 2.最近家里发生了事情,正好赶上公司旅游,旅游的时间要周六补班补回来,但是有件小事让我耿耿于怀。
    人生苦短,及时行乐。

  • 3.最近事情多,家里的,工作上的,让我焦虑、急躁,我也不知道我能干几年,呆几年。
    改一改年轻人的毛病,不急不躁,走一步算一步。很久没写博客了,继续坚持积累与分享!

二、知识点

1.如何自己写一份Camera驱动

以前刚入行时,总希望自己手写一份驱动,毕竟自己驱动工程师嘛,
搬砖一段时间了,现在正好搞新平台,高通官网也下不到驱动代码,我们的模组厂也没有代码,所以只能自己写一份了。
主要分享思路吧。

1.1 对比新老平台

  • 旧平台
    vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/sensor_libs/s5k4h7/
    Android.mk
    s5k4h7_lib.c

  • 高端平台
    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
    由于高端平台没有s5k4h7,我们随便找一份平台本身存在的且类似的,如s5k2l7。

变化:
对比发现,

1.架构变了:

旧平台所有的东西都写在c文件中。
高端平台拆分了c文件和h头文件,并且多了一个pdaf。

2.函数实现:
旧平台

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)

高端平台

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)

所以,其实就是框架变了,该实现的函数还是不变,我们把s5k2l7全部改成s5k4h7
,把旧平台的实现直接搬过来即可,需要注意的一点就是函数参数,
例如: attribute((unused)) int is_hdr_enabled,这些按照新平台写即可,否则编译会报错。

3.参数配置
旧平台:

s5k4h7.c

高端平台:

s5k2l7_lib.h

这上面只是部分截图,作为例子,参数配置还报错res、sensor_slave_info、out_info等等。
这时候,用Beyondcompare软件作对比,然后按照新版框架,把8909的配置移到sdm429即可。
当然,会遇到一些新的配置,是之前没有的,例如:
新配置

如果暂时不知道是什么,就先保留原先的即可。

需要注意的地方
老平台

      /* 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,
      },

高端平台

      /* 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, 
      },

对比发现:新平台没了vt_pixel_clk ,取而代之的是data_rate,并且多了is_pdaf_supported ,
is_pdaf_supported 表面是否支持pdaf,跟af相关的,前期点亮时可以先设置成0。
注意1:data_rate这个一定要配置,不然会造成摄像头无法点亮,预览黑屏。

注意2:如果预览偏红或者其他颜色, 修改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
  },

到此 驱动就算写完了。

2.高端平台摄像头的点亮

想一想旧平台点亮一颗摄像头需要改动到哪些地方。
1.配置device-vendor.mk-编译需要的so库和效果文件
2.在sensor_init.c添加支持的sensor
#define BOARD_SENSORS
"s5k4h7",
"ov5675",
3.添加相应的驱动文件和效果文件。
4.kernel下配置dtsi文件

我们就按照这个思路,去尝试修改高端平台。
2.1 device-vendor.mk修改
vendor/qcom/proprietary/common/config/device-vendor.mk

MM_CAMERA += libmmcamera_s5k4h7

为了快速点亮,我没有自己加效果文件,而是直接引用存在的效果文件。
后续添加效果文件还要加入改动:


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>

需要注意的点:
1.CameraConfigurationRoot里面最大只能配置22个CameraModuleConfig,超过后直接报错。
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> 设置1即可
*<Position>FRONT</Position> 前摄设置FRONT
*<MountAngle>270</MountAngle> 旋转角度 配错好像也没关系
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就是镜头信息,配错了也不影响点亮,可以找模组厂拿,也可以从以前的驱动文件中移植过来。


8909驱动

2.3 添加相应的驱动文件和效果文件
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

为了快速点亮,如果按照的是懒人方法,
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等等,需要跟硬件沟通,按照自身的硬件去配置。

我用的懒人办法点亮的摄像头,没添加效果文件,以下是改动截图:


ok,到此新平台就基本搞定!

Stay Hungry,Stay Foolish!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342