从0到1完成sensor移植

0. 基础知识

  • imx415_probe()是sensor驱动的入口函数、
  • rkisp dts通路有两种、建议使用第一种通路移植sensor
    • sensor --> mipi_phy -->mipi_csi --> rkcif --> rkisp
    • sensor --> mipi_phy -->rkisp
  • 默认已经了解isp、sensor 等基本概念、掌握基本的v4l2-ctl、看图工具、示波器使用方式

1. 找参考设备树和驱动,替换名字

  • 找一份尽可能全的官方参考sensor(驱动、dts、datasheet)
  • 结合自己的具体需求、问sensor厂商/模组厂要目标sensor(驱动、dts、datasheet、初始化列表)
  • 结合原理图、参考官方sensor、移植dts、替换驱动中sensor名字、移植驱动硬件相关函数

2. 替换初始化列表参数

  • 移植初始化列表进驱动、查看初始化列表表头信息、前面几个reg定义、最后几个reg定义,如附件所示
        /*
        IMX415-AAQR All-pixel scan CSI-2_4lane 37.125Mhz AD:10bit Output:10bit 891Mbps Master Mode 30fps Integration Time 33.217ms 
        Tool ver : Ver6.0
        */
        sensor.register(0x3008,  0,  8) =        0x7F  // BCWAIT_TIME[9:0]
        sensor.register(0x300A,  0,  8) =        0x5B  // CPWAIT_TIME[9:0]
        sensor.register(0x3028,  0,  8) =        0x4C  // HMAX[15:0]
        sensor.register(0x3029,  0,  8) =        0x04  // 
        sensor.register(0x3031,  0,  8) =        0x00  // ADBIT[1:0]
        sensor.register(0x3032,  0,  8) =        0x00  // MDBIT
        //...
        sensor.register(0x3024,  0,  8) =        0xCA  // 
        sensor.register(0x3025,  0,  8) =        0x08  // 
        //...
        sensor.register(0x4024,  0,  8) =        0x3F  // THSTRAIL[15:0]
        sensor.register(0x4026,  0,  8) =        0x5F  // THSEXIT[15:0]
        sensor.register(0x4028,  0,  8) =        0x2F  // TLPX[15:0]
        sensor.register(0x4074,  0,  8) =        0x01  // INCKSEL7 [2:0]
  • 查看supported_mode中的成员

    • 根据初始化列表依次填充成员信息
    • supported_modes中hts、vts的值需要对应sensor厂商提供的初始化列表(列表中有表示hts、vts的寄存器)修改、
    • mipi sensor需要检查mipi是几lane、mipi_clk
    • lvds sensor需要配置好sav、eav才能接收到参数
  • 适配新的分辨率需要替换新的初始化列表、或者确定分辨率的基础上调整帧率参考以下内容

    1. 需要适配线性60fps吗?supported_modes中hts、vts的值需要对应sensor厂商提供的初始化列表(列表中有表示hts、vts的寄存器)修改
    2. vts需要大于等于expo
    3. 试试修改hts、vts FPS = PCLK / (VTS * HTS )// 计算FPS

3. 配置电压时钟、通i2c

3.1 说明

  • 重点看下以下类似代码
      dts中与供电、mclk、reset pwdn、standby等pin、i2c相关部分
      imx415_probe()    //获取dts信息部分
      __imx415_power_on()     //控制上电时序部分
      __imx415_power_off()     //控制下电时序部分
      imx415_check_sensor_id()   //sensor_id、i2c从地址、i2c读函数
    
  • 先确认三路供电、mclk是否正常、reset pwdn standby这三个pin上电时序是正确
    • 检查sensor的三路DOVDD18、AVDD28、DVDD12供电是否正常
    • 检查soc给sensor的mclk
      sensor需要的mclk一般取决于sensor初始化列表、也可以咨询sensor厂商
      IMX415-AAQR All-pixel scan CSI-2_4lane 37.125Mhz AD:10bit Output:10bit 1782Mbps
      Master Mode 390fps Integration Time 11.276ms
      
  • 客户一般会在imx415_check_sensor_id()中出现问题、按照以下方式排查
    • 先将__imx415_power_off()注释掉
    • 检查i2c从地址、i2c读函数
      • 比较老的芯片使用的是8bit地址、现在一般为16bit地址
    • i2c使用那个从地址,需要结合sensor Datasheet和原理图看
    • 可以抓下i2c的波形

3.2 以imx415为例

  • imx415_datasheet关于i2c从地址描述如图
    imx415从地址描述

  • imx415_dts信息如下

        imx415: imx415@1a {
            compatible = "sony,imx415";
            reg = <0x1a>;
            clocks = <&cru CLK_MIPICSI_OUT>;
            clock-names = "xvclk";
            power-domains = <&power RV1126_PD_VI>;
            avdd-supply = <&vcc2v8_avdd>;
            dovdd-supply = <&vcc1v8_dovdd>;
            dvdd-supply = <&vcc1v2_dvdd>;
            pwd-gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_HIGH>;
            reset-gpios = <&gpio1 RK_PD5 GPIO_ACTIVE_LOW>;
            rockchip,camera-module-index = <1>;
            rockchip,camera-module-facing = "front";
            rockchip,camera-module-name = "YT10092";
            rockchip,camera-module-lens-name = "IR0147-36IRC-8M-F20";
            ir-cut = <&cam_ircut0>;
            port {
                ucam_out0: endpoint {
                    remote-endpoint = <&mipi_in_ucam0>;
                    data-lanes = <1 2 3 4>;
                };
            };
        };
    
  • 反向验证dts中需要添加i2c移位后的从地址

    - entity 31: m01_f_imx415 1-001a (1 pad, 1 link)
                type V4L2 subdev subtype Sensor flags 0
                device node name /dev/v4l-subdev3
            pad0: Source
                    [fmt:SGBRG10_1X10/3864x2192@10000/300000 field:none
                    crop.bounds:(12,16)/3840x2160]
                    -> "rockchip-mipi-dphy-rx":0 [ENABLED]
    
    
      [root@RV1126_RV1109:/]# i2cdetect -l
      i2c-1   i2c             rk3x-i2c                                I2C adapter
      i2c-6   i2c             DP-AUX                                  I2C adapter
      i2c-4   i2c             rk3x-i2c                                I2C adapter
      i2c-0   i2c             rk3x-i2c                                I2C adapter
      i2c-7   i2c             DesignWare HDMI                         I2C adapter
      i2c-5   i2c             rk3x-i2c                                I2C adapter
      [root@RV1126_RV1109:/]# i2cdetect -y -r 1
          0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
      00:                         -- -- -- -- -- -- -- --
      10: -- -- -- -- -- -- -- -- -- -- UU -- -- -- -- --
      20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      70: -- -- -- -- -- -- -- --
      [root@RV1126_RV1109:/]# 
      [root@RV1126_RV1109:/]# 
      [root@RV1126_RV1109:/]#  cat /sys/class/i2c-adapter/i2c-1/1-001a/name
      imx415
    
  • 其他说明

    • 按照以上方式确认后还是不能调通i2c、需要使用示波器逐项确认各个pin硬件状态、如果硬件没有问题再检查软件配置
    • 偶发性sensor_i2c不能detect id 考虑上电\probe延时不够
    • 如果还是不行建议sensor上电时序、上电熟悉抓下i2c的波形、以imx415为例
      imx415从地址描述

3.3 以ov5695为例

  • i2c使用那个从地址,需要结合sensor Datasheet和原理图看,不同厂商的不同sensor、同一厂商的sensor、同一块sensor因为物理接线不同 i2c从地址都可能有差异,以rk356x_evb_ov5695为例
  • ov5695_datasheet关于i2c从地址描述如图
  • dts中需要添加i2c移位后的从地址
    具体规则如下:dts_addr = datasheet_addr向右移一位 + 最高位补0
    如ov5695: 0x36 = 0x6c>>1 + 最高位补0
         ov5695: ov5695@36 {
             status = "okay";
             compatible = "ovti,ov5695";
             reg = <0x36>;
             clocks = <&cru CLK_CIF_OUT>;   /*viewed*/
             clock-names = "xvclk";         /*viewed*/
             power-domains = <&power RK3568_PD_VI>;
             pinctrl-names = "default";     /*viewed*/
             pinctrl-0 = <&cif_clk>;        /*viewed*/
             reset-gpios = <&gpio3 RK_PA6 GPIO_ACTIVE_HIGH>;
             pwdn-gpios = <&gpio4 RK_PB2 GPIO_ACTIVE_HIGH>;
             power-gpios = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>;
             rockchip,camera-module-index = <0>;
             rockchip,camera-module-facing = "back";
             rockchip,camera-module-name = "TongJu";
             rockchip,camera-module-lens-name = "CHT842-MD";
             port {
                 ov5695_out: endpoint {
                     remote-endpoint = <&mipi_in_ucam1>;
                     data-lanes = <1 2>;
                 };
             };
         };
    
    • 反向验证dts中需要添加i2c移位后的从地址
        - entity 70: m00_b_ov5695 4-0036-1 (1 pad, 1 link)
                    type V4L2 subdev subtype Sensor flags 0
                    device node name /dev/v4l-subdev3
                pad0: Source
                        [fmt:SBGGR10_1X10/2592x1944@10000/300000 field:none]
                        -> "rockchip-csi2-dphy0":0 [ENABLED]
      
        root@RK356X:/# i2cdetect -l
        i2c-1   i2c             rk3x-i2c                                I2C adapter
        i2c-6   i2c             DP-AUX                                  I2C adapter
        i2c-4   i2c             rk3x-i2c                                I2C adapter
        i2c-0   i2c             rk3x-i2c                                I2C adapter
        i2c-7   i2c             DesignWare HDMI                         I2C adapter
        i2c-5   i2c             rk3x-i2c                                I2C adapter
        root@RK356X:/#
        root@RK356X:/#
        root@RK356X:/#
        root@RK356X:/# i2cdetect -y -r 4
            0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
        00:                         -- -- -- -- 0c -- -- --
        10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
        20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
        30: -- -- -- -- -- -- UU -- -- -- -- -- -- -- -- --
        40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
        50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
        60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
        70: -- -- -- -- -- -- -- --
        root@RK356X:/#
        root@RK356X:/#
        root@RK356X:/# cat /sys/class/i2c-adapter/i2c-4/4-0036
        4-0036/   4-0036-1/
        root@RK356X:/# cat /sys/class/i2c-adapter/i2c-4/4-0036-1/name
        ov5695
        root@RK356X:/#
      
  • 其他问题可以联系soc原厂解决

4. 让sensor出图

  • 需要先确保初始化列表中的所有reg都写入成功、

  • 在驱动start_stream函数中操作开关数据流reg处添加打印、确认有真正的操作standby reg、所有的sensor都是类似的
    关于imx415 standby reg 描述如下:
    003_imx415_standby_reg

    关于sc500ai standby reg 描述如下:
    004_sc500ai_standby_reg

  • 执行如下类似命令让sensor输出数据流

          v4l2-ctl -d /dev/video1  --set-fmt-video=width=640,height=480,pixelformat=Y12  --stream-mmap=3 //修改分辨率、fmt、video节点 
  • 如果不能输出任何数据或者直接显示超时了、按照以下步骤排查
    • 确认硬件走线接线没有问题
    • 检查mclk频率、电压幅度、
    • 确认替换初始化列表参数中是否有重复操作standby reg、确认start_stream函数有正确操作standby reg
    • 确认dts中的mipi_data配置与初始化列表一致、让sensor输出数据流后使用示波器测量mipi_clk_p/n、mipi_data_p/n的波形、确认sensor是否真正发送数据出来并反馈相关波形、mipi参考波形如附件
      • 检查到这一步有两种情况
      • sensor没有输出数据、以上步骤确认都检查过的话、让sensor原厂提供新的参数或者验证下参数
      • sensor有发生数据、但soc却没有接到数据、或者出数据的时候报了很多mipi等协议上的错误、先确认软件没有问题、再让硬件排查
  • 能收到数据但是raw数据不对、看不到轮廓、文件大小不对
    • 试试sensor的color bar模式是否正常
  • 其他问题可以联系soc原厂解决

5. 完成基础的expo、gain调节

  • 参考官方的sensor 完成剩余所有reg、接口的移植、一般来说这个时候已经可以出一般场景下预览正常raw的图了
  • 但完成iq效果调节还需要isp的接入、isp的接入需要填充好expo、gain
    • expo相关reg函数接口直接替换即可
    • sensor_gain需要配合后端isp调节才能发挥sensor的性能、不同sensor厂商的gain调节机制不同、同一厂商不同sensor型号调节gain也有差异、但此时已经可以通过raw图看到轮廓了、
      可以直接将参考sensor调节gain的函数拷贝过去、必要时联系soc原厂解决
  • hdr_sensor expo、gain要填充好、实在不明白按照参考sensor填充、后续有问题联系soc原厂解决
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
高通Camera Sensor移植是将高通(Qualcomm)公司设计的相机传感器应用于其他设备或系统的过程。由于高通相机传感器在市场上享有良好的声誉,因此许多厂商希望将其移植到自己的产品中,以提供更出色的图像质量和相机性能。 然而,高通Camera Sensor移植过程中可能会遇到一些主要问题。首先,由于高通相机传感器和目标系统之间的硬件兼容性问题,需要进行适当的硬件连接和接口调整。这涉及到了电路设计和信号处理的挑战。 其次,高通Camera Sensor移植还需要在软件层面上与目标系统进行兼容。这涉及到调整相机驱动程序和相机固件,确保其能够与目标系统的操作系统和应用程序进行良好的交互。这可能需要一定的软件开发和调试工作。 另一个问题是,高通Camera Sensor移植对于非高通芯片的设备来说,可能需要高通的授权和支持。因为高通的相机传感器技术是他们的知识产权,使用和集成这些技术可能需要一定的授权和许可。 最后,高通Camera Sensor移植还需要进行实际的测试和验证。这包括对图像质量、色彩还原、光感和图像稳定性进行全面评估,以确保移植的相机传感器能够在目标系统中达到预期的效果。 综上所述,高通Camera Sensor移植虽然能够为设备带来更出色的相机性能,但在硬件兼容性、软件兼容性、授权和测试验证等方面都存在一些挑战和问题,需要开发者进行一定的研究和努力来解决。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值