Tina Linux 提供了一套完整的屏幕驱动,支持 RGB,MIPI DSI,eDP,LVDS,E-INK屏幕,也支持低分辨率的 SPI,IIC 屏幕。具体屏幕的驱动情况,需要根据芯片而确定。
本文将通过介绍Linux 5.4 两个版本的 Kernel 中的 LCD 驱动,主要讲解配置屏幕驱动的基本方法。
显示驱动主要划分为三个层:驱动层,框架层及底层。底层与图形硬件相接,主要负责将上层配置的功能参数转换成硬件所需要的参数,并配置到相应寄存器中。
显示框架层对底层进行抽象封装成一个个的功能模块。驱动层对外封装功能接口,通过内核向用户空间提供相应的设备结点及统一的接口。
在驱动层,分为三个驱动,分别是framebuffer驱动,display驱动,LCD&HDMI驱动。framebuffer 驱动与 framebuffer core 对接,实现 linux 标准的framebuffer 接口。display驱动是整个显示驱动中的核心驱动模块,所有的接口都由 display 驱动来提供,包括 lcd 的接口。
首先需要修改一下配置文件,sun20iw1p1_defconfig该文件是T113的uboot配置文件。路径如下所示:
Tina-Linux为工程目录,根据自己的sdk路径选择
Tina-Linux/lichee/brandy-2.0/u-boot-2018/configs/sun20iw1p1_defconfig
红色框框住的是 DISP 驱动部分,主要部分如下:
CONFIG_CMD_SUNXI_BMP=y # 开机 LOGO BMP 文件解析器
CONFIG_LZMA=y # 开机 LOGO 使用 LZMA 压缩解压工具
CONFIG_DISP2_SUNXI=y # DISP 驱动
CONFIG_HDMI2_DISP2_SUNXI=y # HDMI DISP 驱动
CONFIG_AW_PHY=y # DISP 驱动使用的是全志自研外设
如果希望关闭 U-Boot 的 LCD DISP 驱动输出,可以注释掉 CONFIG_DISP2_SUNXI=y 这一行。关闭 HDMI DISP 驱动也相同,注释即可。
主要配置了屏幕的特性与功能,路径和配置如下:
Tina-Linux/device/config/chips/t113/configs/mq_r/uboot-board.dts
&lcd0 {
lcd_used = <1>; # 启用lcd
lcd_driver_name = "default_lcd"; # 使用 default_lcd 驱动
lcd_backlight = <50>;
lcd_if = <0>; # 0:rgb 4:dsi
lcd_x = <800>; # 宽度
lcd_y = <480>; # 高度
lcd_width = <108>; # 屏幕物理宽度,单位 mm
lcd_height = <65>; # 屏幕物理高度,单位 mm
lcd_dclk_freq = <22>; # 屏幕时钟,单位 MHz
lcd_pwm_used = <1>; # 启用背光 PWM
lcd_pwm_ch = <9>; # 使用 PWM 通道 9
lcd_pwm_freq = <50000>; # PWM 频率,单位 Hz
lcd_pwm_pol = <0>; # 背光 PWM 的极性
lcd_hbp = <12>; # hsync back porch(pixel) + hsync plus width(pixel);
lcd_ht = <816>; # hsync total cycle(pixel)
lcd_hspw = <4>; # hsync plus width(pixel)
lcd_vbp = <12>; # vsync back porch(line) + vysnc plus width(line)
lcd_vt = <46>; # vsync total cycle(line)
lcd_vspw = <4>; # vsync plus width(pixel)
lcd_lvds_if = <0>;
lcd_lvds_colordepth = <1>;
lcd_lvds_mode = <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>;
pinctrl-0 = <&rgb18_pins_a>;
pinctrl-1 = <&rgb18_pins_b>;
};
运行 make kernel_menuconfig 进入内核配置,找到 Video support for sunxi
Device Drivers > Graphics support > Frame buffer Devices > Video support for sunxi
在显示驱动中最主要的是 <*> DISP Driver Support(sunxi-disp2) ,勾选后可以看到其他的选项。包括驱动支持,调试接口和 LCD 面板的选择。(LCD panels select),进入 LCD 面板选择可以看到许多已经适配了的显示屏可供选择使用。
主要配置了屏幕的特性与功能,路径和配置如下:
Tina-Linux/device/config/chips/t113/configs/mq_r/board.dts
&lcd0 {
lcd_used = <1>; # 启用lcd
lcd_driver_name = "default_lcd"; # 使用 default_lcd 驱动
lcd_backlight = <50>;
lcd_if = <0>; # 0:rgb 4:dsi
lcd_x = <800>; # 宽度
lcd_y = <480>; # 高度
lcd_width = <108>; # 屏幕物理宽度,单位 mm
lcd_height = <65>; # 屏幕物理高度,单位 mm
lcd_dclk_freq = <22>; # 屏幕时钟,单位 MHz
lcd_pwm_used = <1>; # 启用背光 PWM
lcd_pwm_ch = <9>; # 使用 PWM 通道 9
lcd_pwm_freq = <50000>; # PWM 频率,单位 Hz
lcd_pwm_pol = <0>; # 背光 PWM 的极性
lcd_hbp = <12>; # hsync back porch(pixel) + hsync plus width(pixel);
lcd_ht = <816>; # hsync total cycle(pixel)
lcd_hspw = <4>; # hsync plus width(pixel)
lcd_vbp = <12>; # vsync back porch(line) + vysnc plus width(line)
lcd_vt = <46>; # vsync total cycle(line)
lcd_vspw = <4>; # vsync plus width(pixel)
lcd_lvds_if = <0>;
lcd_lvds_colordepth = <1>;
lcd_lvds_mode = <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>;
pinctrl-0 = <&rgb18_pins_a>;
pinctrl-1 = <&rgb18_pins_b>;
};
1)首先将更改的内容进行编译,打包。烧录系统,先 ls 命令打印 /dev/ 目录看看有没有出现 fb0 这个节点
2)可以看到这里有 fb0节点。那就进行下最简单的花屏测试,使用如下命令:
cat /dev/urandom > /dev/fb0
3)另外也可以使用 colorbar 测试
echo 8 > /sys/class/disp/disp/attr/colorbar
基于全志T133-s3(Tina Linux)移植5寸RGB触摸屏驱动(正在努力移植)