eLCDIF

MIPI标准

MIPI表示Mobile Industry Processor Interface,即移动产业处理器接口。是MIPI联盟发起的为移动应用处理器制定的开放标准和一个规范。主要是手机内部的接口(摄像头、显示屏接口、射频/基带接口)等标准化,从而减少手机内部接口的复杂程度及增加设计的灵活性。

对于LCD,MIPI接口可以分为3类:

  • MIPI-DBI (Display Bus Interface)

    • 既然是Bus(总线),就是既能发送数据,也能发送命令,常用的8080接口就属于DBI接口。

    • Type B (i-80 system), 8-/9-/16-/18-/24-bit bus

    • Type C (Serial data transfer interface, 3/4-line SPI)

  • MIPI-DPI (Display Pixel Interface)

    • Pixel(像素),强调的是操作单个像素,在MPU上的LCD控制器就是这种接口

    • Supports 24 bit/pixel (R: 8-bit, G: 8-bit, B: 8-bit)

    • Supports 18 bit/pixel (R: 6-bit, G: 6-bit, B: 6-bit)

    • Supports 16 bit/pixel (R: 5-bit, G: 6-bit, B: 5-bit)

  • MIPI-DSI (Display Serial Interface)

    • Serial,相比于DBI、DPI需要使用很多接口线,DSI需要的接口线大为减少

    • Supports one data lane/maximum speed 500Mbps

    • Supports DSI version 1.01

    • Supports D-PHY version 1.00../../_images/005_mipi_dsi.png

像素的颜色

用红绿蓝三颜色来表示,可以用24位数据来表示红绿蓝,也可以用16位等等格式,比如:

  • bpp:bits per pixel,每个像素用多少位来表示

  • 24bpp:实际上会用到32位,其中8位未使用,其余24位中分别用8位表示红(R)、绿(G)、蓝(B)

  • 16bpp:有rbg565,rgb555

    • rgb565:用5位表示红、6位表示绿、5位表示蓝

    • rgb555:16位数据中用5位表示红、5位表示绿、5位表示蓝,浪费一位

../../_images/002_rgb.png

假设每个像素的颜色用16位来表示,那么一个LCD的所有像素点假设有xres * yres个像素,需要的内存为:

xres * yres * 16 / 8字节,也就是要设置所有像素的颜色,需要这么大小的内存。这块内存就被称为framebuffer

LCD硬件模型

../../_images/004_lcd_hardware_block.png

eLCDIF

简介

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模式,都可以配置时序参数。

../../_images/013_Lcd_Controller_block.png

上图是IMX6ULL的LCD控制器框图。我们在内存中划出一块内存,称之为显存,软件把数据写入显存。设置好LCD控制器之后,它会通过AXI总线协议从显存把RGB数据读入FIFO,再到达LCD接口(LCD Interface)。LCD控制器有两个时钟域:外设总线时钟域,LCD像素时钟域。前者是用来让LCD控制器正常工作,后者是用来控制电子枪移动。上图的Read_Data操作,在MPU模式下才用到;我们采用的是DCLK模式,因此不予考虑。

更详细的内容可以查看IMX6ull芯片手册《Chapter 34 Enhanced LCD Interface (eLCDIF)》。

数据传输与处理

框图

../../_images/image-20210907094449433.png

  1. 数据在fb是怎么存储的;

    设置fb输入和lcd控制器输出位宽格式如下:

    ../../_images/image-20210907094517385.png

    比如rgb56516位一个像素打包格式如下:我们一般设置1111,这样数据比较紧凑。

    ../../_images/image-20210907094541283.png

  2. 从Fb里面一次读出多少32位数据;

  3. 交换字节:目的是如果接错线了可以使用该功能,我们一般设置0,不交换

    ../../_images/image-20210907095028416.png

    ../../_images/image-20210907095633745.png

  4. 上步骤后存放到fifo;

  5. 从3中fifo中取出数据统一转换为RGB888;

    以rgb565为例说明如下:rgb666也是一样

    ../../_images/image-20210907100906939.png

  6. 上步转换后的数据存放到fifo;

  7. 从步骤5中fifo中取出数据然后通过控制时间发送出去。

    设置时间参数timeing,后面会介绍如何设置下面的时间值。

    ../../_images/image-20210906201940851.png

寄存器介绍

关于RGB接口的lcd原理和寄存器请参考RGB_LCD试验