1、硬件原理
TP 相关的引脚有 SCL、SDA、VREG_L10、INT、RST,SCL、SDA用于I2C通讯,VREG_L10用于芯片供电,INT用于产生外部中断,RST是复位引脚。
2、涉及到的知识点
I2C子系统:(https://www.cnblogs.com/deng-tao/p/6130080.html)
INPUT输入子系统:(https://www.cnblogs.com/deng-tao/p/6094049.html)
工作队列:(http://bgutech.blog.163.com/blog/static/18261124320116181119889/)
中断:(http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=21977330&id=3755609)
在linux里,中断处理分为顶半(top half),底半(bottom half),在顶半里处理优先级比较高的事情,要求占用中断时间尽量的短,在处理完成后,就激活底半,有底半处理其余任务。底半的处理方式主要有soft_irq, tasklet, workqueue三种,他们在使用方式和适用情况上各有不同。soft_irq用在对底半执行时间要求比较紧急或者非常重要的场合,主要为一些subsystem用,一般driver基本上用不上。 tasklet和work queue在普通的driver里用的相对较多,主要区别是tasklet是在中断上下文执行,而work queue是在process上下文,因此可以执行可能sleep的操作。
3、功能的调试
a、工模信息的导入
为了方便查看 手机内部信息,项目一般会定制工模,TP正常工作后一般下一步是导入工模,A306的工模通过拨号可以查看,步骤如下。
在makefile下包含wind_device_info下的文件
要在common.c中包含相应的头文件,及定义一个wind_device_info 结构体。
在来prob函数的末尾处把TP名称和版本信息放到wind_device_info结构体中,将就会显示到工模中。
b、手势功能的调试
手势的作用是为了在熄屏状态下快速唤醒手机或应用,流程是当处于熄屏状态下,在屏幕上画相应的手势后,触摸ic处理相应的数据后产生中断,驱动程序根据数据上报相应的键值,然后上层根据键值就会打开相应的手势功能。
-
中断中如何获取TP捕捉到的手势信息
键值的上报: hx83102_ts_register_interrupt(ts->client); himax_int_register_trigger(client); request_threaded_irq(client->irq, NULL, himax_ts_thread,...); himax_ts_thread(int irq, void *ptr) himax_ts_isr_func((struct hx_83102_ts_data *)ptr); hx83102_ts_work(ts); //主要的工作在这个环节 himax_wake_check_func(); ret_event = himax_parse_wake_event(hx83102_ts); //解析手势键值 input_report_key(hx83102_ts->input_dev, KEY_EVENT, 1);//上报键值,上层解析到键值会做相应动作。 input_sync(hx83102_ts->input_dev);//事件结束
c、TP固件升级
-
固件升级是为了当TP中的IC固件升级后,可以在开机后自动加载目录中更新版的固件进行升级。
1、读取 TP IC 中的固件版本号。
2、读取代码(*.i文件)中TP固件版本号。
3、将上述两个版本号比较,判断是否进行TP固件升级
4、如何进行固件升级://申请更新,创建工作队列, 可以把工作推后,交由一个内核线程去执行,因为固 件升级比较耗时。 ts->himax_update_wq = create_singlethread_workqueue("HMX_update_reuqest"); //准备更新TP的固件 INIT_DELAYED_WORK(&ts->work_update, himax_update_register); himax_update_register(); i_update_FW(); fts_ctpm_fw_upgrade_with_sys_fs_32k(private_ts->client,\ ImageBuffer,fullFileLength,false); i2c_himax_write(client, HX_CMD_TSSLPOUT,&cmd[0], 0, DEFAULT_RETRY_CNT)