嵌入式Linux(十二)RGBLCD

1. RGBLCD介绍

1.1 LCD像素格式

①RGB888:R,G,B三个通道各自为8bit,一个像素点就是24bit。可以组合出2^24=16777216种颜色。
②ARGB8888:在RGB888的基础上加入8bit的Alpha透明通道。一个像素点是32bit。下图为ARGB8888的数据格式及,其中bit31:24为Alpha通道,其他的按照颜色为RGB通道。
在这里插入图片描述

1.2 LCD屏幕接口

  I.MX6U支持RGB-LCD接口。信号线包括:RGB数据线各8根,DE数据使能线,VSYNC垂直同步信号线,HSYNC水平同步信号线,PCLK像素时钟信号线。RGBLCD一般有两种工作模式,为DE和HV模式,区别在于HV模式不需要DE使能,DE模式不需要HSYNC。
  通过LCD_G7/R7/B7可以设置LCD的ID,从而兼容不同的LCD模块
  I.MX6U带的是eLCDIF接口,该接口支持MPU接口,VSYNC接口,DOTCLK接口(RGB接口)。DOTCLK接口时序如1.3节所示。下面看一下eLCDIF的重要寄存器:

1)LCDIF_CTRL寄存器:
bit0为使能位。
①SFTRST(bit31):软复位控制位,为1的时候强制复位LCD。
②CLKGATE(bit30):必须为0否则时钟不会进入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在每半个字内进行字节交换。这节选择小端模式。
⑦LCD_DATABUS_WIDTH(bit11:10):LCD数据总线宽度。为0的话16位宽,1对应8位宽,2对应18位宽,3对应24位宽。这节实验选择24位宽。
⑧WORD_LENGTH(bit9:8):输入数据格式,也就是像素数据宽度,为1时每个像素8位,0时16位,2时18位,3时24位
⑨MASTER(bit5):为1设置eLCDIF工作在主模式。
⑩DATA_FORMAT_24_BIT(bit1):bit9:8为3时生效。为0时表示24位数据全都有效。为1实际输入18位,每个颜色的高2位丢弃。

2)LCDIF_CTRL1寄存器:
BYTE_PACKING_FORMAT(bit19:16):默认0xF,32位数据都有效,如果ARGB格式不传输A,只要24位需要设置为0x7

3)LCDIF_TRANSFER_COUNT寄存器:
  该寄存器用于设置屏幕分辨率。分为高低各16位,高16位为V_COUNT,对应LCD垂直分辨率;低16位H_COUNT,对应LCD水平分辨率。这里设置V_COUNT=1024,H_COUNT=600。

4)LCDIF_VDCTRL0寄存器:
VSYNC和DOTCLK的模式控制寄存器0。该寄存器需要结合LCD数据手册进行设置
①ENABLE_PRESENT(bit28):DE数据线使能位,1使能。
②DOTCLK_POL(bit25):DOTCLK数据线极性设置为,为0下降沿锁存数据,上升沿捕获数据,为1相反。
③ENABLE)POL(bit24):DE的极性设置,0的话低电平有效,1高电平有效。
bit21:20在DOTCLK模式下都为1。

5)LCDIF_VDCTRL1寄存器:
用于设置VSYNC总周期,VSPW+VBP+LINE+VFP。

6)LCDIF_VDCTRL2寄存器:
高14位设置HSYNC信号宽度也就是HSPW;低18位设置HSYNC总周期,HSPW+HBP+HOZVAL+HFP。

7)LCDIF_VDCTRL3寄存器:
①HORIZONTAL_WAIT_CNT(bit27:16):用于DOTCLK模式,用于设置HSYNC信号产生和后肩,也就是HSPW+HBP。
②VERTICAL_WAIR_CNT(bit15:0):设置VSPW+VBP。

8)LCDIF_VDCTRL4寄存器:
①SYNC_SIGNALS_ON(bit18):同步信号使能位,设置为1使能VSYNC,HSYNC,DOTCLK。
②DOTCLK_H_VALID_DATA_CNT(bit15:0):设置LCD宽度也就是水平像素数量。

8)LCDIF_CUR/NEXT_BUF寄存器:
  这两个寄存器分别为当前帧和下一帧缓冲区,保存同一个地址,也就是划给LCD的显存首地址。

1.3 LCD时间参数

在这里插入图片描述
  首先产生VSYNC信号,该信号产生代表开始显示新一帧图像,所以该信号在左上角产生。然后产生HSYNC信号,该信号表示新的一行开始显示,所以该信号在最左列。HBP,HFP,VFP,VBP这四个延时信号的目的是锁定有效的像素数据,给LCD的IC留出反应时间,这四个值去查询对应的LCD手册即可获得。

1.3.1 LCD屏幕时序

行显示时序
在这里插入图片描述
重要参数分析(单位均为CLK):
①HSPW:HSYNC信号需要持续一段时间才算有效,这段时间就是HSPW。
②HBP:HSYNC信号完成后需要延时的时间。
③HOZVAL:数值上等于行分辨率,代表显示一行数据所需的时间。
④HFP:HSYNC产生前需要的延时时间。
综上,显示一行所需的时长是HSPW+HBP+HOZVAL+HFP。

帧显示时序
在这里插入图片描述
重要参数分析:
①VSPW:VSYNC信号持续时间。
②VBP:帧同步信号后肩。
③LINE:数值上等于屏幕列分辨率,显示一阵有效数据的时间。
④VFP:帧同步信号后肩。
综上,显示一帧所需时间:(VSPW+VBP+LINE+VFP)× 显示一行时间

像素时钟
在这里插入图片描述
  按照上面的参数和计算公式,得到显示一帧图像需要853440个CLK,那么显示60帧就是约等于51.2M,因此需要51.2MHz的像素时钟。
在这里插入图片描述
  这里LCDIF1_PRE_CLK_SEL(bit17:15)设置为2,选用PLL5作为LCDIF的时钟源。然后将LCDIF1_PRED(bit14:12)和LCDIF1_PODF(bit25:23)分别设置为2和4,对应3和5分频。最后将LCDIF1_CLK_SEL(bit11:9)设置为0,选择前面PPL5分出来的时钟作为最终输入时钟源。
  PLL5的频率涉及CCM_PLL_VIDEO,CCM_MISC2寄存器(不考虑小数分频)。时钟计算公式如下:
在这里插入图片描述
  OSC24M是24MHz的有源晶振,所以主要设置loopDivider和postDivider即可。设置CCM_PLL_VIDEO的POST_DIV_SLECT位(bit20:19)为2选择1分频,从而得到postDivider为1,将CCM_MISC2的VIDEO_DIV(bit31:30)设为0选择1分频,DIV_SELECT(bit6:0)位为32–loopDivider值。这样,PLL5_CLK最终等于768MHz。
  由于不使用小数分频,所以CCM_ANALOG_PLL_VIDEO_NUM=0,CCM_ANALOG_PLL_VIDEO_DENOM=0。

显存
  由于RGBLCD内部没有内存,所以需要在DDR3中开辟内存作为RGBLCD的显存(定义一个32位的数组即可,如u32 lcd[1024*600])。需要开辟的大小为,分辨率×像素所占字节数。这里分辨率为1024x600,ARGB8888一个像素为4byte,所以所需内存大小为2.5MB。

2. 配置及实验

配置步骤如下:
1)初始化LCD使用的IO,复用为eLCDIF接口IO。
2)设置像素时钟。
3)配置eLCDIF接口寄存器。
4)编写API函数,正点原子提供写好了的API,直接用就行了。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值