一、寄存器 Page(页)机制 ------ 调任何寄存器前必读
GC2145 的寄存器按"页(page)"组织,同一个寄存器地址在不同页含义完全不同,改错页等于改错寄存器。
- 切页寄存器为 0xfe :
0xfe = 0x00→ P0(page 0)0xfe = 0x01→ P1(page 1)0xfe = 0x02→ P2(page 2)
- 在初始化表中定位某寄存器所在页的方法:向上找离它最近的一条 0xfe 写入 ,其值即当前页。
- 例:某条
0x17写入的上方最近一条 0xfe 值为 0x00,则该寄存器记作 P0:0x17。
- 例:某条
- 修改初始化表时务必确认页归属,不能改错页。
二、镜像 / 翻转(Mirror & Flip)
直接在初始化表内修改对应寄存器即可,单寄存器控制:
| 方向 | 寄存器 | 值 |
|---|---|---|
| Normal(正常) | P0:0x17 | 0x14 |
| Horizontal Mirror(水平镜像) | P0:0x17 | 0x15 |
| Vertical Flip(垂直翻转) | P0:0x17 | 0x16 |
| HV(水平+垂直) | P0:0x17 | 0x17 |
三、亮度(AEC 目标亮度 AEC_Target_Y)
| 项目 | 内容 |
|---|---|
| 寄存器 | P1:0x13 |
| 方向 | 值越大,画面整体亮度越高 |
| 默认值 | 0x7b(MTK 平台参考) |
注意事项:
- 如果初始化表(Init)和 EV 补偿函数 里都写了亮度寄存器 0x13,两处必须同步修改,否则 EV 切换时会把初始化的值覆盖回去。
- 以 MTK 平台为例:初始化表 AEC 段中有
0x13 = 0x7b;EV 函数(GC2145_set_param_exposure)中各档 EV(±30/±20/±10/0 等)分别写不同的 0x13 值。需要整体调亮时,init 里的 0x7b 加大,EV 各档的值也要一起顺移。
四、饱和度(Saturation)
寄存器值越大整体色彩越鲜艳。饱和度有 Cb/Cr 两个寄存器,两者的值必须设成一样。
| 寄存器 | 含义 |
|---|---|
| P2:0xd1 | saturation_cb |
| P2:0xd2 | saturation_cr |
五、对比度(Contrast / luma_contrast)
| 项目 | 内容 |
|---|---|
| 寄存器 | P2:0xd3 |
| 方向 | 值越大,图像黑白层次越分明,肉眼感觉"清晰度"越高 |
过大会导致暗部死黑、亮部溢出,需适度。
六、边缘增强(Edge Enhancement / 锐化)
值越大边缘越锐、越"清晰",但噪点会同步放大,必须与去噪一起权衡调试。
| 寄存器与位段 | 含义 |
|---|---|
| P2:0x977:4 | 粗沿增强 |
| P2:0x973:0 | 细沿增强 |
七、去噪(DNDD Denoise)
去噪能力越强,清晰度损失越大,需与清晰度(边缘增强)一起权衡调试。
| 寄存器 | 含义 | 方向 |
|---|---|---|
| P2:0x82 | DN_signal_a,亮环境去噪 | 值越大去噪越强,最大可设 0x3f |
| P2:0x83 | DN_signal_b,暗环境去噪 | 值越大去噪越强,最大可设 0x7f |
八、帧率与防闪烁(Banding / Frame Rate)
8.1 核心概念与计算方法
国内市电 50Hz,防闪烁要求曝光按 10ms(半周期)的整数倍步进:
- step :10ms 曝光对应的行数(基数),写在 step 寄存器 P1:0x25/0x26(高/低字节)。
- level :各档允许的最大曝光行数,
level = step × N(N = 1/2/3...)。 - 帧率 = 100 / N (fps)。
- level0 ~ level3 表示从亮到暗的帧率过渡:
- level0:最亮环境对应的帧率(最高帧率档);
- level3:最暗环境对应的帧率(最低帧率档,曝光最长);
- 普通亮度运行在 level0/1/2,暗处一般落到 level3。
计算示例:
- step(0x25/0x26)= 0x00fa;
- level0 = 0x04e2,则 N = 0x04e2 / 0x00fa = 5,帧率 = 100/5 = 20fps;
- 想把 level3 设为约 7fps:100/7 ≈ 14,level3 = 14 × 0x00fa = 0x0dac,
写入 0x2d = 0x0d,0x2e = 0xac。
8.2 帧率寄存器(banding 函数,50Hz 档)
初始化(init)和 banding 函数(GC2145_set_param_banding,AE_FLICKER_MODE_50HZ 分支)内的这些寄存器必须同步修改:
P0: 0x05=0x01
0x06=0x56 // HB(水平消隐)
0x07=0x00
0x08=0x32 // VB(垂直消隐)
P1: 0x25=0x00
0x26=0xfa // step(10ms 曝光行数,高低字节 0x25/0x26)
0x27=0x04, 0x28=0xe2 // level0 → 20fps
0x29=0x06, 0x2a=0xd6 // level1 → 14fps
0x2b=0x07, 0x2c=0xd0 // level2 → 12fps
0x2d=0x0b, 0x2e=0xb8 // level3 → 8fps
调整帧率时:改 HB/VB 会改变行时间(step 需重算),改 level 各档即按上面公式换算目标帧率后写入对应寄存器对。
九、通用调试注意事项(汇总)
- 页机制:任何寄存器修改前先确认所属 page(向上找最近的 0xfe),改错页 = 改错寄存器。GC2145 的效果寄存器分布在 P0(镜像/消隐)、P1(亮度/step/level)、P2(饱和度/对比度/锐化/去噪)三页,尤其容易混。
- 初始化表与运行时函数同步:亮度(init 与 EV 函数)、帧率(init 与 banding 函数)两处都存在的寄存器必须同步改,否则运行时被覆盖。
- 成对寄存器同值:饱和度 Cb(P2:0xd1)/Cr(P2:0xd2)必须设为相同值。
- 锐化与去噪联调:边缘增强(P2:0x97)放大噪点、去噪(P2:0x82/0x83)损失清晰度,两者是一对权衡,建议交替微调而不是单边拉满。
- 50Hz 防闪烁:step 对应 10ms 曝光行数,level 必须是 step 的整数倍,否则出现 banding(明暗横纹)。