S5PV210(TQ210)學習筆記——觸控式螢幕驅動編寫
電阻式觸控式螢幕的驅動比較簡單,可以採用輸入子系統驅動框架來編寫,而電容式觸控式螢幕的驅動程式相對比較複雜,因為電容觸控一般採用I2C引腳才控制,我在自己編寫電容觸控驅動的時候鬱悶了好幾天,當然,並不是因為I2C電容觸控驅動繁瑣,主要是天嵌TQ210的觸控式螢幕驅動程式是以模組方式提供的,並不開發原始碼,也沒有提供觸控的晶片手冊,我曾通過技術諮詢群和電話諮詢的方式諮詢過天嵌相關人士,想跟他們索取觸控協議而不要所謂的觸控驅動程式原始碼,但是,天嵌相關人員以保密協議為由(儘管我完全不相信做LCD屏的商家會不告訴你怎麼用屏)拒絕提供觸控協議。我們不去追究這些無聊的問題,好在天嵌這樣的公司(或者是與其合作開發的觸控式螢幕驅動的公司)還沒有實力自己做晶片,所以,只要找到觸控晶片的型號並根據觸控晶片型號找到對應的手冊,然後就可以自己編寫所謂的電容式觸控式螢幕驅動了。
一 觸控晶片分析
首先,卸下觸控式螢幕的四個螺絲並翻過觸控式螢幕來觀察,可以在在觸控式螢幕排線上看到觸控晶片,仔細觀察晶片型號(如果看不清可以用放大鏡配合手電筒觀看),我們可以看到,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 <linux/module.h>
- #include <linux/input.h>
- #include <linux/i2c.h>
- #include <linux/gpio.h>
- #include <linux/delay.h>
- #include <linux/input.h>
- #include <plat/gpio-cfg.h>
- #include <linux/interrupt.h>
- conststatic unsigned short normal_address[] = {0x5d, I2C_CLIENT_END};
- static unsigned gt811_rst;
- static unsigned gt811_int;
- staticstruct input_dev *ts_input;
- staticstruct workqueue_struct *wq;
- staticstruct work_struct work;
- staticstruct i2c_client * this_client = NULL;
- static unsigned int status = 0;
- staticint i2c_read_bytes(struct i2c_client *client, uint8_t *buf, int len)
- {
- struct i2c_msg msgs[2];
- int ret=-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);
- return ret;
- }
- staticint i2c_write_bytes(struct i2c_client *client,uint8_t *data,int len)
- {
- struct i2c_msg msg;
- int ret=-1;
- msg.flags=!I2C_M_RD;
- msg.addr=client->addr;
- msg.len=len;
- msg.buf=data;
- ret=i2c_transfer(client->adapter,&msg, 1);
- return ret;
- }
- staticconststruct i2c_device_id ts_id[] = {
- { "tq210-ts", 0 },
- { }
- };
- staticint ts_init_panel(struct i2c_client *client){
- short ret=-1;
- uint8_t config_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
- };
- config_info[62] = 480 >> 8;
- config_info[61] = 480 & 0xff;
- config_info[64] = 800 >> 8;
- config_info[63] = 800 & 0xff;
- ret = i2c_write_bytes(client, config_info, sizeof(config_info)/sizeof(config_info[0]));
- if(ret < 0) {
- printk(KERN_ERR "GT811 Send config failed!\n");
- return ret;
- }
- return 0;
- }
- static irqreturn_t gt811_int_handler(int irq, void *devid){
- disable_irq_nosync(this_client->irq);
- queue_work(wq, &work);
- return IRQ_RETVAL(IRQ_HANDLED);
- }
- staticvoid ts_work_func(struct work_struct* work){
- int ret;
- unsigned char point_data[19] = {0x07, 0x21, 0};
- unsigned short input_x = 0;
- unsigned short input_y = 0;
- unsigned short input_p = 0;
- ret=i2c_read_bytes(this_client, point_data, sizeof(point_data)/sizeof(point_data[0]));
- if(ret <= 0){
- printk("Failed\n");
- return;
- }
- if(point_data[2]&0x1){
- status = 1;
- input_y = 479-((point_data[4]<<8)|point_data[5]);
- input_x = 799-((point_data[6]<<8)|point_data[7]);
- input_p = point_data[8];
- printk("stat: %d, x: %d, y: %d, p: %d\n", point_data[2], input_x, input_y,
- input_p);
- }
- elseif(status){
- status = 0;
- printk("up\n");
- }
- enable_irq(this_client->irq);
- }
- staticint ts_probe(struct i2c_client *client, conststruct i2c_device_id *id){
- int retry, ret;
- char test_data;
- printk("ts_probe\n");
- test_data = 0;
- gt811_rst = S5PV210_GPD0(3);
- gt811_int = S5PV210_GPH1(6);
-
gpio_request(gt811_rst, "reset"
相關推薦
S5PV210(TQ210)學習筆記——觸控式螢幕驅動編寫
電阻式觸控式螢幕的驅動比較簡單,可以採用輸入子系統驅動框架來編寫,而電容式觸控式螢幕的驅動程式相對比較複雜,因為電容觸控一般採用I2C引腳才控制,我在自己編寫電容觸控驅動的時候鬱悶了好幾天,當然,並不是因為I2C電容觸控驅動繁瑣,主要是天嵌TQ210的觸控式螢幕驅動程式是以模組方式提供的,並不開發原始
AM335x(TQ335x)學習筆記——觸控式螢幕驅動編寫
前面幾篇文章已經通過配置DTS的方式完成了多個驅動的移植,接下來我們解決TQ335x的觸控驅動問題。由於種種原因,TQ335x的觸控式螢幕驅動是以模組方式提供的,且Linux官方核心中也沒有帶該觸控式螢幕的驅動原始碼,單純的配置DTS是無法完成TQ335x的觸控驅動移植工作
S5PV210(TQ210)學習筆記——系統時鐘和串列埠
TQ210的系統時鐘配置和串列埠配置非常簡單,本文從TQ210的系統時鐘配置開始討論。 TQ210的時鐘配置跟2440/6410的時鐘配置差不多,只是鎖相環的個數略有不同,配置步驟是一樣的。配置系統時鐘,無非要經過以下幾個步驟: (1)設定系統PLL鎖定時間 (2)配置PL
【迅為iTop4412學習筆記】14.編寫一個LED驅動
宣告 以下都是我剛開始看驅動視訊的個人強行解讀,如果有誤請指出,共同進步。 本節目標 編寫一個LED驅動 本節我們就真正的來驅動一個板子上的LED(微控制器第一節就是點燈,沒想到Linux要學這麼久…) 我們首先理清思路。 註冊裝
【迅為iTop4412學習筆記】9.編寫簡單應用呼叫驅動
宣告 以下都是我剛開始看驅動視訊的個人強行解讀,如果有誤請指出,共同進步。 本節目標 編寫簡單應用呼叫驅動 編寫應用就和我們平時寫c檔案差不多了。 首先要包含一些標頭檔案 // 這不解釋 #include <stdio.h>
【知了堂學習筆記】java 編寫幾種常見排序算法
第一個 public 調用 ati print 所有 eth string quick 排序的分類: 一.交換排序 所謂交換,就是根據序列中兩個記錄鍵值的比較結果來對換這兩個記錄在序列中的位置,交換排序的特點是:將鍵值較大的記錄向序列的尾部移動,鍵值較小的記錄向序列的前部
ROS學習筆記16(編寫簡單的訊息釋出器和訂閱器 (Python))
1 編寫釋出者節點 “節點”是連線到ROS網路的可執行檔案ROS術語。在這裡,我們將建立一個持續廣播訊息的釋出者(“talker”)節點。 將目錄更改為您在早期教程中建立的的beginner_tutorials包,並建立一個包: $ roscd beginner_tut
ROS學習筆記18 (編寫簡單的伺服器和客戶端 (C++))
1 編寫Service節點 這裡,我們將建立一個簡單的service節點("add_two_ints_server"),該節點將接收到兩個整型數字,並返回它們的和。 進入先前你在catkin workspace教程中所建立的beginner_tutorials包所在的目錄
ROS學習筆記19 (編寫簡單的伺服器和客戶端 (Python))
1 編寫服務端節點 我們會建立服務端節點 ("add_two_ints_server") ,節點接收兩個整型數字,並返回和 進入beginner_tutorials包 $ roscd beginner_tutorials 確保你確保已經在之前建立好AddTwoInts
ARM學習筆記之驅動程式篇七----字元裝置驅動
1.11 字元裝置驅動模型 在任何一種驅動模型中,裝置都會用核心中的一種結構來描述。字元裝置在核心中使用struct cdev來描述。 struct cdev{ struct kobject kobj; struct module *owner; const stru
STM32學習筆記-FSMC驅動LCD
文章目錄 一、FSMC原理 1.為什麼可以用FSMC驅動LCD? 2.定址問題 3.時序模式 二、程式碼部分 一、FSMC原理 大容量,且引腳數在 100 腳以上的 STM32F103 晶片都帶有 FS
MongoDB學習筆記~官方驅動巢狀陣列物件的更新
回到目錄 對於陣列物件mongodb本身是支援的,不過對於陣列的更新,mongodb的Csharp驅動目前只支援一級,即你的物件裡包含陣列,而陣列又包括陣列,這表示兩層,這在更新子陣列時,Csharp驅動是不支援的,今天要說的就是如何讓它支援子陣列的更新,下面是我給出的資料結構 在Mongodb的Cs
MongoDB學習筆記~官方驅動的原生Curd操作
回到目錄 MongoDB的官方C#驅動,讓我們使用起來也很方便,但對於Linq開發人員來說,可能有些不瞭解,所以,我還是將官方驅動進行了二次封裝,而對於一個比較個性化的mongo操作,使用我封裝的也很難實現,所以,還是需要大家直接使用官方驅動的原生寫法的,下面進行一個介紹。 Insert操作 mo
[RK3399][Android7.1] 學習筆記 DRM驅動程式開發(介紹)
平臺 核心版本 安卓版本 rk Linux4.4 Android7.1 1. 簡介 DRM 全稱是 Direct Rendering Mana
AM335x(TQ335x)學習筆記——LCD驅動移植
TI的LCD控制器驅動是非常完善的,共通的地方已經由驅動封裝好了,與按鍵一樣,我們可以通過DTS配置完成LCD的顯示。下面,我們來討論下使用DTS方式配置核心完成LCD驅動的思路。 (1)初步分析 由於TQ335x使用的晶片是AM335x,故仍然可以參考am335x-evm
AM335x(TQ335x)學習筆記——USB驅動移植
對於AM335x來講,TI維護的USB驅動已經非常完善了,本文稱之為移植,實際上僅僅是配置核心選項使能USB HOST/OTG功能。廢話少說,直接動手開啟AM335x的USB驅動配置項。 Step1. 配置核心支援USB 預設的配置項沒有配置USB相關的選項,但是DTS已
iQQ 學習筆記3 :編寫程式碼打包Ant指令碼
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <project default="create_run_jar" name="Create Runnable Jar for Project test with librarie
新手學習筆記之Spring編寫AOP半自動代理
invoke proc pro aspect 新手 接口 src info nbsp 1.導包: 2.目標類 package oyb.service; public interface UserService { public void add(
嵌入式核心及驅動開發之學習筆記(五) 編寫字元驅動步驟總結
1,實現模組載入和解除安裝入口函式 module_init(chr_dev_init); module_exit(chr_dev_exit);
Ubuntu14_ROS學習筆記(12)Dynamixel串列埠U2D2Dynamixel驅動ID編寫
昨天剛買回來U2D2Dynamixel串列埠和供電模組 大體在WINDOW10上測試了一下可用,現在通過Ubuntu系統驅動舵機,舵機型號AX-12+(已編好ID),串列埠以及供電模組U2D2Dynamixel(USB2Dynamixel二代,死貴) 首先,連線