• Mangopi MQ-R:T113-s3(四)Tina系统 适配LCD屏幕



    参考大佬:https://www.gloomyghost.com/live/20220808.aspx

    • $ source build/envsetup.sh
    • $ lunch
    • 选择开发板:$ 7
    • 编译:$ make
    • 打包boot0和uboot为一个文件:$ mboot
    • 打包成一个.img镜像:$ pack

    打包好的地址为:/Tina-Linux/out/t113-mq_r/tina_t113-mq_r_uart0.img
    使用phoenixcard4.2.8.zip烧录启动卡到SD卡里面去

    适配LCD

    注意需要重新适配两个设备树

    修改Linux Kernel的设备树Tina-Linux/device/config/chips/t113/configs/mq_r/board.dts
    修改Uboot的设备树:Tina-Linux/device/config/chips/t113/configs/mq_r/uboot-board.dts

    原版的:我的五寸屏幕会闪屏,需要修改适配!

     当我们配置并行 RGB 接口时,在配置里面并不需要区分是 24 位,18 位和 16 位,最大位宽是哪种是参考 pin mux 表格,如果 LCD 屏本身支持的位宽比 SoC 支持的位宽少,当然只能选择少的一方。

     因为不需要初始化,RGB 接口极少出现问题,重点关注 lcd 的 timing 的合理性,也就是lcd_ht,lcd_hspw,lcd_hbp,lcd_vt,lcd_vspw和lcd_vbp这个属性的合理性。

    &lcd0 {
    /* part 1 */
    lcd_used = <1>;
    lcd_driver_name = "default_lcd";
    
    /* part 2 */
    lcd_if = <0>;
    lcd_hv_if = <0>;
    
    /* part 3 */
    lcd_width = <150>;
    lcd_height = <94>;
    lcd_x = <800>;
    lcd_y = <480>;
    lcd_dclk_freq = <33>;
    lcd_hbp = <46>;
    lcd_ht = <1055>;
    lcd_hspw = <0>;
    lcd_vbp = <23>;
    lcd_vt = <525>;
    lcd_vspw = <0>;
    
    /* part 4 */
    lcd_backlight = <50>;
    lcd_pwm_used = <1>;
    lcd_pwm_ch = <8>;
    lcd_pwm_freq = <10000>;
    lcd_pwm_pol = <1>;
    lcd_bl_en = <&pio PD 27 1 0 3 1>;
    lcd_bright_curve_en = <0>;
    
    /* part 5 */
    lcd_frm = <0>;
    lcd_io_phase = <0x0000>;
    lcd_gamma_en = <0>;
    lcd_cmap_en = <0>;
    lcd_hv_clk_phase = <0>;
    lcd_hv_sync_polarity= <0>;
    
    /* part 6 */
    lcd_power = "vcc-lcd";
    lcd_pin_power = "vcc-pd";
    pinctrl-0 = <&rgb24_pins_a>;
    pinctrl-1 = <&rgb24_pins_b>;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    上面是典型并行 RGB 接口 board.dts 配置示例,其中用空行把配置分成几个部分

    1. 第一部分,决定该配置是否使用,以及使用哪个屏驱动,lcd_driver_name 决定了用哪个屏驱动来初始化,这里是 default_lcd,是针对不需要初始化设置的 RGB 屏
    2. 第二部分决定下面的配置是一个并行 RGB 的配置。
    3. 第三部分决定了 SoC 中的 LCD 模块发送时序,请查看屏时序参数说明。
    4. 第四部分决定了背光(pwm 和 lcd_bl_en)。请看背光相关参数。
    5. 第五部分是显示效果部分的配置,如果非 24 位的 RGB,那么一般情况下需要设置lcd_frm。
    6. 第六部分就是电源和管脚配置。是用 RGB666 还是 RGB888,需要根据实际 pinmux 表来决定,如果该芯片只有 18 根 rgb 数据则只能 rgb18。请看电源和管脚参数。

    屏幕参数:
    在这里插入图片描述

    在这里插入图片描述

    照着屏幕规格书写的设备树:

    &lcd0 {
    	lcd_used            = <1>;            // 启用lcd
    
    	lcd_driver_name     = "default_lcd";  // 使用 default_lcd 驱动
    	lcd_backlight       = <50>;
    	lcd_if              = <0>;            // 0:rgb 4:dsi
    
    	// Part 1
    	lcd_x               = <800>;          // 宽度
    	lcd_y               = <480>;		  // 高度
    	lcd_width           = <108>;          // 屏幕物理宽度,单位 mm
    	lcd_height          = <65>;           // 屏幕物理高度,单位 mm
    
    	// Part 2
    	lcd_pwm_used        = <1>;            // 启用背光 PWM
    	lcd_pwm_ch          = <7>;            // 使用 PWM 通道 7
    	lcd_pwm_freq        = <50000>;         // PWM 频率,单位 Hz
    	lcd_pwm_pol         = <0>;            // 背光 PWM 的极性
    	lcd_pwm_max_limit   = <255>;          // 背光 PWM 的最大值(<=255)
    
    	// Part 3 
    	lcd_dclk_freq       = <29>;           // 屏幕时钟,单位 MHz
    	lcd_ht              = <928>;          // hsync total cycle(pixel)
    	lcd_hbp             = <88>;           // hsync back porch(pixel) + hsync plus width(pixel);
    	lcd_hspw            = <48>;           // hsync plus width(pixel)
    	lcd_vt              = <525>;          // vsync total cycle(line)
    	lcd_vbp             = <32>;           // vsync back porch(line) + vysnc plus width(line)
    	lcd_vspw            = <1>;            // vsync plus width(pixel)
    
    	// Part 4
    	lcd_lvds_if         = <0>;
    	lcd_lvds_colordepth = <1>;
    	lcd_lvds_mode       = <0>;
    	lcd_frm             = <0>;            // 0:关闭; 1:启用rgb666抖动; 2:启用rgb656抖动
    	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>;
    
    	// Part 5
    	pinctrl-0 = <&rgb18_pins_a>;
    	pinctrl-1 = <&rgb18_pins_b>;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    /Tina-Linux/lichee/linux-5.4/arch/arm/boot/dts/sun8iw20p1.dtsi

    rgb18_pins_a: rgb18@0 {
    				pins = "PD0", "PD1", "PD2", "PD3", "PD4", "PD5", \
    					"PD6", "PD7", "PD8", "PD9", "PD10", "PD11", \
    					"PD12", "PD13", "PD14", "PD15", "PD16", "PD17", \
    					"PD18", "PD19", "PD20", "PD21";
    				function = "lcd0";
    				drive-strength = <30>;
    				bias-disable;
    			};
    
    rgb18_pins_b: rgb18@1 {
    				pins = "PD0", "PD1", "PD2", "PD3", "PD4", "PD5", \
    					"PD6", "PD7", "PD8", "PD9", "PD10", "PD11", \
    					"PD12", "PD13", "PD14", "PD15", "PD16", "PD17", \
    					"PD18", "PD19", "PD20", "PD21";
    				function = "io_disabled";
    				bias-disable;
    			};
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    调试LCD

    满屏雪花

    cat /dev/urandom > /dev/fb0
    
    • 1

    清屏

    cat /dev/zero > /dev/fb0
    
    • 1

    在这里插入图片描述

    测试色条显示

    echo 8 > /sys/class/disp/disp/attr/colorbar
    
    • 1

    在这里插入图片描述

    适配电容触摸屏

    我的屏幕的电容屏芯片是汇顶:GT911

    配置内核模块

    make kernel_menuconfig
    
    • 1
    Device Drivers  ---> 
    	Input device support  --->
    		[*]   Touchscreens  --->
    			<*>   Goodix I2C touchscreen
    			<*>   gt9xxnew touchscreen driver
    
    • 1
    • 2
    • 3
    • 4
    • 5

    配置Kernel的设备树

    在这里插入图片描述

    根据原理图修改一下中断引脚和复位引脚如下:

    &twi2 {
    	clock-frequency = <400000>;
    	pinctrl-0 = <&twi2_pins_a>;
    	pinctrl-1 = <&twi2_pins_b>;
    	pinctrl-names = "default", "sleep";
    	dmas = <&dma 45>, <&dma 45>;
    	dma-names = "tx", "rx";
    	status = "okay";
    
    	/* pcf8574-usage:
    	 * only use gpio0~7, 0 means PP0.
    	 * pin set:
    	 * gpios = <&pcf8574 0 GPIO_ACTIVE_LOW>;
    	 * interrupt set:
    	 * interrupt-parent = <&pcf8574>;
    	 * interrupts = <0 IRQ_TYPE_EDGE_FALLING>;
    	 */
    	pcf8574: gpio@38 {
    					compatible = "nxp,pcf8574";
    					reg = <0x38>;
    					gpio_base = <2020>;
    					gpio-controller;
    					#gpio-cells = <2>;
    					interrupt-controller;
    					#interrupt-cells = <2>;
    					interrupt-parent = <&pio>;
    					interrupts = <PB 2 IRQ_TYPE_EDGE_FALLING>;
    					status = "disabled";
    	};
    
    	ctp@14 {
              compatible = "allwinner,goodix";
              device_type = "ctp";
              reg = <0x14>;
              status = "okay";
              ctp_name = "gt9xxnew_ts";
              ctp_twi_id = <0x2>;
              ctp_twi_addr = <0x14>;
              ctp_screen_max_x = <0x320>;
              ctp_screen_max_y = <0x1e0>;
              ctp_revert_x_flag = <0x0>;
              ctp_revert_y_flag = <0x0>;
              ctp_exchange_x_y_flag = <0x0>;
              ctp_int_port = <&pio PB 3 GPIO_ACTIVE_HIGH>; // 中断
              ctp_wakeup = <&pio PB 2 GPIO_ACTIVE_HIGH>; // 复位
    	};
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    配置文件系统

    make menuconfig
    
    • 1
    Libraries  --->
    	<*> tslib......... tslib is an abstraction layer for touchscreen panel events
    
    • 1
    • 2

    上电信息

    [    3.190476] get ctp_power is fail, -22
    [    3.194658] get ctp_power_ldo_vol is fail, -22
    [    3.199665] sunxi_ctp_startup: ctp_power_io is invalid.
    [    3.205523] get ctp_gesture_wakeup fail, no gesture wakeup
    [    3.211672] gt9xxnew_ts 2-0014: 2-0014 supply ctp not found, using dummy regulator
    [    3.409439] input: gt9xxnew_ts as /devices/virtual/input/input1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    设备节点

    $ ls /dev/input/
    event0  event1  event2  mice
    
    • 1
    • 2
  • 相关阅读:
    JVM--Java虚拟机
    [学习笔记]Python for Data Analysis, 3E-1.序言
    Springboot+Vue+Mysql实现模拟汽车保养系统(附源码)
    第十章 引用
    21天学会C++:Day8----范围for与nullptr
    最短路径之Dijkstra(迪杰斯特拉)路由算法C语言验证
    R语言使用ggplot2可视化泊松回归模型(Poisson Regression)的结果、可视化不同参量组合下的计数结果
    【Python3】基本数据类型、数据类型转换
    2022下半年软件设计师上午真题题目+答案 (新鲜出炉、持续更新)
    [hive]搭建hive3.1.2hiveserver2高可用可hive metastore高可用
  • 原文地址:https://blog.csdn.net/qq_28877125/article/details/127398866