[MTK] Panel IC 色彩、色温及饱和度参数移植
一、修改概述
屏厂提供的色彩、色温及饱和度参数,本质上是通过 MIPI DSI 命令写入 Panel IC 的 Vendor Register(厂商私有寄存器),用于调整屏幕显示效果。
注意:
- 不属于 Android 上层显示效果调整。
- 不涉及 DRM Color Matrix(色彩矩阵)修改。
- 需要在 LCM 初始化阶段,通过 DSI 命令写入 Panel IC。
1. 修改位置
LK 阶段:
- 初始化数组:
lcm_init_setting[]
Kernel 阶段:
- 初始化函数:
lmibe127119272_panel_init()
二、屏厂原始参数格式
1. 原始 DSI 命令
屏厂提供的参数格式如下:
MIPI_WR(0x39, 0xBD, 0x00);
MIPI_WR(0x39, 0xC1, 0x01);
MIPI_WR(0x39, 0xBD, 0x01);
MIPI_WR(0x39, 0xC1, ...);
MIPI_WR(0x39, 0xBD, 0x02);
MIPI_WR(0x39, 0xC1, ...);
MIPI_WR(0x39, 0xBD, 0x03);
MIPI_WR(0x39, 0xC1, ...);
MIPI_WR(0x39, 0xBD, 0x00);
2. 参数含义
① 0x39:MIPI DSI Packet Type
- 表示 MIPI DSI Long Write(长包写入)。
- 属于 DSI 数据包类型,并非 Panel IC 寄存器地址。
- 当前 LK 和 Kernel 驱动接口已经负责封装 DSI Packet。
注意:合入驱动时,不需要将 0x39 作为寄存器数据写入。
② 0xBD:寄存器页选择
- 用于切换 Panel IC 的寄存器页。
- 也称为
Page Select或Bank Select。 - 不同寄存器页对应不同的参数配置。
③ 0xC1:色彩参数寄存器
- 用于写入当前寄存器页对应的色彩参数。
- 不同寄存器页下的
0xC1对应不同参数表。
三、DSI 命令转换规则
1. 转换原则
屏厂提供的原始命令:
MIPI_WR(0x39, 0xBD, 0x00);
实际需要写入 Panel IC 的数据为:
BD 00
因此,移植时需要去除 DSI Packet Type 0x39,保留实际的寄存器地址与参数数据。
2. 实际写入顺序
BD 00
C1 01
BD 01
C1 ...
BD 02
C1 ...
BD 03
C1 ...
BD 00
3. 注意事项
- 必须保留
0xBD与0xC1的原始写入顺序。 - 每次写入
0xC1前,需要先切换到对应的寄存器页。 - 不允许只复制
0xC1参数而忽略0xBD。 - 不允许将不同寄存器页的参数混合写入。
- 参数写入完成后,需要通过
BD 00恢复默认寄存器页。
四、LK 阶段参数移植
1. 修改位置
在 LK 驱动的 lcm_init_setting[] 初始化数组中添加屏厂提供的色彩参数。
2. 参考代码
{0xBD, 1, {0x00}},
{0xC1, 1, {0x01}},
{0xBD, 1, {0x01}},
{0xC1, 58, {...}},
{0xBD, 1, {0x02}},
{0xC1, 58, {...}},
{0xBD, 1, {0x03}},
{0xC1, 58, {...}},
{0xBD, 1, {0x00}},
3. 参数说明
LK 初始化数组格式:
{寄存器地址, 数据长度, {参数数据}},
例如:
{0xBD, 1, {0x01}},
表示切换至寄存器页 0x01。
{0xC1, 58, {...}},
表示向当前寄存器页的 0xC1 寄存器写入 58 字节参数。
注意: 58 为示例中的参数长度,实际移植时应与屏厂提供的数据长度保持一致。
五、Kernel 阶段参数移植
1. 修改位置
在 Kernel 驱动的 lmibe127119272_panel_init() 初始化函数中添加相同的色彩参数。
2. 参考代码
lmibe127119272_dcs_write_seq_static(ctx, 0xBD, 0x00);
lmibe127119272_dcs_write_seq_static(ctx, 0xC1, 0x01);
lmibe127119272_dcs_write_seq_static(ctx, 0xBD, 0x01);
lmibe127119272_dcs_write_seq_static(ctx, 0xC1, ...);
lmibe127119272_dcs_write_seq_static(ctx, 0xBD, 0x02);
lmibe127119272_dcs_write_seq_static(ctx, 0xC1, ...);
lmibe127119272_dcs_write_seq_static(ctx, 0xBD, 0x03);
lmibe127119272_dcs_write_seq_static(ctx, 0xC1, ...);
lmibe127119272_dcs_write_seq_static(ctx, 0xBD, 0x00);
3. 参数说明
Kernel DSI 写入接口:
lmibe127119272_dcs_write_seq_static(ctx, 寄存器地址, 参数数据);
例如:
lmibe127119272_dcs_write_seq_static(ctx, 0xBD, 0x01);
表示切换至寄存器页 0x01。
lmibe127119272_dcs_write_seq_static(ctx, 0xC1, ...);
表示向当前寄存器页的 0xC1 寄存器写入对应色彩参数。
注意: Kernel 与 LK 的参数内容及写入顺序需要保持一致。
六、初始化命令放置位置
1. 推荐位置
建议将屏厂提供的色彩参数放置在:
- 原始 Panel IC 初始化参数的末尾。
B9 00 00 00 00锁寄存器命令之前。0x11(Sleep Out)之前。0x29(Display On)之前。
2. 初始化顺序示例
/* 原始 Panel IC 初始化参数 */
...
/* 色彩、色温及饱和度参数 */
BD 00
C1 01
BD 01
C1 ...
BD 02
C1 ...
BD 03
C1 ...
BD 00
/* 锁定寄存器 */
B9 00 00 00 00
/* Sleep Out */
11
/* Display On */
29
注意: 以上为初始化命令的逻辑顺序示例,实际代码应使用对应 LK 或 Kernel 的 DSI 写入接口。
七、移植注意事项
-
DSI Packet Type
屏厂命令中的
0x39表示 Long Write,不需要作为寄存器数据写入。 -
寄存器页切换
必须按照
0xBD→0xC1的顺序写入,确保参数写入正确的寄存器页。 -
参数完整性
不同寄存器页的
0xC1参数必须完整保留,不能遗漏或混合。 -
数据长度
LK 中
0xC1的数据长度必须与实际参数字节数一致。 -
LK / Kernel 一致性
两个阶段需要写入相同的参数,避免初始化配置不一致。
-
恢复默认寄存器页
全部参数写入完成后,通过
BD 00恢复默认寄存器页。 -
初始化位置
建议在锁寄存器、Sleep Out 和 Display On 命令之前完成色彩参数配置。
八、修改总结
本次色彩、色温及饱和度参数移植主要涉及两个位置:
LK:
lcm_init_setting[]
Kernel:
lmibe127119272_panel_init()
核心修改:
- 将屏厂提供的 MIPI DSI 命令转换为当前驱动支持的写入格式。
- 去除原始命令中的
0x39Packet Type。 - 保留
0xBD寄存器页切换与0xC1参数写入顺序。 - 在 LK 和 Kernel 初始化流程中添加对应参数。
- 在锁寄存器及屏幕开启命令之前完成参数写入。
最终效果: 通过 Panel IC Vendor Register 完成屏厂色彩参数配置,不涉及 Android 上层显示效果或 DRM Color Matrix 修改。