2023年6月26日发(作者:)
GT8xx多芯片模组应用于Android平台驱动移植说明书V1.5
【程序总揽】
本程序针对Android2.1系统,移植的硬件平台为华天正科技开发的Real6410(基于S3C6410)。本驱动支持多指,通过编译宏开关能够支持三种运行方式;能够在系统支持的情况下在主控进入关屏状态时自动调整GT8XX工作状态,达到省电的目的。
1.1 系统硬件资源使用
资源类型
外部中断(可选,建议使用)
GOODIX演示主控配置
硬件IO:S3C64XX_GPL(10)
作用
接收GT8XX的数据中断,通知系统系统中断号:119((外部中断18),运行相应的坐标处理;
触发类型可通过配置信息控制
IO口(Reset)(可选) 154(S3C64XX_GPF(3)),配置为输出控制
I2C适配器(SCL、SDA)
I2C-0
在GT8XX睡眠时用作唤醒管脚
控制GT8XX运行状态,硬件复位GT8XX(低有效)
GT8XX控制、数据传输
注:如需要支持GT8XX的睡眠功能,则INT管脚和Reset必选其一。
1.2 系统运行流程
为了便于移植,程序中采用了中断、中断+不定时查询和轮询三种方式,程序根据编译宏自动选择方式。以边沿触发中断方式为例,系统的主运行流程如下所示:
1.
2.
创建GT8XX对应的i2c_client对象,其中完成了该适配器的相关信息设置(name,address等);
加载触摸屏驱动,注意该驱动必须在I2C总线驱动已经加载的情况下才能进行,否则I2C通信将出错。程序中将其加载优先级设为最低;
3. 创建驱动结构体,探测GT8XX设备,并将其挂载到I2C总线驱动上;测试I2C通信,注册input设备,申请IO口和中断资源,完成GT8XX初始化工作;
4.
5.
6.
7.
8.
开启触摸屏中断,等待数据接收;
收到触摸屏数据中断,关中断;
通过I2C传输数据,分析手指信息,;
更新按键信息,上报手指坐标、按键等信息,开中断;
重复4-7之间的循环。
开始系统启动,创建触摸屏的i2c_client,加载触摸屏驱动创建i2c_driver结构体,执行probe函数设备探测成功?Y开启触摸屏数据中断等待触摸屏中断关闭中断,读取缓冲区数据,对数据进行校验分析有按压动作?NYN读取触摸坐标、压力等信息N发送按键/松键信息,开中断退出系统?Y注销设备,释放相关资源结束
【移植指南】
1、 准备工作
本驱动采用GPL许可证,代码没有采用模块方式,所以使用本驱动前需要重新编译内核。在编译内核前,我们需要做好以下准备工作:
1.1 在硬盘上或使用虚拟机(如VmWare)安装Linux系统,推荐使用Ubuntu;
1.2 安装gcc及arm-linux-gcc和其他编译工具,将CC和LD指定为arm-linux-gcc;
1.3 获取平台对应的Android源码,解压到自己的工作目录。
1.4 了解移植平台的IO口、中断、I2C总线的使用方式。
2、 内核编译配置
在编译代码前我们需要进行内核编译配置,可使用下面命令中的一个:
#make xconfig (基于QT的图形配置界面,直观,推荐使用)
#make menuconfig (基于文本菜单的配置界面)
下面我们以make xconfig为例,将我们的驱动增加到内核中去。假定我们源代码目录为:
~/android/kernel/
将编写的源代码复制到Linux内核源代码的相应目录:
~/android/kernel/driver/input/touchscreen/goodix_touch.c
~/android/kernel/include/linux/goodix_touch.h
~/android/kernel/include/linux/goodix_queue.h(主要用于辅助功能和调试,可能不包括)
1) 在目录touchscreen的Kconfig文件中增加新源代码对应项目的编译配置选项:
# 配置项名称,加载后将生成一个全局的编译开关CONFIG_TOUCHSCREEN_GOODIX_BIG
config TOUCHSCREEN_GOODIX_BIG
#选择项,tristate表示有三种选择状态:Y(编译进内核),N(不编译),M(编译成驱动模块)
tristate "
Goodix Big TouchScreen Driver"
#默认编译选项,Y标识要将其编译进内核
default y
#依赖项,本驱动必须工作在I2C总线驱动的基础上
depends on I2C
#帮助信息,用于对驱动功能和使用方法的简单描述,可选
help
This is a android driver to support the Gooidx's GT8XX touchscreen
on s3c6410 platform. The touchscreen support multi-touch as more as ten.
Say Y here to enable the driver for the touchscreen on the
S3C SMDK board.
If unsure, say compile this driver as a module, choose M here:
the module will be called goodix_.
config TOUCHSCREEN_GOODIX_IAP
bool "Goodix GT8xx touchscreen update support"
#需要I2C驱动和GOODIX触摸屏驱动的支持
depends on I2C && TOUCHSCREEN_GOODIX_BIG
default y
help
This is a part of Goodix touchscreen function of this moudle is
to update the firmware of GT8XX touchscreen moudle must
be used with the program in user mode of android platform.
Say Y here to enable the driver for the touchscreen on the S3C SMDK board.
If unsure, say N.
注意:
当将编译选项设置为M时,编译生成的驱动需要我们手动挂载。如需要系统启动时自动挂载,需要将模块goodix_拷贝到系统模块加载目录,并修改对应的启动过程的rc脚本,不推荐使用。
2) 在touchscreen目录下的makefile文件中增加对新源代码的编译条目;
#这里的二进制文件名必须与要增加的驱动源文件名一致,如goodix_touch
obj-$(CONFIG_GOODIX_TOUCHSCREEN_BIG) += goodix_touch.o
3) 进入内核源码目录,执行make xconfig命令,查看配置界面的Device Drivers->Input device
support->Touchscreens项下面是否增加了Goodix Big TouchScreen Driver条目(如下图),如果有,则表示增加成功。
3、 New-style形式(probe方式)驱动信息配置
如果采用的是New-style驱动探测方式(GOODIX驱动程序使用了该方式),在挂载驱动前需要预先建立在主板的i2c_board_info列表 中添加I2C地址、名字、中断等相关结构信息,以便于系统自动建立i2c_client用于probe。需要修改的文件路径为 arch/arm/mach-s3c6410/ mach-smdk6410.c,i2c总线0上需要建立的的适配器列表,需要挂载在哪个适配器列表上取决于硬件配置。
将文件中的以下地方:
static struct i2c_board_info i2c_devs0[] __initdata = {
{ I2C_BOARD_INFO("24c08", 0x50), },
/* { I2C_BOARD_INFO("WM8580", 0x1b), },
}
*/
修改为:
static struct i2c_board_info i2c_devs0[] __initdata = {
/* { I2C_BOARD_INFO("24c04", 0x50, }, */
//0x55为I2C从设备地址,注意名字"Goodix-TS"与代码中GOODIX_I2C_NAME的值一致
{ I2C_BOARD_INFO("Goodix-TS", 0x55),
//程序中使用的系统中断号,也可直接在驱动文件中指定,需要根据实际情况修改
.irq=IRQ_EINT(18),},
……,
};
4、 修改input子系统使驱动支持多指(仅Linux kernel 2.26.30以下版本需要)
要支持多点触摸,首先需要 linux 内核的支持,也就是 input 子系统需要提供多点触摸的接口,其次是
GUI 库要能处理多点触摸的事件,后者在Android2.0及以上版本已经支持。内核方面,自 2.26.30 以后的内核的 input 子系统开始增加了多点触摸的支持,而比这更早版本的内核我们可以通过修改input子系统源文件来完成支持。
以内核2.6.28为例,主要修改的部分为:(红色代码为需要添加的部分,绿色代码为系统原有代码,如果没有引用系统原有代码,则表示该部分代码可位于文件的任何地方)
在文件(内核源文件目录)/include/input.h中按照以下几部分修改:
PART1:
#define SYN_REPORT 0
#define SYN_CONFIG 1
#ifdef CONFIG_TOUCHSCREEN_GOODIX_BIG
#define SYN_MT_REPORT 2
#define ABS_MT_TOUCH_MAJOR 0x30 /* Major axis of touching ellipse */
#define ABS_MT_TOUCH_MINOR 0x31 /* Minor axis (omit if circular) */
#define ABS_MT_WIDTH_MAJOR 0x32 /* Major axis of approaching ellipse */
#define ABS_MT_WIDTH_MINOR 0x33 /* Minor axis (omit if circular) */
#define ABS_MT_ORIENTATION 0x34 /* Ellipse orientation */
#define ABS_MT_POSITION_X 0x35 /* Center X ellipse position */
#define ABS_MT_POSITION_Y 0x36 /* Center Y ellipse position */
#define ABS_MT_TOOL_TYPE 0x37 /* Type of touching device */
#define ABS_MT_BLOB_ID 0x38 /* Group a set of packets as a blob */
#define ABS_MT_TRACKING_ID 0x39 /* Unique ID of initiated contact */
#define ABS_MT_PRESSURE 0x3a /* Pressure on contact area */
#endif
#define ABS_MAX 0x3f
#define ABS_CNT (ABS_MAX+1)
PART2:
/*
* MT_TOOL types
*/
#ifdef CONFIG_TOUCHSCREEN_GOODIX_BIG
#define MT_TOOL_FINGER 0
#define MT_TOOL_PEN 1
#endif
PART3:
#ifdef CONFIG_TOUCHSCREEN_GOODIX_BIG
static inline void input_mt_sync(struct input_dev *dev)
{
input_event(dev, EV_SYN, SYN_MT_REPORT, 0);
}
#endif
在文件(内核源文件目录)/drivers/input/input.c 按照以下几部分进行修改:
PART1:
#ifdef CONFIG_TOUCHSCREEN_GOODIX_BIG
static unsigned int __initdata input_abs_bypass_init_data[] = {
ABS_MT_TOUCH_MAJOR,
ABS_MT_TOUCH_MINOR,
ABS_MT_WIDTH_MAJOR,
ABS_MT_WIDTH_MINOR,
ABS_MT_ORIENTATION,
ABS_MT_POSITION_X,
ABS_MT_POSITION_Y,
ABS_MT_TOOL_TYPE,
ABS_MT_BLOB_ID,
ABS_MT_TRACKING_ID,
ABS_MT_PRESSURE,
0
};
static unsigned long input_abs_bypass[BITS_TO_LONGS(ABS_CNT)];
#endif
PART2:
static void input_handle_event(struct input_dev *dev,
……
disposition = INPUT_PASS_TO_HANDLERS;
}
break;
#ifdef CONFIG_TOUCHSCREEN_GOODIX_BIG
case SYN_MT_REPORT:
dev->sync = 0;
disposition = INPUT_PASS_TO_HANDLERS;
break;
#endif
}
break;
……
case EV_ABS:
if (is_event_supported(code, dev->absbit, ABS_MAX)) {
#ifdef CONFIG_TOUCHSCREEN_GOODIX_BIG
if (test_bit(code, input_abs_bypass)) {
disposition = INPUT_PASS_TO_HANDLERS;
break;
}
#endif
value = input_defuzz_abs_event(value,
dev->abs[code], dev->absfuzz[code]);
PART3:
#ifdef CONFIG_TOUCHSCREEN_GOODIX_BIG
static void __init input_init_abs_bypass(void)
{
const unsigned int *p;
for (p = input_abs_bypass_init_data; *p; p++)
input_abs_bypass[BIT_WORD(*p)] |= BIT_MASK(*p);
}
#endif
PART4:
static int __init input_init(void)
{
int err;
#ifdef CONFIG_TOUCHSCREEN_GOODIX_BIG
input_init_abs_bypass();
#endif
err = class_register(&input_class);
}
其他版本的内核的input子系统文件可以根据/kernel/ 上提供的文件更新比较来
作出对应的修改。
5、 GT8XX触摸屏的配置信息
GT8XX触摸屏在上电初始化的过程中,可以向主控需要发送配置信息,适合不同机型触摸屏的配置信息由汇顶科技公司提供,具体配置信息详细内容可参阅GT8xx的用户手册。下面以10 inch屏为例,配置信息的设置在goodix_touch.c文件中goodix_init_panel函数中的config_info[]数组:
static int goodix_init_panel(struct goodix_ts_data *ts)
{
int ret=-1;
uint8_t config_info[] = {
//红色部分为配置信息(有省略),需要根据不同的模组情况进行修改
// MAX_FINGER_NUM标识支持的手指数目,INT_TRIGER标识INT检测方式
101, //操作地址
1, //原点
0X03, //X最大输出
0XC0,
0X02, //Y最大输出
0X80,
MAX_FINGER_NUM, //手指数
(0|INT_TRIGGER), //module_switch
……
……
};
ret=i2c_write_bytes(ts->client,config_info,
(sizeof(config_info)/sizeof(config_info[0])));
if (ret <= 0)
return ret;
msleep(10);
return 0;
}
只有发送正确的配置信息才能让GT8XX运行在最佳状态,注意不同模组的配置信息一般都不相同。注意: 发送配置信息不是必要步骤,触摸屏模组在出产时已经保存了一组正确的配置,在此发送配置信息只是在触摸屏模组调试阶段使用,goodix_touch驱动默认不发送配置信息,如需改变模组的配置信息,请将GOODiX提供的正确配置信息替换上面的config_info数组中的内容,然后打开goodix_touch.h中的#define
DRIVER_SEND_CFG宏开关即可。
如果操作到这一步,并且之前的所有移植操作都正确的完成,那么GT8XX系列触摸屏就能正常的配合您的主控进行工作了,后续是一些附加功能的移植或使用说明,建议您根据实际需要进行操作。推荐在驱动中增加“触摸屏固件升级支持”,以保证您的触摸屏能够升级到GOODIX提供的最新固件。
6、 编译控制宏的使用
在gootix_touch.h中定义了GT8XX使用到的一些资源,其中几个可作为编译控制宏使用。
#define INT_PORT
#define INT_TRIGGER
S3C64XX_GPL(10)
0
//Int IO port
//电平触发+查询方式的时间间隔(ms),轮询方式为:POLL_TIME+6
#define POLL_TIME 10
#define HAVE_TOUCH_KEY
#define DRIVER_SEND_CFG
……
如果没有定义INT_PORT,驱动将使用轮询方式,查询时间间隔为(POLL_TIME + 6)ms,可以通过修改POLL_TIME的值来调整坐标查询频率;
如果定义INT_PORT且有效,驱动将使用中断触发方式,其INT_TRIGER标识的是默认的INT触发方式中,驱动在上电时会从触摸屏模组读取正确的触发方式,若读取失败,则会使用默认的出发方式;
如果配置为电平触发(Touch保持为高或保持为低),驱动将在有触摸动作的时间内循环查询坐标情况(中断+循环查询),查询的时间间隔为POLL_TIME ms。注意该方式没有严格的坐标上报时间间隔(一般在系统重负载时坐标发送速率将降低)。
如果GT801_PLUS模组自带触摸按键检测功能,请定义HAVE_TOUCH_KEY有效,驱动将对触摸按键进行支持,请参照GOODIX的《GTXF23 GT801双芯片组合应用说明》文档对触摸按键进行配置,并在goodix_touch.h中的touch_key_array数组中设置各个按键的功能和按键的顺序,GOODIX提供的驱动程序默认依次设置MENU,HOME,CALL三个按键,如需增减按键,请直接给该数组赋需要的键值,并调整顺序即可:
const uint16_t touch_key_array[]={
KEY_MENU, //MENU
KEY_BACK, //HOME
KEY_SEND //CALL
};
DRIVER_SEND_CFG宏开关是用来控制是否向模组发送配置信息的,请谨慎使用,因为发送错误的配置信息可能使触摸屏模组失效。
7、 触摸屏固件升级支持
为了使您的触摸屏始终保持最好的工作状态,强烈建议在您的驱动中增加对固件升级的支持模块,该模块提供对Android应用层的固件升级程序的支持,能够将GT8XX系列触摸屏模块的固件进行升级。GOODIX提供的参考驱动代码默认自带固件升级模块,并依赖CONFIG_TOUCHSCREEN_GOODIX_IAP宏编译开关,如需对固件升级进行支持,可以通过Kconfig文件中增加该选项(前面的Kconfig设置已包含该项),或者直接在goodix_touch.h中定义,两者二选一即可:
#define CONFIG_TOUCHSCREEN_GOODIX_IAP
安装GOODIX提供的Android固件升级程序GOODiX在线升级程序.apk,程序运行后的界面如下图所示:
第一个路径栏用于选择用于升级中要使用固件文件(*.bin),第二个路径栏用于选择升级过程中要使用的配置文件(*.cfg或者*.txt),程序会自动保存上次升级所使用升级文件的路径,通过”浏览”按钮可以从存储器中选择升级文件相应的升级文件,选择升级文件的界面如下图所示:
进入相应文件夹选择用于升级的*.bin文件时,程序将弹出警告提示,如果您确认该文件为GOODIX提供的正确的bin文件,请选择”强制升级”返回升级主界面,否则请”重新选择”正确的bin文件。(注意:错误的升级文件将导致触摸屏失效,请慎重操作!)
选择完两个升级文件后,升级主界面的地址栏中将显示您所选择的路径:
点击”升级”按钮进入升级后,将出现确认升级倒计时对话框,可以点击”立即升级”直接进入升级,或者点击”选择”返回升级主界面,注意:10s倒计时到后,程序将自动进入升级:
进入升级后,将在屏幕中央打印出升级过程的各个步骤,并用进度条显示升级进度,可以对比升级前后所读取的版本号,来判断升级是否成功:
升级完成10s后,程序将自动弹出系统重启倒计时,20s倒计时后,系统自动重新启动:
如果升级失败,触摸屏将无法正常工作,重启系统后将出现以下提示界面,此时请将升级文件按照程序的按照上次升级的路径和文件名存放,然后重启系统,程序将自动进行升级:
固件升级注意事项:
(1) 升级前请确保系统电量充足,以防升级过程中出现意外;
(2) 请确保升级文件为GOODIX提供的GT81x触摸屏模组的bin文件;
(3) 请确保升级文件为GOODIX提供的对应于贵公司屏的配置文件;
(4) 建议升级完成后卸载该程序,以防止出现误操作;
8、 系统资源使用
GT8XX的硬件I2C传输有最大速率限制(具体速率限制可以通过查询GT8XX主控编程说明),过大将通信失败,需要预设移植系统的I2C总线速度低于此速度;I2C系统的上拉电阻应保证小于一定阈值。
驱动中使用的Reset管脚为GPF3,移植时需要修改为移植芯片上的对应管脚;注意Reset管脚为低有效(IO口输入低时,触摸屏复位);
系统使用的中断管脚为GPL10(系统中断119),移植时需要根据具体的应用手册来修改系统中断号。不使用中断(即采用轮询方式)将可能降低主控系统效率。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1687751787a39268.html
评论列表(0条)