文章目录
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才能接收到参数
-
适配新的分辨率需要替换新的初始化列表、或者确定分辨率的基础上调整帧率参考以下内容
- 需要适配线性60fps吗?supported_modes中hts、vts的值需要对应sensor厂商提供的初始化列表(列表中有表示hts、vts的寄存器)修改
- vts需要大于等于expo
- 试试修改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_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为例
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 + 最高位补0ov5695: 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:/#
- 反向验证dts中需要添加i2c移位后的从地址
- 其他问题可以联系soc原厂解决
4. 让sensor出图
-
需要先确保初始化列表中的所有reg都写入成功、
-
在驱动start_stream函数中操作开关数据流reg处添加打印、确认有真正的操作standby reg、所有的sensor都是类似的
关于imx415 standby reg 描述如下:
关于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原厂解决