百问网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 = <<dc_pins_a>;
//pinctrl-1 = <<dc_pins_sleep_a>;
status = "disabled";
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
sii9022_in: endpoint {
remote-endpoint = <<dc_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
<dc {
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