一、前言
linux的触摸屏驱动一般要经历一下几个步骤(以4412为例):1.移植驱动到linux源码“driver/input/touchscreen/”目录下,在Kconfig里面增加这款触摸屏驱动的菜单。
#add by long 20170207
config TOUCHSCREEN_GT9XX
tristate "GT9XX based touchscreens"
depends on I2C
help
Say Y here if you have a GT9XX based touchscreen
controller.
If unsure, say N.
To compile this driver as a module, choose M here: the
module will be called GT9XX.
#end add
2.在“driver/input/touchscreen/Makefile"文件里增加编译条件,控制触摸屏驱动是否编译。
obj-$(CONFIG_TOUCHSCREEN_GT9XX) += gt9xx_module.o
gt9xx_module-objs := gt9xx.o gt9xx_update.o goodix_tool.o
3.增加板载驱动信息。修改方法,,在“arch/arm/mach-exynos/mach-itop4412.c“增加
#if defined(CONFIG_TOUCHSCREEN_GT9XX)
{
//I2C_BOARD_INFO("Goodix-TS", 0x5d),
I2C_BOARD_INFO("Goodix-TS", 0x14),
},
#endif
二、全志平台触摸屏驱动移植
1.简介
全志平台对于input设备有专门的模块程序进行管理,无需添加专门的初始化信息或者insmod驱动,这个模块就是“sw-device.c”,所在位置“drivers/input/sw-device.c”。安卓系统初始化的时候只需要安装sw-device.ko即可
“ insmod /system/vendor/modules/sw-device.ko”
sw-device所支持的设备有
2.移植gt928触摸屏驱动的步骤1:修改sys_config.fex
若 sys_config.fex 文件中不存在 ctp_list 配置项时,请添加该配置项,且将不使用的存在冲突的设备设置为 0,即将其剔除出扫描列表。已支持的设备不存在冲突情况,但是为了减少检测时间,也可以将不使用的模组剔除出扫描列表。将 gt82x 系列剔除出扫描列表,
sys_config.fex 文件中关系到自动 ctp 自动检测功能的为 “ctp”以及“ ctp_list”
两块参数。如下所示:
[ctp]
compatible = "allwinner,sun50i-ctp-para"
ctp_used = 1
ctp_name = "gt9xxf_ts"
ctp_twi_id = 1
ctp_twi_addr = 0x14
ctp_screen_max_x = 1280
ctp_screen_max_y = 800
ctp_revert_x_flag = 0
ctp_revert_y_flag = 0
ctp_exchange_x_y_flag = 1
ctp_int_port = port:PH10<6><default><default><default>
ctp_wakeup = port:PH11<1><default><default><1>
ctp_power_ldo = "vcc-ctp"
ctp_power_ldo_vol = 3300
ctp_power_io =
;-----------------------------------------------------------------------
如果ctp_used 设置为0 ,表示不使用ctp,则将不继续ctp的自动检测。
;------------------------------------------------------------------------
[ctp_list]
ctp_list_used = 1 //设置为 1 时,启动自动检测,设置为 0 时,不检测
ft5x_ts = 1 //设置为 1,添加该型号 TP 到自动扫描列表
gt82x = 0 //设置为 0,不添加该型号 TP 到自动扫描列表
gslX680 = 0 //gslX680 旧量产工具 TP,和 gslX680new 不能同时为 1
gslX680 new = 0 //gslX680 新量产工具 TP,和 gslX680 不能同时为 1
gt9xx_ts = 0
gt9xxf_ts = 1
gt811 = 0
zet622x = 0
ctp_list列表中的名称顺序必须与 sw-device.c中ctps的名称顺序一一对应。
当ctp_list_used 设置为1时,启用自动检测,将设置为0时,退出自动检测。模块
的名称后面写 1表示添加到自动检测扫描列表,写0表示剔除自动检测扫描列表
3.移植gt928触摸屏驱动的步骤2:修改menuconfig
在编译服务器上,目录为\lichee\linux-3.10 上,输入以下命令:make ARCH=arm64 menuconfig进入目录 Device Drivers\Input device support\ i2c device detect support 目录下可以看到 device 模块是编译为模块、编译进内核、不编译。 device 驱动默认编译为模块
Symbol: TOUCHSCREEN_GT9XXF_TS [=m]
Type : tristate
Prompt: gt9XXF touchscreen driver
Location:
-> Device Drivers
-> Input device support
> Generic input layer (needed for keyboard, mouse, ...) (INPUT [=y])
-> Touchscreens (INPUT_TOUCHSCREEN [=y])
Defined at drivers/input/touchscreen/gt9xxf/Kconfig:5
Depends on: !UML && INPUT_TOUCHSCREEN [=y] && INPUT [=y] && I2C [=y]
4.移植gt928触摸屏驱动的步骤3:修改sw_device
sw-device.c 中的修改主要为增加设备的描述信息,将相关的描述信息增加到相应的 sw_device_info 中的变量中即可。结构体 sw_device_info 用于存放设备的相关信息,该结构体的相关变量如下列表所示:注意:当有两个或者以上的设备地址相同,且存在两个设备没有 chip id 值时,将按照顺序检测,返回第一个检测到的设备,可能造成错误,因此当存在两个设备没有 chip id 时,为了确保无误,请将不使用的设备剔除掉。CTP 设备的 sw_device_info 结构体变量为 ctps,如果增加的设备为 ctp 设备,只需要按照 sw_device_info 中的格式,添加相关的信息放置到 ctps 变量中即可。Gsensor 设备的 sw_device_info 结构体变量为 gsensors,如果增加的设备为gsensor 设备,只需要按照 sw_device_info 中的格式,添加相关的信息放置到 gsensors变量中即可。以下针对 sw_device_info 中相关的设置进行相关的说明。( 1)进行 chip id 值检测ctp 中需要增加 gt811 这个设备到自动检测中,编译之后的模块驱动名称为:“gt811”, I2C 地址可以设置为 0x5d; chip id 寄存器为 0x715; chip id 值为 0x11。描述信息如下所示:
static struct sw_device_info ctps[] = {
{ "ft5x_ts", { 0x38}, 0xa3, {0x0a,0x55,0x06,0x08,0x02,0xa3}, 0},
{ "gt82x", { 0x5d}, 0xf7d, {0x13,0x27,0x28 }, 0},
{ "gslX680", { 0x40}, 0x00, {0x00 }, 1},
{"gslX680new", { 0x40}, 0x00, {0x00 }, 1},
{"gt9xx_ts", { 0x14,0x5d}, 0x8140, {0x39 }, 0},
{"gt9xxf_ts",{ 0x14,0x5d}, 0x00, {0x00 }, 1},
{ "gt811", { 0x5d}, 0x715, {0x11 }, 0},
{"gt818_ts", { 0x5d}, 0x715, {0xc3 }, 0},
{"aw5306_ts",{ 0x38}, 0x01, {0xA8 }, 0},
{ "zet622x", { 0x76}, 0x00, {0x00 }, 0},}
( 2)不进行 chip id 值检测当设备没有 chip id 值时,可以不进行 chip id 的检测,此时 chip_id_reg 以及id_value 都必须设置为 0x00,否者将可能造成错误。这些设备都只检测 i2c 通信而不进行 chip id 值的判断,当所支持的设备中,没有产生地址冲突的情况时,也可以将chip_id_reg 以及 id_value 设置为 0x00 而不检测 chip id。zet622x ctp 设备没有 chip id 如下所示:
static struct sw_device_info ctps[] = {
{ "ft5x_ts", { 0x38}, 0xa3, {0x0a,0x55,0x06,0x08,0x02,0xa3}, 0},
{ "gt82x", { 0x5d}, 0xf7d, {0x13,0x27,0x28 }, 0},
{ "gslX680", { 0x40}, 0x00, {0x00 }, 1},
{"gslX680new", { 0x40}, 0x00, {0x00 }, 1},
{"gt9xx_ts", { 0x14,0x5d}, 0x8140, {0x39 }, 0},
{"gt9xxf_ts",{ 0x14,0x5d}, 0x00, {0x00 }, 1},
{ "gt811", { 0x5d}, 0x715, {0x11 }, 0},
{"gt818_ts", { 0x5d}, 0x715, {0xc3 }, 0},
{"aw5306_ts",{ 0x38}, 0x01, {0xA8 }, 0},
{ "zet622x", { 0x76}, 0x00, {0x00 }, 0},}
( 3) same_flagsame_flag 为当支持的设备中有两个或者以上的设备地址相同,当有一个以上设备是没有 chip id 时,需要写 1 进行标识。当有两个设备以上地址相同且没有 chip id,则将按照顺序进行检测,且返回检测到的第一个设备。为避免错误,当两个以上设备地址相同且没有 chip id 值时,请将方案中不需要的设备剔除掉。剔除的方法为sys_config.fex 中相应的模组名称后写 0。
注意:当增加一个设备时,除了在 sw-device.c 中添加 sw-device_info 结构体设备的配置信息外,sys_config.fex 文件中也需要在设备的列表中增加该设备,增加检测的可选性。ctp 中的设备列表为“ [ctp_list]”, gsensor 中的设备列表为“[gsensor_list]”。如在 sw_device.c 中的 ctps 增加了“ gt9xx”,在“ ctp_list”中需要增加相应的配置项,否则将默认添加到扫描列表中。Xxx_list 中设备的名称需要跟 sw_device_info 中设备的名称顺序对应,且名称必须一致,否则将无法正确解析,默认将所有的都添加到扫描列表中。
示例如下:
sys_config.fex文件的ctp_list如下图所示
sw_device.c的设备列表如下:
5.移植gt928触摸屏驱动的步骤4:驱动的拷贝
编译过程中使用的命令: $extract-bsp ,将把驱动拷贝到指定的目录中备用。编译后的目录: out\ target\product\...\system\vendor\modules,省略的部分为lunch 时选择选择的配置文件夹名称。机器中对应的目录为: /system/vendor/modules
6.移植gt928触摸屏驱动的步骤5:测试触摸屏驱动
重新打包安卓的镜像烧录到开发板,开机后读取驱动的信息。默认情况下驱动的信息是不显示的,需要更改sw_device.c的调试等级才会显示。
调试信息如下
shell@tulip-t1:/ # dmesg |grep gt9
<4>[ 22.205895] get_detect_list name = gt9xxf_ts
<4>[ 22.205901] number 6, module_name:gt9xxf_ts is_support:1
<4>[ 22.205905] get_detect_list name = gt9xxnew_ts
<4>[ 22.205911] number 5, module_name:gt9xxnew_ts is_support:0
<4>[ 22.205916] get_detect_list name = gt9xx_ts
<4>[ 22.205921] number 4, module_name:gt9xx_ts is_support:0
<4>[ 22.304202] sw_device_response_test: name = gt9xxf_ts, addr = 0x14
<4>[ 22.402562] sw_device_response_test: name = gt9xxf_ts, addr = 0x5d
<4>[ 22.403183] from copy name:gt9xxf_ts, strlen(name):0
<4>[ 22.403306] write info:ctp_module_name="gt9xxf_ts"
<4>[ 102.924129] i2c-core: driver [gt9xxf_ts] using legacy suspend method
<4>[ 102.924142] i2c-core: driver [gt9xxf_ts] using legacy resume method
<6>[ 103.032128] input: gt9xxf_ts as /devices/virtual/input/input5
7.官方关于sw_device的使用说明
CTP 使用步骤
( 1)自动检测支持的模组
FT 系列: ft5202, ft5204, ft5316, ft5x06(共用一个驱动, ft5x_ts.ko);驱动源文件目录: \lichee\linux-3.10\drivers\input\touchscreen\ft5x
Goodix 系 列 : gt813,gt827,gt828(gt82x.ko) , 驱 动 源 文 件 目 录 :\lichee\linux-3.10\drivers\input\touchscreen
gt9xx 系列(gt9xx_ts.ko),可以 gt9xx 系列中带 flash的触摸 IC 可以在此驱动中添加支持,驱动源文件目录: \lichee\linux-3.10\drivers\input\touchscreen\gt9xx;
gt9xxf 系列(gt9xxf_ts.ko),可以 gt9xx 系列中不带 flash的触摸 IC 可以在此驱动中添加支持;驱动源文件目录: \lichee\linux-3.10\drivers\input\touchscreen\gt9xxf
GSL 系列: gsl1680,gsl2681,gsl1688,gsl1680e(gslX680.ko),驱动源文件目录:\lichee\linux-3.10\drivers\input\touchscreen\gslx680;
GSL 系 列 (gslX680new.ko), 驱 动 源 文 件 目 录 :\lichee\linux-3.10\drivers\input\touchscreen\gslx680new,此驱动用于支持 GSL系列中,新量产工具生成的 firmware 的触摸 IC;
AW 系列, aw5206,aw5306(aw5306_ts.ko);驱动源文件目录: \lichee\linux-3.10\drivers\input\touchscreen\aw5x06。
( 2)驱动的拷贝编译过程中使用的命令:
$extract-bsp ,将把驱动拷贝到指定的目录中备用。编译后的目录: out\ target\product\...\system\vendor\modules,省略的部分为lunch 时选择选择的配置文件夹名称。机器中对应的目录为: /system/vendor/modules
( 3) sys_config.fex 文件的修改
若 sys_config.fex 文件中不存在 ctp_list 配置项时,请添加该配置项,且将不使用的存在冲突的设备设置为 0,即将其剔除出扫描列表。已支持的设备不存在冲突情况,但是为了减少检测时间,也可以将不使用的模组剔除出扫描列表。将 gt82x 系列剔除出扫描列表,如下所示。
[ctp_list]
ctp_list_used = 1
ft5x_ts = 1
gt82x = 0
gslX680 = 1
gslX680new = 0
gt818 = 1
zet622x = 1
aw5306_ts = 1
( 4)驱动的加载使用自动检测功能时,只需要加载 sw-device.ko 即可。
在 android\device\softwinner\polaris-xxx\init.xxx.rc 中添加驱动加载的模块,为了快速的检测到设备,此语句应该放置在模块加载的最前面,如下所示:
on fs
……
#csi module
insmod /system/vendor/modules/videobuf-core.ko
insmod /system/vendor/modules/videobuf-dma-contig.ko
#insmod tp and keyboard gsensor
insmod /system/vendor/modules/sw-device.ko
insmod /system/vendor/modules/sunxi-keyboard.ko
#insmod usb ethernet
insmod /system/vendor/modules/asix.ko
insmod /system/vendor/modules/qf9700.ko
......如果 Gsensor 使用而 CTP 不想使用时,只需要修改 sys_config.fex 中 的“ctp_list”主键下的 “ctp_list_used”子键值,将其设置为 0 即可,而不需要将加载语句删除掉,这样 ctp 驱动就不会被自动检测和加载。
(5) IDC 文件使用
adb shell getevent 命令,或者设备的名称为“ gslX680”,“ gt82x”,“ ft5x_ts”,“sunxi-ts”,“gt818_ts”,“gt811_ts”,“gt9xx”,“sw-ts”时,使用的 idc 名字均为 tp.idc。 idc 文件放置的目录为:system/usr/idc ,则在配置文件为 polaris_xx.mk拷贝语句如下所示: