# 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 ![](media/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位表示蓝,浪费一位 ![](media/002_rgb.png) 假设每个像素的颜色用16位来表示,那么一个LCD的所有像素点假设有xres * yres个像素,需要的内存为: `xres * yres * 16 / 8`字节,也就是要设置所有像素的颜色,需要这么大小的内存。这块内存就被称为framebuffer ## LCD硬件模型 ![](media/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模式,都可以配置时序参数。 ![](media/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)》。 ### 数据传输与处理 **框图**: ![](media/image-20210907094449433.png) 0. 数据在fb是怎么存储的; 设置fb输入和lcd控制器输出位宽格式如下: ![](media/image-20210907094517385.png) 比如rgb56516位一个像素打包格式如下:我们一般设置1111,这样数据比较紧凑。 ![](media/image-20210907094541283.png) 1. 从Fb里面一次读出多少32位数据; 2. 交换字节:目的是如果接错线了可以使用该功能,我们一般设置0,不交换 ![](media/image-20210907095028416.png) ![](media/image-20210907095633745.png) 3. 上步骤后存放到fifo; 4. 从3中fifo中取出数据统一转换为RGB888; 以rgb565为例说明如下:rgb666也是一样 ![](media/image-20210907100906939.png) 5. 上步转换后的数据存放到fifo; 6. 从步骤5中fifo中取出数据然后通过控制时间发送出去。 设置时间参数timeing,后面会介绍如何设置下面的时间值。 ![](media/image-20210906201940851.png) ### 寄存器介绍 关于RGB接口的lcd原理和寄存器请参考[RGB_LCD试验](../00.ARM裸机编程/14.RGB_LCD试验.md)