【嵌入式LINUX学习笔记】RGB LCD原理及接口寄存器简述

前言

所用平台为I.MX6UL。

原理简述

LCD简介

Liquid Crystal Display,液晶显示器。液晶显示器的每个像素由以下几个部分构成:悬浮于两个透明电极(氧化铟锡)间的一列液晶分子层,两边外侧有两个偏振方向互相垂直的偏振过滤片。如果没有电极间的液晶,光通过其中一个偏振过滤片其偏振方向将和第二个偏振片完全垂直,因此被完全阻挡了。但是如果通过一个偏振过滤片的光线偏振方向被液晶旋转,那么它就可以通过另一个偏振过滤片。液晶对光线偏振方向的旋转可以通过静电场控制,从而实现对光的控制。

分辨率

LCD是由像素点组成的(可以理解为放大版的点阵屏),在同等尺寸下,分频率越高,图像越细腻

常见的1080P指的是19201080,也就是2073600个像素点,2K就是25601440个像素点,4K是3840*2160个像素点
显示器左上角是第一个像素点,右下角为左后一个像素点,分x,y轴。

像素格式

一个像素点相当于个RGB小灯,通过控制R、G、B三种颜色的亮度就可以显示颜色。

  • RGB888格式:通常一个R、G、B三部分分别使用8bit的数据,一个像素点就是8bit*3=24bit(三个字节)
  • ARGB8888格式:在RGB888的基础上增加了8bit的Alpha(透明)通道,总达到32bit,4个字节
  • RGB565格式:每个像素用16比特位表示,占2个字节,RGB分量分别使用5位、6位、5位。
  • RGB555格式:每个像素用16比特位表示,占2个字节,RGB分量都使用5位(最高位不用)。
  • RGB24格式: 每个像素用8比特位表示,占1个字节,注意:在内存中RGB各分量的排列顺序为:BGR BGR BGR ···
  • RGB32格式:每个像素用32比特位表示,占4个字节,R,G,B分量分别用8个bit表示,存储顺序为B,G,R,最后8个字保留。
  • ARGB32格式:在RGB32的基础上增加了alpha通道,保留的8bit用来表示alpha通道。

RGBLCD接口

信号线 描述
R[7:0] 8根红色数据线
G[7:0] 8根绿色数据线
B[7:0] 8根蓝色数据线
DE 数据使能线(DE模式)
VSYNC 垂直同步信号线
HSYNC 水平同步信号线(HV模式)
PCLK 像素时钟信号线

LCD时间参数

图像的形成:从左至右、从上到下的顺序扫描每个像素点(“Z”形运动,并在像素画上对应的像素。

一帧图像是一行一行组成的。

下图为分辨率为1020*600LCD一帧扫描图
【嵌入式LINUX学习笔记】RGB LCD原理及接口寄存器简述_第1张图片

  • HSYNC是水平同步信号(行同步信号):当产生此信号表示开始新的一行。
  • VSYNC是垂直同步信号(帧同步信号):当产生此信号表示开始显示新的一帧图像。
  • HBP 水平同步信号前肩 :表示从水平同步信号开始到一行的有效数据开始之间的VCLK的个数
  • HFP 水平同步信号后肩 :表示一行的有效数据结束到下一个水平同步信号開始之间的VCLK的个数
  • VBP 垂直同步信号前肩 :表示在一帧图像开始时,垂直同步信号以后的无效的行数
  • VFP 垂直同步信号后肩 :表示在一帧图像结束后,垂直同步信号曾经的无效的行数

这六个时间参数具体就要去查看LCD数据手册。

屏幕时序

行时序:

【嵌入式LINUX学习笔记】RGB LCD原理及接口寄存器简述_第2张图片

补充参数:

  • HSPW: 是HSYNC信号宽度,也就是HSYNC信号持续时间。HSYNC信号不是一个脉冲,而是需要持续一段时间才是有效的,单位为 CLK
  • HOZVAL:显示一行数据所需的时间

行列时序

【嵌入式LINUX学习笔记】RGB LCD原理及接口寄存器简述_第3张图片

补充参数:

  • VSPW:是 VSYNC 信号宽度,也就是 VSYNC 信号持续时间,单位为 1 行的时间。
  • LINE:显示一帧有效数据所需的时间
  1. 一行的通信过程:LCD控制器IC先发送一个HSYNC高电平脉冲信号,脉冲告诉驱动器下面的信息是一行信息。然后开始这一行信息,这一行信息包括3部分:HBPD+有效行信息+HFPD。其中前肩和后肩都属于时序信息(和LCD屏幕具体有关),有效行信息就是横向分辨率。所以你可以认为一行总共包含4部分:HSPW+HBP+HOZVAL(有效行信息)+HFPD。
  2. 一帧图像其实就是一列,一列图像由多个行组成,每行都是上面的时序。
  3. 一帧图像的通信过程:整个帧图像信号分为4部分:VSYNC+VBPD+LINE(帧有效信号)+VFPD。VSVNC是帧同步信号宽度,用来告诉驱动器一帧图像要开始了;VBPD和VFPD分别是垂直同步信号前后肩。
  4. 整帧所需时间为:T = (VSPW+VBP+LINE+VFP) * (HSPW + HBP + HOZVAL + HFP)

同时这也能解释黑边产生原因,无效行和无效个数一同组成了黑边。

像素时钟

像素时钟就是 RGB LCD 的时钟信号,显示一帧图像所需时钟数为上文提到的T

显存

显存=单个像素的大小*分辨率

通常RGB LCD内部不带内存,需要从其他地方分出一段内存作为显存用。

驱动分析

eLCDIF接口:

用于连接RGB LCD接口的屏幕,特性如下:

  1. 支持 RGB LCD 的 DE 模式。
  2. 支持 VSYNC 模式以实现高速数据传输。
  3. 支持 ITU-R BT.656 格式的 4:2:2 的 YCbCr 数字视频,并且将其转换为模拟 TV 信号。
  4. 支持 8/16/18/24/32 位 LCD。

支持以下三种接口:

  1. MPU 接口
    用于与LCD屏幕直接传输数据和命令,用于6080/8080接口的LCD屏幕
  2. VSYNC 接口
    VSYNC 接口时序和 MPU 接口时序基本一样,只是多了 VSYNC 信号来作为帧同步
  3. DOTCLK 接口
    DOTCLK 接口就是用来连接 RGB LCD 接口屏幕的, 它包括 VSYNC、 HSYNC、 DOTCLK和 ENABLE(可选的)这四个信号,这样的接口通常被称为 RGB 接口,其时序和上文提到的行类时序很类似。

重要寄存器

配置寄存器LCDIF_CTRL

【嵌入式LINUX学习笔记】RGB LCD原理及接口寄存器简述_第4张图片

重要位:

描述
SFTRST(bit31) 软复位控制位,为1则复位
CLKGATE(bit30) 正常运行下为0,为1则不会进入到LCDIF
BYPASS_COUNT(bit19) 在DOTCLK模式下必须为1
VSYNC_MODE(bit18) 为1在VSYNC接口模式
DOTCLK_MODE(bit17) 为1在DOTCLK接口模式
INPUT_DATA_SWIZZLE(bit15:14) 输入数据字节交换设置,为0,不交换字节(小端模式);为1交换所有字节;为2半字交换;为3在每个半字内进行字节交换
CSC_DATA_SWIZZLE(bit13:12) CSC数据字节交换设置,交换方式同上
LCD_DATABUS_WIDTH(bit11:10) LCD 数据总线宽度,为0总线宽度为16bit;为1总线宽度为8bit;为2总线宽度为18bit;为宽度为24bit
WORD_LENGTH(bit9:8) 输入的数据格式(像素数据宽度),为0每个像素16bit;为1每个像素8bit;为2每个像素18bit;为3每个像素24bit
MASTER(bit5) 为1工作在主模式
DATA_FORMAT_16_BIT(bit3) 当此位为 1 并且 WORD_LENGTH 为 0 的时候像素格式为 ARGB555,当此位为 0 并且 WORD_LENGTH 为 0 的时候像素格式为 RGB565
DATA_FORMAT_18_BIT(bit2) 当 WORD_LENGTH 为 2 的时候此位才有效,此位为 0 的话低 18 位有效,像素格为 RGB666,高 14 位数据无效。当此位为 1 的话高 18 位有效,低14为数据无效
DATA_FORMAT_24_BIT(bit1) 当 WORD_LENGTH 为 3 的时候此位才有效,为0表示全部的 24 位数据都有效.为1数据有效位只有 18 位,每个颜色通道的高 2 位数据会被丢弃掉
RUN(bit0) 接口运行控制位,为1使能,开始传输数据

控制寄存器 LCDIF_CTRL1

【嵌入式LINUX学习笔记】RGB LCD原理及接口寄存器简述_第5张图片

重要位:

  • BYTE_PACKING_FORMAT(bit19:16),用来决定在 32 位的数据中哪些字节的数据有效,默认值为 0XF,也就是所有的字节有效,当为 0 的话表示所有的字节都无效。

寄存器LCDIF_TRANSFER_COUNT

在这里插入图片描述

  • 高16位:V_COUNT,LCD 的垂直分辨率
  • 低16位:H_COUNT,是 LCD 的水平分辨率

寄存器 LCDIF_VDCTRL0

VSYNC 和 DOTCLK 模式 控制寄存器0
【嵌入式LINUX学习笔记】RGB LCD原理及接口寄存器简述_第6张图片

重要位:

描述
VSYNC_OEB(bit29) VSYNC 信号方向控制位,为0输出,为1输入
ENABLE_PRESENT(bit28) EBABLE 数据线使能位(DE数据线),为1使能,为0关闭
VSYNC_POL(bit27) VSYNC 数据线极性设置位,为 0 的话 VSYNC 低电平有效,为1高电平有效
HSYNC_POL(bit26) HSYNC 数据线极性设置位,为 0 的话 HSYNC 低电平有效,为1高电平有效
DOTCLK_POL(bit25) DOTCLK 数据线(像素时钟线 CLK) 极性设置位,为0的话下降沿锁存数据,上升沿捕获数据,为1相反
ENABLE_POL(bit24) EANBLE 数据线极性设置位,为 0 的话低电平有效,为1高电平有效
VSYNC_PERIOD_UNIT(bit21) VSYNC 信号周期单位,为 0 的话 VSYNC 周期单位为像素时钟。为1的话 VSYNC 周期单位是水平行,如果使用 DOTCLK 模式话就要设置为 1
VSYNC_PULSE_WIDTH_UNIT(bit20) VSYNC信号脉冲度单位,设置同上
VSYNC_PULSE_WIDTH(bit17:0) VSPW 参数设置位

寄存器 LCDIF_VDCTRL1

VSYNC 和 DOTCLK 模式 控制寄存器1
设置VSYNC总周期:VSYNC 和 DOTCLK 模式 控制寄存器0

寄存器 LCDIF_VDCTRL2

分为高 16 位和低 16 位两部

  • 高16bit,HSYNC_PULSE_WIDTH,用来设置 HSYNC 信号宽度,也就是 HSPW
  • 低16bit,HSYNC_PERIOD,设置 HSYNC 总周期,就是:屏幕宽度+HSPW+HBP+HFP

寄存器LCDIF_VDCTRL3

重要位:

  • HORIZONTAL_WAIT_CNT(bit27:16):此位用于 DOTCLK 模式,用于设置 HSYNC 信号产生到有效数据产生之间的时间,也就是 HSPW+HBP
  • VERTICAL_WAIR_CNT(bit15:0):此位用于 DOTCLK 模式,用于设置 VSYNC 信号产生到有效数据产生之间的时间,也就是 VSPW+VBP

寄存器 LCDIF_VDCTRL4

重要位:

  • SYNC_SIGNALS_ON(bit18):同步信号使能位,设置为 1 使能 VSYNC、 HSYNC、DOTCLK 信号
  • DOTCLK_H_VALID_DATA_CNT(bit15:0): 设置 LCD 的宽度,也就是水平像素数量

寄存器 LCDIF_CUR_BUF 和 LCDIF_NEXT_BUF

LCD显存,分别存放当前帧和下一帧缓冲区,保存在同一地址

你可能感兴趣的:(嵌入式LINUX,嵌入式,单片机)