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 软件架构如下图所示:
备注
LCDC 包含两个部分:LCDC 和 MIPI-DSI。DRM 驱动这两部分。
关于 Linux DRM 系统的详细信息,请参考 DRM internal v5.4 或 DRM internal v6.6 。
实现
Realtek DRM 驱动的实现位于以下目录:
驱动位置 |
介绍 |
---|---|
|
Realtek LCDC驱动函数 |
|
Realtek LCDC驱动相关函数声明、宏定义、结构体定义及其他引用头文件 |
|
Realtek LCDC驱动函数 |
|
Realtek MIPI-DSI驱动函数 |
|
Realtek MIPI-DSI驱动相关函数声明、宏定义、结构体定义及其他引用头文件 |
|
Realtek DRM驱动通用函数 |
|
Realtek DRM驱动通用相关函数声明、宏定义、结构体定义及其他引用头文件 |
|
Realtek LCDC硬件函数 |
|
Realtek LCDC硬件相关函数声明、宏定义、结构体定义及其他引用头文件 |
|
Realtek MIPI_DSI硬件函数 |
|
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 驱动配置时,执行以下命令并依次选择
:make kernelconfig
APIs
用户空间 API
LCDC 通过标准 DRM 接口提供以下功能:
接口 |
介绍 |
---|---|
Open |
打开DRM设备( |
Close |
关闭DRM设备 |
Ioctl |
通过属性读写与DRM驱动交互 |
Libdrm 是 Linux 内核中与 DRM 交互的标准库,其功能包括:
100%支持内核 API 功能。
简化应用层代码设计。
兼容性代码集成在库中而非驱动。
更多细节请参考 libdrm 。
用户空间测试示例位于 tests/fwk/display/libdrm
。有很多不同的测试示例,如下所示。
演示名称 |
演示描述 |
位置 |
---|---|---|
drm_plane_test_demo |
平面测试示例 |
|
drm_vbl_test |
垂直消隐事件测试 |
|
LCDC 演示只是使示例 drm_plane_test_demo 和 drm_vbl_test 在启动测试产品目标时能够在 SDK 中编译。请参考《系统应用说明》(章节:编译环境)以编译测试用例。
成功编译并烧录后,您可以在 /bin/
目录中找到测试用例。
内核空间 API
LCDC 函数接口
LCDC_Init
项 |
描述 |
---|---|
介绍 |
通过 |
参数 |
|
返回值 |
无 |
LCDC_StructInit
项 |
描述 |
---|---|
介绍 |
用默认值初始化 |
参数 |
|
返回值 |
无 |
LCDC_TrigerSHWReload
项 |
描述 |
---|---|
介绍 |
触发影子寄存器重载以应用新配置 |
参数 |
|
返回值 |
无 |
LCDC_SetBkgColor
项 |
描述 |
---|---|
介绍 |
设置背景色 |
参数 |
|
返回值 |
无 |
LCDC_SetPlaneSize
项 |
描述 |
---|---|
介绍 |
设置显示平面尺寸 |
参数 |
|
返回值 |
无 |
LCDC_Cmd
项 |
描述 |
---|---|
介绍 |
启用或禁用 LCDC。 |
参数 |
|
返回值 |
无 |
LCDC_GetINTStatus
项 |
描述 |
---|---|
介绍 |
获取LCDC中断状态 |
参数 |
|
返回值 |
LCDC中断状态 |
LCDC_ClearINT
项 |
描述 |
---|---|
介绍 |
清除 LCDC 的中断挂起位 |
参数 |
|
返回值 |
无 |
LCDC_DMAModeConfig
项 |
描述 |
---|---|
介绍 |
配置 LCDC DMA 突发传输大小 |
参数 |
|
返回值 |
无 |
LCDC_DMAUnderFlowConfig
项 |
描述 |
---|---|
介绍 |
配置 LCDC DMA 欠载模式和欠载错误数据 |
参数 |
时,此参数是必需的;否则,可以忽略。 |
返回值 |
无 |
LCDC_GetCurPosStatus
项 |
描述 |
---|---|
介绍 |
获取当前位置 |
参数 |
|
返回值 |
无 |
LCDC_GetDmaUnINTCnt
项 |
描述 |
---|---|
介绍 |
获取 DMA FIFO 欠载中断计数 |
参数 |
|
返回值 |
无 |
LCDC_INTConfig
项 |
描述 |
---|---|
介绍 |
启用或禁用指定的 LCDC 中断 |
参数 |
|
返回值 |
读取的数值 |
LCDC_LineINTPosConfig
项 |
描述 |
---|---|
介绍 |
配置行中断位置 |
参数 |
|
返回值 |
无 |
LCDC_LayerConfig
项 |
描述 |
---|---|
介绍 |
根据 |
参数 |
|
返回值 |
无 |
LCDC_CheckLCDCReady
项 |
描述 |
---|---|
介绍 |
在启用 LCDC 后,检查 LCDC 是否准备好与 VO 接口一起工作 |
参数 |
|
返回值 |
状态 :
|
MIPI_DSI 函数接口
MIPI_Init
项 |
描述 |
---|---|
介绍 |
使用 |
参数 |
|
返回值 |
无 |
MIPI_DSI_init
项 |
描述 |
---|---|
介绍 |
使用 |
参数 |
|
返回值 |
无 |
MIPI_DPHY_init
项 |
描述 |
---|---|
介绍 |
使用 |
参数 |
|
返回值 |
无 |
MIPI_InitStruct_Config
项 |
描述 |
---|---|
介绍 |
使用 |
参数 |
|
返回值 |
无 |
MIPI_DSI_Mode_Switch
项 |
描述 |
---|---|
介绍 |
使用 |
参数 |
|
返回值 |
无 |
MIPI_DSI_CMD_Send
项 |
描述 |
---|---|
介绍 |
以指令模式向面板发送一个短数据包 |
参数 |
|
返回值 |
无 |
MIPI_DSI_CMD_LongPkt_MemQWordRW
项 |
描述 |
---|---|
介绍 |
以指令模式向面板发送一个长数据包 |
参数 |
|
返回值 |
无 |
MIPI_DSI_CMD_Rxcv_CMD
项 |
描述 |
---|---|
介绍 |
以指令模式从面板获取状态或数据包 |
参数 |
|
返回值 |
|
MIPI_DSI_INT_Config
项 |
描述 |
---|---|
介绍 |
为 MIPI_DIS 配置 IRQ |
参数 |
|
返回值 |
无 |
MIPI_DSI_INTS_Get
项 |
描述 |
---|---|
介绍 |
获取命令模式中断状态 |
参数 |
|
返回值 |
命令模式中断状态 |
MIPI_DSI_INTS_Clr
项 |
描述 |
---|---|
介绍 |
清除命令模式中断挂起位 |
参数 |
|
返回值 |
无 |
MIPI_DSI_INTS_ACPU_Get
项 |
描述 |
---|---|
介绍 |
获取视频模式中断状态 |
参数 |
|
返回值 |
视频模式中断状态,即帧完成中断 |
MIPI_DSI_INTS_ACPU_Clr
项 |
描述 |
---|---|
介绍 |
清除视频模式中断挂起位 |
参数 |
|
返回值 |
无 |