Android touch详解(2) touch bringup
前言
本篇文章是根据本人实际项目的touch开发流程编写的,如有遗漏欢迎补充
了解需求
在一个项目的起始阶段,首先要了解该项目要用的touch 模组或touch IC;阅读touch模组和touch Ic spec;整理touch相关的需求,包括时序要求、电压要求、I2C从机地址、wakeup的实现等。确认有无特殊的功能要求。
电路图
review硬件电路图,确认touch使用的gpio只有touch使用、检查soc的spec确认中断gpio是否具有wakeup能力;I2C是否有上拉,有没有对应测试点。
确认touch需要enable的电源,一般包括,I2C上拉电源、touch IC电源、level shift电源;确保touch相关电源都是畅通的;
驱动移植
1. 添加touch driver
将驱动代码移植到目录" \drivers\input\touchscreen\sis_i2c_95xx " 下,“sis_i2c_95xx” 是touch驱动代码所在的文件夹,一般命名方式为:厂商缩写_(i2c/usb_)芯片型号
2. 修改Makefile
\drivers\input\touchscreen\sis_i2c_95xx\Makefile
#
# # Makefile for the sis95xx touchscreen drivers.
#
obj-$(CONFIG_TOUCHSCREEN_SIS_I2C_95XX) += sis_i2c.o
修改上级目录Makefile
obj-$(CONFIG_TOUCHSCREEN_SIS_I2C_95XX) += sis_i2c_95xx/
obj-$(CONFIG_XXX) += sis_i2c.o,表示在这个目录中有一个名为sis_i2c.o的目标文件。sis_i2c.o将从sis_i2c.c 或sis_i2c.S文件编译得到
其中 $(CONFIG_XXX)代表引用了CONFIG_XXX变量,CONFIG_XXX一般定义在.ini文件中,可以为y(编译进内核)或m(编译成模块),如果CONFIG_XXX的不是y或m就不会编译连接
3. kconfig
\drivers\input\touchscreen\sis_i2c_95xx\Kconfig
#
# STMicroelectronics touchscreen driver configuration
#
config TOUCHSCREEN_SIS_I2C_95XX
tristate "SiS95xx series I2C touchscreen driver"
depends on I2C
help
Say Y here to enable support for I2C connected ilitek touch panels.
If unsure, say N.
To compile this driver as a module, choose M here: the
module will be called sis_i2c.
修改上级目录Kconfig
source "drivers/input/touchscreen/sis_i2c_95xx/Kconfig"
config是关键字,表示一个配置选项的开始;紧跟着的TOUCHSCREEN_SIS_I2C_95XX是配置选项的名称。编译过程中会以arch\arm64\Kconfig为起点逐层解析Kconfig,在TOUCHSCREEN_SIS_I2C_95XX前面加入前缀"CONFIG_"
tristate表示变量类型,即"CONFIG_TOUCHSCREEN_SIS_I2C_95XX"的类型,有5种类型:bool、tristate、string、hex和int,其中 tristate和string是基本的类型
depends on:表示依赖于XXX,“depends on I2C”表示只有当I2C配置选项被选中时,当前配置选项的提示信息才会出现,才能设置当前配置选项
4. .ini文件
\mpos_config\hw_config\hw_common.ini
CONFIG_TOUCHSCREEN_SIS_I2C_95XX=y
设置CONFIG_TOUCHSCREEN_SIS_I2C_95XX的值,y为编译进内核、m为编译成模块。在编译过程中会通过Makefile、Kconfig和.ini中的定义一起结合生成.config文件。总结来说,Kconfig中去定义"CONFIG_XXX"变量,Makefile中引用变量看是否编译,.ini定义变量的值。
\android_out\ …\target\product\ …\obj\KERNEL_OBJ\ .config
CONFIG_TOUCHSCREEN_SIS_I2C_95XX=y
若没有定义变量的值,则"CONFIG_XXX"的值为n(不编译)
5. DTS
修改对应dts文件,通过I2C SCL和SDA的gpio确定touch挂在哪个I2C下面,设置compatible匹配的driver、addr,设置irq、reset、电源的gpio,设置pinctrl的名字和状态。
\arch\arm64\boot\dts\qcom\
&tlmm {
sis_ts_default {
sis_ts_reset_default: sis_ts_reset_default {
mux {
pins = "gpio66";
function = "gpio";
};
config {
pins = "gpio66";
drive-strength = <2>;
bias_disable;
};
};
sis_ts_int_default: sis_ts_int_default {
mux {
pins = "gpio107";
function = "gpio";
};
config {
pins = "gpio107";
drive-strength = <2>;
bias_pull_down;
};
};
sis_ts_through_default: sis_ts_through_default {
mux {
pins = "gpio113";
function = "gpio";
};
config {
pins = "gpio113";
drive-strength = <2>;
bias_disable;
};
};
};
};
&i2c_4 {
status = "okay";
/* sis touch configuration */
sis_touchscreen@5c {
compatible = "sis,sis_touch"; //和驱动中保持一致
reg = <0x5c>;// I2C地址
interrupt-parent = <&tlmm>;
interrupts = <107 0x0>;
sis,irq-gpio = <&tlmm 107 0x00>;
sis,reset-gpio = <&tlmm 66 0x00>;
sis,through-gpio = <&tlmm 113 0x00>;
// 电源
p5v_usb-supply = <&p5v_usb>;
vregl13-supply = <&pm660_l13>;
vregl11-supply = <&pm660_l11>;
p3v3-supply = <&p3v3>;
pinctrl-names = "sis_ts_default";
pinctrl-0 = <&sis_ts_reset_default