自己寫的觸摸屏驅動

    觸摸屏在現代生活中普遍使用,它通過壓力或其他事件判斷屏幕被觸摸,從而將數據輸入、上報給系統處理。觸摸屏並不是lcd,而是在lcd上表面有一層adc,它的規格大小跟lcd屏幕大小一樣,而且厚度很薄,所以會讓我們誤以爲觸摸屏就是lcd本身。

    通過開發板的原理圖及數據手冊,對觸摸屏一章仔細閱讀分析,便可以知道怎麼使用觸摸屏。觸摸屏分爲4種模式:wKiom1aGSpKDuEYtAAElk7JSBSQ378.png

當然還有一種省電模式。

當要測量xy位置座標時,原理大概如圖:

wKioL1aGSxjRhFkpAABfF0f_qKk008.png

    在Linux中,觸摸屏驅動也是依據輸入子系統實現的,所以一般步驟爲:

1.分配一個input_dev結構體

2.設置能產生哪一類事件以及這類事件中的哪些事件。(按鍵類(觸摸按鍵事件),相對位移類(x/y絕對位移,絕對位移壓力))

3.利用input_register_device註冊

4.硬件相關操作

硬件操作的主要操作有:

  1. 設置分頻係數和 ADCDLY

  2. 註冊INT_TC中斷和AD中斷

  3. 使能時鐘

  4. 測量xy座標時還需要啓動adc


總結:

判斷觸摸屏被按下還是鬆開,是根據寄存器ADCDAT0的第15位,這一位如是爲1,則是被鬆開,爲0則是被按下

在測量xy座標時,讀取ADCDAT0的低10位,即可得到x的座標,讀取ADCDAT1的低10位,即可得到y座標

如何處理觸摸屏被長按或滑動的情況?啓動定時器!

如何上報觸摸屏事件:

上報事件

input_report_abs(struct input_dev *dev, unsigned int code, int value);

input_report_key(struct input_dev *dev, unsigned int code, int value);

如:

input_report_abs(s3c_ts_dev, ABS_PRESSURE, 0);

input_report_key(s3c_ts_dev, BTN_TOUCH, 0);

input_sync(s3c_ts_dev);

觸摸屏的數據如何更精確?

優化措施:

1.設置ADCDLY爲最大值, 這使得電壓穩定後再發出IRQ_TC中斷

2.如果ADC完成時, 發現觸摸筆已經鬆開, 則丟棄此次結果

3.多次測量求平均值

4.軟件過濾

5.啓動定時器處理長按/滑動的情況

例子:

wKioL1aGT3ChZhwdAAKGDgcKbtc509.png

幾種模式

wKiom1aGT8mzE1n_AACfBexN1FA576.png

上報事件:

            input_report_abs(myts_dev, ABS_X, (x[0]+x[1]+x[2]+x[3])/4);

input_report_abs(myts_dev, ABS_Y, (y[0]+y[1]+y[2]+y[3])/4);

input_report_abs(myts_dev, ABS_PRESSURE, 1);

input_report_key(myts_dev, BTN_TOUCH, 1);

input_sync(myts_dev);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章