概述
前言
imx385 是一款原本用在安防行业的专业超星光夜视模组,因项目需要,将其移植高通 MSM8953、Android P(9.0) 平台,仅做记录。
后续也调试过imx307、imx327、这三款芯片通过查看规格书,发现从寄存器到IC特性相差不大,因此放在一起进行记录。
硬件平台:MSM8953
软件平台:Android P(9.0)
最终配置:CSI-2、2lane、RAW10、37.125Mhz、全像素扫描模式、1080p@30fps
目录
前言
IMX327 IC 特性
重要属性说明
从机地址和ID匹配
上电时序
输出格式配置
输出长宽及增益配置
曝光增益配置
输出信息配置
vt clock
op clock
增益精度
DB 精度
TABLE 精度
AE 计算,都是用线性的倍数gain
IMX327 增益曝光配置
雪山千古冷,独照峨嵋峰
IMX327 IC 特性
再列出imx327一些重要属性:
- 输入工作频率:
- 37.125Mhz or 74.25Mhz
- 输出模式:
- 支持全像素扫描模式和窗口裁剪模式。
- 全像素输出模式,最高帧率 60fps
- WDR宽动态感知范围
- 多重曝光
- 数字叠加动态范围
- 0 db – 29.4 db 模拟增益
- 29.7 db – 71.4 db 数字叠加增益。步长0.3db
- 可变速度快门 最小刻度 1 line
- 可变AD转换位数
- 输出支持 raw 10 和 raw 12
重要属性说明
移植的过程遇到了很多问题,分析过程就不一 一表述了。这里结合IC datasheet 和驱动文件对一些重要属性做一些说明。
从机地址和ID匹配
从机地址直接可以从手册查到
ID 匹配机制,在android系统cam 驱动中,开机时会从 cam sensor 主动读取一个寄存器的值和驱动中的 id 属性进行对比,一致则认为识别 cam 正常。
由于 imx327 没有专门的 id 寄存器,这里使用了一个普通的寄存器,用其默认值当作了 id 值。
上电时序
注意,这里使用了 37.125Mhz的 mclk,内核驱动和这里都要修改。
输出格式配置
输出长宽及增益配置
长宽寄存器:按照手册填写。正常来说,x_output,y_output这两个寄存器的值对应输出帧的长宽。但其实在整个cam框架中,不会去读取这两个寄存器,因此这两个属性几乎无影响。这里将 win crop 模式下的长宽寄存器填了上去,实际上是不对的。
line_length_pclk = 0x301B, 表示每行有多少个像素
frame_length_lines = 0x3018, 表示每帧有多少行
在设置不同的分辨率的时候,这两个值可能会有所变化。
曝光增益配置
global_gain_addr:增益 gain 的设置地址及范围大小都是IC的默认属性,IC手册可查。
coarse_int_time_addr:积分时间,对应曝光时间,单位为line,有范围限制。
从这个表格可以得出另一个属性,vert_offset 偏移量为2。
最大最小gain:并且在写入寄存器和实际的gain之间也有转换关系。
模拟增益在29.4db 以下使用,数字增益在29.7db及其以上生效。
寄存器值和实际gain的转换关系:
输出信息配置
line_length_pclk = 2200,
frame_length_lines = 1125,
这两个值是按照1080p@30fps的规定值填写的。
vt clock
> 用于曝光时间计算
> 用于 AEC 算法的 banding 纠正
1. 计算方式 vt_pixel_clk = line_length_pclk * frame_length_lines * frame_rate;
2. 也是曝光时间的参考时钟, (video timing clk value) – Virtual clock value used for calculating shutter time,and used by AEC for correcting banding artifacts;
3. 平台根据写入不同的 [曝光行] 来控制帧率,比如在暗处希望牺牲一点帧率,让Gain值更高,就用这个公式来计算,最后计算的 frame_length_lines 写入相应寄存器;
4. 注意一点的是不同的平台需要一个最小的 blanking time,所以 frame_length_lines 是要大于真实有效数据行 y_output,而且差值一般16对齐;
op clock
op clock 就是手册上给出的值 222.75 Mhz。
qcom 的解释:
* vendorqcomproprietarymm-camerasdksensorincludessensor_lib.h
* vt_pixel_clk: sensor scanning rate (cycles / sec)
* op_pixel_clk: actual sensor output rate (cycles / sec)
作用:
> VFE 时钟,表示每秒 VFE 处理数据量
1. 计算方式 op_pixel_clk = (sensor 输出实际比特率)/ bits-per-pixel;
// 比如,MIPI DDR 时钟值(MIPI clk 值)是 300MHz, 且 camera 使用 4 lane,每 lane 是 600MHz 的速率, 那么总的数据速率是2400MHz。
// 因为 mipi 是差分信号, 每个时钟信号在上升沿和下降沿都可以传输数据,所以 each_lane_rate = clk_rate * 2;
// 例子: 对于一个 10bit/pixel 总速率为 2400MHz 的 sensor, 这个 op_pixel_clk = 2400MHz / 10 = 240MHz.
1. 这个是 camera mipi csi 的 clock
2. 这个值必须根据 sensor 的实际特性填写,一般 IC 规格书会给出数据,如 IMX307 给出 1080p@30fps 4lane 输出,Mbps/Lane = 222.75MHz;
3. 这个时钟决定了 sensor mipi data lane 吐出数据的带宽;不同的平台的处理能力不一样,所以这个值不能超过平台规范定义的值。
4. 这个是 camera mipi 的 clock,我们这里配置的是 254.4MHz,单位一定要注意,有一次FAE把这个值误写,造成camera功耗增大,功耗测试了很久才发现是这个地方写错了
5. 这个的解释是 VFE 时钟,表示每秒 VFE 处理的数据量(in pixel),就是一个表示处理数据快慢的单位,
如果是全尺寸的话,那么就要配置的大一些; 如果是小尺寸的话,就没必要配置很大
6. 这个 op_pixel_clk 会影响功耗,注意这个配置不能和天线初一同一个频段,或者说这个频率的倍数不能落到天线的频段里面去,否则就会对天线干扰。
增益精度
大部分增益的精度均可归结为线性精度、DB 精度和 TABLE 精度这几类。线性精度指的是增益的倍数均匀增加。例如 sensor 能支持的 again 为 1 倍,1(1+1/16)倍,1(1+2/16)倍……这种情况下,精度类型可以设定为 AE_ACCURACY_LINEAR,精度值设置为 0.0625,在这种精度下,again 为 32 则表示 32*0.0625= 2 倍增益。
DB 精度
DB 精度指的是增益的倍数以倍增的形式增加。例如 sensor 的芯片手册说明能支持的 again 为 0db,0.3db,0.6db……这种情况下,精度类型可以设定为 AE_ACCURACY_DB,精度值设置为 0.3,在这种精度下,again 为 80 则表示 80*0.3db=24db,24db 是 16 倍增益。
再例如 sensor 能支持的 again 为 1 倍,2 倍,4 倍,8 倍……这种情况下,对应为 db 则为 0db,6db,12db,18db,所以精度类型设定为 AE_ACCURACY_DB,精度值设置为 6。由于 AE 算法内部实现线性转DB 时计算精度存在误差,当 DB 精度较高(小于 1)时,建议采用 TABLE 精度来实现。
TABLE 精度
x1024的原因
TABLE 精度指增益的倍数是通过查表的形式获得,表格统一使用 10bit 精度,即1024 表示 1 倍增益。当某些 sensor 的增益值的增加规律不线性或者 DB 精度较高时,可以使用 TABLE 方式,AE 算法计算出需要的模拟增益/数字增益的数值,用查询 sensor 增益表格中最接近的值作为数字增益/模拟增益的值。使用 TABLE 模式时,需要相应的初始化回调结构体 AE_SENSOR_EXP_FUCN_S 中的回调函数。
AE 计算,都是用线性的倍数gain
曝光时间与 sensor 增益保持线性关系是 AE 曝光量分配的前提,即认为曝光量一定的情况下,曝光时间和 sensor 增益可以相互转换而保持图像亮度基本不变。比如说曝光量为 4096,那么分配为曝光时间(2)*增益(2048),也可以分配为曝光时间(4)*增益(1024),这 2 种情况下图像亮度应该基本不变。若不满足这种线性关系,在高亮环境下,由于曝光时间很短,1 行曝光时间的变化也容易使画面发生闪烁。
某些 sensor,如 Panasoni MN34220 采用 1080p@30fps 的初始化序列配置时,曝光时间必须偏移 0.8018 行之后才与 sensor 增益有线性关系,因此增加了 f32Offset 这个变量,它为 float 型变量,以行为单位,将 f32Offset 设置成 0.8018,AE 算法内部即可完成偏移处理。一般 sensor 的曝光时间和增益不存在这种偏移关系,需在代码 中将该值配为 0。
IMX327 增益曝光配置
使用查表法配置
#define IMX327_GAIN_TABLE 239
static uint32_t imx327_gain_table[IMX327_FACE_GAIN_TABLE]=
{
1024, 1060, 1097, 1136, 1176, 1217, 1260, 1304, 1350, 1397, 1446, 1497, 1550, 1604, 1661,
1719, 1780, 1842, 1907, 1974, 2043, 2115, 2189, 2266, 2346, 2428, 2514, 2602, 2693, 2788,
2886, 2987, 3092, 3201, 3314, 3430, 3551, 3675, 3805, 3938, 4077, 4220, 4368, 4522, 4681,
4845, 5015, 5192, 5374, 5563, 5758, 5961, 6170, 6387, 6611, 6844, 7084, 7333, 7591, 7858,
8134, 8420, 8716, 9022, 9339, 9667, 10007, 10359, 10723, 11099, 11489, 11893, 12311, 12744, 13192,
13655, 14135, 14632, 15146, 15678, 16229, 16800, 17390, 18001, 18634, 19289, 19966, 20668, 21394, 22146,
22925, 23730, 24564, 25427, 26321, 27246, 28203, 29194, 30220, 31282, 32382, 33520, 34698, 35917, 37179,
38486, 39838, 41238, 42687, 44188, 45740, 47348, 49012, 50734, 52517, 54363, 56273, 58251, 60298, 62417,
64610, 66881, 69231, 71664, 74182, 76789, 79488, 82281, 85173, 88166, 91264, 94471, 97791, 101228, 104785,
108468, 112279, 116225, 120310, 124537, 128914, 133444, 138134, 142988, 148013, 153215, 158599, 164172, 169942, 175914,
182096, 188495, 195119, 201976, 209074, 216421, 224027, 231900, 240049, 248485, 257217, 266256, 275613, 285299, 295325,
305703, 316446, 327567, 339078, 350994, 363329, 376097, 389314, 402995, 417157, 431817, 446992, 462700, 478961, 495793,
513216, 531251, 549921, 569246, 589250, 609958, 631393, 653582, 676550, 700326, 724936, 750412, 776783, 804081, 832338,
861589, 891867, 923209, 955652, 989236, 1024000, 1059986, 1097236, 1135795, 1175709, 1217026, 1259795, 1304067, 1349895, 1397333,
1446438, 1497269, 1549887, 1604353, 1660734, 1719095, 1779508, 1842044, 1906777, 1973786, 2043149, 2114949, 2189273, 2266209, 2345848,
2428287, 2513622, 2601956, 2693394, 2788046, 2886024, 2987445, 3092431, 3201105, 3313599, 3430046, 3550585, 3675361, 3804521
};
cmos的gain增益本质是电压的放大,所以使用以下的倍数和db的转换公式。
电压(电流)放大倍数分贝数定义:
(db)K=20lg(Vo/Vi),其中K为放大倍数的分贝数,Vo为放大信号输出,Vi为信号输入。
即这个表的使用方式是这样的:
第1个表格参数:
gain db:20log(1024/1024)= 0
第2个表格参数:
gain db:20log(1060/1024)= 0.300 db
依次类推
正好也是这颗sensor的最小db精度。
雪山千古冷,独照峨嵋峰
最后
以上就是优雅水杯为你收集整理的imx385驱动、imx307驱动、imx327驱动调试记录前言IMX327 IC 特性 输出长宽及增益配置vt clock增益精度DB 精度TABLE 精度AE 计算,都是用线性的倍数gainIMX327 增益曝光配置雪山千古冷,独照峨嵋峰的全部内容,希望文章能够帮你解决imx385驱动、imx307驱动、imx327驱动调试记录前言IMX327 IC 特性 输出长宽及增益配置vt clock增益精度DB 精度TABLE 精度AE 计算,都是用线性的倍数gainIMX327 增益曝光配置雪山千古冷,独照峨嵋峰所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复