百问网技术交流群,百万嵌入式工程师聚集地: https://www.100ask.net/page/2248041
硬件_IMX6ULL的LCD控制器参考资料,GIT仓库里:
-
IMX6ULL\开发板配套资料\datasheet\Core_board\CPU\IMX6ULLRM.pdf
《Chapter 34 Enhanced LCD Interface (eLCDIF)》
-
IMX6ULL的LCD裸机程序
IMX6ULL\source\03_LCD\05_参考的裸机源码\03_font_test
IMX6ULL的LCD控制器名称为eLCDIF(Enhanced LCD Interface,增强型LCD接口),主要特性如下:
- 支持MPU模式:有些显示屏自带显存,只需要把命令、数据发送给显示屏即可;就是前面讲的8080接口
- VSYNC模式:跟MPU模式类似,多了VSYNC信号。针对高速数据传输(行场信号)
- 支持DOTCLK模式:RGB接口,就是前面讲的TFT-RGB接口
- 支持ITU-R BT.656接口,可以把4:2:2 YcbCr格式的数据转换为模拟电视信号
- 8/16/18/24/32 bit 的bpp数据都支持,取决于IO的复用设置及寄存器配置
- MPU模式,VSYNC模式,DOTCLK模式,都可以配置时序参数。
上图是IMX6ULL的LCD控制器框图。 我们在内存中划出一块内存,称之为显存,软件把数据写入显存。 设置好LCD控制器之后,它会通过AXI总线协议从显存把RGB数据读入FIFO,再到达LCD接口(LCD Interface)。 LCD控制器有两个时钟域:外设总线时钟域,LCD像素时钟域。前者是用来让LCD控制器正常工作,后者是用来控制电子枪移动。 上图的Read_Data操作,在MPU模式下才用到;我们采用的是DCLK模式,因此不予考虑。
更详细的内容可以查看IMX6ull芯片手册《Chapter 34 Enhanced LCD Interface (eLCDIF)》。
1.2 数据传输与处理- 框图:
- 举例说明:见视频
看寄存器说明。
2. LCD控制器寄存器简介查看任何芯片的LCD控制器寄存器时,记住几个要点:
① 怎么把LCD的信息告诉LCD控制器:即分辨率、行列时序、像素时钟等; ② 怎么把显存地址、像素格式告诉LCD控制器。
上图是我们将要使用到的寄存器,下面逐个讲解这些寄存器,在后续的LCD控制编程实验会用到。
2.1 LCDIF_CTRL寄存器本实验中使用TFT LCD,LCD控制器使用DOTCLK模式。本寄存器中其他用不到的位,就不介绍了。
位域名读写描述[19:16]BYTE_PACKING_FORMATR/W用来表示一个32位的word中,哪些字节是有效的,即哪些字节是用来表示颜色的。 bit16、17、18、19分别对应byte0、1、2、3;某位为1,就表示对应的字节有效。 默认值是0xf,表示32位的word中,所有字节都有效。 对于8bpp,可以忽略本设置,所有的字节都是有效的; 对于16bpp,bit[1:0]、bit[3:2]分别对应一个字节,组合中的2位都为1时,对应的字节才有效; 对于24bpp,0x7表示32位数据中只用到3个字节,这称为“24 bit unpacked format”,即ARGB,其中的A字节被丢弃[0]RESETR/W用来复位了接的LCD, 0:LCD_RESET引脚输出低电平; 1:LCD_RESET引脚输出高电平 2.3 LCDIF_TRANSFER_COUNT寄存器 本寄存器用来设置Vsync信号相关的时序,及极性。
位域名读写描述[29]VSYNC_OEBR/W用来控制VSYNC信号,对于DOTCLK模式,设为0, 0:VSYNC是输出引脚,用LCD控制器产生; 1:VSYNC是输入引脚[28]ENABLE_PRESENTR/W在DOTCLK模式下,硬件是否会产生数据使能信号ENALBE: 0:不产生; 1:产生[27]VSYNC_POLR/W用来决定VSYNC脉冲的极性, 0:低脉冲; 1:高脉冲[26]HSYNC_POLR/W用来决定HSYNC脉冲的极性, 0:低脉冲; 1:高脉冲[25]DOTCLK_POLR/W用来决定DOTCLK的极性, 0:LCD控制器在DOTCLK下降沿发送数据,LCD在上升沿捕获数据; 1:反过来[24]ENABLE_POLR/W用来决定ENABLE信号的极性, 0:数据有效期间,ENABLE信号为低; 1:反过来[21]VSYNC_PERIOD_UNITR/W用来决定VSYNC_PERIOD的单位, 0:单位是像素时钟(pix_clk),这在VSYNC模式下使用; 1:单位是“整行”,这在DOTCLK模式下使用[20]VSYNC_PULSE_WIDTH_UNITR/W用来决定VSYNC_PULSE_WIDTH的单位, 0:单位是像素时钟(pix_clk); 1:单位是“整行”[19]HALF_LINER/WVSYNC周期是否周加上半行的时间, 0:VSYNC周期=VSYNC_PERIOD; 1:VSYNC周期=VSYNC_PERIOD+HORIZONTAL_PERIOD/2[18]HALF_LINE_MODER/W0:第1帧将在一行的中间结束,第2帧在一行的中间开始; 1:所有帧结束前都加上半行时间,这样所有帧都会起始于“行的开头”[17:0]VSYNC_PULSE_WIDTHR/WVSYNC脉冲的宽度 2.5 LCDIF_VDCTRL1寄存器 HSYNC_PULSE_WIDTH:水平同步信号脉冲宽度;
HSYNC_PERIOD:两个水平同步信号之间的总数,即水平方向同步信号的总周期
位域名读写描述[31:18]HSYNC_PULSE_WIDTHR/WHSYNC脉冲的宽度(单位:pix_clk)[17:0]HSYNC_PERIODR/W整行的宽度,即两个HYSNC信号之间的宽度(单位:pix_clk) 2.7 LCDIF_VDCTRL3寄存器LCD控制器传输完当前帧后,会把LCDIF_NEXT_BUF寄存器的值复制到LCDIF_CUR_BUF寄存器。
百问网技术交流群,百万嵌入式工程师聚集地: https://www.100ask.net/page/2248041
百问网技术论坛: http://bbs.100ask.net/
百问网嵌入式视频官网: https://www.100ask.net/index
百问网开发板: 淘宝:https://100ask.taobao.com/ 天猫:https://weidongshan.tmall.com/