对于触摸屏的基础理解 |
您所在的位置:网站首页 › 威纶通触摸屏通讯线引脚定义 › 对于触摸屏的基础理解 |
Ft5x06的实现 分为两部分整理————硬件接口与驱动注册+驱动执行部分 硬件接口目的: 1、知道硬件与cpu的接口,在dts/dtsi匹配设置参数,使得硬件被连接打通 2、知道tp芯片的寄存器设定,了解触点数目+触点坐标的寄存器,用于获取数据
驱动注册:驱动注册代码部分分析,对于实际的工作无太多意义。 ————硬件接口设计
1):INT引脚,这个脚是一个中端信号,它用来通知HOST端FT5X06已经准备好,可以进行读操作了。 2):WAKE引脚:这个功能主要的作用是将FT5X06从睡眠状态转换到工作状态。 3):/RST引脚:FT5X06的芯片复位信号。 如何来设计硬件接口呢,这个我们可以从FT5X06的datasheet看出来,首先我们来看下FT5X06的上电时序,如下图所示:(主要是INT、RST、I2C的两根线) 将引脚进行匹配,在dtsi文件中设置 ————接下来就是确定I2C的从地址,如下图所示: 从地址高位必须为:3,低位必须根据i2ccon设定的值来确定。 ————根据FT5406数据手册上的指令,我们先了解下驱动如何实现电容屏的多点触摸,其实很简单,主要需要触摸屏ICFT5406 能够捕获多点数据,这点电容屏基本多能支持到捕获2点以上,而FT5406可以捕获5个触摸点,编写驱动时,只要去获取这几个点的数据,然后上报就可以了。 在手册上面有具体的存储点的个数+具体点的x、y坐标的说明。 驱动注册:
在driver注册之前,bus、device都已经准备好了,所以driver在注册完之后,会通过名字与bus下面的device进行匹配,这个操作在driver结构中定义,在probe执行之前完成,匹配之后probe的参数就不是空的了,会自动被写入部分相关的数据。 了解完之后,开始看代码: 1、分析注册过程: 加载/卸载代码: static int __init ft5x06_ts_init(void) { return i2c_add_driver(&ft5x06_ts_driver); } module_init(ft5x06_ts_init); static void __exit ft5x06_ts_exit(void) { i2c_del_driver(&ft5x06_ts_driver); } module_exit(ft5x06_ts_exit); MODULE_DESCRIPTION("FocalTech ft5x06 TouchScreen driver"); MODULE_LICENSE("GPLv2"); return i2c_add_driver(&ft5x06_ts_driver);//注册驱动,struct i2c_driver ft5x06_ts_driver
看一下struct i2c_driver ft5x06_ts_driver的结构定义,理解如何注册的: static struct i2c_driver ft5x06_ts_driver = { .probe= ft5x06_ts_probe, //probe函数 作用:总线驱动类似于用轮训方法探测总线上的所有设备,将设备的识别型信息和关键数据结构传递给probe函数,probe就会识别是否是自己负责驱动的设备,并负责完成该设备的初始化操作。 .remove= ft5x06_ts_remove, //remove函数 ,卸载操作 .driver= { //driver结构 .name = "ft5x06_ts", //驱动名字,与设备名字相同,进行匹配 .owner = THIS_MODULE, //不解释 .of_match_table= ft5x06_match_table, //与dts或dtsi的设备匹配,用来获取数据 #ifdef CONFIG_PM //判断是否需要配置pm这个属性,CONFIG_PM一般定义为1 .pm = &ft5x06_ts_pm_ops, //这里包含两个函数,suspend、resume,前者为机器休眠的操作函数,后者为休眠唤醒的操作函数 #endif }, .id_table= ft5x06_ts_id, //与设备去匹配,这里一个驱动可以匹配多个设备(二维数组) }; 到此,注册结束,开始实现probe、remove、suspend、resume这四个函数 触摸屏操作的流程: 驱动加载完成之后,进入probe函数: 注意:在这里dts/dtsi文件起了作用,它把设备的信息,通过总线传送到具体硬件设备进行初始化设定。 dtsi文件应该定义的数据:i2c定义、中断、四个引脚(vcc也许要定义上电)、初始化数据(初始化ft5x06这个硬件芯片)等 看一下触屏的dtsi的结构: compatible = "goodix,gt9xx"; //名字,通过这个才能找到 reg = ; //设备注册号 interrupt-parent = ; //中断定义 interrupts = ; reset-gpios = ; //reset引脚 interrupt-gpios = ; //中断引脚 vdd-supply = ; //vdd vcc-i2c-supply = ; //vcc pinctrl-names = "pmx_ts_active","pmx_ts_suspend"; pinctrl-0 = ; pinctrl-1 = ; goodix,panel-coords = ; //坐标参数等,剩下的几乎都是 硬件触摸屏初始化参数 goodix,display-coords = ; goodix,button-map= ; goodix,product-id = "9137"; goodix,rawdata-key0 = ; goodix,rawdata-key1 = ; goodix,cfg-data0 {... ... ...}
probe里面做了哪些操作呢??? 1、分配触摸屏结构内核空间; pdata= devm_kzalloc(&client->dev, sizeof(structft5x06_ts_platform_data), GFP_KERNEL); 2、读取dtsi的数据,放到触摸屏结构中 err= ft5x06_parse_dt(&client->dev, pdata); 3、分配input驱动内核空间; 4、挂接到data,因为pdata等都是局部变量,在probe执行完之后就消失,需要挂接到data上 data->input_dev= input_dev;//系统分配的input子系统 data->client= client; //系统的client data->pdata= pdata; //系统的pdata数据(第2步的数据保存在这里) 5、i2c_set_clientdata(client,data);//屏幕硬件初始化设定 6、触摸屏复位,拉高;//pdata->power_init 7、中断申请,TS_INT就是我们所设定的中断脚;//申请中断引脚与中断号 8、input初始化参数设定,我们在前面提到Linux与Android多点触摸协议里有对这部分说明; 9、check the controllerid;//检查i2c与触屏硬件能否顺利通信 10、触摸屏版本信息;//通过i2c读取触摸板的信息 11,中断的休眠唤醒; 到此,完成了probe操作。
ft5x06_ts_interrupt函数:————中断函数 if(data->suspended){ …… ... }else{ ft5x06_fetch_touchdata(data); //i2c得到触屏设备发来的数据 ft5x06_adjust_touchdata(data); //调整数据 ft5x06_report_touchdata(data); //报告数据,通过input子系统 }
注册中断的时候,没有使用工作队列、tasklet等,而是使用了request_threaded_irq函数,以线程模式来开启中断操作!!!
至于更多的细节操作: 像suspend如何操作、resume如何操作、代码内的具体函数的原理 不甚明白,以后理解了再说吧。
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |