RGB LCD 驱动开发学习笔记
1. LCD 硬件接口与信号线
RGB LCD 采用并行接口,主要包含以下信号线:
- 数据线:R[7:0](8根)、G[7:0](8根)、B[7:0](8根),共24根数据线(也可配置为16位模式)。
- 控制信号线 :
- DE (Data Enable):数据使能信号。
- VSYNC:垂直同步信号(帧同步信号)。
- HSYNC:水平同步信号(行同步信号)。
- PCLK (Pixel Clock):像素时钟信号。
2. LCD 像素格式 (Pixel Format)
- ARGB8888 格式 :一个像素点占用 4 个字节 (32位)。
- A (Alpha):透明度通道 (bit 31-24)。
- R (Red):红色通道 (bit 23-16)。
- G (Green):绿色通道 (bit 15-8)。
- B (Blue):蓝色通道 (bit 7-0)。
- 显存 (Frame Buffer):需要在 DDR 中开辟一段内存空间用于存放像素数据,eLCDIF 控制器会自动从该地址读取数据发送给 LCD。
3. LCD 时序详解 (重点)
LCD 显示一帧图像的过程类似于"画图",电子枪从左到右、从上到下扫描像素点。为了锁定有效的像素数据,需要设置特定的时序参数(包含"黑边"时间)。
A. 行显示时序 (Horizontal Timing)
行时序决定了每一行的扫描过程。
-
HSYNC:行同步信号(低电平有效)。
-
HSPW (Horizontal Sync Pulse Width):行同步信号宽度(Thp),单位为 CLK。
-
HBP (Horizontal Back Porch):行同步信号后肩(Thb)。
-
HOZVAL:显示一行有效数据所需的时间(即屏幕宽度)。
-
HFP (Horizontal Front Porch) :行同步信号前肩(Thf)。
-
关键计算公式:
-
显示一行所需时间 =
HSPW + HBP + HOZVAL + HFP -
有效像素开始位置 = 等待
HSPW + HBP个 CLK 时间后开始。
B. 帧显示时序 (Vertical Timing)
帧时序决定了每一帧(画面)的扫描过程。
- VSYNC:帧同步信号(低电平有效)。
- VSPW (Vertical Sync Pulse Width):帧同步信号宽度(Tvp)。
- VBP (Vertical Back Porch):帧同步信号后肩(Tvb)。
- LINE (或 VERVAL):显示一帧有效数据所需的时间(即屏幕高度)。
- VFP (Vertical Front Porch):帧同步信号前肩(Tvf)。
关键计算公式:
- 显示一帧所需时间 =
(VSPW + VBP + LINE + VFP)个行时间。- 总像素时钟频率 =
1 / (显示一帧所需时间 * 显示一行所需时间)。
C. 时序参数对照表
| 参数缩写 | 全称 | 中文含义 | 说明 |
|---|---|---|---|
| HSPW | Horizontal Sync Pulse Width | 行同步脉宽 | HSYNC 信号持续时间 |
| HBP | Horizontal Back Porch | 行后肩 | 同步信号结束后到有效数据开始的时间 |
| HFP | Horizontal Front Porch | 行前肩 | 有效数据结束后到下一次同步信号的时间 |
| VSPW | Vertical Sync Pulse Width | 帧同步脉宽 | VSYNC 信号持续时间 |
| VBP | Vertical Back Porch | 帧后肩 | 帧同步信号结束后到有效数据开始的时间 |
| VFP | Vertical Front Porch | 帧前肩 | 有效画面结束后到下一次帧同步的时间 |
4. eLCDIF 控制器配置
I.MX6U 的 LCD 控制器称为 eLCDIF (Enhanced LCD Interface)。
A. 像素时钟配置 (Pixel Clock)
eLCDIF 的工作频率需要根据屏幕参数精确配置。
- 时钟源选择 :通常选择 PLL5 (Video PLL)。
- 分频流程 :
- 选择 PLL5 作为时钟源(设置
CSCDR2[LCDIF1_PRE_CLK_SEL])。 - 经过预分频器(设置
CSCDR2[LCDIF1_PODF])。 - 最终到达 eLCDIF 外设。
- 选择 PLL5 作为时钟源(设置
- 计算示例 :
- 目标频率:31.5 MHz。
- 设置 PLL5 为 1008 MHz -> 4分频 -> 8分频 -> 31.5 MHz。
B. 关键寄存器配置
在代码中,需要初始化 LCDIF_CTRL、LCDIF_VDCTRL0-4 等寄存器。
| 寄存器 | 关键位域 (BitFields) | 说明 |
|---|---|---|
| LCDIF_CTRL | CLKGATE, SFTRST |
复位和时钟门控 |
DOTCLK_MODE |
必须置 1,工作在 DOTCLK 模式 | |
WORD_LENGTH |
像素位宽 (3=24位) | |
| LCDIF_VDCTRL0 | HSYNC_POL, VSYNC_POL |
同步信号极性设置 |
ENABLE_POL |
DE 信号极性 | |
VSYNC_PULSE_WIDTH |
VSPW 值设置 | |
| LCDIF_VDCTRL2 | HSYNC_PULSE_WIDTH |
HSPW 值设置 |
HSYNC_PERIOD |
一行的总周期 (HSPW+HBP+WIDTH+HFP) | |
| LCDIF_VDCTRL3 | VERTICAL_WAIT_CNT |
VSPW + VBP |
HORIZONTAL_WAIT_CNT |
HSPW + HBP | |
| LCDIF_VDCTRL4 | DOTCLK_H_VALID_DATA_CNT |
设置屏幕宽度 (WIDTH) |
5. 驱动初始化流程
- 初始化 IO 引脚 :将 LCD 相关引脚复用为
LCDIF功能,并配置电气属性(如驱动能力、压摆率)。 - 初始化像素时钟:配置 CCM 模块,设置 PLL5 和分频器,生成所需的像素时钟(如 31.5MHz)。
- 配置 eLCDIF 寄存器 :
- 复位控制器。
- 设置屏幕分辨率(
TRANSFER_COUNT)。 - 配置时序参数(VSPW, VBP, VFP, HSPW, HBP, HFP)。
- 设置显存地址(
CUR_BUF,NEXT_BUF)。
- 开启显示:使能 eLCDIF 控制器,之后显存中的数据会自动显示在屏幕上。