百问网STM32157适配正点原子7寸电容屏(1024X600)

本文详细介绍了如何在百问网STM32MP157开发板上配置正点原子7寸电容屏,涉及修改设备树文件、触摸驱动以及QT环境变量。首先,通过对比正点原子源码修改STM32MP157的设备树文件,解决触摸IC与HDMI驱动IC的管脚冲突问题。其次,更新触摸驱动edt-ft5x06.c,并配置内核选项。最后,修改QT环境变量以确保触摸屏正常工作。经过这些步骤,正点原子触摸屏成功适配并能正常使用。
摘要由CSDN通过智能技术生成

百问网STM32157适配正点原子7寸电容屏(1024X600)

1.修改设备树文件

由于百问网STM32MP157的触摸IC与HDMI驱动IC复用,因此需要完成以下几个步骤

(1)在stm32mp157c-100ask-512d-lcd-v1.dts文件中对i2c4节点增加ft5x06触摸的描述信息,具体参考正点原子STM32MP157开发板的配套源码,如下

在正点原子出厂linux源码中找到stm32mp157d-atk-spdif.dts文件,在第64行可以看到两个触摸IC的描述信息

&i2c2 {
    ft5x06: ft5x06@38 {
        compatible = "edt,edt-ft5206";
        reg = <0x38>;
        interrupts = <1 IRQ_TYPE_EDGE_FALLING>;
        interrupt-parent = <&gpioi>;
        interrupt-controller;
        reset-gpios = <&gpioh 15 GPIO_ACTIVE_LOW>;
        status = "okay";
    };

    gt9147: gt9147@14 {
        compatible = "goodix,gt9147","goodix,gt1151";
        reg = <0x14>;
        interrupt-parent = <&gpioi>;
        interrupts = <1 IRQ_TYPE_EDGE_RISING>;
        irq-gpios = <&gpioi 1 GPIO_ACTIVE_HIGH>;
        reset-gpios = <&gpioh 15 GPIO_ACTIVE_HIGH>;
        status = "okay";
    };

};

回到stm32mp157c-100ask-512d-lcd-v1.dts中,因为百问网的触摸是挂在I2C4的节点下,因此根据stm32mp15xx-100ask.dtsi文件中的gt911描述信息找到相应的管脚

gt911@5d {
			compatible = "goodix,gt928";
			reg = <0x5d>;
			interrupt-parent = <&gpioe>;
			interrupts = <4 IRQ_TYPE_EDGE_FALLING>;
			reset-gpios = <&gpioe 12 GPIO_ACTIVE_LOW>;
			irq-gpios = <&gpioe 4 IRQ_TYPE_EDGE_FALLING>;
			irq-flags = <2>;                /*1:rising 2: falling*/
			touchscreen-max-id = <5>;
			touchscreen-size-x = <1024>;
			touchscreen-size-y = <600>;
	};

根据管脚信息,在stm32mp157c-100ask-512d-lcd-v1.dts中找到&i2c4

/*HDMI*/
&i2c4 {
        
       clock-frequency = <100000>;
       hdmi-transmitter@40 { // use a dummy device
                compatible = "sil,sii9022";
                reg = <0x40>;
                reset-gpios = <&gpiob 10 GPIO_ACTIVE_LOW>;
                interrupts = <13 IRQ_TYPE_EDGE_FALLING>;
                interrupt-parent = <&gpiob>;
                //pinctrl-names = "default", "sleep";
                //pinctrl-0 = <&ltdc_pins_a>;
                //pinctrl-1 = <&ltdc_pins_sleep_a>;
                status = "disabled";

                ports {
                        #address-cells = <1>;
                        #size-cells = <0>;
    
                        port@0 {
                                reg = <0>;
                                sii9022_in: endpoint {
                                        remote-endpoint = <&ltdc_ep1_out>;
                                };
                        };
    
                };
        };


	sii902x: sii902x@39 {
	          compatible = "SiI,sii902x";
	          reset-gpios = <&gpiob 10 GPIO_ACTIVE_LOW>;
	          //pinctrl-names = "default";
	          //pinctrl-0 = <&pinctrl_sii902x>;
	          interrupts = <13 IRQ_TYPE_EDGE_FALLING>;
	          interrupt-parent = <&gpiob>;
	          mode_str ="1024x600M@60";
	          bits-per-pixel = <16>;
	          reg = <0x39>;
	          status = "disabled";
	
	};


};

这里是RGB转HDMI IC sii902x的相关描述,因为RGB转HDMI驱动IC与FT5x06触摸ic管脚冲突,因此需要屏蔽sii902x相关信息,笔者在这将这些代码删除,包括追加的ltdc节点

/* test HDMI
&ltdc {
    status = "okay";
    port {
       #address-cells = <1>;
       #size-cells = <0>;

	ltdc_ep1_out: endpoint@1 {
	   		reg = <1>;
	    	remote-endpoint = <&sii9022_in>;
	    };

   };
};*/

最终ft5x06描述如下

&i2c4 {
        ft5x06: ft5x06@38 {
                compatible = "edt,edt-ft5206";
                reg = <0x38>;
                

                interrupt-parent = <&gpioe>;
                interrupt-controller;
                interrupts = <4 IRQ_TYPE_EDGE_FALLING>;
                reset-gpios = <&gpioe 12 GPIO_ACTIVE_LOW>;       
                //touchscreen-swapped-x-y=<1>;
                //touchscreen-size-x = <1024>;
                //touchscreen-size-y = <600>;
                status = "okay";
        };

};

2.修改edt-ft5x06.c(触摸驱动)

打开/home/book/100ask_stm32mp157_pro-sdk/Buildroot_2020.02.x/output/build/linux-origin_master/drivers/input/touchscreen/edt-ft5x06.c这个文件

在1135行附近增删如下代码,这些代码都是从正点原子出厂linux源码中看到的

np = of_find_node_by_path("/lcd_id");
    if(np == NULL) {
        printk("lcd_id node nost find! %s\n",__func__);
        return -1;
    }

error = of_property_read_u32(np, "select_id", &tmp);
if(error < 0) {
    printk("select_id read failed! \n");
    return 0;
}

if(tmp == 1) {
input_set_abs_params(input, ABS_MT_POSITION_X,
				0, 800, 0, 0);
input_set_abs_params(input, ABS_MT_POSITION_Y,
                0, 480, 0, 0);
}else if(2 == tmp) {
input_set_abs_params(input, ABS_MT_POSITION_X,
                0, 1024, 0, 0);
input_set_abs_params(input, ABS_MT_POSITION_Y,
                0, 600, 0, 0);
}

// if (tsdata->version == EDT_M06 ||
//     tsdata->version == EDT_M09 ||
//     tsdata->version == EDT_M12) {
// 	input_set_abs_params(input, ABS_MT_POSITION_X,
// 			     0, tsdata->num_x * 64 - 1, 0, 0);
// 	input_set_abs_params(input, ABS_MT_POSITION_Y,
// 			     0, tsdata->num_y * 64 - 1, 0, 0);
// } else {
// 	/* Unknown maximum values. Specify via devicetree */
// 	input_set_abs_params(input, ABS_MT_POSITION_X,
// 			     0, 65535, 0, 0);
// 	input_set_abs_params(input, ABS_MT_POSITION_Y,
// 			     0, 65535, 0, 0);
// }

同时在/home/book/100ask_stm32mp157_pro-sdk/Buildroot_2020.02.x/output/build/linux-origin_master/arch/arm/boot/dts/stm32mp15xx-100ask.dtsi文件中led节点(140行左右)上方增加如下代码

lcd_id {
        select_id = <2>;
    };
led {
    	compatible = "gpio-leds";
    	blue {
    		label = "heartbeat";
    		gpios = <&gpioa 10 GPIO_ACTIVE_HIGH>;
    		linux,default-trigger = "heartbeat";
    		default-state = "off";
    	};
        red {
            label = "red";
            gpios = <&gpiog 8 GPIO_ACTIVE_HIGH>;
            linux,default-trigger = "none";
            status = "okay";
        };

};

这些修改完成后还需要配置内核

在/home/book/100ask_stm32mp157_pro-sdk/Buildroot_2020.02.x路径下打开终端

执行

make linux-menuconfig

定位到如下图位置,将CONFIG_TOUCHSCREEN_EDT_FT5X06配置为y

在这里插入图片描述

重新编译内核

make linux-rebuild  

更新uImahe和设备树文件stm32mp157c-100ask-512d-lcd-v1.dtb 到板子上的/boot目录

3.修改QT环境变量(重要,踩坑)

直接说了,启动开发板,修改/usr/bin/start.sh文件如下

#!/bin/sh -e

echo "start myir HMI 2.0..."
echo  82 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio82/direction
echo 1 > /sys/class/gpio/gpio82/value

echo  139 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio139/direction
echo 1 > /sys/class/gpio/gpio139/value



export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_CONSOLEDEVICE=none
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/lib/ts
export TSLIB_TSEVENTTYPE=INPUT




export QT_QPA_EGLFS_ALWAYS_SET_MODE=1
export QT_QPA_EGLFS_KMS_ATOMIC=1
export QT_QPA_EGLFS_KMS_CONFIG=/usr/share/qt5/cursor.json
export QT_QPA_EGLFS_INTEGRATION=eglfs_kms
export QT_QPA_EGLFS_TSLIB=1
export QT_QPA_EVDEV_MOUSE_PARAMETERS=abs
export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event0,evdevmouse:/dev/input/event0
export QT_QPA_EGLFS_DISABLE_INPUT=1


export QT_QPA_FONTDIR=/usr/lib/fonts
export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/plugins
export QT_PLUGIN_PATH=/usr/plugins
export LD_LIBRARY_PATH=/usr/lib:/usr/plugins/platforms
export QML2_IMPORT_PATH=/usr/qml 


mount /dev/mmcblk2p2 /boot
wait

export QT_QPA_PLATFORM=eglfs
/usr/bin/mxapp2  -platform eglfs &

#export QT_QPA_PLATFORM='linuxfb'
#/usr/bin/mxapp2 -platform linuxfb &

exit 0

增加了TSLIB和QT的相关环境变量,这个地方踩了很多坑,主要参考这个网址

https://bbs.elecfans.com/jishu_1889296_1_1.html 在PanGu Board上运行Qt应用实战

接下来将修改/etc/profile如下

export PATH=/bin:/sbin:/usr/bin:/usr/sbin

if [ "$PS1" ]; then
	if [ "`id -u`" -eq 0 ]; then
		export PS1='# '
	else
		export PS1='$ '
	fi
fi

export PAGER='/bin/more'
export EDITOR='/bin/vi'

# Source configuration files from /etc/profile.d

for i in /etc/profile.d/*.sh ; do
	if [ -r "$i" ]; then
		. $i
	fi
done
unset i

export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_CONSOLEDEVICE=none
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/lib/ts
export TSLIB_TSEVENTTYPE=INPUT

export QT_QPA_EGLFS_ALWAYS_SET_MODE=1
export QT_QPA_EGLFS_KMS_ATOMIC=1
export QT_QPA_PLATFORM=eglfs
export QT_QPA_EGLFS_INTEGRATION=eglfs_kms

export QT_QPA_EGLFS_TSLIB=1
export QT_QPA_EVDEV_MOUSE_PARAMETERS=abs
export QT_QPA_EGLFS_KMS_CONFIG=/usr/share/qt5/cursor.json
export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event0,evdevmouse:/dev/input/event0
export QT_QPA_EGLFS_DISABLE_INPUT=1

export QT_QPA_FONTDIR=/usr/lib/fonts
export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/plugins
export QT_PLUGIN_PATH=/usr/plugins
export LD_LIBRARY_PATH=/usr/lib:/usr/plugins/platforms
export QML2_IMPORT_PATH=/usr/qml 


HOSTNAM='/bin/hostname:'
PS1='\[\e[0;32m\][\u@\h:\w]\$ \[\e[m\]'
shopt -s checkwinsize
resize
export PS1 HOSTNAME

plugins文件夹是从buildroot下的QT目录中拿到的,也可以屏蔽掉

在【韦东山】嵌入式Linux应用开发完全手册_韦东山全系列视频文档-STM32MP157开发板(预览版).pdf中第2篇的第十二章中找到图形库和图形应用,里面有QT的相关说明,笔者使用了platform 为linuxfb 和eglfs两种方式进行实验,在GPU加持下,画面更加流畅,上述的QT相关声明均使用eglfs方式

经测试,正点原子触摸屏可以正常使用

注:需要有FPC转接板,说明详见参考文章1,有能力的也可以自己画板子

如果发现XY轴对调的话,有两种办法解决

(1)/home/book/100ask_stm32mp157_pro-sdk/Buildroot_2020.02.x/output/build/linux-origin_master/arch/arm/boot/dts/stm32mp157c-100ask-512d-lcd-v1.dts文件中修改I2C4节点如下

&i2c4 {
        ft5x06: ft5x06@38 {
                compatible = "edt,edt-ft5206";
                reg = <0x38>;
                interrupt-parent = <&gpioe>;
                interrupt-controller;
                interrupts = <4 IRQ_TYPE_EDGE_FALLING>;
                reset-gpios = <&gpioe 12 GPIO_ACTIVE_LOW>;            
                touchscreen-swapped-x-y=<1>;
                status = "okay";       

        };

};

增加touchscreen-swapped-x-y=<1>;

(2)修改开发板中/etc/ts.conf文件

在这里插入图片描述

在module linear后加上xyswap

如有疑问请评论留言或者发邮箱1272910026@qq.com,看到即回复

参考文章

1.http://wiki.100ask.org/How_to_use_fpc_adapter_board#.E9.87.8D.E6.96.B0.E9.85.8D.E7.BD.AE.E5.86.85.E6.A0.B8.E6.B7.BB.E5.8A.A0.E9.A9.B1.E5.8A.A8

2.https://bbs.elecfans.com/jishu_1889296_1_1.html

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值