摄像头驱动指南
(一)内核驱动
1. GPIO
kernel/Documentation/devicetree/bindings/media/video/
gpios = <&msmgpio 15 0>, |
实现I2C的功能
gpios = <&msm_gpio 29 0>, |
2. 时钟
设置时钟源
clocks = <&clock_gcc clk_mclk0_clk_src>, |
3. 供电
PMIC供电
cam_vdig-supply = <&pm8916_s4>; |
CAM_VANA – Supply voltage (模拟)
CAM_VDIG – Supply voltage (数字)
CAM_VAF – Supply voltage (Actuator 电压)
CAM_VIO – Input/output voltage (IO数字)
也可以通过GPIO控制外部的LDO供电
gpios = <&msm_gpio 27 0>, |
4. YUV I2C 地址配置(bayer的配置在用户空间中)
(二)用户空间驱动
1. sensor初始化参数
包括支持模式,安装位置和安装角度
2. sensor输出配置
bayer或者YUV
连接模式MIPI或者parallel
输出的sensor尺寸会有要求,具体需要看sensor手册,比如说长宽需要是多少的倍数,起始点的横纵坐标是多少的倍数
3. bayer slave配置
I2C slave地址以及地址类型
sensor id寄存器地址,写入sensor_id_info数据结构
上下电设置,写入mm_sensor_power_setting结构体
4. 输出尺寸表
vt_pixel_clk = line_length_pclk * frame_length * frame rate
用于曝光时间的计算,可以用来AEC算法的antibanding校正
op_pixel_clk VFE时钟
op_pixel_clk = (sensor 输出实际比特率)/bits-per-pixel
如果MIPI DDR时钟值(MIPI lane的频率)为300Mhz,同时sensor使用4个lane传输数据,每个lane的数据率为300 * 2 = 600Mhz,因此总数据率为600* 4 = 2400Mhz,对于10bit的bayer sensor,op_pixel_clk 的值可设置为2400 / 10 = 240Mhz。实际测试下来,这个时钟值可以大不能小
5. chromatix参数
6. sensor寄存器地址
- 曝光寄存器
vert_offset - 曝光行数上限的边界值,曝光行数任何情况下都应该小于frame_length_lines减去vert_offset
- 输出控制寄存器地址
7. MIPI接收器配置
- CSI-PHY config 设置lane参数
- csi_lane_assign对sensor和MSM的lan进行映射,调整顺序
- CSI-D配置 这个没太懂,一般应该都是CSI_RAW10
8. 寄存器设定
通过I2C来配置
初始化设定
grouphold on设定
sensor工作时更新曝光设定需要操作很多寄存器(曝光时间,每帧行数,增益),他们必须要在同一帧内完成,这些寄存器都有双buffer,并具有按组更新的功能。表现为所有相关寄存器一起完成更新。当设定grouped parameter hold为1时,写入的寄存器数据被暂存到buffer寄存器中。
grouphold off设定
当设定group parameter hold为0时,曝光寄存器的值会被同时更新,参数的变化会在同一帧生效,相当于一个触发器。
分辨率设定
曝光设定 主要编写real_to_register_gain和register_to_real_gain()函数
启动输出设定
MIPI数据包必须在start of transmission 和 end of transmission之间发送
这个地方相当于启动camera
停止输出设定
应该要把clock和data lane置为LP11的状态,如果没有正确执行会导致相机和高通平台同步问题
(三)可能出现的问题
当相邻两证的时间戳相差较远,会出现SOF IRQ 超时的问题,这个地方高通出现过fd泄露的问题
当VFE时钟的设置小于sensor的MIPI时钟,会出现VFE overflow
当声明的传感器输出尺寸和传感器输出尺寸不匹配时,会发生CAMIF错误。
为了排除CSID故障,必须启用所有CSID IRQ以检查CSID是否收到mipi数据或错误位IRQ。
为了对DPHY进行故障排除,必须启用DPHY调试日志以检查硬件寄存器CAMSS_A_CSI_PHY_X_MIPI_CSIPHY_INTERRUPT_STATUSY是否收到任何IRQ错误。
(四)注意点
VI/ISP 的工作时钟 。 如上图中的 VI 最大工作时钟是 6 00MHz ,模式 3 840 * 2160 * 60fps 的像素时钟是 4 98MHz ,还是能够支持的;如果是模式 3 840 * 2160 * 100fps , 那么像素时钟需要 8 30Mhz , 超出了芯片的处理能力 。 VI 时钟 通过 vi_p0_cksel(pipe0) 寄存器来控制 , 高分辨率高帧率下如果出现 mipi 解析数据无异常 , 但出现 vi 中断不对的情况 , 可以确认下这 组 寄存器的配置 。
通信数据速率。上述 sensor 端的帧率和位宽方面已提过,一般来说新的 soc 平台不会因为 mipi 或 lvds 的接受速率受限而无法对接,但是对于大分辨率较高帧率的 sensor ,还是存在这方面的风险。
输入时钟。 Sensor 依赖于外部时钟驱动,输入时钟区分为芯片平台提供和晶振提供,需要与硬件确认。如果是芯片平台提供的时钟,需要查找《 SoC 用户指南》的时钟复位配置寄存器,配置为需要的频率;如果是晶振提供,那与硬件确认晶振提供的时钟频率是什么,是否合乎需求。
注意主从模式,主要区别是sensor的行列同步信号,是有sensor内部产生还是外部产生来达到控制帧率的目的,主从模式在硬件设计以及软件配置方面有差别。
如果需要详细了解,请参考《Camera Sensor Driver Development and Troubleshooting》