1. eLCDIF
1.1 概述
eLCDIF是一种通用的显示控制器,用于驱动各种尺寸和性能不同的显示设备。
eLCDIF块支持以下功能:
- 支持MPU接口(8080模式和6800模式)
- 支持DOTCLK接口(RGB接口)
- VSYNC模式:针对高速数据传输(行场信号)
- 支持ITU-R BT.656接口,可以把4:2:2 YcbCr格式的数据转换为模拟电视信号
eLCDIF支持可编程能力:
- 总线主接口到源帧缓冲数据显示刷新。该接口也可用于驱动“智能”显示器的数据
- PIO接口,以管理“智能”显示器和SoC之间的数据传输
- 8/16/18/24/32 bit 的bpp数据都支持,取决于IO的复用设置及寄存器配置;
- MPU模式,VSYNC模式,DOTCLK模式,都可以配置时序参数
1.2 外部引脚
1.3 时钟
ELCDIF时钟源说明如下表所示。请参考时钟控制器模块(CCM)用于时钟设置,配置和门控信息
LCD控制器有两个时钟域:外设总线时钟域,LCD像素时钟域。前者是用来让LCD控制器正常工作,后者是用来控制电子枪移动
1.4 功能描述
1.4.1 总线接口机制
eLCDIF模块具有内存映射控制、数据和状态寄存器。它提供了几个接口来在显示器和SoC之间传输数据。
总线主接口用于发起将数据从外部存储器传输到显示器的请求。它是完全自主的,或者不需要CPU干预,来管理刷新标准显示类型的周期性。总线主控也可以用于MPU模式的数据写入。
PIO接口用于连接“智能”显示器,以将帧缓冲数据和控制信息传输到外部显示器。主机CPU执行显示驱动程序来管理显示解决方案。下面几节描述系统总线。
1.4.1.1 读/显示模式下的总线主操作
eLCDIF块有一个总线主接口,该接口发起对数据的请求以驱动显示。必须将LCDIF_MASTER位设置为1才能启用总线主接口。软件应该对传输帧序列所需的所有控制寄存器进行编程。
在MPU和VSYNC模式下,传输单帧。当传输一个完整的帧时,eLCDIF进入空闲状态并清除CTRL寄存器中的RUN位。对于后续的帧传输,应该重复eLCDIF设置序列。
DOTCLK和DVI模式用于以所需的刷新率和分辨率刷新显示器,和驱动不集成显示缓冲区内存的显示器。当显示器被刷新时,eLCDIF将会在当前帧的末尾自动用LCDIF_NEXT_BUF_ADDR中的值更新LCDIF_CUR_BUF_ADDR寄存器,并开始从新地址获取下一帧。如果LCDIF_NEXT_BUF_ADDR寄存器没有在一个帧刷新周期内更新,eLCDIF将继续传输最后一帧,直到一个新的值被编程到该寄存器中。
eLCDIF还提供了通过在第一个字段中获取奇数行,然后在第二个字段中获取偶数行来交错递进帧的能力。这个特性可以在DV模式下使用,并且可以通过LCDIF_CTRL1寄存器中设置INTERLACE_FIELDS位来打开。
1.4.1.2 系统总线
1.4.2 写数据路径
eLCDIF支持基于光栅的帧缓冲区,并且不支持平铺缓冲区。
在为外部显示处理数据之前,有几个选项来适应内存中显示缓冲区的特性。LCDIF_CTRL[INPUT_DATA_SWIZZLE]字段提供了以下数据字复用的选项:
LCDIF_CTRL[WORD_LENGTH]字段表示输入数据/像素格式。LCDIF_TRANSFER_COUNT寄存器表示每帧中包含多少数据。LCDIF_TRANSFER_COUNT[H_COUNT]字段表示每行像素的数量,LCDIF_TRANSFER_COUNT[V_COUNT]表示每帧的总行数。
LCDIFCTRL1[BYTE_PACKING_FORMAT]字段可用于指定32位字中的哪些字节是有效的。例如,如果整个32位字是有效的,LCDIFCTRL1[BYTE_PACKING_FORMAT]应该设置为OXE(0b1111),如果帧缓冲区中每个字只有较低的3个字节是有效的,那么LCDIF_CTRL1[BYTE_PACKING_FORMAT]应该设置为Ox7(0b111)。
LCDIF_CTRL[LCD_DATABUS_WIDTH]字段表示通往显示控制器的总线的宽度。有一个选项来获取所有32位输入字并将其传输到输出I/0显示接口。如果LCDIF
_CTRL[LCD_DATABUS_WIDTH]与LCDIF_CTRL[WORD_LENGTH]不同,eLCDIF将执行RGB到RGB的颜色空间转换。例如,如果输入帧每像素的比特数比显示的少,例如在16bpp的输入帧变成24bpp的LCD时,eLCDIF将把每种颜色的msb填充到每个像素相同颜色的lsb上。如果输入帧每像素的比特数多于显示,比如,24bpp的输入帧转到16bpp的LCD上,eLCDIF会将每个颜色通道的lsb转换为较低的颜色深度。通过编程LCDIF_CTRL2[ODD_LINE_PATTERN]和LCDIF_CTRL2[EVEN_LINE_PATTERN]位字段,eLCDIF还能够通过分别在帧的奇数行和偶数行中混合每个像素的R,G和B颜色来支持增量像素显示。此操作发生在rgb到rgb色彩空间转换操作之后。
eLCDIF还支持RGB到YCbCr 4:2:2的色彩空间转换。这在DVI模式下很有用,因为电视编码器需要以YCbCr 4:2:2格式输入的,LCDIF CSC*寄存器对CSC系数和偏移量具有完全的可编程性。这些值必须以有符号二进制的补码格式写入这些寄存器。
下面的列表显示了如何获得不同的输入/输出组合:
......
最后,有一个选项可以在将输出数据发送到显示器之前转移输出数据。这是基于LCDIF_CTRL[SHIFT_DIR]和LCDIF_CTRL[SHIFT_NUM_BITS]字段。
- 读取数据
- 交换字节序
- rgb到rgb的转换
- 输出
1.4.3 读数据路径
不需要用到
1.4.4 eLCDIF中断
eLCDIF支持许多中断来帮助块的控制和状态报告
所有中断都有单独的掩码位来启用或禁用它们。它们都通过连接到中断收集器(ICOLL)的一条中断线汇集。
下面的列表描述了eLCDIF支持的不同中断:
- 当FIFO(TXFIFO)变为空时,中断发生。
- 当FIFO溢出时,中断发生。
- VSYNC边沿触发中断
1.4.5 eLCDIF初始化
1.4.5.1 写模式
在进入任何特定模式之前,以下初始化步骤对于所有eLCDIF写操作模式都是通用的。
初始化步骤:
- 配置外部/o以正确连接外部显示器
- 启动DISPLAY_CLOCK(pix_clk)时钟,并通过在CCM中编程寄存器设置适当的频率
- 启动总线时钟(apb_clk)并通过在CCM中编程寄存器设置适当的频率。
- 将eLCDIF从软复位中取出并禁用时钟门位。
- 通过设置LCDIF_CTRL1[RESET]复位LCD控制器,需要仔细查看复位的需求
- 确保LCDIF_CTRL[READ_WRITEB]为0
- 选择操作的转移方式。LCDIF_CTRL[MASTER]位决定了选择的传输模式。总线主模式(LCDIF_CTRL[master]=1)或PIO模式(LCDIF_CTRL[master] =0)是要选择的传输模式。
- 根据LCD控制器的端序设置LCDIF_CTRL[INPUT_DATA_SWIZZLE]。另外,如果需要在输出数据之前向左或向右移动数据,可以设置LCDIFCTRLIDATA SHIFT DIR]和LCDIF_CTRL[SHIFT_NUM_BITS]。
- 适当设置LCDIF_CTRL[WORD_LENGTH]字段:0=16位输入,1=8位输入,2=18位输入,3=24/32位输入。此外,在LCDIF_CTRL寄存器中选择正确的16/18/24位数据格式和相应的字段。
- 根据输入帧设置LCDIF_CTRL1[BYTE_PACKING_FORMAT]字段
- 适当设置LCDIF_CTRL[LCD_DATABUS_WIDTH]:0=16位输出,1=8位输出,2=18位输出,3=24/32位输出。
- 使能必要的中断
1.4.5.2 MPU读模式
不会使用此模式
1.4.6 MPU接口
MPU接口用于通过eLCDIF和外部显示器以适度的数据速率在SoC之间传输数据和命令。
总线主模式或PIO处理使用LCDIF_DATA寄存器可以用于MPU模式写操作,对于MPU模式的读操作,只能使用PIO。eLCDIF能支持6800和8080协议,如果DOTCLK_MODE,DVI_MODE和VSYNC_MODE位在LCDIF_CTRL寄存器被置为0,这意味着该设备是在MPU接口模式下操作的。LCDIF MPU板模式有四种基本模式
时间参数:设置和保持命令/数据寄存器选择(TCS, TCH)、数据总线的设置和保持(TDS, TDH)。这些参数在DISPLAY_CLOCK (pix_clk)中被表达,LCD_WR信号用作写开关,
而LCD_RS信号通常用于在命令模式和数据模式之间切换
eLCDIF具有灵活的引脚和频闪时序,使其能够最佳地支持各种lcd。最小周期时间为两个DISPLAY_CLOCK(pix_clk)周期(TDS=TDH=1)。例如,当DISPLAY CLOCK(pix_clk)为24MHz时,最大LCD数据速率为12 MB/S。TDS和TDH是8位值,所以最小eLCDIF周期是510 DISPLAY CLOCK(pix_clk)周期(47 KHz与24 MHz DISPLAY CLOCK (pix_clk))。如果DISPLAY CLOCK(pix clk)频率改变,则不会自动调整计时,因此如果DISPLAY CLOCK(pix_clk)改变,则可能需要调整计时。
在MPU接口模式下,LCDIF_CTRL_BYPASS_COUNT位必须为o。一旦eLCDIF根据LCDIF_TRANSFER_COUNT寄存器接收/传输了所有数据并完成了向面板的传输,RUN位就会自动清除。如果手动设置RUN位为0,则可以取消/中止当前传输。
1.4.6.1 MPU 初始化例程
1.4.7 VSYNC接口
不使用
1.4.8 DOTCLK接口
DOTCLK接口是运动图像显示中使用的另一种模式。
它包括VSYNC,HSYNC,DOTCLK和(可选)ENABLE信号。如果存在ENABLE信号,该接口通常称为RGB接口。
DOTCLK模式以高速向LCD写入数据,显示操作与VSYNC,HSYNC,ENABLE和DOTCLK信号同步。同步信号的极性、周期和脉宽可使用LCDIF_VDCTRL0-4寄存器进行编程。VSYNC信号的单位必须是水平线的数量,可以使用VSYNC_PULSE_WIDTH_UNIT和VSYNC_PERIOD_UNIT位字段来选择。默认情况下,VERTICAL_WAIT_CNT与
VSYNC_PERIOD具有相同的单位。显示时钟(pixclk)频率由CCM管理。
DOTCLK模式下,LCDIF_CTRL_BYPASS_COUNT位必须设置为1。为了结束当前的传输,软件应该使DOTCLK_MODE位为0,这样当前在LCDIF LFIFO和TX FIFO中的所有数据都被传输一旦传输完成,块将自动清除RUN位并发出cur_frame_done中断。
1.4.8.1 DOTCLK 初始化例程
1.4.9 CSI HANDSHAKE接口
不使用
1.4.10 Alpha Blending接口
不使用
1.4.11 DVI 接口
不使用
1.5 复位行为
总线时钟(apb_clk)和显示时钟(pix_clk)必须在对SFTRST或CLKGATE位进行任何更改之前运行。
软复位(SFTRST)需要多个时钟周期才能完成,所以在设置SFTRST时不要设置CLKGATE。
复位过程自动控制时钟。