linux 多點觸控協議

2021-09-06 01:45:58 字數 2911 閱讀 8115

多點觸控協議

討論: [email protected]

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

使用說明

任何乙個手指的觸控資料都是打包成 abs event 包按順序傳送,只有 abs_mt event包能作為多點觸控資料被識別,呼叫 input_mt_sync()函式可以產生乙個 syn_mt_report event ,這個函式接收並處理當前手指的資訊並準備接收其它手指的觸控資訊。最後呼叫 input_sync()函式上報 ev_syn/syn_report

event 完成乙個包的開始處理並準備處理下乙個包。

協議定義了 abs_mt事件的屬性,這些事件被分為幾大類,充許只應用其中的一部份,多點觸控最小的事件集中應包括 abs_mt_position_x和 abs_mt_position_x,這兩個事件用來描述多點觸控中手指的觸控軌跡。如果裝置支援這兩個事件,那麼 abs_mt_touch_major和 abs_mt_width_major 分別被用來提供手指的大小和觸控面積大小。

touch 和 width引數給出了個,想想如果乙個手指按在玻璃上,透過玻璃你將看到兩個區域,乙個是手指與玻璃接觸的區域,用 abs_mt_touch_major描述,乙個是手指本身大小的區域, abs_mt_width_major描述, 手指與玻璃接觸的面積要小於手指本身的大小,通過這兩個引數,可以換算出手指的壓力。也可通過 abs_mt_pressure引數直接提供手指的壓力。

除了 major這個引數,還可以提供乙個 minor引數,手指可以被認為是乙個橢圓, major和 minor可以認為是這個橢圓的長軸和短軸,橢圓的中心可以被 orientation這個引數描述。

abs_mt_tool_type引數用來描述觸控工具的型別(手指,觸控筆等)。不同的裝置可能有一些其它的資訊需要傳遞到使用者層。比如 abs_mt_blob_id用來描述長方形的邊的集合,目前僅有少數裝置可以被支援, abs_mt_tracking_id事件用來向上層報告硬體所採集的手指的觸控軌跡。

下面是兩指觸控的最小事件集 :

abs_mt_position_x

abs_mt_position_y

syn_mt_report //上報第一指座標資料

abs_mt_position_x

abs_mt_position_y

syn_mt_report//上報第二指座標資料

syn_report  

完成一次上報

協議解析

「觸控」這個詞用來描述工具(手指,筆,等)直接接觸觸控螢幕表面。

abs_mt_touch_major   

接觸面的長軸。

abs_mt_touch_minor   

接觸面的短軸,如果是圓形接觸面,這個引數可以省略。

abs_mt_width_major   

接觸工具的長軸。

abs_mt_width_minor   

接觸工具的切面的短軸,如果是圓形,此引數可以省略。

上面的四個引數用來描術接觸面的一些附加資訊, abs_mt_touch_major / abs_mt_width_major的比值可以用來反應接觸時的壓力值。

abs_mt_pressure 

接觸工具對接觸面的壓力大小,可以用來代替上面的四個引數。

abs_mt_orientation

描述隨圓的轉動趨勢,這是乙個抽相值,o值表示接觸面在平行與觸控螢幕的y軸,向左是負值,向右是正值,如果完全平行於x軸,則上向返回最大值。如果接觸面是圓形,則可以忽略這個引數。如果核心不能獲得這個引數有有效值,但可以區分接觸面的長短軸,這個功能還是可以被部份支援,在一些裝置中, abs_mt_orientation 的值只能是 0和1。

abs_mt_position_x   

接觸面的形心的x座標值。

abs_mt_position_y   

接觸面的形心的y座標值。

abs_mt_tool_type    

觸控工具的型別

abs_mt_blob_id        

用來標識多邊形的邊的集合,大多數核心不支援這個引數。

abs_mt_tracking_id 

僅有少數裝置支援,用來區別乙個觸控動作的週期。

計算方法

一些裝置將觸控面作為乙個矩形上報,可以通過下面這些公式來計算出協議中所需要的資訊。

abs_mt_touch_major := max(x, y)

abs_mt_touch_minor := min(x, y)

abs_mt_orientation := bool(x > y)

abs_mt_orientation的取值範圍為0至1,用來標識矩形接觸面偏向x軸或y軸的程度。

觸控軌跡

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

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

說明:

為了完作支援己有的應用,多點觸控驅動應上報單點觸控相應的 event,另外,所有的觸控事件需要通過 input子系統向上傳遞。

目前核心只有 bcm5974這麼乙個驅動支援多點觸控,可以以此為例設計你的驅動。

2)這個協議需要補充。

3)多點觸控的驅動尚沒不成熟,到目前為此( 2023年4月) ,多點觸控協議還沒有 merged到核心主開發分支。

4)水平有限,敬請指正。

linux 多點觸控協議

多點觸控協議 討論 datangsoc hotmail.com 簡介 為了使用功能強大的多點觸控裝置,一種方案是上報使用者層所需的詳細的手指觸控資料。這個文件所描述的多點觸控協議可以讓核心驅動程式向使用者層上報任意多指的資料資訊。使用說明 任何乙個手指的觸控資料都是打包成 abs event 包按順...

MTP 多點觸控協議資訊獲取

附 例項 多點觸控協議有兩種,a協議和b協議。首先來看a協議,協議上說了報點格式是這樣的,以兩點為例 abs mt position x x 0 abs mt position y y 0 syn mt report abs mt position x x 1 abs mt position y y...

Andrioid 多點觸控

event.getaction 獲取觸控動作比如action down event.getpointercount 獲取觸控點的數量,比如2則可能是兩個手指同時按壓螢幕 event.getpointerid nid 對於每個觸控的點的細節,我們可以通過乙個迴圈執行getpointerid方法獲取索引...