背景
触摸屏作为人机交互的关键设备之一,其稳定性对设备的使用至关重要,通常触摸屏的驱动会编进内核中,但是这会导致一个问题,如果触摸芯片概率性工作不正常会导致触摸驱动加载失败,影响设备的使用,所以需要将触摸驱动改成以模块的形式加载,那又引出另外一个问题:如何在开机之后加载触摸驱动?
开机后自动加载驱动的方式无非就是两种:
1、通过脚本加载
通过脚本加载有一个好处就是可定制化强,不依赖特定的策略和规则,例如,
- 如果触摸驱动加载失败可以通过脚本控制重复加载
- 如果在设备使用过程中触摸失灵,可以通过脚本控制触摸驱动重新加载
- 等等,其他情况
2、通过udev加载
使用udev的方式加载,从项目整体视角来看有益于标准化,减少重复造轮子,
本次调试的触摸芯片为: ili2131,触摸驱动的版本为:ilitek_limv5_9_0_2
修改内核配置,生成内核驱动模块,为了快速验证,直接修改Makefile:
//修改前
ccflags-y += -Wall
obj-y += ilitek.o
ilitek-y += ilitek_main.o \
ilitek_platform_init.o \
ilitek_update.o \
ilitek_tool.o \
ilitek_protocol.o \
ilitek_mp.o
//修改后
ccflags-y += -Wall
obj-m += ilitek.o
ilitek-y += ilitek_main.o \
ilitek_platform_init.o \
ilitek_update.o \
ilitek_tool.o \
ilitek_protocol.o \
ilitek_mp.o
根据设备树配置修改udev规则,设备树配置 i2c 第三通道 地址 0x41 :
/* touch */
&i2c3 {
clock_frequency = <400000>;
pinctrl-names = "default";
status = "okay";
ili2131: ili2131@41 {
compatible = "tchip,ilitek";
reg = <0x41>;
pinctrl-names = "default";
pinctrl-0 = <&ilitek_ili2131_pins>;
interrupt-parent = <&gpio4>;
interrupts = <1 IRQ_TYPE_EDGE_FALLING>;
ilitek,irq-gpio = <&gpio4 1 IRQ_TYPE_EDGE_FALLING>;
ilitek,reset-gpio = <&gpio1 12 GPIO_ACTIVE_HIGH>;
ilitek,name = "ilitek_i2c";
touchscreen-swapped-x-y;
touchscreen-revert-y;
touchscreen-lcm-resolution;
touchscreen-lcm-resolution-x = <800>;
touchscreen-lcm-resolution-y = <1280>;
};
};
udev动态加载规则文件:/lib/udev/rules.d/80-drivers.rules
//修改前
root@myd-imx8mm:/lib/udev/rules.d# cat 80-drivers.rules
# do not edit this file, it will be overwritten on update
ACTION!="add", GOTO="drivers_end"
ENV{MODALIAS}=="?*", RUN{builtin}+="kmod load $env{MODALIAS}"
SUBSYSTEM