LCD-TFT(Liquid Crystal Display-Thin Film Transistor)显示控制器提供 24 位并行数字 RGB(Red, Green, Blue)信号,并通过 VO 接口输出所有信号,可直接通过 MIPI Display Serial Interface 连接多种 LCD 和 TFT 面板。

介绍

Realtek LCDC 驱动遵循 Linux 的 DRM Framework 架构。Linux Direct Rendering Manager(DRM)层包含支持复杂图形设备需求的代码。内核中的图形驱动可利用 DRM 函数简化内存管理、中断处理和 DMA 等任务,并为应用程序提供统一接口。

LCDC 驱动主要由两部分组成:

  • LCDC 驱动 - 处理液晶显示控制器,向控制器发送指令。

  • MIPI-DSI 驱动 - 处理 MIPI-DSI 设备,向设备发送指令并接收响应。

架构

LCDC 使用 DRM(Direct Rendering Manager)框架驱动设备。LCDC 软件架构如下图所示:

../../rst_linux/8_lcdc/figures/lcdc_drm_software_arch.svg

备注

LCDC 包含两个部分:LCDC 和 MIPI-DSI。DRM 驱动这两部分。

关于 Linux DRM 系统的详细信息,请参考 DRM internal v5.4DRM internal v6.6

实现

Realtek DRM 驱动的实现位于以下目录:

驱动位置

介绍

<linux>/drivers/rtkdrivers/drm/ameba_drm_drv.c

Realtek LCDC驱动函数

<linux>/drivers/rtkdrivers/drm/ameba_drm_drv.h

Realtek LCDC驱动相关函数声明、宏定义、结构体定义及其他引用头文件

<linux>/drivers/rtkdrivers/drm/ameba_drm_obj.c

Realtek LCDC驱动函数

<linux>/drivers/rtkdrivers/drm/ameba_drm_dsi.c

Realtek MIPI-DSI驱动函数

<linux>/drivers/rtkdrivers/drm/ameba_drm_dsi.h

Realtek MIPI-DSI驱动相关函数声明、宏定义、结构体定义及其他引用头文件

<linux>/drivers/rtkdrivers/drm/ameba_drm_util.c

Realtek DRM驱动通用函数

<linux>/drivers/rtkdrivers/drm/ameba_drm_util.h

Realtek DRM驱动通用相关函数声明、宏定义、结构体定义及其他引用头文件

<linux>/drivers/rtkdrivers/drm/ameba_lcdc.c

Realtek LCDC硬件函数

<linux>/drivers/rtkdrivers/drm/ameba_lcdc.h

Realtek LCDC硬件相关函数声明、宏定义、结构体定义及其他引用头文件

<linux>/drivers/rtkdrivers/drm/ameba_mipi.c

Realtek MIPI_DSI硬件函数

<linux>/drivers/rtkdrivers/drm/ameba_mipi.h

Realtek MIPI_DSI硬件相关函数声明、宏定义、结构体定义及其他引用头文件

配置

设备树配置

LCDC 设备树包含两部分:LCDC 和 MIPI-DSI。主设备树文件位于 <dts>/rtl8730e-drm.dtsi

drm:drm@0x400D8000 {
   compatible = "realtek,ameba-drm";
   reg = <0x400D8000 0xE0>;
   interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
   clocks = <&rcc RTK_CKE_LCDCMIPI>;
   memory-region = <&mem_drm_reserved>;
   port {
      #address-cells = <1>;
      #size-cells = <0>;
      dsi_out: endpoint@0 {
         reg = <0>;
         remote-endpoint = <&dsi_in>;
      };
      panel_out: endpoint@1 {
         reg = <1>;
         remote-endpoint = <&panel_in>;
      };
   };
};
dsi: dsi@0x400EA000 {
   compatible = "realtek,ameba-dsi";
   reg = <0x400EA000 0xC10>,
   <0x4200825C 0x04>;
   interrupts = <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>;
   clocks = <&rcc RTK_CKE_HPERI>;
   rtk,lcdc-vo-clock = <&rcc>;
   status = "disabled";
   // 0 for input port
   port {
      #address-cells = <1>;
      #size-cells = <0>;
      dsi_in: endpoint@0 {
         reg = <0>;
         remote-endpoint = <&dsi_out>;
      };
   };
};

<dts>/rtl8730e-pinctrl.dtsi

drm_disable_swd_pins:drm_swd@0 {
   pins {
      pinmux = <REALTEK_PINMUX('A',14, GPIO)>;
      bias-disable;
      swd-disable;
   };
};

LCDC 需要 CMA(Contiguous Memory Allocation)支持,根据不同的开发板需在设备树中修改保留内存:

reserved-memory {
   #address-cells = <1>;
   #size-cells = <1>;
   ranges;
   /*reserver 32M mem for drm graphics , from 0x61000000 to 0x63000000*/
   mem_drm_reserved: drm_buffer@0x61000000 {
      compatible = "shared-dma-pool";
      no-map;
      reg = <0x61000000 0x2000000>;
   };
};

LCDC 基础配置不建议修改:

  • 驱动与设备匹配标识:compatible。

  • LCDC 设备寄存器: 0x400D8000。MIPI_DSI 设备寄存器: 0x400EA000

  • LCDCMIPI 时钟: <&rcc RTK_CKE_LCDCMIPI >

  • LCDC 中断:中断编号 33; MIPI_DSI 中断:中断编号 70。

LCDC 的引脚分配列在下面的表格中。

端口名

pinctrl 设备树配置

PA4

<&drm_disable_swd_pins>

LCDC 只有一个引脚复用,因此只定义了一个引脚。PA13 和 PA14 也可以用于 SWD,当用于 LCDC 时,应在设备树中禁用 SWD。

LCDC 需要 CMA 支持,对于不同的显示分辨率,CMA 可以设置为不同的大小。

编译配置

修改 LCDC 驱动配置时,执行以下命令并依次选择 Device Drivers > Drivers for Realtek > DRM driver

make kernelconfig
../../rst_linux/8_lcdc/figures/lcdc_build_config.svg

APIs

用户空间 API

LCDC 通过标准 DRM 接口提供以下功能:

接口

介绍

Open

打开DRM设备(/dev/dri/card0

Close

关闭DRM设备

Ioctl

通过属性读写与DRM驱动交互

Libdrm 是 Linux 内核中与 DRM 交互的标准库,其功能包括:

  • 100%支持内核 API 功能。

  • 简化应用层代码设计。

  • 兼容性代码集成在库中而非驱动。

更多细节请参考 libdrm

用户空间测试示例位于 tests/fwk/display/libdrm。有很多不同的测试示例,如下所示。

演示名称

演示描述

位置

drm_plane_test_demo

平面测试示例

tests/fwk/display/libdrm/planetest

drm_vbl_test

垂直消隐事件测试

tests/fwk/display/libdrm/vbltest

LCDC 演示只是使示例 drm_plane_test_demodrm_vbl_test 在启动测试产品目标时能够在 SDK 中编译。请参考《系统应用说明》(章节:编译环境)以编译测试用例。

成功编译并烧录后,您可以在 /bin/ 目录中找到测试用例。

内核空间 API

LCDC 函数接口

LCDC_Init

描述

介绍

通过 LCDC_InitTypeDef 结构体初始化寄存器。

参数

  • LCDCx: 寄存器地址

  • LCDC_InitStruct: 初始化结构体 LCDC_InitTypeDef 指针

返回值

LCDC_StructInit

描述

介绍

用默认值初始化 LCDC_InitTypeDef 中的参数。

参数

LCDC_InitStruct:指向将被初始化的 LCDC_InitTypeDef 结构体

返回值

LCDC_TrigerSHWReload

描述

介绍

触发影子寄存器重载以应用新配置

参数

LCDCx:寄存器地址

返回值

LCDC_SetBkgColor

描述

介绍

设置背景色

参数

  • LCDCx: 寄存器地址

  • red_color:红色值

  • green_color:绿色值

  • blue_color:蓝色值

返回值

LCDC_SetPlaneSize

描述

介绍

设置显示平面尺寸

参数

  • LCDCx:寄存器地址

  • ImageWidth:显示屏宽度

  • ImageHeight:显示屏高度

返回值

LCDC_Cmd

描述

介绍

启用或禁用 LCDC。

参数

  • LCDCx:其中 LCDCx 可以是 LCDC

  • NewState:LCDC 的新状态。该参数可以是 ENABLEDISABLE

返回值

LCDC_GetINTStatus

描述

介绍

获取LCDC中断状态

参数

LCDCx:其中 LCDCx 可以是 LCDC

返回值

LCDC中断状态

LCDC_ClearINT

描述

介绍

清除 LCDC 的中断挂起位

参数

  • LCDCx:其中 LCDCx 可以是 LCDC

  • LCDC_IT:指定要清除的中断。该参数可以是以下值的任意组合:

    • LCDC_BIT_DMA_UN_INTS:DMA FIFO 下溢中断

    • LCDC_BIT_LCD_FRD_INTS:刷新帧完成中断

    • LCDC_BIT_LCD_LIN_INTS:行中断

    • LCDC_BIT_FRM_START_INTS:帧开始中断

返回值

LCDC_DMAModeConfig

描述

介绍

配置 LCDC DMA 突发传输大小

参数

  • LCDCx:其中 LCDCx 可以是 LCDC

  • BurstSize:DMA 突发传输大小;单位为 64 字节

    • LCDC_LAYER_BURSTSIZE_1X64BYTES: Burst Transactions = 1;

    • LCDC_LAYER_BURSTSIZE_2X64BYTES: Burst Transactions = 2;

    • LCDC_LAYER_BURSTSIZE_3X64BYTES: Burst Transactions = 3;

    • LCDC_LAYER_BURSTSIZE_4X64BYTES: Burst Transactions = 4;

返回值

LCDC_DMAUnderFlowConfig

描述

介绍

配置 LCDC DMA 欠载模式和欠载错误数据

参数

  • LCDCx:其中 LCDCx 可以是 LCDC

  • DmaUnFlwMode:DMA 欠载模式,此参数可以是以下值之一:

    • LCDC_DMAUNFW_OUTPUT_LASTDATA:输出最后的数据

    • LCDC_DMAUNFW_OUTPUT_ERRORDATA:输出错误数据

  • ErrorData: 当DMA FIFO欠载发生时的输出数据。当欠载模式配置为 LCDC_DMAUNFW_OUTPUT_ERRORDATA

时,此参数是必需的;否则,可以忽略。

返回值

LCDC_GetCurPosStatus

描述

介绍

获取当前位置

参数

  • LCDCx:其中 LCDCx 可以是 LCDC

  • pCurPosX: 当前位置的 X 坐标指针

  • pCurPosY: 当前位置的 Y 坐标指针

返回值

LCDC_GetDmaUnINTCnt

描述

介绍

获取 DMA FIFO 欠载中断计数

参数

  • LCDCx:其中 LCDCx 可以是 LCDC

  • DmaUnIntCnt:DMA 欠载中断计数指针

返回值

LCDC_INTConfig

描述

介绍

启用或禁用指定的 LCDC 中断

参数

  • LCDCx:其中 LCDCx 可以是 LCDC

  • LCDC_IT:指定要启用或禁用的 LCDC 中断源

    • LCDC_BIT_DMA_UN_INTEN: DMA FIFO 下溢中断

    • LCDC_BIT_LCD_FRD_INTEN: LCDC刷新完成中断

    • LCDC_BIT_LCD_LIN_INTEN: 行中断

    • LCDC_BIT_FRM_START_INTEN: 帧开始中断

  • NewState:指定 LCDC 中断的新状态。该参数可以是 ENABLEDISABLE

返回值

读取的数值

LCDC_LineINTPosConfig

描述

介绍

配置行中断位置

参数

  • LCDCx:其中 LCDCx 可以是 LCDC

  • LineNum: 行号

返回值

LCDC_LayerConfig

描述

介绍

根据 EachLayer 中指定的参数初始化 LCDC 图层

参数

  • LCDCx:其中 LCDCx 可以是 LCDC

  • LayerId: 层索引

  • EachLayer:指向 LCDC_EachLayerInitTypeDef 结构的指针,该结构包含指定 LCDC 层的配置信息

返回值

LCDC_CheckLCDCReady

描述

介绍

在启用 LCDC 后,检查 LCDC 是否准备好与 VO 接口一起工作

参数

LCDCx:其中 LCDCx 可以是 LCDC

返回值

状态 :

  • 1:准备完毕

  • 其它:未准备完成

MIPI_DSI 函数接口

MIPI_Init

描述

介绍

使用 MIPI_InitTypeDef 结构的值初始化 MIPI 寄存器值

参数

  • MIPIx: 指向 MIPI 寄存器地址

  • MIPI_InitStruct:指向已初始化的 MIPI_InitTypeDef 结构

返回值

MIPI_DSI_init

描述

介绍

使用 MIPI_InitTypeDef 结构的值初始化 MIPI_DSI 寄存器值

参数

  • MIPIx:指向 MIPI 寄存器地址

  • MIPI_InitStruct:指向一个已经初始化的 MIPI_InitTypeDef 结构

返回值

MIPI_DPHY_init

描述

介绍

使用 MIPI_InitTypeDef 结构的值初始化 MIPI_D-PHY 寄存器值

参数

  • MIPIx:指向 MIPI 寄存器地址

  • MIPI_InitStruct:指向一个已经初始化的 MIPI_InitTypeDef 结构

返回值

MIPI_InitStruct_Config

描述

介绍

使用 MIPI_InitTypeDef 结构的值初始化 MIPI_DSI 寄存器值

参数

MIPI_InitStruct:指向一个已经初始化的 MIPI_InitTypeDef 结构

返回值

MIPI_DSI_Mode_Switch

描述

介绍

使用 MIPI_InitTypeDef 结构的值初始化 MIPI_DSI 寄存器值

参数

  • MIPIx:指向 MIPI 寄存器地址

  • MIPI_VideoNCmdMode:参数可为 ENABLEDISABLE

返回值

MIPI_DSI_CMD_Send

描述

介绍

以指令模式向面板发送一个短数据包

参数

  • MIPIx:指向 MIPI 寄存器地址

  • DataId: MIPI DSI处理器到外设事务类型

  • Byte0: 有效承载

  • Byte1: 有效承载

返回值

MIPI_DSI_CMD_LongPkt_MemQWordRW

描述

介绍

以指令模式向面板发送一个长数据包

参数

  • MIPIx: 指向 MIPI 寄存器地址

  • Addr: MIPI DSI模块中命令有效负载缓冲区的地址值

  • Word0: word0 的数值

  • Word1: word1 的数值

  • IsRead: 读取标志,如果被设置,将从地址中读取值

返回值

MIPI_DSI_CMD_Rxcv_CMD

描述

介绍

以指令模式从面板获取状态或数据包

参数

  • MIPIx:指向 MIPI 寄存器地址

  • rcmd_idx:接收命令寄存器读取的索引

返回值

RCMD_1/RCMD_2/RCMD_3 寄存器的值

MIPI_DSI_INT_Config

描述

介绍

为 MIPI_DIS 配置 IRQ

参数

  • MIPIx: 指向寄存器地址的指针

  • AcpuEn: ACPU 中断使能

  • ScpuEN: SCPU 中断使能

  • IntSelAnS:哪个 CPU 选择索引,0 是命令模式,1 是视频模式

返回值

MIPI_DSI_INTS_Get

描述

介绍

获取命令模式中断状态

参数

MIPIx:指向寄存器地址的指针

返回值

命令模式中断状态

MIPI_DSI_INTS_Clr

描述

介绍

清除命令模式中断挂起位

参数

  • MIPIx:指向寄存器地址的指针

  • DSI_INTS:指定要清除的中断

返回值

MIPI_DSI_INTS_ACPU_Get

描述

介绍

获取视频模式中断状态

参数

MIPIx:指向寄存器地址的指针

返回值

视频模式中断状态,即帧完成中断

MIPI_DSI_INTS_ACPU_Clr

描述

介绍

清除视频模式中断挂起位

参数

  • MIPIx:指向寄存器地址的指针

  • DSI_INTS:指定要清除的中断

返回值