内核 DISP LCD 驱动
本文将通过介绍 Tina Linux 的显示驱动、配置方法、移植适配 LCD 屏幕与测试和使用,介绍 Tina Linux 的显示系统。
LCD 的驱动

显示驱动可划分为三个层面:驱动层,框架层及底层。底层与图形硬件相接,主要负责将上层配置的功能参数转换成硬件所需要的参数,并配置到相应寄存器中。
显示框架层对底层进行抽象封装成一个个的功能模块。驱动层对外封装功能接口,通过内核向用户空间提供相应的设备结点及统一的接口。
在驱动层,分为三个驱动,分别是framebuffer驱动,display驱动,LCD&HDMI驱动。framebuffer 驱动与 framebuffer core 对接,实现 linux 标准的framebuffer 接口。display驱动是是整个显示驱动中的核心驱动模块,所有的接口都由 display 驱动来提供,包括 lcd 的接口。
LCD 接口复用关系
RGB Serial RGB/CPU屏各种类型接口 mapping 关系如图所示。

8/9/16 bit CPU屏接法说明如表所示。
| SoC PIN | SRGB | 16bit-CPU(不带TE) | 9bit-CPU(不带TE) | 8bit-CPU(不带TE) | 16bit-CPU(带TE) | 9bit-CPU(带TE) | 8bit-CPU(带TE) |
|---|---|---|---|---|---|---|---|
| LCD-VSYNC | LCD-VSYNC | LCD-CS | LCD-CS | LCD-CS | TE | TE | TE |
| LCD-HSYNC | LCD-HSYNC | LCD-RD | LCD-RD | LCD-RD | LCD-RD | LCD-RD | LCD-RD |
| LCD-CLK | LCD-DCLK | LCD-WR | LCD-WR | LCD-WR | LCD-WR | LCD-WR | LCD-WR |
| LCD-DE | LCD-DE | LCD-RS | LCD-RS | LCD-RS | LCD-RS | LCD-RS | LCD-RS |
| GPIO | / | / | / | / | CS | CS | CS |
| LCD-PWM | LCD-PWM | LCD-PWM | LCD-PWM | LCD-PWM | LCD-PWM | LCD-PWM | LCD-PWM |
| LCD-RST | LCD-RST | LCD-RST | LCD-RST | LCD-RST | LCD-RST | LCD-RST | LCD-RST |
8bit 带 TE 信号CPU 屏参考设计如图所示。

LCD 配置
内核配置
运行 make kernel_menuconfig 进入内核配置
Allwinner BSP --->
Device Drivers --->
Video Drivers --->
<*> DISP Driver Support(sunxi-disp2)

在显示驱动中最主要的是 <*> DISP Driver Support(sunxi-disp2) ,勾选后可以 看到其他的选项。包括驱动支持,调试接口和 LCD 面板的选择。(LCD panels select)
进入 LCD 面板选择可以看到许多已经适配了的显示屏可供选择使用。

设备树配置示例
设备树配置位于板级目录下的 board.dts 文件包括了两个配置节点。第一个是 display 所使用的节点,配置了DE的特性与功能,另外一个是 lcd 所使用的节点,配置了 LCD 面板的驱动与参数。这里我们主要配置 LCD 面板相关。这里以 Serial RGB 屏为例,一份配置包括以下几个部分:
- 屏幕驱动名称,背光亮度,屏接口
- 屏幕物理分辨率,物理宽高
- 屏幕时序参数
- 背光 PWM 参数
- 其他显示配置
- 自定义引脚(可选)
- 屏幕控制 IO
&lcd0 {
lcd_used = <1>;
/* 屏幕驱动名称,背光亮度,屏接口 */
lcd_driver_name = "nv3049f";
lcd_backlight = <50>;
lcd_if = <0>;
/* 屏幕物理分辨率,物理宽高 */
lcd_x = <480>;
lcd_y = <854>;
lcd_width = <60>;
lcd_height = <100>;
/* 屏幕时序参数 */
lcd_dclk_freq = <71>;
lcd_hbp = <23>;
lcd_ht = <1479>;
lcd_hspw = <2>;
lcd_vbp = <8>;
lcd_vt = <870>;
lcd_vspw = <2>;
/* 背光 PWM 参数 */
lcd_pwm_used = <0>;
lcd_pwm_ch = <7>;
lcd_pwm_freq = <50000>;
lcd_pwm_pol = <0>;
/* 其他显示配置 */
lcd_frm = <0>;
lcd_io_phase = <0x0000>;
lcd_gamma_en = <0>;
lcd_bright_curve_en = <0>;
lcd_cmap_en = <0>;
deu_mode = <0>;
lcdgamma4iep = <22>;
smart_color = <90>;
lcd_hv_if = <8>;
lcd_hv_clk_phase = <1>;
lcd_hv_sync_polarity = <0>;
lcd_hv_srgb_seq = <10>;
/* 自定义引脚 */
lcd_gpio_0 = <&pio PD 17 GPIO_ACTIVE_LOW>;
lcd_gpio_1 = <&pio PD 15 GPIO_ACTIVE_LOW>;
lcd_gpio_2 = <&pio PD 16 GPIO_ACTIVE_LOW>;
/* 屏幕控制 IO */
pinctrl-0 = <&rgb8_pins_a>, <&rgb8_pins_ctl_a>;
pinctrl-1 = <&rgb8_pins_b>, <&rgb8_pins_ctl_b>;
};
通用配置参数
lcd_driver_name
LCD 屏驱动的名字(字符串),必须与屏驱动的名字对应。