本文完整整理 47 页英文 V1.0.34 原稿的技术正文(PDF p.9–47)。没有提供对应中文 PDF:中文与俄文均完整翻译英文原稿,三语统一使用英文 PDF 原图;原图中已有中文标签如实保留,不伪称已获得另一语言图片。代码、参数、标识符、示例数值与代码注释保持原文;自然语言说明和图注本地化。
原稿适用芯片见下表,未指定统一内核版本或具体 ArmSoM 板卡。本篇仅作 ArmSoM 平台参考:需核对实际 SoC、模组、传感器、VCM/OIS、ISP、SDK/BSP、校准 DLL/API 版本、驱动及 OTP/EEPROM 存储格式,不能将原厂模组示例当成 ArmSoM 实测。尚未进行硬件验证,也未执行校准、烧写或相机操作。
操作风险与来源疑点:OTP/EEPROM 烧写可能不可逆或覆盖模组校准数据;先核对厂家流程及目标存储布局。原文若干参数默认值、函数声明与附录调用存在差异,附录是原文示例,不保证可直接编译或适配生产环境。公式、地址、位数和 ID 均按原文保留;未擅自纠正技术常量。
| 原文芯片范围 |
|---|
| RV1109 / RV1126 / RK356X / RK3588 |
原文疑点及校对记录: EDITORIAL-NOTES. ArmSoM · Rockchip Linux
1. LSC 与 AWB 校准流程
1.1 校准方案
1. 光源环境与设备
D50(5000K±100K),避免其他环境杂散光干扰。
使用满足上述光源要求的匀光片或 DNP 灯箱,匀光片如下图所示:

英文原稿技术图, PDF p.9.
2. 拍摄方法
- 根据实际条件选择以下方法之一:
- 使用匀光片:使镀膜面朝向镜头并靠近放置,保持模组端面、匀光片和光源面板平行。
- 使用 DNP 灯箱:将模组放在 DNP 光源面板前 1–2cm,模组端面与面板平行。
- 关闭 mirror/flip 等功能。
- 调节曝光,使图像 G 通道的最大亮度(8bit)达到 160~180。
- 使用该曝光拍摄并保存一幅 raw 图像。
3. AWB 校准
1. 选择 Raw 图像中心区域(每通道长、宽各 20%),计算 R、Gr、Gb、B 通道平均值。
Gr_ave = ROI 的 Gr 平均值 - Black level
Gb_ave = ROI 的 Gb 平均值 - Black level
R_ave = ROI 的 Red 平均值 - Black level
B_ave = ROI 的 Blue 平均值 - Black level
2. 计算 R/Gb、B/Gb 和 Gr/Gb。
R/Gb=R_ave/Gb_ave
B/Gb=B_ave/Gb_ave
Gr/Gb=Gr_ave/Gb_ave
3. 将 R/Gb、B/Gb、Gr/Gb 转换为 10 位定点数:
R/Gb_hex=R/Gb * 1024
B/Gb_hex=B/Gb * 1024
Gr/Gb_hex=Gr/Gb * 1024
4. LSC 校准
1. 将校准计算目标值设置为 70%。
2. 计算四个通道各自的 10 位增益。
1.2 管控方案
1. LSC 校准前
1. Y shading 标准:
ROI = 1/5 Width * 1/5Height
YShading_Corner = Y_Corner/Y_Center
30% < YShading_Corner < 55%
Ydiffer = YShading_Corner_Max - YShading_Corner_Min < 7%
2. Color Shading 标准:
单个模组的色彩阴影均匀性:管控每个块与中心块之间的差异。
ROI 框为 1/5*1/5,计算 24 个块与中心块的差异。
ROI = 1/5Width * 1/5Height
|(R/G_Corner)/(R/G_Center)-1| < 15%
|(B/G_Corner)/(B/G_Center)-1| < 15%
2. LSC 校准
针对模组摆放导致 RAW 数据四周暗角不对称的问题,在 lsc_otp_Calibrate 接口中增加 ratio 参数管控校准结果,默认 ratio=1.5。
如果模组自身装配导致光学中心偏移,可以增大 ratio 以提高通过率。
3. LSC 校准后
1. Y shading 标准:
ROI = 1/5 Width * 1/5Height
YShading_Corner = Y_Corner/Y_Center
Ydiffer = YShading_Corner_Max - YShading_Corner_Min < 5%
2. Color Shading 标准:
单个模组的色彩阴影均匀性:管控每个块与中心块之间的差异。
ROI 框为 1/5*1/5,计算 24 个块与中心块的差异。
ROI = 1/5Width * 1/5Height
|(R/G_Corner)/(R/G_Center)-1| < 5%
|(B/G_Corner)/(B/G_Center)-1| < 5%
2. PDAF 校准流程
PDAF 校准分为 Gain Map 校准和 DCC Map 校准两部分,流程如下:

英文原稿技术图, PDF p.12.
2.1 校准前准备
1. 模组准备
(1) 检测镜头脏污。
(2) VCM 检测:测试线性度、镜头位置精度和稳定性。
(3) AF 基础校正:
确定 DAC 与对焦距离的关系:校准模组镜头在 Inf 和 Marco 焦点处的马达位置,记录 DAC_inf 与 Dac_marco,确定 DCC_LENS_BEGIN 与 DCC_LENS_END。马达中心位置对焦最清晰时对应的物距,就是 DCC Map 校准距离 a。
马达中心位置 DAC = (DAC_INF + DAC_MACRO)/2,相应校准距离 a 可通过镜头景深表确定。先查 INF 和 MACRO 的 lens shift,计算二者中间值,再在景深表中找最接近该值的 lens shift,得到马达中心位置及对应物距 A。例如,无穷远物距对应 lens shift 为 0;最近物距选 10cm,对应 -0.183,则中心位移为 -0.0915,最接近表中 -0.091,相应 DCC Map 校准物距 a 为 0.20m。
| 物距 (m) | 镜头位移 (mm) | 远景深 (m) | 近景深 (m) |
|---|---|---|---|
| INF | 0.000 | - | - |
| 10.0 | -0.002 | INF | 4.33 |
| 7.6 | -0.002 | 14417.449 | 3.81 |
| 5.0 | -0.004 | 14.511 | 3.02 |
| 4.0 | -0.004 | 8.406 | 2.63 |
| 3.0 | -0.006 | 4.941 | 2.15 |
| 2.0 | -0.009 | 2.71 | 1.59 |
| 1.9 | -0.009 | 2.53 | 1.52 |
| 1.8 | -0.010 | 2.35 | 1.46 |
| 1.7 | -0.010 | 2.19 | 1.39 |
| 1.6 | -0.011 | 2.02 | 1.32 |
| 1.5 | -0.012 | 1.87 | 1.25 |
| 1.4 | -0.013 | 1.71 | 1.18 |
| 1.3 | -0.014 | 1.57 | 1.11 |
| 1.2 | -0.015 | 1.42 | 1.04 |
| 1.1 | -0.016 | 1.28 | 0.96 |
| 1.0 | -0.018 | 1.15 | 0.88 |
| 0.9 | -0.020 | 1.02 | 0.81 |
| 0.8 | -0.022 | 0.89 | 0.72 |
| 0.7 | -0.025 | 0.77 | 0.64 |
| 0.6 | -0.029 | 0.65 | 0.56 |
| 0.5 | -0.035 | 0.53 | 0.47 |
| 0.45 | -0.039 | 0.478 | 0.425 |
| 0.40 | -0.044 | 0.422 | 0.380 |
| 0.35 | -0.051 | 0.366 | 0.335 |
| 0.30 | -0.059 | 0.312 | 0.289 |
| 0.25 | -0.071 | 0.258 | 0.242 |
| 0.20 | -0.091 | 0.202 | 0.192 |
| 0.15 | -0.120 | 0.153 | 0.147 |
| 0.14 | -0.129 | 0.142 | 0.138 |
| 0.13 | -0.140 | 0.132 | 0.128 |
| 0.12 | -0.152 | 0.122 | 0.118 |
| 0.11 | -0.166 | 0.111 | 0.109 |
| 0.10 | -0.183 | 0.101 | 0.099 |
| 0.09 | -0.205 | 0.091 | 0.089 |
| 0.08 | -0.232 | 0.081 | 0.079 |
| 0.07 | -0.267 | 0.071 | 0.069 |
| 0.06 | -0.315 | 0.060 | 0.060 |
| 0.05 | -0.383 | 0.050 | 0.050 |
| 项目 | 详情 | 说明 |
|---|---|---|
| 测试图卡 | 由供应商定义 | 建议采用棋盘格、菱形图等具有高对比度和适中频率的测试图卡。 |
| 测试图卡表面照明亮度 | 大于 400Lux | 成像不应闪烁 |
| 模组与测试图卡的距离 | INF:2~5m;Marco:10-20cm(详见景深表;Marco 为原文拼写) | INF 距离使用增距镜模拟远焦位置。 |
| 模组校正方向 | 校正 INF/MACRO 时,模组光轴水平。 | 开环 VCM 仅在水平方向校正;闭环 VCM 可将光轴朝上校正。注意 Inf/Macro 的校正方向应一致。 |
| 增益设置 | 与 AWB 相同 | 数字增益固定为 1;模拟增益:传统 PD 或 2x1OCL 设为 1x,Dual-photodiode 的 PD 设为 2x。 |
| 传感器设置 | 禁用传感器的 mirror/flip/OB/坏点去除等设置。 | |
| 图像亮度要求 | 与 AWB 相同 | 全尺寸显示时,画面中心 1/32W*1/32H ROI 内 G 通道最高 10% 的平均亮度为 800LSB (raw10);dual pd G 通道平均值为 700LSB (raw10)。 |
| 误差测试样本数 | 范围检查:每个模组应进行准确检查;大于 10pcs(原文表述)。 | 测试失败时需修改校正方法,使 AF 远焦和近焦校正结果更准确。 |
(4) 若模组支持 OIS,校准 lsc 和 pdaf 前应完成防抖校正。将马达移到参考 XY 位置,确认 OIS 配置;此步骤生成用于 LSC 和 PDAF 索引的平场图像。
(5) 完成黑电平和 LSC 校正,必要时也可校正场曲。
2. 模组 AE 设置
(1) 数字增益固定为 1;传统 PD 或 2x1OCL 的模拟增益 again 设置为 1x; Dual-photodiode 的 PD 模拟增益 again 设置为 2x,以防像素电荷溢出。
(2) 曝光时间:为防止 dual-pd 电荷溢出及普通像素(regular_pixel=dual_pd_l+dual_pd_r)过曝,调节曝光使全尺寸显示时中心区域 G 通道亮度为 700(raw10)。OCL 与 metal-shield 类型应保证中心 G 通道亮度为 800(raw10)。建议传感器曝光时间为 10ms 的整数倍,避免工频干扰。
2.2 Gain Map 校准
1. 光源环境与设备
D50(5000K±100K),避免其他环境杂散光干扰。
满足上述光源要求的匀光片或 DNP 灯箱、积分球。
2. 拍摄方法

英文原稿技术图, PDF p.16.
- 将模组放在均匀面光源前,端面与光源平行;例如原文实验使用积分球,将面板亮度调为 6.6。镜头前放匀光片,使面光源充满画面。
- 传感器增益:metal-shield 和 2x1OCL 的 again、dgain 均设为 1x;dual-pd 的 again 为 2x、dgain 为 1x,曝光时间设为 10 的倍数。
- 关闭传感器 mirro/flip/OB 等设置。
- 全尺寸显示时,中心 1/32W*1/32H ROI 内 TOP 10% G 通道平均亮度为 800LSB(raw10)或 200LSB(raw8);dual pd G 通道平均值为 700LSB(raw10)或 175LSB(raw8)。
- 开机预热 3 分钟,马达移到中心位置,连续拍摄 3 幅 RAW。先检查坏点数是否超限;超限时降低亮度重新拍摄,通过后获得平均图像数据。
3. 校准
调用 pdaf_gainmap_calibration(…) 生成 gainmap 数据,并获得 gainmap 大小:gainmap_width*gainmap_height*2 字节,包含左、右 gainmap。
4. 验证
1. 保持步骤 2 的环境一致,拍摄测试图,将已校准 gainmap 与测试图送入 pdaf_gainmap_vertification(…)。返回 1 表示验证成功,gainmap 可用;返回 -1 表示坏点数可能超出允许范围,需要降低图像亮度并重新拍摄。
2. 验证标准
gainmap 校正后的左右 PD 像素差异小于 5%,则验证成功。
2.3 DCC Map 校准
DCC(离焦转换系数)表示马达位置与左右图像差异之间的关系。将图像分区,等步长移动马达,计算不同位置的 pd 值,通过线性回归获得各区域 DCC 值,即 DCCMAP。

DCC = Δlensposition[dac]/Δphasedisparity[pixel]

英文原稿技术图, PDF p.17.
[可选]
部分模组需要校准 PD_OFFSET。例如,马达位于 DAC_0 时得到失焦图,清晰对焦位置计算为 DAC = DAC_0 + PD * DCC + PD_OFFSET * DCC。
1. 光源环境与设备
D50(5000K±100K),避免其他环境杂散光干扰。
满足上述光源要求的匀光片或 DNP 灯箱、积分球、黑白标准板。
标准板由定制半透明胶片制作,图案为等间距黑白条纹或菱形网格。

英文原稿技术图, PDF p.17.

英文原稿技术图, PDF p.18.

英文原稿技术图, PDF p.18.
校准距离 a 在 2.1.1 AF 基础校正步骤中确定。
标准板宽度取决于镜头水平 FOV 和校准距离 a,建议:

S >= a * tan(FOV * pi/360) * 2/0.9
校准距离在 2.1.1 AF 基础校正步骤中确定。
标准板宽度取决于镜头水平 FOV 和校准距离 a,建议:

λ[mm] = (u[um]/1000) * raw_width/(6 * dccmap_width)

W[mm] = (a[mm] - f[mm])/f[mm] * λ[mm]
IMX258 的系数 λ 建议为 0.11;S5KJN1 建议为 0.088~0.099。
DCC 校准要求正确制作、放置标准板。条纹尺寸不当、摆放旋转或变形、亮度过暗或过曝都会导致校准失败。下图给出部分错误情况。

英文原稿技术图, PDF p.18.
2. 拍摄方法
- 将条纹胶片放在积分球前,模组置于标准板前、约中间焦点处,距离按 2.1.1 AF 基础校正确定。端面与标准板平行,避免标准板旋转、倾斜和扭曲,拍摄时图案应充满画面。
- metal-shield、2x1OCL 的 again、dgain 均为 1x;dual-pd 的 again 为 2x、dgain 为 1x。
- 关闭传感器 mirro/flip/OB/坏点去除等设置。
- 曝光:标准板画面中心 1/32w*1/32h ROI 内白块 G 通道平均值应为 800LSB(raw10)或 200LSB(raw8);dual pd 为 700LSB(raw10)或 175LSB(raw8),防止过暗或过曝影响 DCC 精度。metal-shield 传感器还应保证非遮挡像素不过曝。
- 马达从 DCC_LENS_BEGIN 按 DCC_LENS_INTERVAL 步长移动到 DCC_LENS_END,每次稳定后拍 3 幅 RAW,计算该位置平均图像。原文示例从 0 到 64、步长 8,共 9 个位置、27 幅图。
3. 校准
将第 2.1 节校准得到的 gainmap、马达位置参数以及各位置平均图像数据输入 pdaf_dccmap_calibration(…),获得 dccmap 数据及其大小。
大小为 dccmap_width*dccmap_height*2 字节。原文此处还写:若选择 PD_OFFSET 校准,其值大小同时为 2bytes DCC_RSQ_THRESHOLD(原句语义不完整,保留待核对)。不满足线性阈值的块数超过一定数量时校准失败;应检查输入数据、调整环境并重新拍摄。
4. 验证
本步骤检查当前 dccmap 是否正确,流程如下:

英文原稿技术图, PDF p.19.
1. 验证图拍摄环境与 DCCmap 校准一致,镜头端面平行标准板,拍摄时标准板图案充满画面。
2. 相机预热 3 分钟,将马达移到失焦位置 DAC0。

DAC0 ∈ (DACinf + 0.2 * abs(DACinf - DACmacro), DACinf + 0.8 * abs(DACinf - DACmacro)]
马达稳定后拍摄三幅 Raw 并取平均,将 DAC0、平均图像、已校准 gainmap 和 dccmap 输入 pdaf_dccmap_vertification(),计算失焦图像对应的理想清晰位置 DAC1。
3. 将马达移到 DAC1,在其前后 tolerance_factor*abs(DACinf-DACmacro)+Δ(如 Δ=2)范围内拍摄五幅图。tolerance_factor 为验证容差,不同传感器的误差范围不同,如 5%、10%、20%。
验证时马达从位置 1 移动到位置 5;五个位置如下(例 tolerance_factor=10%、Δ=2):
4.
| 序号 | 位置 |
|---|---|
| 1 | DAC1-10% *abs(DACinf-DACmacro)-Δ |
| 2 | DAC1-10% *abs(DACinf-DACmacro) |
| 3 | DAC1 |
| 4 | DAC1+10% *abs(DACinf-DACmacro) |
| 5 | DAC1+10% *abs(DACinf-DACmacro)+Δ |
5. 将五幅图输入 pdaf_calc_sharpness(…),计算中心区域 DCC_PERCENT_ROI_W*DCC_PERCENT_ROI_H(如 30%*30%)的清晰度,若存在峰值则验证成功。失败时增大 tolerance_factor 和 Δ(如 Δ 从 2 增至 5),重新采集 5 幅图并重复步骤 4。建议选择 PD 像素较少的通道计算清晰度。

英文原稿技术图, PDF p.20.
3. 校准接口方案
校准模块包括 AWB(自动白平衡)、LSC(镜头阴影校正)和 PDAF(相位检测自动对焦)。
3.1 AWB 校准
【功能说明】
此函数计算 raw 图像 ROI 的 R/G、B/G、Gr/Gb。
【函数原型】
bool awb_otp_Calibrate(uint16_t* RawAddr, int width, int height, int roiw,
int roih, int bits, int bayer, int blc_r, int blc_gr,
int blc_gb, int blc_b, uint16_t* R, uint16_t* Gr,
uint16_t*Gb, uint16_t* B, uint16_t* R_G, uint16_t* B_G,
uint16_t* Gr_Gb)
【输入信息】
| 参数名 | 描述 |
|---|---|
| RawAddr | 产线上当前模组拍摄的 raw 图像数据 |
| width | raw 图像宽度 |
| height | raw 图像高度 |
| bits | 每像素位数。10bit=10 |
| roiw | ROI 区域宽度与图像宽度之比的倒数 |
| roih | ROI 区域高度与图像高度之比的倒数 |
| bayer | Raw 图像 Bayer 模式。BGGR=0,GBRG=1,GRBG=2,RGGB=3 |
| blc_r | R 通道 BLC |
| blc_gr | Gr 通道 BLC |
| blc_gb | Gb 通道 BLC |
| blc_b | B 通道 BLC |
【输出信息】
| 参数名 | 描述 |
|---|---|
| R | ROI 区域 R 通道均值 |
| Gr | ROI 区域 Gr 通道均值 |
| Gb | ROI 区域 Gb 通道均值 |
| B | ROI 区域 B 通道均值 |
| R_G | ROI 内 R 通道均值与 Gb 通道均值之比 *1024 |
| B_G | ROI 内 B 通道均值与 Gb 通道均值之比 *1024 |
| Gr_Gb | ROI 内 Gr 通道均值与 Gb 通道均值之比 *1024 |
【返回值】
=0:参数错误
=1:校准成功
3.2 LSC 校准
3.2.1 LSC 校准
【功能说明】
此函数计算 raw 图像各通道增益。
【函数原型】
bool lsc_otp_Calibrate(int vig,uint16_t* RawAddr, int width, int height,
int bits, int bayer, int blc_r, int blc_gr,
int blc_gb, int blc_b, float ratio, uint16_t* lsc_otp)
【输入信息】
| 参数名 | 描述 |
|---|---|
| vig | LSC 校正强度,默认 vig=70 (%) |
| RawAddr | 产线上当前模组拍摄的 raw 图像数据 |
| width | raw 图像宽度 |
| height | raw 图像高度 |
| bits | 每像素位数。10bit=10 |
| bayer | Raw 图像 Bayer 模式。BGGR=0,GBRG=1,GRBG=2,RGGB=3 |
| blc_r | R 通道 BLC |
| blc_gr | Gr 通道 BLC |
| blc_gb | Gb 通道 BLC |
| blc_b | B 通道 BLC |
| ratio | 衡量周边暗角是否对称的阈值,建议 ratio=1.5 |
【输出信息】
| 参数名 | 描述 |
|---|---|
| lsc_otp | LSC 增益:R、Gr、Gb、B 通道各为 17 * 17 |
【返回值】
=0:LSC 校准数据异常,暗角异常。
=1:校准成功
3.2.2 LSC 验证
【功能说明】
此函数验证 LSC 校准结果。
【函数原型】
bool lsc_otp_verify(uint16_t *RawAddr, int width, int height, int bits,
int bayer, int blc_r, int blc_gr, int blc_gb,
int blc_b, uint16_t *lsc_otp, int Ydiffer_down,
int Ydiffer_up, int ColorShading_down,
int ColorShading_up, float *fYdiffer,
float *fRGCorner,float *fBGCorner)
【输入信息】
| 参数名 | 描述 |
|---|---|
| RawAddr | 产线上当前模组拍摄的 raw 图像数据 |
| width | raw 图像宽度 |
| height | raw 图像高度 |
| bits | 每像素位数。10bit=10 |
| bayer | Raw 图像 Bayer 模式。BGGR=0,GBRG=1,GRBG=2,RGGB=3 |
| blc_r | R 通道 BLC |
| blc_gr | Gr 通道 BLC |
| blc_gb | Gb 通道 BLC |
| blc_b | B 通道 BLC |
| lsc_otp | 由 lsc_otp_Calibrate 计算输出的 lsc_otp |
| Ydiffer_down | 校准控制指标 YShading_Corner_Max - YShading_Corner_Min 的下限,以百分比表示 |
| Ydiffer_up | 校准控制指标 YShading_Corner_Max - YShading_Corner_Min 的上限,以百分比表示 |
| ColorShading_down | 校准控制指标 abs((R/G_Corner)/(R/G_Center)-1)、abs((B/G_Corner)/(B/G_Center)-1) 的下限,以百分比表示 |
| ColorShading_up | 校准控制指标 abs((R/G_Corner)/(R/G_Center)-1)、abs((B/G_Corner)/(B/G_Center)-1) 的上限,以百分比表示 |
【输出信息】
| 参数名 | 描述 |
|---|---|
| fYdiffer | YShading_Corner_Max - YShading_Corner_Min 的值 |
| fRGCorner | 各块 abs((R/G_Corner)/(R/G_Center)-1) 的值,共 5 x 5 块 |
| fBGCorner | 各块 abs((B/G_Corner)/(B/G_Center)-1) 的值,共 5 x 5 块 |
【返回值】
=0:不满足校准后的管控指标,验证失败。
=1:验证成功
3.3 PDAF 校准
3.3.1 获取传感器配置
【功能说明】
配置 sensor.ini,从该文件获取 PD 传感器信息。
【配置内容】
[sensor config]
| 关键字 | 描述 |
|---|---|
| RAW_WIDTH | Raw 图像宽度 |
| RAW_HEIGHT | Raw 图像高度 |
| RAW_BITS | 像素值位宽 |
| RAW_BLACK_LEVEL | 黑电平值 |
| RAW_BAYER_PATTERN | Raw 图像 Bayer 排列。0:BGGR,1:GBRG,2:GRBG,3:RGGB |
| SENSOR_TYPE | 0:shieldPD 或 1x2OCL;1:水平和垂直 (LR&TB);2:保留;3:保留 |
| PD_DUAL_MODE | 0:非 dual;1:dual PD |
| PD_BINNING_TYPE | 使用 binning PD 校准;0:OFF;1:ON |
| MIPI_MIX_MODE | 0:数据仅含 raw 或 PD;1:数据同时包含 raw 和 PD。仅在 PD_DUAL_MODE=1 时有效。 |
| PD_OFFSET_X | PD 块的 x 偏移 |
| PD_OFFSET_Y | PD 块的 y 偏移 |
| PD_PITCH_X | PD 块的 x 间距 |
| PD_PITCH_Y | PD 块的 y 间距 |
| PD_DENSITY_X | 一对 L/R PD 像素的 x 间隔 |
| PD_DENSITY_Y | 一对 L/R PD 像素的 y 间隔 |
| PD_BLOCK_NUM_X | 沿 x 方向的 PD 块总数 |
| PD_BLOCK_NUM_Y | 沿 y 方向的 PD 块总数 |
| CALB_S_LEVEL | 饱和级别,默认 100 |
| CALB_S_CNT | 饱和计数,默认 10 |
| PD_POS_L | 一个 PD 块内 L PD 像素的位置 |
| PD_POS_R | 一个 PD 块内 R PD 像素的位置 |
dual 类型
[sensor config]
| 关键字 | 描述 |
|---|---|
| RAW_WIDTH | Raw 图像宽度 |
| RAW_HEIGHT | Raw 图像高度 |
| LR_WIDTH | PD 图像宽度 |
| LR_HEIGHT | PD 图像高度 |
| RAW_BITS | 像素值位宽 |
| RAW_BLACK_LEVEL | 黑电平值 |
| RAW_BAYER_PATTERN | Raw 图像 Bayer 排列。0:BGGR,1:GBRG,2:GRBG,3:RGGB |
| SENSOR_TYPE | 0:shieldPD 或 1x2OCL;1:水平和垂直 (LR&TB);2:保留;3:保留 |
| PD_DUAL_MODE | 0:非 dual;1:dual PD |
| PD_BINNING_TYPE | 使用 binning PD 校准;0:OFF;1:ON |
| MIPI_MIX_MODE | 0:数据仅含 raw 或 PD;1:数据同时包含 raw 和 PD。仅在 PD_DUAL_MODE=1 时有效。 |
| PD_OFFSET_X | PD 块的 x 偏移 |
| PD_OFFSET_Y | PD 块的 y 偏移 |
| PD_PITCH_X | PD 块的 x 间距 |
| PD_PITCH_Y | PD 块的 y 间距 |
| PD_DENSITY_X | 一对 L/R PD 像素的 x 间隔 |
| PD_DENSITY_Y | 一对 L/R PD 像素的 y 间隔 |
| PD_BLOCK_NUM_X | 沿 x 方向的 PD 块总数 |
| PD_BLOCK_NUM_Y | 沿 y 方向的 PD 块总数 |
| CALB_S_LEVEL | 饱和级别,默认 100 |
| CALB_S_CNT | 饱和计数,默认 10 |
| PD_POS_L | 一个 PD 块内 L PD 像素的位置 |
| PD_POS_R | 一个 PD 块内 R PD 像素的位置 |
[Gainmap_Calib]
| 关键字 | 描述 |
|---|---|
| GAINMAP_BLKSZ_W | 一个 gainmap 块的宽度 |
| GAINMAP_BLKSZ_H | 一个 gainmap 块的高度 |
| GAIN_CALIB_INPUT_MAX | 输入 raw 图像级别上限:920(raw10) |
| GAIN_CALIB_INPUT_MIN | 输入 raw 图像级别下限:800(raw10) |
| GAIN_VERIFY_DIFF_MAX | 增益处理后的 L/R 差异级别 (5%*1024) |
| CROSS_VER | 使用其他图像验证 gainmap |
[DCCmap_Calib]
| 关键字 | 描述 |
|---|---|
| DCCMAP_BLKSZ_W | 一个 dccmap 块的宽度 |
| DCCMAP_BLKSZ_H | 一个 dccmap 块的高度 |
| DCC_CALIBRATE_MODE | DCC 校准模式,默认 1 |
| DCC_LENS_BEGIN | 采样起始码值位置 |
| DCC_LENS_END | 采样结束码值位置 |
| DCC_LENS_INTERVAL | 采样码值间隔 |
| DCC_RSQ_THRESHOLD | RSQ 矩阵阈值 |
| DCC_BORDER_RSQ_THRESHOLD | RSQ 边界矩阵阈值 |
| DCC_BAD_RSQ_NUM_RATIO | 不合格 RSQ 矩阵数量的比例 |
| DCC_CALIB_INPUT_MAX | 输入 raw 图像级别上限:640(raw10) 或 160(raw8) |
| DCC_CALIB_INPUT_MIN | 输入 raw 图像级别下限:340(raw10) 或 85(raw8) |
| DCC_CALIB_PD_RANGE | 像素视差搜索半径 |
| DCC_VERIFY_CAF_DIFF_MAX | DAC 范围阈值 (%) |
| DCC_VERIFY_CAF_DIFF_DET | DAC 范围的 delta(DAC) |
| CALIB_TARGET_PEAK_OFFSET_LOG | 将 FV 峰值信息保存至 PDAFFVLog.txt。1:ON,0:OFF |
| CALIB_TARGET_PEAK_OFFSET | FV 峰值判据中的 PD 目标偏移,默认 0 |
| DCC_PERCENT_ROI_W | 测试图像 ROI 宽度 |
| DCC_PERCENT_ROI_H | 测试图像 ROI 高度 |
| DCC_SHARPNESS_MODE | 清晰度计算模式,默认 1 |
| DCC_SHARPNESS_CHL | 清晰度计算通道:0:origin raw;1:red;2:green(默认);3:blue;4:demosaic |
[optional params]
| 关键字 | 描述 |
|---|---|
| QUALITY_VERIFY_ENABLE | 启用 gainmap 校准质量测试 |
| QUALTI_LRDiff_L_MIN | L/R 差异判据 (block1,2,3) |
| QUALTI_LRDiff_L_MAX | L/R 差异判据 (block1,2,3) |
| QUALTI_LRDiff_C_MIN | L/R 差异判据 (block4,5,6) |
| QUALTI_LRDiff_C_MAX | L/R 差异判据 (block4,5,6) |
| QUALTI_LRDiff_R_MIN | L/R 差异判据 (block7,8,9) |
| QUALTI_LRDiff_R_MAX | L/R 差异判据 (block7,8,9) |
| QUALITY_SENSITIVITY_MIN | 灵敏度判据 |
【示例】
以 IMX258 的 PD 像素分布为例,如图:

英文原稿技术图, PDF p.30.
根据图示,sensor.ini 内容如下:
[sensor config]
RAW_WIDTH =4208
RAW_HEIGHT =3120
RAW_BITS =12
RAW_BLACK_LEVEL =64
RAW_BAYER_PATTERN =0
SENSOR_TYPE=0
PD_DUAL_MODE=0
PD_BINNING_TYPE=0
PD_OFFSET_X =24
PD_OFFSET_Y =24
PD_PITCH_X =32
PD_PITCH_Y =32
PD_DENSITY_X =16
PD_DENSITY_Y =16
PD_BLOCK_NUM_X =130
PD_BLOCK_NUM_Y =96
CALB_S_LEVEL=1000
CALB_S_CNT=10
PD_POS_L=
[26 29]
[42 29]
[33 48]
[49 48]; #end with a ";"
PD_POS_R=
[25 32]
[41 32]
[34 45]
[50 45]; #end with a ";"
[Gainmap_Calib]
GAINMAP_BLKSZ_W=16
GAINMAP_BLKSZ_H=16
GAIN_CALIB_INPUT_MAX=920
GAIN_CALIB_INPUT_MIN=800
GAIN_VERIFY_DIFF_MAX=5
CROSS_VER=1
[DCCmap_Calib]
DCCMAP_BLKSZ_W=32
DCCMAP_BLKSZ_H=32
DCC_CALIBRATE_MODE=1
DCC_LENS_BEGIN=0
DCC_LENS_END=64
DCC_LENS_INTERVAL=8
DCC_RSQ_THRESHOLD=0.985
DCC_BORDER_RSQ_THRESHOLD=0.97
DCC_BAD_RSQ_NUM_RATIO=0.05
DCC_CALIB_INPUT_MAX=640
DCC_CALIB_INPUT_MIN=340
DCC_VERIFY_CAF_DIFF_MAX=10
DCC_VERIFY_CAF_DIFF_DET=2
CALIB_TARGET_PEAK_OFFSET_LOG=0
CALIB_TARGET_PEAK_OFFSET=0
DCC_PERCENT_ROI_W=0.4
DCC_PERCENT_ROI_H=0.4
DCC_SHARPNESS_MODE=1
DCC_SHARPNESS_CHL=1
[optional params]
QUALITY_VERIFY_ENABLE=1
QUALTI_LRDiff_L_MIN=0.4
QUALTI_LRDiff_L_MAX=2.5
QUALTI_LRDiff_C_MIN=0.55
QUALTI_LRDiff_C_MAX=1.8
QUALTI_LRDiff_R_MIN=0.4
QUALTI_LRDiff_R_MAX=2.5
QUALITY_SENSITIVITY_MIN=0.45
【函数原型】
bool pdaf_initial(char* filename, sensor_cfg* psensor_cfg)
【输入信息】
| 参数名 | 描述 |
|---|---|
| filename | Sensor.ini 文件的完整路径 |
【输出信息】
| 参数名 | 描述 |
|---|---|
| psensor_cfg | 保存 sensor.ini 内容的结构体指针 |
【返回值】
=0:获取 sensor.ini 失败。
=1:成功获取 sensor.ini。
3.3.2 Gain Map 校准
【功能说明】
此函数用于 PDAF gain map 的标定。
【函数原型】
bool pdaf_gainmap_calibration(uint16_t *RawAddr, sensor_cfg* psensor_cfg,
uint16_t *gainmap_lut,int* gainmap_width,
int* gainmap_height)
【输入信息】
| 参数名 | 描述 |
|---|---|
| RawAddr | 产线上当前模组拍摄的 raw 图像数据 |
| psensor_cfg | 保存 sensor.ini 内容的结构体指针 |
【输出信息】
| 参数名 | 描述 |
|---|---|
| gainmap_lut | 校准后的 gain map |
| gainmap_width | 所得 gain map 宽度 |
| gainmap_height | 校准所得 gain map 高度 |
【返回值】
=0:参数错误
=1:校准成功
3.3.3 Gain Map 验证
【功能说明】
此函数验证已校准 gain map 是否满足要求。
【函数原型】
bool pdaf_gainmap_vertification(uint16_t *RawAddr, sensor_cfg* psensor_cfg,
uint16_t *gainmap_lut)
【输入信息】
| 参数名 | 描述 |
|---|---|
| RawAddr | 产线上当前模组拍摄的 raw 图像数据 |
| psensor_cfg | 保存 sensor.ini 内容的结构体指针 |
| gainmap_lut | 由 pdaf_gainmap_calibration 得到的 gain map |
【返回值】
=0:验证失败,所用 gainmap 不满足要求。
=1:验证成功
3.3.4 DCC Map 校准
【功能说明】
此函数用于 PDAF DCC MAP 校准。
【函数原型】
bool pdaf_dccmap_calibration(uint16_t *RawAddrAll , sensor_cfg* psensor_cfg,
uint16_t *gainmap_lut, uint16_t *dccmap_lut,
int* dccmap_width,int* dccmap_height,
uint8_t* dccSign,wchar_t*pd_offset)
【输入信息】
| 参数名 | 描述 |
|---|---|
| RawAddrAll | 在各马达位置采集的平均图像数据序列 |
| psensor_cfg | 保存 sensor.ini 内容的结构体指针 |
| gainmap_lut | 由 pdaf_gainmap_calibration 得到的 gain map |
【输出信息】
| 参数名 | 描述 |
|---|---|
| dccmap_lut | 所得 DCC MAP |
| dccmap_width | 所得 DCC map 宽度 |
| dccmap_height | 所得 DCC MAP 高度 |
| dccSign | 校准得到的 DCC MAP 方向 |
| pd_offset | 校准得到的 pd_offset |
【返回值】
=0:校准失败。
=1:校准成功
3.3.5 DCC Map 验证
验证 dcc map 是否满足要求,包括 pdaf_dccmap_vertification() 和 pdaf_calc_sharpness() 两个接口。
【功能说明】
使用已校准 dcc map 获取失焦图像的理想清晰位置 DAC1。
【函数原型】
uint16_t pdaf_dccmap_vertification(uint16_t *RawAddr, sensor_cfg* psensor_cfg,
int cur_pos_id, uint16_t *gainmap_lut,
uint16_t *dccmap_lut, uint8_t dccSign, wchar_t
*pd_offset)
【输入信息】
| 参数名 | 描述 |
|---|---|
| RawAddr | 所拍摄模糊图像的平均图像数据 |
| psensor_cfg | 保存 sensor.ini 内容的结构体指针 |
| cur_pos_id | 拍摄模糊图像时的当前马达位置 |
| gainmap_lut | 由 pdaf_gainmap_calibration 校准的 gain map |
| dccmap_lut | 由 pdaf_dccmap_calibration 校准的 dcc map |
| dccSign | 由 pdaf_dccmap_calibration 校准的 dccSign |
| pd_offset | 由 pdaf_dccmap_calibration 校准得到的 pd_offset |
【返回值】
失焦图像达到理想清晰对焦时的马达位置 DAC1。
【功能说明】
在 DAC1 前后 DCC_VERIFY_CAF_DIFF_MAX*abs(DACinf-DACmacro)+DCC_VERIFY_CAF_DIFF_DET 范围内计算图像中心区域清晰度,判断是否有峰值。
【函数原型】
bool pdaf_calc_sharpness(uint16_t *RawAddrAll, int img_num, sensor_cfg*
psensor_cfg)
【输入信息】
| 参数名 | 描述 |
|---|---|
| RawAddrAll | DAC1 前后 valid_toerance*abs (DACinf-DACmacro)+2 范围内的平均图像数据序列 |
| img_num | RawAddrAll 中包含的图像数 |
| psensor_cfg | 保存 sensor.ini 内容的结构体指针 |
【返回值】
=0:没有找到清晰度峰值,验证失败。
=1:验证成功
4. 附录
4.1 OTP 应用示例代码
#include <iostream>
#include "RKOTPDLL.h"
#include <stdlib.h>
int main()
{
int ret = 0;
#LSC AWB Otp Calibration
ret =lsc_awbtest();
#Pdaf Otp Calibration
uint16_t gainmap[30*30 * 2];
uint16_t dccmap[20 * 20 * 2];
uint16_t code = 0;
int gainmap_width = 0;
int gainmap_height = 0;
int dccmap_width = 0;
int dccmap_height = 0;
uint8_t dcc_Sign = 0;
wchar_t pd_offset=0xffff;
int curpos = 864;
sensor_cfg sensor_param;
if (pdaf_initial("D:\\testdll\\testdll\\sensor_ov16A10.ini", &sensor_param))
{
if (gainmaptest(&sensor_param, gainmap,&gainmap_width,&gainmap_height))
{
if (dccmaptest(&sensor_param, gainmap, dccmap, curpos, &code,
&dccmap_width, &dccmap_height, &dcc_Sign,&pd_offset))
{
ret = dcc_calc_sharpness(&sensor_param);
}
}
}
}
bool lsc_awbtest()
{
int vig=70;
int height = 1944;
int width = 2592;
int bits =10;#10bit
int bayer =0;#BGGR
int roiw =5;#1/5 width
int roih =5;#1/5 height
int blc[4]={ 64, 64, 64, 64};
uint16_t lsctable[17*17*4];
uint16_t awb[3];
uint16_t Rave =0;
uint16_t Grave =0;
uint16_t Gbave =0;
uint16_t Bave =0;
int Ydiffer_down =0;#%
int Ydiffer_up =5;#%
int ColorShading_down =0;#%
int ColorShading_up =5;#%
float Ydiffer = 0;
float RGconer[25];
float BGconer[25];
bool ret =0;
uint16_t *Rawdata = NULL;
Rawdata = (uint16_t*)malloc(width * height * 2);
memset(Rawdata, 0, sizeof(uint16_t)* width * height);
FILE *fp = NULL;
fp = fopen("input.raw", "rb");
if (fp == NULL)
{
return false;
}
fread(Rawdata, 1, height * width * 2, fp);
fclose(fp);
ret =lsc_otp_Calibrate(vig,Rawdata, width, height, bits, bayer, blc[0],
blc[1],blc[2], blc[3],lsctable);
ret = awb_otp_Calibrate(Rawdata, width, height,roiw,roih, bits, bayer,
blc[0], blc[1],blc[2], blc[3],&Rave,&Grave,&Gbave,&Bave, &awb[0], &awb[1],
&awb[2]);
ret = lsc_otp_verify(Rawdata, width, height, bits, bayer, blc[0], blc[1],
blc[2], blc[3], lsctable, Ydiffer_down, Ydiffer_up, ColorShading_down,
ColorShading_up, &Ydiffer, RGconer, BGconer);
if(!ret)
{
return false; #The calibrated data does not meet the control standards and the verification fails.
}
if(Rawdata!=NULL)
{
free (Rawdata);
Rawdata =NULL;
}
return ret;
}
int gainmaptest(sensor_cfg* psensor_cfg, uint16_t *gainmap_lut,int *
gainmap_width, int *gainmap_height)
{
int ret = 0;
int height = psensor_cfg->height;
int width = psensor_cfg->width;
uint16_t maxval = (1 << psensor_cfg->bits) - 1;
int gainmapfilenum = 3;
int over_exp_cnt = 0;
if (psensor_cfg->pd_dual_mode && psensor_cfg->mipi_mix_mode)
{
height = psensor_cfg->height + (psensor_cfg->sensor_type+1)*psensor_cfg->pd_height;
}
uint16_t *ave_pixelbuf = NULL;
ave_pixelbuf = (uint16_t*)malloc(width * height * 2);
memset(ave_pixelbuf, 0, sizeof(uint16_t)* width * height);
uint16_t *sum_pixelbuf = NULL;
sum_pixelbuf = (uint16_t*)malloc(width * height * 2);
memset(sum_pixelbuf, 0, sizeof(uint16_t)* width * height);
uint16_t *pixelbuf = NULL;
pixelbuf = (uint16_t*)malloc(width * height * 2);
memset(pixelbuf, 0, sizeof(uint16_t)* width * height);
FILE *fp = NULL;
char prename[20] = "gainRAW";
char endname[5] = ".raw";
for (int i = 0; i < gainmapfilenum; i++)
{
char temp[20];
char id[5];
int idint = i + 1;
strcpy(temp, prename);
_itoa_s(idint, id, 10);
strcat(temp, id);
strcat(temp, endname);
fp = fopen(temp, "rb");
if (fp == NULL)
{
return false;
}
fread(pixelbuf, 1, height * width * 2, fp);
fclose(fp);
for (int j = 0; j < height; j++)
{
for (int i = 0; i < width; i++)
{
uint32_t tempbuf = *(pixelbuf + j*width + i);
*(sum_pixelbuf + j*width + i) = tempbuf + *(sum_pixelbuf +
j*width + i);
if (tempbuf >= maxval)
over_exp_cnt++;
}
}
}
for (int j = 0; j < height; j++)
{
for (int i = 0; i < width; i++)
{
*(ave_pixelbuf + j*width + i) = *(sum_pixelbuf + j*width + i) /
gainmapfilenum;
}
}
ret = pdaf_gainmap_calibration(ave_pixelbuf, psensor_cfg, gainmap_lut,
gainmap_width,gainmap_height);
ret = pdaf_gainmap_vertification(ave_pixelbuf, psensor_cfg, gainmap_lut);
if(ret == -1)
printf("gainmap image OVER exposure!!!");
if (ave_pixelbuf!=NULL)
{
free(ave_pixelbuf);
ave_pixelbuf = NULL;
}
if (pixelbuf != NULL)
{
free(pixelbuf);
pixelbuf = NULL;
}
if (sum_pixelbuf != NULL)
{
free(sum_pixelbuf);
sum_pixelbuf = NULL;
}
return ret;
}
bool dccmaptest(sensor_cfg* psensor_cfg, uint16_t *gainmap_lut, uint16_t
*dccmap_lut, int curpos , uint16_t *code, int *dccmap_width, int *dccmap_height,
uint8_t *dcc_Sign,wchar_t *pdaf_offset)
{
int ret = 0;
int lens_begin = 0;
int lens_end = 64;
int lens_interval = 8;
int height = psensor_cfg->height;
int width = psensor_cfg->width;
int lensnum = (lens_end - lens_begin) / lens_interval + 1;
if (psensor_cfg->pd_dual_mode && psensor_cfg->mipi_mix_mode)
{
height = psensor_cfg->height + (psensor_cfg->sensor_type +
1)*psensor_cfg->pd_height;
}
uint16_t *ave_pixelbuf = NULL;
ave_pixelbuf = (uint16_t*)malloc(width * height * 2);
memset(ave_pixelbuf, 0, sizeof(uint16_t)* width * height);
uint16_t *Rawdata = NULL;
Rawdata = (uint16_t*)malloc(width * height * 2 * lensnum);
memset(Rawdata, 0, sizeof(uint16_t)* width * height* lensnum);
uint16_t *pixelbuf= NULL;
pixelbuf = (uint16_t*)malloc(width * height * 2);
memset(pixelbuf, 0, sizeof(uint16_t)* width * height);
FILE *fp = NULL;
char prename[20] = "dccRAW";
char endname[5] = ".raw";
for (int a = 0;a <lensnum;a++)
{
char temp[20];
char id[5] ;
int id1 = a + 1;
strcpy(temp,prename);
_itoa_s(id1, id, 10);
strcat(temp, id);
for (int b = 0; b < 3;b++)
{
char name[20];
strcpy(name, temp);
int id2 = b + 1;
_itoa_s(id2, id, 10);
strcat(name, id);
strcat(name, endname);
fp = fopen(name, "rb");
if (fp == NULL)
{
return false;
}
fread(pixelbuf, 1, height * width * 2, fp);
fclose(fp);
for (int j = 0; j < height; j++)
{
for (int i = 0; i < width; i++)
{
uint16_t tempbuf = *(ave_pixelbuf + j*width + i);
*(ave_pixelbuf + j*width + i) = tempbuf + *(pixelbuf +
j*width + i) / 3;
}
}
}
memcpy(Rawdata + a*height * width, ave_pixelbuf, sizeof(uint16_t)*height
* width);
memset(ave_pixelbuf, 0, sizeof(uint16_t)* width * height);
}
ret = pdaf_dccmap_calibration(Rawdata, psensor_cfg, gainmap_lut, dccmap_lut,
dccmap_width, dccmap_height, dcc_Sign,pd_offset);
memset(pixelbuf, 0, sizeof(uint16_t)* width * height);
memset(ave_pixelbuf, 0, sizeof(uint16_t)* width * height);
char prename1[20] = "image";
for (int i = 0; i < 3; i++)
{
char temp[20];
char id[5];
int idint = i + 1;
strcpy(temp, prename1);
_itoa_s(idint, id, 10);
strcat(temp, id);
strcat(temp, endname);
fp = fopen(temp, "rb");
if (fp == NULL)
{
return false;
}
fread(pixelbuf, 1, height * width * 2, fp);
fclose(fp);
for (int j = 0; j < height; j++)
{
for (int i = 0; i < width; i++)
{
uint16_t tempbuf = *(ave_pixelbuf + j*width + i);
*(ave_pixelbuf + j*width + i) = tempbuf + *(pixelbuf + j*width +
i) / 3;
}
}
}
*code = pdaf_dccmap_vertification(ave_pixelbuf, psensor_cfg, curpos,
gainmap_lut, dccmap_lut, *dcc_Sign,pd_offset);
if (ave_pixelbuf != NULL)
{
free(ave_pixelbuf);
ave_pixelbuf = NULL;
}
if (pixelbuf != NULL)
{
free(pixelbuf);
pixelbuf = NULL;
}
if (Rawdata != NULL)
{
free(Rawdata);
Rawdata = NULL;
}
return ret;
}
bool dcc_calc_sharpness(sensor_cfg* psensor_cfg)
{
int height = psensor_cfg->height;
int width = psensor_cfg->width;
int imgnum = 5;
if (psensor_cfg->pd_dual_mode && psensor_cfg->mipi_mix_mode)
{
height = psensor_cfg->height + (psensor_cfg->sensor_type +
1)*psensor_cfg->pd_height;
}
uint16_t *Rawdata = NULL;
Rawdata = (uint16_t*)malloc(width * height * 2 * imgnum);
memset(Rawdata, 0, sizeof(uint16_t)* width * height* imgnum);
uint16_t *pixelbuf = NULL;
pixelbuf = (uint16_t*)malloc(width * height * 2);
memset(pixelbuf, 0, sizeof(uint16_t)* width * height);
FILE *fp = NULL;
char prename[20] = "calimage";
char endname[5] = ".raw";
for (int i = 0; i < imgnum; i++)
{
char temp[20];
char id[5];
int idint = i + 1;
strcpy(temp, prename);
_itoa_s(idint, id, 10);
strcat(temp, id);
strcat(temp, endname);
fp = fopen(temp, "rb");
if (fp == NULL)
{
return false;
}
fread(pixelbuf, 1, height * width * 2, fp);
fclose(fp);
memcpy(Rawdata + i*height * width, pixelbuf, sizeof(uint16_t)*height *
width);
}
bool ret=pdaf_calc_sharpness(Rawdata, imgnum, psensor_cfg);
if (pixelbuf != NULL)
{
free(pixelbuf);
pixelbuf = NULL;
}
if (Rawdata != NULL)
{
free(Rawdata);
Rawdata = NULL;
}
return ret;
}
4.2 烧录封装数据格式
如下表,可按需烧录指定块,但不能更改块 ID;所需块烧录完成后还需烧录结束值 0xff。
| 长度(Byte) | 数据项 | 说明 |
|---|---|---|
| 8 | 标志 | ROCKCHIP |
| 1 | ID | ID=0,传感器信息 |
| 4 | 大小 | 块数据大小 |
| 块数据 | ||
| 1 | ID | ID=1,AWB 校准 |
| 4 | 大小 | 块数据大小 |
| 块数据 | ||
| 1 | ID | ID=2,LSC 校准 |
| 4 | 大小 | 块数据大小 |
| 块数据 | ||
| 1 | ID | ID=3,PDAF 校准 |
| 4 | 大小 | 块数据大小 |
| 块数据 | ||
| 1 | ID | ID=4,AF 码值 |
| 4 | 大小 | 块数据大小 |
| 块数据 | ||
| 1 | ID | ID=5,QSC |
| 4 | 大小 | 块数据大小 |
| 块数据 | ||
| … | … | … |
| 1 | 0xFF | 结束标志 |
各块具体内容如下。多字节数据统一采用大端模式:高字节存低地址,低字节存高地址。
| 偏移地址 | 长度(Byte) | 数据项 | 说明 |
|---|---|---|---|
| 0x0000 | 8 | 标志 | ROCKCHIP |
| 0x0008 | 1 | ID | ID=0,传感器信息 |
| 0x0009 | 4 | 大小 | Size=35 |
| 0x000D | 2 | 版本 | Sensor Info 版本:v1.0.8=0x0108 |
| 0x000F | 1 | 供应商 ID | 用户指定 |
| 0x0010 | 1 | 日期:年 | 例如 2021 年写 21 |
| 0x0011 | 1 | 日期:月 | 例如 7 月写 7 |
| 0x0012 | 1 | 日期:日 | 例如 12 日写 12 |
| 0x0013 | 1 | Sensor ID | 用户指定 |
| 0x0014 | 1 | Lens ID | 用户指定 |
| 0x0015 | 1 | VCM ID | 用户指定 |
| 0x0016 | 1 | Driver ID | 用户指定 |
| 0x0017 | 4 | Module ID | 用户指定 |
| 0x001B | 1 | mirror/flip | Bit[7:4]:Mirror(镜像);Bit[3:0]:Flip(翻转);ON: 1,OFF: 0 |
| 0x001C | 1 | Full Width H | 全尺寸宽度高字节 |
| 0x001D | 1 | Full Width L | 全尺寸宽度低字节 |
| 0x001E | 1 | Full Height H | 全尺寸高度高字节 |
| 0x001F | 1 | Full Height L | 全尺寸高度低字节 |
| 0x0020 | 15 | 保留 | Reserved=0xff |
| 0x002F | 1 | 校验和 | Sensor Info 校验和;Sum(0x0009~0x002E) % 255+1 |
| 偏移地址 | 长度(Byte) | 数据项 | 说明 |
|---|---|---|---|
| 0x0000 | 1 | ID | ID=1,AWB 校准 |
| 0x0001 | 4 | 大小 | Size=43 |
| 0x0005 | 2 | 版本 | AWB 版本:v1.0.9=0x0109 |
| 0x0007 | 1 | R/G_H | 当前 R/G 高字节 |
| 0x0008 | 1 | R/G_L | 当前 R/G 低字节 |
| 0x0009 | 1 | B/G_H | 当前 B/G 高字节 |
| 0x000A | 1 | B/G_L | 当前 B/G 低字节 |
| 0x000B | 1 | Gr/Gb_H | 当前 Gr/Gb 高字节 |
| 0x000C | 1 | Gr/Gb_L | 当前 Gr/Gb 低字节 |
| 0x000D | 1 | R/G_H | Golden 参考 R/G 高字节 |
| 0x000E | 1 | R/G_L | Golden 参考 R/G 低字节 |
| 0x000F | 1 | B/G_H | Golden 参考 B/G 高字节 |
| 0x0010 | 1 | B/G_L | Golden 参考 B/G 低字节 |
| 0x0011 | 1 | Gr/Gb_H | Golden 参考 Gr/Gb 高字节 |
| 0x0012 | 1 | Gr/Gb_L | Golden 参考 Gr/Gb 低字节 |
| 0x0013 | 28 | 保留 | Reserved=0xff |
| 0x002F | 1 | 校验和 | AWB Calibration 校验和;Sum(0x0001~0x002E) % 255+1 |
| 偏移地址 | 长度(Byte) | 数据项 | 说明 |
|---|---|---|---|
| 0x0000 | 1 | ID | ID=2,LSC 校准 |
| 0x0001 | 4 | 大小 | Size=2347 |
| 0x0005 | 2 | 版本 | LSC 版本:v1.0.b=0x010b |
| 0x0007 | 2312 | LSC 校准数据 | 17x17x4 矩阵,定点到 1024,非压缩封装,大端存储;通道顺序 R、Gr、Gb、B |
| 0x090F | 32 | 保留 | Reserved=0xff |
| 0x092F | 1 | 校验和 | LSC Calibration 校验和;Sum(0x0001~0x092E) % 255+1 |
| 偏移地址 | 长度(Byte) | 数据项 | 说明 |
|---|---|---|---|
| 0x0000 | 1 | ID | ID=3,PDAF 校准 |
| 0x0001 | 4 | 大小 | Size=2603 |
| 0x0005 | 2 | 版本 | PDAF 版本:v1.1.12=0x011c |
| 0x0007 | 1 | Gainmap_width | Gainmap 尺寸,由 pdaf_gainmap_calibration() 得到 |
| 0x0008 | 1 | Gainmap_height | Gainmap 尺寸,由 pdaf_gainmap_calibration() 得到 |
| 0x0009 | 2048 | Gainmap | 实际大小=Gainmap_width* Gainmap_height*2,大端,默认值 0xff |
| 0x0809 | 1 | 校验和 | Gainmap 校验和;Sum(0x0007~0x00808) % 255+1 |
| 0x080A | 1 | 模式值 | DCC Map 拟合模式(本版本默认 1),与 PD ini 中的 DCC_CALIBRATE_MODE 一致 |
| 0x080B | 1 | 方向 | 由 pdaf_dccmap_calibration() 得到 dccSign;0:负;1:正 |
| 0x080C | 1 | DCCmap_width | DCCmap 尺寸,由 pdaf_dccmap_calibration() 得到 |
| 0x080D | 1 | DCCmap_height | DCCmap 尺寸,由 pdaf_dccmap_calibration() 得到 |
| 0x080E | 512 | Dccmap | 实际大小=DCCmap_width* DCCmap_height*2,大端,默认值 0xff |
| 0x0A0E | 1 | 校验和 | DCCmap 校验和;Sum(0x080A~0x0A0D) % 255+1 |
| 0x0A0F | 2 | pd_offset | flag(1)sign(1)reserve(2)integer(4)8fix_decimals(8),flag=0:校准;sign=1:正 |
| 0x0A11 | 30 | 保留 | Reserved=0xff |
| 0x0A2F | 1 | 校验和 | PDAF Calibration 校验和;Sum(0x0001~0x0A2E) % 255+1 |
| 偏移地址 | 长度(Byte) | 数据项 | 说明 |
|---|---|---|---|
| 0x0000 | 1 | ID | ID=4,AF 码值 |
| 0x0001 | 4 | 大小 | Size=27 |
| 0x0005 | 2 | 版本 | AF 版本:v1.0.9=0x0109 |
| 0x0007 | 1 | AF Infinite H | AF 远焦码值高位 |
| 0x0008 | 1 | AF Infinite L | AF 远焦码值低位 |
| 0x0009 | 1 | AF Macro H | AF 近焦码值高位 |
| 0x000A | 1 | AF Macro L | AF 近焦码值低位 |
| 0x000B | 1 | AF_Medium H | AF 中焦码值高位 |
| 0x000C | 1 | AF_Medium L | AF 中焦码值低位 |
| 0x000D | 18 | 保留 | Reserved=0xff |
| 0x001F | 1 | 校验和 | AF Code 校验和;Sum(0x0001~0x001E) % 255+1 |
| 偏移地址 | 长度(Byte) | 数据项 | 说明 |
|---|---|---|---|
| 0x0000 | 1 | ID | ID=5,QSC |
| 0x0001 | 4 | 大小 | Size=4107 |
| 0x0005 | 2 | 版本 | QSC 版本:v1.0.0=0x0100 |
| 0x0007 | 2 | QSC Size | QSC 大小,大端 |
| 0x0009 | 4096 | 数据 | QSC 数据实际写入大小依据 QSC size,默认值 0xff |
| 0x1009 | 6 | 保留 | Reserved=0xff |
| 0x100F | 1 | 校验和 | QSC 校验和;Sum(0x0001~0x100E) % 255+1 |
