新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > S5PV210(TQ210)學習筆記——觸摸屏驅動編寫

        S5PV210(TQ210)學習筆記——觸摸屏驅動編寫

        作者: 時間:2016-11-28 來源:網絡 收藏
        電阻式觸摸屏的驅動比較簡單,可以采用輸入子系統驅動框架來編寫,而電容式觸摸屏的驅動程序相對比較復雜,因為電容觸控一般采用I2C接口控制,我在自己編寫電容觸控驅動的時候郁悶了好幾天,當然,并不是因為I2C電容觸控驅動繁瑣,主要是天嵌TQ210的觸摸屏驅動程序是以模塊方式提供的,并不開放源代碼,也沒有提供觸控的芯片手冊,我曾通過技術咨詢群和電話咨詢的方式咨詢過天嵌相關人士,想跟他們索取觸控協議而不要所謂的觸控驅動程序源碼,但受保密協議限制不提供源碼及手冊。我們不去追究這些無聊的問題,只要找到觸控芯片的型號并根據觸控芯片型號找到對應的手冊,然后就可以自己編寫所謂的電容式觸摸屏驅動了。

        一 觸控芯片分析

        首先,卸下觸摸屏的四個螺絲并翻過觸摸屏來觀察,可以在在觸摸屏排線上看到觸控芯片,仔細觀察芯片型號(如果看不清可以用放大鏡配合手電筒觀看),我們可以看到,TQ210的觸摸屏控制芯片是GT811,然后我找到了GT811的芯片手冊(這些資料都上傳到了我的CSDN資源里,請您支持一下),有了手冊,編寫驅動就不難了。

        本文引用地址:http://www.104case.com/article/201611/322810.htm

        GT811引出了6根腳,分別是VCC、GND、I2CSDA、I2CSCL、INT和RESET,雖然INT腳不是必須的,但是開發高效省資源的觸屏驅動程序往往都采用中斷方式,下面是GT811的引腳圖:

        我用萬能表實際測量了一下觸控模塊的各個引腳,實際線序是GND、SDA、SDL、INT、RESET和VDD。GT811的初始化順序如下:

        1. (1)初始化INT腳為懸浮輸入態并初始化RESET腳為輸出態,并輸出低電平
        2. (2)延時1ms
        3. (3)初始化RESET腳為懸浮輸入態,并使能上拉
        4. (4)寫入GT811寄存器配置表
        5. (5)根據需要配置INT腳
        具體的操作可以參見代碼部分。

        二 I2C驅動編寫

        I2C驅動也是基于總線結構的,不過分為兩種,一種是Legacy方式,另一種是New Style方式,其中,Legacy方式在新內核中已經不支持了,不過韋東山老師的視頻中還是分析的Legacy方式,New Style方式你可以自己用Source Insight追蹤分析一下,我這里就不多說了,具體的可以參考下面的代碼。

        1. #include
        2. #include
        3. #include
        4. #include
        5. #include
        6. #include
        7. #include
        8. #include
        9. conststaticunsignedshortnormal_address[]={0x5d,I2C_CLIENT_END};
        10. staticunsignedgt811_rst;
        11. staticunsignedgt811_int;
        12. staticstructinput_dev*ts_input;
        13. staticstructworkqueue_struct*wq;
        14. staticstructwork_structwork;
        15. staticstructi2c_client*this_client=NULL;
        16. staticunsignedintstatus=0;
        17. staticinti2c_read_bytes(structi2c_client*client,uint8_t*buf,intlen)
        18. {
        19. structi2c_msgmsgs[2];
        20. intret=-1;
        21. msgs[0].flags=!I2C_M_RD;
        22. msgs[0].addr=client->addr;
        23. msgs[0].len=2;
        24. msgs[0].buf=&buf[0];
        25. msgs[1].flags=I2C_M_RD;
        26. msgs[1].addr=client->addr;
        27. msgs[1].len=len-2;
        28. msgs[1].buf=&buf[2];
        29. ret=i2c_transfer(client->adapter,msgs,2);
        30. returnret;
        31. }
        32. staticinti2c_write_bytes(structi2c_client*client,uint8_t*data,intlen)
        33. {
        34. structi2c_msgmsg;
        35. intret=-1;
        36. msg.flags=!I2C_M_RD;
        37. msg.addr=client->addr;
        38. msg.len=len;
        39. msg.buf=data;
        40. ret=i2c_transfer(client->adapter,&msg,1);
        41. returnret;
        42. }
        43. staticconststructi2c_device_idts_id[]={
        44. {"tq210-ts",0},
        45. {}
        46. };
        47. staticintts_init_panel(structi2c_client*client){
        48. shortret=-1;
        49. uint8_tconfig_info[]={
        50. 0x06,0xA2,
        51. 0x12,0x10,0x0E,0x0C,0x0A,0x08,0x06,0x04,0x02,0x00,0xE2,0x53,0xD2,0x53,0xC2,0x53,
        52. 0xB2,0x53,0xA2,0x53,0x92,0x53,0x82,0x53,0x72,0x53,0x62,0x53,0x52,0x53,0x42,0x53,
        53. 0x32,0x53,0x22,0x53,0x12,0x53,0x02,0x53,0xF2,0x53,0x0F,0x13,0x40,0x40,0x40,0x10,
        54. 0x10,0x10,0x0F,0x0F,0x0A,0x35,0x25,0x0C,0x03,0x00,0x05,0x20,0x03,0xE0,0x01,0x00,
        55. 0x00,0x34,0x2C,0x36,0x2E,0x00,0x00,0x03,0x19,0x03,0x08,0x00,0x00,0x00,0x00,0x00,
        56. 0x14,0x10,0xEC,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0D,0x40,
        57. 0x30,0x3C,0x28,0x00,0x00,0x00,0x00,0xC0,0x12,0x01
        58. };
          上一頁 1 2 3 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 容城县| 石林| 巫溪县| 和硕县| 牙克石市| 泸定县| 大同市| 嵩明县| 策勒县| 平谷区| 灌云县| 泗洪县| 龙岩市| 于都县| 广南县| 冷水江市| 韶关市| 德化县| 岱山县| 北安市| 商洛市| 金川县| 平潭县| 阿坝| 南宫市| 韶山市| 晋江市| 泾阳县| 交城县| 佛教| 潍坊市| 仁布县| 苍溪县| 汉阴县| 屯留县| 牙克石市| 化州市| 会同县| 雷波县| 井研县| 谢通门县|