电阻式触摸屏的驱动比较简单,能够选用输入子系统驱动结构来编写,而电容式触摸屏的驱动程序相对比较复杂,由于电容触控一般选用I2C接口操控,我在自己编写电容触控驱动的时分抑郁了好几天,当然,并不是由于I2C电容触控驱动繁琐,主要是天嵌TQ210的触摸屏驱动程序是以模块方法供给的,并不开放源代码,也没有供给触控的芯片手册,我曾经过技术咨询群和电话咨询的方法咨询过天嵌相关人士,想跟他们讨取触控协议而不要所谓的触控驱动程序源码,但受保密协议约束不供给源码及手册。咱们不去追查这些无聊的问题,只需找到触控芯片的类型并依据触控芯片类型找到对应的手册,然后就能够自己编写所谓的电容式触摸屏驱动了。
一 触控芯片剖析
首要,卸下触摸屏的四个螺丝并翻过触摸屏来调查,能够在在触摸屏排线上看到触控芯片,仔细调查芯片类型(假如看不清能够用放大镜合作手电筒观看),咱们能够看到,TQ210的触摸屏操控芯片是GT811,然后我找到了GT811的芯片手册(这些材料都上传到了我的CSDN资源里,请您支撑一下),有了手册,编写驱动就不难了。
GT811引出了6根脚,分别是VCC、GND、I2CSDA、I2CSCL、INT和RESET,尽管INT脚不是有必要的,可是开发高效省资源的触屏驱动程序往往都选用中止方法,下面是GT811的引脚图:
我用万能表实践测量了一下触控模块的各个引脚,实践线序是GND、SDA、SDL、INT、RESET和VDD。GT811的初始化次序如下:
- (1)初始化INT脚为悬浮输入态并初始化RESET脚为输出态,并输出低电平
- (2)延时1ms
- (3)初始化RESET脚为悬浮输入态,并使能上拉
- (4)写入GT811寄存器装备表
- (5)依据需要装备INT脚
详细的操作能够拜见代码部分。
二 I2C驱动编写
I2C驱动也是根据总线结构的,不过分为两种,一种是Legacy方法,另一种是New Style方法,其间,Legacy方法在新内核中现已不支撑了,不过韦东山教师的视频中仍是剖析的Legacy方法,New Style方法你能够自己用Source Insight追寻剖析一下,我这儿就不多说了,详细的能够参阅下面的代码。
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- conststaticunsignedshortnormal_address[]={0x5d,I2C_CLIENT_END};
- staticunsignedgt811_rst;
- staticunsignedgt811_int;
- staticstructinput_dev*ts_input;
- staticstructworkqueue_struct*wq;
- staticstructwork_structwork;
- staticstructi2c_client*this_client=NULL;
- staticunsignedintstatus=0;
- staticinti2c_read_bytes(structi2c_client*client,uint8_t*buf,intlen)
- {
- structi2c_msgmsgs[2];
- intret=-1;
- msgs[0].flags=!I2C_M_RD;
- msgs[0].addr=client->addr;
- msgs[0].len=2;
- msgs[0].buf=&buf[0];
- msgs[1].flags=I2C_M_RD;
- msgs[1].addr=client->addr;
- msgs[1].len=len-2;
- msgs[1].buf=&buf[2];
- ret=i2c_transfer(client->adapter,msgs,2);
- returnret;
- }
- staticinti2c_write_bytes(structi2c_client*client,uint8_t*data,intlen)
- {
- structi2c_msgmsg;
- intret=-1;
- msg.flags=!I2C_M_RD;
- msg.addr=client->addr;
- msg.len=len;
- msg.buf=data;
- ret=i2c_transfer(client->adapter,&msg,1);
- returnret;
- }
- staticconststructi2c_device_idts_id[]={
- {“tq210-ts”,0},
- {}
- };
- staticintts_init_panel(structi2c_client*client){
- shortret=-1;
- uint8_tconfig_info[]={
- 0x06,0xA2,
- 0x12,0x10,0x0E,0x0C,0x0A,0x08,0x06,0x04,0x02,0x00,0xE2,0x53,0xD2,0x53,0xC2,0x53,
- 0xB2,0x53,0xA2,0x53,0x92,0x53,0x82,0x53,0x72,0x53,0x62,0x53,0x52,0x53,0x42,0x53,
- 0x32,0x53,0x22,0x53,0x12,0x53,0x02,0x53,0xF2,0x53,0x0F,0x13,0x40,0x40,0x40,0x10,
- 0x10,0x10,0x0F,0x0F,0x0A,0x35,0x25,0x0C,0x03,0x00,0x05,0x20,0x03,0xE0,0x01,0x00,
- 0x00,0x34,0x2C,0x36,0x2E,0x00,0x00,0x03,0x19,0x03,0x08,0x00,0x00,0x00,0x00,0x00,
- 0x14,0x10,0xEC,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0D,0x40,
- 0x30,0x3C,0x28,0x00,0x00,0x00,0x00,0xC0,0x12,0x01
- };