linux_驱动_camera_dtsi_深度解析

【Camera专题】Camera dtsi 完全解析

0.15 字数 1,348 阅读 2,050

一、唠嗑

说来惭愧,搬砖也有一段时间了,dtsi里面有些配置还没弄清楚含义,
作为一个咸鱼的搬砖行家,就研究一下吧!

二、知识点

平台:8909

主要参考kernel/Documentation/devicetree/bindings/media/video/msm-cci.txt的注释,加上自我的理解!

1. sensor配置
qcom,camera@0 {
        cell-index = <0>;
        compatible = "qcom,camera";
        reg = <0x2>;
        qcom,csiphy-sd-index = <0>;
        qcom,csid-sd-index = <0>;
        qcom,mount-angle = <90>;
        qcom,eeprom-src = <&eeprom0>;
        qcom,actuator-src = <&actuator0>;
        qcom,led-flash-src = <&led_flash0>;
        cam_vana-supply = <&pm8916_l2>;
        cam_vdig-supply = <&pm8916_s3>;
        cam_vio-supply = <&pm8916_l10>;
        cam_vaf-supply = <&pm8916_l11>;
        qcom,cam-vreg-name = "cam_vana","cam_vdig","cam_vio", "cam_vaf";
        qcom,cam-vreg-type = <0 0 0 0>;
        qcom,cam-vreg-min-voltage = <2800000 1500000 1800000  2800000>;
        qcom,cam-vreg-max-voltage = <2800000 1500000 1800000  2800000>;
        qcom,cam-vreg-op-mode = <200000 100000 80000  100000>;
        pinctrl-names = "cam_default", "cam_suspend";
        pinctrl-0 = <&cam_sensor_mclk0_default &cam_sensor_rear_default>;
        pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>;
        gpios = <&msm_gpio 26 0>,
            <&msm_gpio 29 0>,
            <&msm_gpio 33 0>;
        qcom,gpio-reset = <1>;
        qcom,gpio-standby = <2>;
        qcom,gpio-req-tbl-num = <0 1 2>;
        qcom,gpio-req-tbl-flags = <1 0 0>;
        qcom,gpio-req-tbl-label = "CAMIF_MCLK",
            "CAM_RESET0",
            "CAM_STANDBY";
        qcom,sensor-position = <0>;
        qcom,sensor-mode = <0>;
        qcom,cci-master = <0>;
        status = "ok";
        clocks = <&clock_gcc clk_mclk0_clk_src>,
            <&clock_gcc clk_gcc_camss_mclk0_clk>;
        clock-names = "cam_src_clk", "cam_clk";
    };

1. cell-index = <0>;
唯一标识,用来区分多个摄像头。

源码:
kernel/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c

static int32_t msm_sensor_driver_get_dt_data(struct msm_sensor_ctrl_t *s_ctrl){
···
    /*
     * Read cell index - this cell index will be the camera slot where
     * this camera will be mounted
     */
    rc = of_property_read_u32(of_node, "cell-index", &cell_id);
    if (rc < 0) {
        pr_err("failed: cell-index rc %d", rc);
        goto FREE_SENSOR_DATA;
    }
    s_ctrl->id = cell_id;
···
}

按照这里的英文注释,cell index标识camera安装的位置,这个值只要唯一即可!

2. compatible = "qcom,camera";
匹配节点,驱动和设备的compatible属性相同时,才会调用probe函数。
dtsi里面配置就是设备,下面的源码对应的就是驱动,这两个属性相同。

源码:
kernel/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c

static const struct of_device_id msm_sensor_driver_dt_match[] = {
    {.compatible = "qcom,camera"},
    {}
};

MODULE_DEVICE_TABLE(of, msm_sensor_driver_dt_match);

static struct platform_driver msm_sensor_platform_driver = {
.probe = msm_sensor_driver_platform_probe,
.driver = {
.name = “qcom,camera”,
.owner = THIS_MODULE,
.of_match_table = msm_sensor_driver_dt_match,
},
.remove = msm_sensor_platform_remove,
};

3. reg = <0x2>;
i2c地址,从经验来看,只要配置成唯一即可,不过还是推荐配成i2c地址!

未找到源码调用的位置

4. qcom,csiphy-sd-index = <0>;
用于接收传感器数据的csiphy实例,
可以配置的值:0,1,2

源码:
kernel/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c

5. qcom,csid-sd-index = <0>;
用于接收传感器数据的csid核心实例
可以配置的值:0,1,2

源码:
kernel/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c


6. qcom,mount-angle = <90>;
摄像头在设备上的物理安装角度
可以配置的值:0,90,180,360

一般来说 sensor raw图默认的方向都是90或者270!

7. qcom,eeprom-src = <&eeprom0>;
如果支持otp(eeprom)的话,就配置成各种的eeprom节点,否则不配置。

8. qcom,actuator-src = <&actuator0>;
如果支持马达的话,就配置成各自的马达节点,否则不配置。

9. qcom,led-flash-src = <&led_flash0>;
如果支持闪光灯的话,就配置成各自的闪光灯节点,否则不配置。

10. cam_vana-supply = <&pm8916_l2>;
avdd供电,是否是要配置,配置成哪路系统供电,需要和硬件沟通!
11. cam_vdig-supply = <&pm8916_s3>;
dvdd供电,是否是要配置,配置成哪路系统供电,需要和硬件沟通!
12. cam_vio-supply = <&pm8916_l10>;
iovdd供电,是否是要配置,配置成哪路系统供电,需要和硬件沟通!
13. cam_vaf-supply = <&pm8916_l11>;
马达供电,是否是要配置,配置成哪路系统供电,需要和硬件沟通!
14. qcom,cam-vreg-name等

  • qcom,cam-vreg-name = "cam_vana","cam_vdig","cam_vio", "cam_vaf";
    配置sensor需要的所有电源。
    可配置选项:"cam_vdig", "cam_vana", "cam_vio", "cam_vaf"
    分别代表含义:dvdd,avdd,iovdd,af供电
    不一定要全部配置,用到哪路配哪路,有些电路硬件自己拉高了,具体跟硬件沟通。

  • qcom,cam-vreg-type = <0 0 0 0>;
    指定用于此sensor的电源类型,0表示ldo电源,1表示lvs电源。
    默认配0.
    其他配置参考

171        qcom,cam-vreg-type = <0 1>;
172        qcom,cam-vreg-min-voltage = <1200000 0>;
173        qcom,cam-vreg-max-voltage = <1200000 0>;
  • qcom,cam-vreg-min-voltage = <2800000 1500000 1800000 2800000>;
    供电电源的最大值,单位mV
    第一个dvdd最大值为2800000mA=2.8V,其他同理

  • qcom,cam-vreg-max-voltage = <2800000 1500000 1800000 2800000>;
    供电电源的最小值,单位mV
    第一个dvdd最小值为2800000mA=2.8V,其他同理

  • qcom,cam-vreg-op-mode = <200000100000 80000 100000>;
    供电电源的最佳电压水平。
    比如第一个dvdd最佳电压水平为200000
    常用值:200000 100000 105000 80000 0
    这个节点没有完全理解。

注意:

 qcom,cam-vreg-name = "cam_vana","cam_vdig","cam_vio", "cam_vaf";
qcom,cam-vreg-type = <0 0 0 0>;
qcom,cam-vreg-min-voltage = <2800000 1500000 1800000  2800000>;
qcom,cam-vreg-max-voltage = <2800000 1500000 1800000  2800000>;
qcom,cam-vreg-op-mode = <200000 100000 80000  100000>;

这些值分别是按顺序一一对应的!

15. pinctrl-names pinctrl-0 pinctrl-1

        pinctrl-names = "cam_default", "cam_suspend";
        pinctrl-0 = <&cam_sensor_mclk0_default &cam_sensor_rear_default>;
        pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>;

这个也是按照顺序一一对应的。

  • pinctrl-names = "cam_default", "cam_suspend";
    默认就这么配置,前面代表clk,后面代表reset脚和standby脚,唤醒作用。


kernel/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c

static int msm_camera_pinctrl_init(struct msm_camera_power_ctrl_t *ctrl)
{
    struct msm_pinctrl_info *sensor_pctrl = NULL;
sensor_pctrl <span class="token operator">=</span> <span class="token operator">&amp;</span>ctrl<span class="token operator">-&gt;</span>pinctrl_info<span class="token punctuation">;</span>
sensor_pctrl<span class="token operator">-&gt;</span>pinctrl <span class="token operator">=</span> <span class="token function">devm_pinctrl_get</span><span class="token punctuation">(</span>ctrl<span class="token operator">-&gt;</span>dev<span class="token punctuation">)</span><span class="token punctuation">;</span>

···
sensor_pctrl->gpio_state_active =
pinctrl_lookup_state(sensor_pctrl->pinctrl,
CAM_SENSOR_PINCTRL_STATE_DEFAULT);
···
sensor_pctrl->gpio_state_suspend
= pinctrl_lookup_state(sensor_pctrl->pinctrl,
CAM_SENSOR_PINCTRL_STATE_SLEEP);
···
return 0;
}

  • pinctrl-0 = <&cam_sensor_mclk0_default &cam_sensor_rear_default>;

kernel/arch/arm/boot/dts/qcom/msm8909-pinctrl-i18.dtsi

        /*sensors */
        cam_sensor_mclk0_default: cam_sensor_mclk0_default {
            /* MCLK0 */
            mux {
                /* CLK, DATA */
                pins = "gpio26";
                function = "cam_mclk";
            };
        config <span class="token punctuation">{</span>
            pins <span class="token operator">=</span> <span class="token string">"gpio26"</span><span class="token punctuation">;</span>
            bias<span class="token operator">-</span>disable<span class="token punctuation">;</span> <span class="token comment">/* No PULL */</span>
            drive<span class="token operator">-</span>strength <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token number">2</span><span class="token operator">&gt;</span><span class="token punctuation">;</span> <span class="token comment">/* 2 MA */</span>
        <span class="token punctuation">}</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">;</span>

    cam_sensor_rear_default<span class="token operator">:</span> cam_sensor_rear_default <span class="token punctuation">{</span>
        <span class="token comment">/* RESET, STANDBY */</span>
        mux <span class="token punctuation">{</span>
            pins <span class="token operator">=</span> <span class="token string">"gpio29"</span><span class="token punctuation">,</span> <span class="token string">"gpio33"</span><span class="token punctuation">;</span>
            function <span class="token operator">=</span> <span class="token string">"gpio"</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span><span class="token punctuation">;</span>

        config <span class="token punctuation">{</span>
            pins <span class="token operator">=</span> <span class="token string">"gpio29"</span><span class="token punctuation">,</span><span class="token string">"gpio33"</span><span class="token punctuation">;</span>
            bias<span class="token operator">-</span>disable<span class="token punctuation">;</span> <span class="token comment">/* No PULL */</span>
            drive<span class="token operator">-</span>strength <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token number">2</span><span class="token operator">&gt;</span><span class="token punctuation">;</span> <span class="token comment">/* 2 MA */</span>
        <span class="token punctuation">}</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">;</span>

这里的gpio配置成多少,和硬件沟通

pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>;

        cam_sensor_mclk0_sleep: cam_sensor_mclk0_sleep {
            /* MCLK0 */
            mux {
                /* CLK, DATA */
                pins = "gpio26";
                function = "cam_mclk";
            };
        config <span class="token punctuation">{</span>
            pins <span class="token operator">=</span> <span class="token string">"gpio26"</span><span class="token punctuation">;</span>
            bias<span class="token operator">-</span>pull<span class="token operator">-</span>down<span class="token punctuation">;</span> <span class="token comment">/* PULL DOWN */</span>
            drive<span class="token operator">-</span>strength <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token number">2</span><span class="token operator">&gt;</span><span class="token punctuation">;</span> <span class="token comment">/* 2 MA */</span>
        <span class="token punctuation">}</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">;</span>

    cam_sensor_rear_sleep<span class="token operator">:</span> cam_sensor_rear_sleep <span class="token punctuation">{</span>
        <span class="token comment">/* RESET, STANDBY */</span>
        mux <span class="token punctuation">{</span>
            pins <span class="token operator">=</span> <span class="token string">"gpio29"</span><span class="token punctuation">,</span><span class="token string">"gpio33"</span><span class="token punctuation">;</span>
            function <span class="token operator">=</span> <span class="token string">"gpio"</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span><span class="token punctuation">;</span>

        config <span class="token punctuation">{</span>
            pins <span class="token operator">=</span> <span class="token string">"gpio29"</span><span class="token punctuation">,</span><span class="token string">"gpio33"</span><span class="token punctuation">;</span>
            bias<span class="token operator">-</span>disable<span class="token punctuation">;</span> <span class="token comment">/* No PULL */</span>
            drive<span class="token operator">-</span>strength <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token number">2</span><span class="token operator">&gt;</span><span class="token punctuation">;</span> <span class="token comment">/* 2 MA */</span>
        <span class="token punctuation">}</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">;</span>

这里的gpio配置成多少,和硬件沟通

16. gpio相关

gpios = <&msm_gpio 26 0>,
        <&msm_gpio 29 0>,
        <&msm_gpio 33 0>;
qcom,gpio-reset = <1>;
qcom,gpio-standby = <2>;
qcom,gpio-req-tbl-num = <0 1 2>;
qcom,gpio-req-tbl-flags = <1 0 0>;
qcom,gpio-req-tbl-label = "CAMIF_MCLK","CAM_RESET0","CAM_STANDBY";

这里分别是一一对应的
比如:
26 对应 CAMIF_MCLK
29 对应 CAM_RESET0
33 对应 CAM_STANDBY

  • qcom,gpio-reset = <1>;
    传感器 reset脚的索引,这里是1

  • qcom,gpio-standby = <2>
    传感器 standby脚的索引,这里是2

  • qcom,gpio-req-tbl-num = <0 1 2>;
    mclk,reset,stanby的索引,由于mclk为0,qcom,gpio-reset = <1>,qcom,gpio-standby = <2>
    因此配置成 <0,1,2>

  • qcom,gpio-req-tbl-flags = <1 0 0>;
    gpio的方向,mclk为1,表示输出,reset和standby为0,表示输入。

  • qcom,gpio-req-tbl-label
    gpio的名称。
    常用值:
    "CAMIF_MCLK", "CAM_RESET","CAM_STANDBY";
    "CAMIF_MCLK0", "CAM_RESET0","CAM_STANDBY0";
    "CAMIF_MCLK1", "CAM_RESET1","CAM_STANDBY1";
    "CAMIF_MCLK2", "CAM_RESET2","CAM_STANDBY2";

17. qcom,sensor-position = <0>;
camera位置。

  • 0-后摄
  • 1-前摄
  • 0x100-副摄(目前只有后摄有副摄,前摄暂时没有)

18. qcom,sensor-mode = <0>;
传感器模式支持

  • 0 -> back camera 2D
  • 1 -> front camera 2D
  • 2 -> back camera 3D
  • 3 -> back camera int 3D

19. qcom,cci-master = <0>;
sensor使用的master id。
可选值:

  • 0 -> MASTER 0
  • 1 -> MASTER 1

20. clocks相关

clocks = <&clock_gcc clk_mclk0_clk_src>,
         <&clock_gcc clk_gcc_camss_mclk0_clk>;
clock-names = "cam_src_clk", "cam_clk";
  • clocks
    设备使用的时钟
30  clock_gcc: qcom,gcc@1800000 {
31      compatible = "qcom,dummycc";
32      #clock-cells = <1>;
33  };

#define clk_mclk0_clk_src 0x266b3853
#define clk_mclk1_clk_src 0xa73cad0c
#define clk_mclk2_clk_src 0x42545468
#define clk_mclk3_clk_src 0x2bfbb714

  • clock-names
    设备所需时钟的名称
99static struct msm_cam_clk_info cam_8974_clk_info[] = {
100 [SENSOR_CAM_MCLK] = {"cam_src_clk", 24000000},
101 [SENSOR_CAM_CLK] = {"cam_clk", 0},
102};

Stay Hungry,Stay Foolish !

"Read the fucking souce code!"
赞赏支持 还没有人赞赏,支持一下

你看那个人,好像一条狗">Camera驱动

你看那个人,好像一条狗

总资产7 (约0.64元) 共写了6.6W字 获得159个赞 共205个粉丝
关注

被以下专题收入,发现更多相似内容

推荐阅读更多精彩内容

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值