【Linux 驱动】IMX6ULL eLCDIF参考手册翻译

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]字段。 

  1. 读取数据
  2. 交换字节序
  3. rgb到rgb的转换
  4. 输出

1.4.3 读数据路径

         不需要用到

 1.4.4 eLCDIF中断

        eLCDIF支持许多中断来帮助块的控制和状态报告

        所有中断都有单独的掩码位来启用或禁用它们。它们都通过连接到中断收集器(ICOLL)的一条中断线汇集。

下面的列表描述了eLCDIF支持的不同中断:

  • 当FIFO(TXFIFO)变为空时,中断发生。
  • 当FIFO溢出时,中断发生。
  • VSYNC边沿触发中断

1.4.5 eLCDIF初始化

1.4.5.1 写模式

        在进入任何特定模式之前,以下初始化步骤对于所有eLCDIF写操作模式都是通用的。

初始化步骤:

  1. 配置外部/o以正确连接外部显示器
  2. 启动DISPLAY_CLOCK(pix_clk)时钟,并通过在CCM中编程寄存器设置适当的频率
  3. 启动总线时钟(apb_clk)并通过在CCM中编程寄存器设置适当的频率。
  4. 将eLCDIF从软复位中取出并禁用时钟门位。
  5. 通过设置LCDIF_CTRL1[RESET]复位LCD控制器,需要仔细查看复位的需求
  6. 确保LCDIF_CTRL[READ_WRITEB]为0
  7. 选择操作的转移方式。LCDIF_CTRL[MASTER]位决定了选择的传输模式。总线主模式(LCDIF_CTRL[master]=1)或PIO模式(LCDIF_CTRL[master] =0)是要选择的传输模式。
  8. 根据LCD控制器的端序设置LCDIF_CTRL[INPUT_DATA_SWIZZLE]。另外,如果需要在输出数据之前向左或向右移动数据,可以设置LCDIFCTRLIDATA SHIFT DIR]和LCDIF_CTRL[SHIFT_NUM_BITS]
  9. 适当设置LCDIF_CTRL[WORD_LENGTH]字段:0=16位输入,1=8位输入,2=18位输入,3=24/32位输入。此外,在LCDIF_CTRL寄存器中选择正确的16/18/24位数据格式和相应的字段。
  10. 根据输入帧设置LCDIF_CTRL1[BYTE_PACKING_FORMAT]字段
  11. 适当设置LCDIF_CTRL[LCD_DATABUS_WIDTH]:0=16位输出,1=8位输出,2=18位输出,3=24/32位输出。
  12. 使能必要的中断
1.4.5.2 MPU读模式 

        不会使用此模式

1.4.6 MPU接口

        MPU接口用于通过eLCDIF和外部显示器以适度的数据速率在SoC之间传输数据和命令。

        总线主模式或PIO处理使用LCDIF_DATA寄存器可以用于MPU模式写操作,对于MPU模式的读操作,只能使用PIO。eLCDIF能支持6800和8080协议,如果DOTCLK_MODE,DVI_MODEVSYNC_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_UNITVSYNC_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)必须在对SFTRSTCLKGATE位进行任何更改之前运行。
        软复位(SFTRST)需要多个时钟周期才能完成,所以在设置SFTRST时不要设置CLKGATE
        复位过程自动控制时钟。

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 05:48:04       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 05:48:04       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 05:48:04       45 阅读
  4. Python语言-面向对象

    2024-07-22 05:48:04       55 阅读

热门阅读

  1. 配置文件格式 XML 快速上手

    2024-07-22 05:48:04       17 阅读
  2. Redis 数据结构—跳跃表(Skiplist)深度解析

    2024-07-22 05:48:04       16 阅读
  3. MySQL-显示所有错误信息

    2024-07-22 05:48:04       15 阅读
  4. Python 爬虫技术 第06节 HTTP协议与Web基础知识

    2024-07-22 05:48:04       11 阅读
  5. Oracle19.24发布,打补丁到19.24

    2024-07-22 05:48:04       13 阅读