1. 程式人生 > >android 電容屏(一)

android 電容屏(一)

平臺資訊:

核心:linux2.6/linux3.0

系統:android/android4.0

平臺:S5PV310(samsung exynos4210)

from:http://blog.csdn.net/xubin341719/article/details/7833383

一、電容屏工作基本原理

       觸控式螢幕的工作原理概括來說就是上報座標值,X軸、Y軸的值,從觸控點檢測裝置上接收觸控資訊,並將它轉換成觸點座標,再送給CPU,它同時能接收CPU發來的命令並加以執行。

       與電阻式觸控式螢幕不同,電容式觸控式螢幕不依靠手指按力創造、改變電壓值來檢測座標的。電容屏通過任何持有電荷的物體包括人體面板工作。(人體所帶的電荷)電容式觸控式螢幕是由諸如合金或是銦錫氧化物(ITO)這樣的材料構成,電荷儲存在一根根比頭髮還要細的微型靜電網中。當手指點選螢幕,會從接觸點吸收小量電流,造成角落電極的壓降,利用感應人體微弱電流的方式來達到觸控的目的。(這是為什麼當你帶上手套觸控式螢幕幕時,沒有反應的原因),下圖可以清晰的說明電容屏的工作原理。

二、電容屏基本介紹

1、電容式觸控式螢幕模組構成:

觸控式螢幕:也就是我們手觸控操作的透明部分;

觸控IC:當電容屏觸控到時,要解析到觸點的位置座標,就是通過這顆晶片去計算處理的。


2、電容式觸控式螢幕型別

電容式觸控式螢幕的型別主要有兩種表面電容式和投射電容式

(1)、表面電容式: 表面電容式利用位於四個角落的感測器以及均勻分佈整個表面的薄膜,有一個普通的ITO層和一個金屬邊框,當一根手 指觸控式螢幕幕時,從板面上放出電荷,感應在觸 屏 的四角完成,不需要複雜的ITO圖案;

(2)、投射電容採用一個或多個精心設計,被蝕燭的ITO,這些 ITO層通過蛀蝕形成多個水平和垂直電極,採用成行/列交錯同時帶有感測功能的獨立晶片。現在平板電腦、手機、車載等多用投射式電容,所以我們後面分析表明投射式電容的構成。

        投射電容的軸座標式感應單元矩陣 :軸座標式感應單元分立的行和列,以兩個交叉的滑條實現 X軸滑條 Y軸滑條 檢測每一 格感應單元的電容變化。(示意圖中電容,實際為透明的)

3、電容觸控式螢幕解析度,通道數;

          X,Y軸的透明電極電容屏的精度、解析度與X、Y軸的通道數有關,通道越多,解析度越高。



4、電容觸屏的結構分類:

(1)、單層ITO 


優點:成本 低,透過率 高,

缺點: 抗干擾能力 差

(2)、單面雙層ITO 


優點:效能 好,良率高

缺點:成本 較高

(3)、雙面單層ITO 


優點:效能好,抗靜電能力強

缺點:抗干擾能力差 

三、電容式觸屏的分類及工作原理

(1)、自生電容式觸控式螢幕 


Cp-寄生電容

手指觸控時寄生電容增加:Cp’=Cp/Cfinger

檢測寄生電容的變化量,確定手指觸控的位置

(2)、互電容式觸控式螢幕 


CM-耦合電容

手指觸控時耦合電容減小 ,檢測耦合電容變化量,確定手指觸控的位置

四、為什麼會出現鬼點,鬼點如何消除

1、為什麼會出現鬼點?

               當一個手指按下時,X、Y軸只有一個交叉點,兩個同時按下時就會出現4個交叉點,如下圖所示,我們不期望得到的點就是所說的鬼點。


2、消除鬼點的方法

(1)、分時法:基於時間的多點觸控,假設多點觸控 分時進行,操作間 隔續集毫秒;

(2)、分割槽法:將整個觸屏物理上分割幾個區域 通過判斷觸控進入推出 相應區域,從而分出鬼點中分 出真實點。

五、中斷下半部-工作佇列

1、中斷

               先看一下宋寶華先生的《linux裝置驅動開發詳解》裡面對中斷的描述吧。這本書個人感覺 寫的比較好,從開始學驅動到現在,還能從中得到不少知識。

               裝置的中斷會打斷核心中程序的正常排程和執行,系統對更高吞吐率的追求勢必要求中斷服務程式儘可能地短小精悍。但是,這個良好的願望往往與現實並不吻合。在大多數真實的系統中,當中斷到來時,要完成的工作往往並不會是短小的,它可能要進行較大量的耗時處理。如下圖描述了Linux核心的中斷處理機制。為了在中斷執行時間儘可能短和中斷處理需完成大量工作之間找到一個平衡點,Linux將中斷處理程式分解為兩個半部:頂半部(top  half)和底半部(bottom half)。頂半部完成儘可能少的比較緊急的功能,它往往只是簡單地讀取暫存器中的中斷狀態並清除中斷標誌後就進行“登記中斷”的工作。“登記中斷”意味著將底半部處理程式掛到該裝置的底半部執行佇列中去。這樣,頂半部執行的速度就會很快,可以服務更多的中斷請求。現在,中斷處理工作的重心就落在了底半部的頭上,它來完成中斷事件的絕大多數任務。底半部幾乎做了中斷處理程式所有的事情,而且可以被新的中斷打斷,這也是底半部和頂半部的最大不同,因為頂半部往往被設計成不可中斷。底半部則相對來說並不是非常緊急的,而且相對比較耗時,不在硬體中斷服務程式中執行。儘管頂半部、底半部的結合能夠改善系統的響應能力,但是,僵化地認為Linux裝置驅動中的中斷處理一定要分兩個半部則是不對的。如果中斷要處理的工作本身很少,則完全可以直接在頂半部全部完成。

           其實上面這一段大致說明一個問題,那就是:中斷要儘可能耗時比較短,儘快恢復系統正常除錯,所以把中斷觸發、中斷執行分開,也就是所說的“上半部分(中斷觸發)、底半部(中斷執行)”,其實就是我們後面說的中斷上下文。下半部分一般有tasklet、工作佇列實現,觸控式螢幕中中斷實現以工作佇列形式實現的,所以我們今天重點講工作佇列。


2、為什麼還需要工作佇列?

       工作佇列(work queue)是另外一種將中斷的部分工作推後的一種方式,它可以實現一些tasklet不能實現的工作,比如工作佇列機制可以睡眠。這種差異的本質原因是,在工作佇列機制中,將推後的工作交給一個稱之為工作者執行緒(worker thread)的核心執行緒去完成(單核下一般會交給預設的執行緒events/0)。因此,在該機制中,當核心在執行中斷的剩餘工作時就處在程序上下文(process context)中。也就是說由工作佇列所執行的中斷程式碼會表現出程序的一些特性,最典型的就是可以重新排程甚至睡眠。

       對於tasklet機制(中斷處理程式也是如此),核心在執行時處於中斷上下文(interrupt context)中。而中斷上下文與程序毫無瓜葛,所以在中斷上下文中就不能睡眠。因此,選擇tasklet還是工作佇列來完成下半部分應該不難選擇。當推後的那部分中斷程式需要睡眠時,工作佇列毫無疑問是你的最佳選擇;否則,還是用tasklet吧。

3、中斷上下文

       有上面那個圖可以看出上下兩部分吧,就是上下文吧,這個比較好理解。

    看下別人比較專業的解釋:

       在瞭解中斷上下文時,先來回顧另一個熟悉概念:程序上下文(這個中文翻譯真的不是很好理解,用“環境”比它好很多)。一般的程序執行在使用者態,如果這個程序進行了系統呼叫,那麼此時使用者空間中的程式就進入了核心空間,並且稱核心代表該程序運行於核心空間中。由於使用者空間和核心空間具有不同的地址對映,並且使用者空間的程序要傳遞很多變數、引數給核心,核心也要儲存使用者程序的一些暫存器、變數等,以便系統呼叫結束後回到使用者空間繼續執行。這樣就產生了程序上下文。

       所謂的程序上下文,就是一個程序在執行的時候,CPU的所有暫存器中的值、程序的狀態以及堆疊中的內容。當核心需要切換到另一個程序時(上下文切換),它需要儲存當前程序的所有狀態,即儲存當前程序的程序上下文,以便再次執行該程序時,能夠恢復切換時的狀態繼續執行。上述所說的工作佇列所要做的工作都交給工作者執行緒來處理,因此它可以表現出程序的一些特性,比如說可以睡眠等。              對於中斷而言,是硬體通過觸發訊號,導致核心呼叫中斷處理程式,進入核心空間。這個過程中,硬體的一些變數和引數也要傳遞給核心,核心通過這些引數進行中斷處理,中斷上下文就可以理解為硬體傳遞過來的這些引數和核心需要儲存的一些環境,主要是被中斷的程序的環境。因此處於中斷上下文的tasklet不會有睡眠這樣的特性。

4、工作佇列的使用方法

       核心中通過下述結構體來表示一個具體的工作:

  1. struct work_struct  
  2.     {  
  3.       unsigned long pending;//這個工作是否正在等待處理
  4.       struct list_head entry;//連結所有工作的連結串列,形成工作佇列
  5.       void (*func)(void *);//處理函式
  6.       void *data;//傳遞給處理函式的引數
  7.       void *wq_data;//內部使用資料
  8.       struct timer_list timer;//延遲的工作佇列所用到的定時器
  9.     };  
   而這些工作(結構體)連結成的連結串列就是所謂的工作佇列。工作者執行緒會在被喚醒時執行連結串列上的所有工作,當一個工作被執行完畢後,相應的work_struct結構體也會被刪除。當這個工作連結串列上沒有工作時,工作執行緒就會休眠。

(1)、通過如下巨集可以建立一個要推後的完成的工作:

  1. DECLARE_WORK(name,void(*func)(void*),void*data);  

(2)、也可以通過下述巨集動態建立一個工作:
  1. INIT_WORK(struct work_struct*work,void(*func)(void*),void *data);  
與tasklet類似,每個工作都有具體的工作佇列處理函式,原型如下:
  1. void work_handler(void *data)  

將工作佇列機制對應到具體的中斷程式中,即那些被推後的工作將會在func所指向的那個工作佇列處理函式中被執行。

(3)、實現了工作佇列處理函式後,就需要schedule_work函式對這個工作進行排程,就像這樣:

  1. schedule_work(&work);  

這樣work會馬上就被排程,一旦工作執行緒被喚醒,這個工作就會被執行(因為其所在工作佇列會被執行)。

六、input子系統概述 

       可見文章基於 mini2440 電阻式觸控式螢幕(三):Linux輸入子系統(InputSubsystem):按鍵、滑鼠、觸控式螢幕、電池資訊等,都是通過input子系統上報。

七、Linux與Android 多點觸控協議

            為了使用功能強大的多點觸控裝置,就需要一種方案去上報使用者層所需的詳細的手指觸控資料。這個文件所描述的多點觸控協議可以讓核心驅動程式向用戶層上報任意多指的資料資訊。

1、使用說明

            單點觸控資訊是以ABS承載並按一定順序傳送,如BTN_TOUCH、ABS_X、ABS_Y、SYNC。而多點觸控資訊則是以ABS_MT承載並按一定順序傳送,如ABS_MT_POSITION_X、ABS_MT_POSITION_Y,然後通過呼叫input_mt_sync()產生一個 SYN_MT_REPORT event來標記一個點的結束,告訴接收方接收當前手指的資訊並準備接收其它手指的觸控資訊。最後呼叫 input_sync()函式上報觸控資訊開始動作並告訴接收方開始接收下一系列多點觸控資訊。

             協議定義了一系列ABS_MT事件,這些事件被分為幾大類,充許只應用其中的一部份,多點觸控最小的事件集中應包括ABS_MT_TOUCH_MAJOR、ABS_MT_POSITION_X和 ABS_MT_POSITION_Y,以此來實現多點觸控。如果裝置支援ABS_MT_WIDTH_MAJOR這個事件,那麼此事件可以提供手指觸控接觸面積大小。觸控方向等資訊可以由ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MINOR and ABS_MT_ORIENTATION提供。ABS_MT_TOOL_TYPE提供觸控裝置的類別,如手或是筆或是其它。最後有些裝置可能會支援ABS_MT_TRACKING_ID,用來支援硬體跟蹤多點資訊,即該點屬於哪一條線等。

  1. 下面是兩點觸控支援的最小事件集序列:  
  2. ABS_MT_TOUCH_MAJOR  
  3. ABS_MT_POSITION_X  
  4. ABS_MT_POSITION_Y  
  5. SYN_MT_REPORT //上報第一個點
  6. ABS_MT_TOUCH_MAJOR  
  7. ABS_MT_POSITION_X  
  8. ABS_MT_POSITION_Y  
  9. SYN_MT_REPORT //上報第二個點
  10.            ………… //完成多點上報
  11. SYN_REPORT //開始動作

2、Event原語

接觸”一詞用來描述一個物體直接碰到另一個物體的表面。

ABS_MT_TOUCH_MAJOR描述了主接觸面的長軸,它和X,Y同一個單位,如果一個面的解析度為X*Y,則ABS_MT_TOUCH_MAJOR的最大值為sqrt(X^2+Y^2)
  1. ABS_MT_TOUCH_MINOR描述了接觸面的短軸,如果接觸面是圓形,它可以不用。  
  2. ABS_MT_WIDTH_MAJOR描述了接觸工具的長軸  
  3. ABS_MT_WIDTH_MINOR描述了接觸工具的短軸  
  4. ABS_MT_TOUCH_MAJOR := max(X, Y)  
  5. ABS_MT_TOUCH_MINOR := min(X, Y)  
  6. ABS_MT_ORIENTATION := bool(X > Y)  

以上四個引數可以用來生成額外的觸控資訊,ABS_MT_TOUCH_MAJOR/ABS_MT_WIDTH_MAJOR的比率可以用來描述壓力。

                ABS_MT_ORIENTATION

                ABS_MT_POSITION_X接觸面的中心點X座標

                ABS_MT_POSITION_Y接觸面的中心點Y座標

                ABS_MT_TOOL_TYPE描述接觸工具型別,很多核心驅動無法區分此引數如手指及筆,如果是這樣,該引數可以不用,協議目前支援MT_TOOL_FINGER和MT_TOOL_PEN兩種型別。

                ABS_MT_BLOB_ID形狀集ID,集合幾個點以描述一個形狀,很多驅動沒有形狀屬性,此引數可以不用。ABS_MT_TRACKING_ID描述了從接觸開始到釋放的整個過程的集合,如果裝置不支援,此引數可是不用。

3、觸控軌跡

            僅有少數裝置可以明觸的標識真實的 trackingID,多數情況下 trackingID只能來標識一次觸控動作的過程。

4、手勢

            多點觸控指定的應用是建立手勢動作, TOUCH和 WIDTH引數經常用來區別手指的壓力和手指間的距離,另外 MINOR類的引數可以用來區別裝置的接觸面的大小(點接觸還是面接觸),ORIENTATION可以產生旋轉事件。

5、在Linux核心支援的基礎上,Android在其2.0原始碼中加入多點觸控功能(android4.0中間層有所不同)

            由此觸控式螢幕在Android的frameworks被完全分為2種實現途徑:單點觸控式螢幕的單點方式,多點觸控式螢幕的單點和多點方式。

             在Linux的input.h中,多點觸控功能依賴於以下幾個主要的軟體位:

  1. ……  
  2. #define SYN_REPORT0
  3. #define SYN_CONFIG1
  4. #define SYN_MT_REPORT2
  5. ……  
  6. #define ABS_MT_TOUCH_MAJOR0x30
  7. #define ABS_MT_TOUCH_MINOR0x31
  8. #define ABS_MT_WIDTH_MAJOR0x32
  9. #define ABS_MT_WIDTH_MINOR0x33
  10. #define ABS_MT_ORIENTATION0x34
  11. #define ABS_MT_POSITION_X0x35
  12. #define ABS_MT_POSITION_Y0x36
  13. #define ABS_MT_TOOL_TYPE0x37
  14. #define ABS_MT_BLOB_ID0x38
  15. ……  

在Android中對應的軟體位定義在RawInputEvent.java中:
  1. ……  
  2.  publicclass RawInputEvent {  
  3.  ……  
  4.  publicstatic final int CLASS_TOUCHSCREEN_MT = 0x00000010;  
  5.  ……  
  6.  publicstatic final int ABS_MT_TOUCH_MAJOR = 0x30;  
  7. 相關推薦

    android 電容()

    平臺資訊: 核心:linux2.6/linux3.0 系統:android/android4.0 平臺:S5PV310(samsung exynos4210) from:http://blog.csdn.net/xubin341719/arti

    android 電容):電容基本原理篇

    關鍵詞:android  電容屏 tp  ITO 平臺資訊: 核心:linux2.6/linux3.0 系統:android/android4.0 平臺:S5PV310(samsung exynos 4210)  作者:xubin341719(歡迎轉載,請註明作者)

    android 電容(三):驅動除錯之驅動程式分析篇

    關鍵詞:android  電容屏 tp 工作佇列 中斷 坐點計算  電容屏主要引數 平臺資訊: 核心:linux2.6/linux3.0 系統:android/android4.0  平臺:S5PV310(samsung exynos 4210)  作者:xubin3417

    android 電容:驅動除錯之驅動程式分析篇

    以goodix的gt8105為例 一、總體架構 硬體部分:先看一個總體的圖吧,其實觸控式螢幕原理也比較簡單,觸控式螢幕和主控晶片間的聯絡,如下主要有三部分: 1、IIC部分,初始化gt8105的資料和傳回主控制的座標位置資訊就是通過IIC這條線傳輸的; 2、I

    分鐘了解Android橫豎 mdpi hdpi xhdpi xxhdpi xxxhdpi

    lin msu mage 豎屏 啟動 oar href super ide DPI:每英寸像素數 簡單的屏幕分辨率計算方法: DisplayMetrics metrics = this.getResources().getDisplayMetri

    Android劉海適配庫NotchFit鍵完美實現劉海適配!!!

        NotchFit是Android端的劉海適配庫。該庫使用簡單,劉海蔘數智慧判斷,使開發者無需再考慮手機系統和製造廠商的差異,一鍵智慧劉海蔘數回撥。你值得擁有!!! 下面對全屏劉海適配做個簡要說明: 程式碼實現方式: NotchFit.fit(this, Not

    react-native Android 全面手機 底部留有大塊黑

    class data csharp roi nbsp react manifest true ive 解決方案:在AndroidManifest.xml 中 配置 <meta-data android:name="android.max_aspect" a

    android 再按次退出應用 出現閃 重啟

    今天測試出來一個bug 再按一次 出現閃屏 重啟   @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEY

    分鐘瞭解Android橫豎 mdpi hdpi xhdpi xxhdpi xxxhdpi

    DPI:每英寸畫素數 簡單的螢幕解析度計算方法: DisplayMetrics metrics = this.getResources().getDisplayMetrics(); float density = metrics.density; int dpi =

    Android螢幕控制:強制豎

      預設情況下,app會隨著手機方向的改變進行螢幕切換,手機橫向擺放的時候,app螢幕就會切換到橫屏,反之切換到豎屏,但是app是一般都是根據豎屏設計的,一旦切換到橫屏,佈局就會亂掉,所以沒有考慮橫屏設計的app一般要強制設定為豎屏,強制豎屏有兩種方法:   

    鍵生成 Android gif 的指令碼

    目的 編寫 bash 指令碼, 實現一行命令得到 Android 手機錄製螢幕 gif 動圖檔案. 博主使用 ubuntu 系統, shell 為 bash. 這個指令碼也可以用在 mac 系統上. 聽說 windows 系統出了 ubuntu on wi

    Android或滅狀態下,快速按兩次音量下鍵實現抓拍功能(,Framework層實現)

        WindowManagerService迴圈讀取下面按鍵訊息並分發給視窗,在訊息分發前會在PhoneWindowManager.interceptKeyBeforeQueueing方法中進行訊息的過濾。因此該實現方式為在訊息分發前的interceptKeyBeforeQueueing方法中監聽當前按

    Kotlin Android 實戰()閃頁面

    看了一些kotlin的語法,但是總覺得不真正寫一下不行。 聽說kotlin和java完全相容,寫了寫發現,最小單位是類(java類中不能寫kotlin程式碼,反之亦然)。 想在新專案中嘗試一下的同學不要有顧慮,就像當初使用mvvm,mvp一樣,實在不行在換回java唄(哈哈

    【筆記】與Android選項卡

    android fragment viewpager 選項卡 果然,還是項目驅動的學習方式比較有趣呢。這周的學習全部圍繞著選項卡,也就是tab。用到了好多知識點,都不知道從哪裏開始啦(≧o≦*)。 選項卡的制作有很多方法。選項菜單可以用普通的TextView,也可以直接上button。我

    【分享】迅為iTOP4412開發板-Android系統幕旋轉設置

    原生 android4 代碼 豎屏 == watermark ont 分辨率 軟件 1.1概述 Android4.0,Androd4.4源代碼能夠編譯成手機模式和平板模式,訊為iTop4412 開發平臺 的Android系統默認編譯為平板模式。客戶須要依據自己的產品

    Android旋轉幕後國際化語言失效的解決的方法

    padding lang label orien resource oca auto 切換 overflow 本文已同步至個人博客:liyuyu.cn 近期在項目中使用到了國際化多語言(英文+中文),但在使用時發現了一個問題。當屏幕旋轉後。APP語言(中文)自己主動轉

    Android xUtils框架() DbUtils

    todo etc finder put build findall integer run get 在DbUtils中,只支持4中數據類型: public enum ColumnDbType { INTEGER("INTEGER"), REAL("REA

    android:怎樣用天時間,寫出“飛機大戰”這種遊戲!(無框架-SurfaceView繪制)

    col ride raw ech tro cti 開發人員 contex epo 序言作為一個android開發人員,時常想開發一個小遊戲娛樂一下大家,今天就說說,我是怎麽樣一天寫出一個簡單的“飛機大戰”的.體驗地址:http://www.wandoujia.com/ap

    Android手機搖搖的實現SensorEventListener

    fas exceptio change interface var cti com android手機 模式 Android手機搖一搖的實現SensorEventListener 看實例 package com.example.shakeactiv

    Android橫豎切換View設置不同尺寸或等比例縮放的XML解決方案

    fill 文件結構 nts mas hang 同名 log lan spa 在一些應用中,涉及到橫豎屏切換,View要切換成不同大小比例尺寸。為解決這種開發場景,有多種解決方案,比如可以重寫View,實現橫豎切換在onMesure或者此類View的回調方法裏面重新測量重新繪