ITOP4412----基于4.19.99Linux内核,添加内核提供的tsc2007触摸驱动程序

    技术2022-07-10  139

    本工程源码已打包进内核,使用gitee托管:地址

    前面一段时间移植好了4.3寸电阻屏,但是显示效果很差,也没有时间去和思路去调整,最近一切安定下来,终于能抽时间继续查漏补缺了。

    秉着先易后难的原则,就先把触摸屏的驱动给适配上吧,因为Linux官方提供的内核源码中,已经提供了tsc2007触摸芯片的驱动(偶然瞥见的,巧不巧),而恰好讯为的4.3寸屏幕使用的就是这款芯片。

    按照惯例,先在内核源码中找到驱动文件。 在内核目录下,找到: drivers/input/touchscreen/tsc2007_core.c文件,内核驱动的一贯套路,先看probe函数,tsc2007_probe中,可以看到从设备树里获取资源。那就完事了,把设备树写好,应该就适配完了。

    //设备树的属性值可以在.c文件里看到。 #ifdef CONFIG_OF static const struct of_device_id tsc2007_of_match[] = { { .compatible = "ti,tsc2007" }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, tsc2007_of_match); #endif

    一般内核提供了驱动文件的话,也会配套设备树的实例,跟着简单修改一下应该就能用了,在文档目录里找到了。

    Documentation/devicetree/bindings/input/touchscreen/tsc2007.txt

    这个文本文件里,比较详细地描述了tsc2007设备树的必须属性,还给了一个例子,我们按照例子修改即可。

    Example: &i2c1 { /* ... */ tsc2007@49 { compatible = "ti,tsc2007"; reg = <0x49>; interrupt-parent = <&gpio4>; interrupts = <0x0 0x8>; gpios = <&gpio4 0 0>; ti,x-plate-ohms = <180>; }; /* ... */ };

    修改后: 讯为的tsc2007芯片接的是I2c7,将设备挂载到I2c7下即可。

    &i2c_7 { samsung,i2c-sda-delay = <100>; samsung,i2c-slave-addr = <0x10>; samsung,i2c-max-bus-freq = <40000>; pinctrl-0 = <&i2c7_bus>; pinctrl-names = "default"; status = "okay"; tsc2007: tsc2007@38 { compatible = "ti,tsc2007"; reg = <0x48>; interrupt-parent = <&gpx0>; interrupts = <0 IRQ_TYPE_EDGE_FALLING>; pinctrl-names = "default"; pinctrl-0 = <&tsc2007_irq>;//<&ft5x06_rst>, // reset-gpios = <&gpc0 2 0>; gpios = <&gpx0 0 GPIO_ACTIVE_LOW>; ti,x-plate-ohms = <180>; status = "okay"; }; };

    这样就配置完了。记得把设备树编译出来,更新一下开发板。

    接着就是配置内核,把驱动配置到内核里去。 在Menuconfig里,把驱动选为y即可。

    然后就是make uImage -j4 LOADADDR=0x40007000,把内核镜像编译出来。

    启动开发板之后,可以发现/dev/input下多了一个event0,使用hexdump命令,用手触屏一下,会有一些信息打印出来,证明中断是没问题啦,其实在驱动里,可以加上一个宏定义#define DEBUG,就可以看到打印出来的坐标。 下面,我们把之前通过buildroot添加的tslib给使用上。

    修改/etc/profile文件,把tslib的环境给配置上: 第一个是配置触摸事件 第二个是配置校准文件 第三个是tslib的配置文件 第四个是tslib的库 第五个是控制台设备,不知道有什么用…知道的大神麻烦留言 第六个是屏幕设备

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

    配置完成以后,source /etc/profile,使环境生效。就可以使用ts_calibrate命令来校准屏幕了。校准完屏幕,重启一下开发板,坐标就正确了。还可以使用ts_test来试一下触摸滑动效果,也可以使用ts_print打印一下坐标。 如果要在QT中使用的话也是很简单,配置好了TSlib后,export到环境变量里:

    export QT_QPA_FB_TSLIB=1

    如果没有使用tslib的话:

    export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event0:rotate=180:invertx and inverty #这个是触摸屏幕的旋转,和颠倒

    乱七八糟的命令在这里记录一下,做笔记的习惯又丢了,唉。

    if mmc rescan; then echo SD/MMC found on device ${mmcdev};if run loadbootenv; then echo Loaded environment from ${bootenv};run importbootenv;fi;if test -n $uenvcmd; then echo Running uenvcmd ...;run uenvcmd;fi;if run loadbootscript; then run bootscript; fi; fi;mmc read ${loadaddr} 0x1000 0x4000; mmc read ${dtb_addr} 0x800 0xa0; bootm ${loadaddr} - ${dtb_addr}load mmc ${mmcdev} ${loadaddr} uImage; load mmc ${mmcdev} ${dtb_addr} ${dtb_name}; bootm ${loadaddr} - ${dtb_addr} setenv bootcmd 'fatload mmc 0:2 0x40007000 uImage;fatload mmc 0:2 0x41000000 exynos4412-itop-elite.dtb;bootm 0x40007000 - 0x41000000' fatload mmc 0:2 0x40007000 uImage fatload mmc 0:2 0x41000000 exynos4412-itop-elite.dtb bootm 0x40007000 - 0x41000000 setenv bootargs root=/dev/mmcblk0p3 rw rootwait rootfstype=ext4 init=/linuxrc console=tty0 console=ttySAC2,115200 fastboot.exe flash u-boot-iTOP-4412.bin fastboot.exe flash bootloader u-boot.bin fastboot.exe flash kernel uImage fastboot.exe flash dtb exynos4412-itop-elite.dtb fastboot.exe flash system system.img mount /dev/sda2 /mnt cd /mnt ./untitled1 -platform linuxfb -fn dejavu -mouse -qws export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=480x272:offset=0x0:tty=/dev/tty1 export QT_QPA_FONTDIR=usr/share/fonts //TSlib和QT的环境变量设置 export TSLIB_ROOT=/opt/tslib1.4 export QT_ROOT=/opt/qt5.8_arm export TSLIB_TSDEVICE=/dev/input/event0 export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event0:rotate=180:invertx and inverty #这个是触摸屏幕的旋转,和颠倒 export TSLIB_TSEVENTTYPE=input export TSLIB_CONFFILE=/opt/tslib1.4/etc/ts.conf export TSLIB_PLUGINDIR=/opt/tslib1.4/lib/ts export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0 export QT_QPA_EVDEV_MOUSE_PARAMETERS=/dev/input/event0 export QT_QPA_FB_TSLIB=1 export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:$QT_ROOT/lib:$TSLIB_ROOT/lib:$TSLIB_ROOT/ export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0 export QT_QPA_FONTDIR=$QT_ROOT/fonts export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event0 export QT_QPA_FB_HIDECURSOR=1 #说好的隐藏呢 export QML2_IMPORT_PATH=$QT_ROOT/qml export PATH=$PATH:/usr/local/arm/arm-2014.05/bin #export PATH=$PATH:/usr/local/arm/arm-2009q3/bin export CROSS_COMPILE=arm-none-linux-gnueabi-
    Processed: 0.032, SQL: 9