10.14 android輸入系統_多點觸摸驅動測試及Reader線程、InputStage分析

來源:互聯網
上載者:User

標籤:row   需要   不同   his   read   array   應用程式   .com   地方   

21. 多點觸摸_電容屏驅動程式_實踐_tiny4412

tiny4412觸控螢幕: 解析度為800 x 480
http://wiki.friendlyarm.com/wiki/index.php/LCD-S702/zh

測試:
a. 先把原有的ft5x06_ts.c 驅動程式去掉
I2C驅動有i2c_driver, i2c_device,ft5x06_ts.c只是i2c_driver,
修改同目錄下的Makefile:
obj-$(CONFIG_TOUCHSCREEN_FT5X0X) += ft5x06_ts.o
改為:
obj-$(CONFIG_TOUCHSCREEN_FT5X0X) += mtp_input.o

b. 修改 arch/arm/mach-exynos/mach-tiny4412.c
去掉:
i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));
不去掉也可以,需要修改mtp_input.c:
static const struct i2c_device_id mtp_id_table[] = {
{ "100ask_mtp", 0 },
{ "ft5x0x_ts", 0}, // 添加這句
{}
};


c. make zImage

 

註冊i2c driver時,
a. 它會首先判斷能否支援系統中現有的I2C DEVICE,
假設該I2C DEVICE位於第n條I2C匯流排,地址為A

b. 再去各個I2C BUS(匯流排)上,使用address_list中的addr去探測是否存在能支援的裝置
但是, 會忽略第n條I2C匯流排,地址為A的裝置,因為在i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1))中註冊的裝置名稱字是使用的ft5x0x_ts,與我們的驅動不符合,所以註冊i2c driver的時候,在判斷能否支援系統中現有的I2C DEVICE時,不會匹配裝置,後續對驅動中的i2c_driver結構體中的address_list裡的地址A忽略,這樣觸控螢幕裝置在這個過程也不會通過add_new_device新增IIC裝置,進而調用probe函數,因此如果不去掉i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1)),必須在驅動中的i2c_device_id中添加{ "ft5x0x_ts", 0},這樣註冊i2c driver時就能匹配現有的裝置,當然也可以修改核心中i2c_register_board_info

第一次:
git clone https://github.com/weidongshan/DRV_0005_MultiTouchPanel.git

git clone https://git.coding.net/weidongshan/DRV_0005_MultiTouchPanel.git

更新:
git pull origin

取出指定版本:
git checkout v3 // FT5x06 driver for tiny4412


22. Andriod系統使用多點觸控螢幕流程_idc設定檔

驅動中input_device的name必須設定,android系統會根據名字找到idc的設定檔,android應用程式通過ioctl讀到,流程見uml圖的input_reader,設定檔的作用是為了給android提供更多的資訊,因為我們的驅動程式僅提供觸點資訊,如果我們的驅動能提供更多的資訊,idc檔案是可以省去的

在InputReader.cpp中的2837行會獲得touch.deviceType的值,根據這個值來進行不同的事情,設定不同值;在InputReader.cpp搜尋這個賦值過程,發現如果驅動提供了Input的屬性等於INPUT_PROT_DIRECT,也會進行同樣的賦值操作:

在驅動中添加:set_bit(INPUT_PROP_DIRECT,input_dev->propbit),這樣就可以不提供idc檔案了

/system/usr/idc/ft5x0x_ts.idc
/data/system/devices/idc/ft5x0x_ts.idc

https://source.android.com/devices/input/touch-devices

最重要一項:
touch.deviceType = touchScreen | touchPad | pointer | default        //idc檔案只要這一項就可以了
觸摸裝置的類型:
touchScreen : 觸控螢幕, 覆蓋在顯示器上, 可以直接操作各種表徵圖
touchPad : 觸摸板, 不是覆蓋在顯示器上, 需要在LCD上顯示一個游標以便定位
pointer : 跟touchPad類似, 多一些手勢功能("Indirect Multi-touch Pointer Gestures")
default : 由系統自己確定


Indirect Multi-touch Pointer Gestures
A. Single finger tap: click. (單手指點擊: 點擊)
B. Single finger motion: move the pointer. (單手指移動: 移動)
c. Single finger motion plus button presses: drag the pointer. (按鍵+單指移動: 拖拽pointer)
D. Two finger motion both fingers moving in the same direction: drag the area under the pointer in that direction. The pointer itself does not move.
(兩手指同方向移動: 拖拽pointer所在地區,但是pointer不動)
E. Two finger motion both fingers moving towards each other or apart in different directions: pan/scale/rotate the area surrounding the pointer. The pointer itself does not move.
(兩手指往對方移動, 或往不同方向移動: pan/scale/rotate, 移動、放大縮小、旋轉, pointer不動)
F. Multiple finger motion: freeform gesture.

第一次:
git clone https://github.com/weidongshan/DRV_0005_MultiTouchPanel.git

git clone https://git.coding.net/weidongshan/DRV_0005_MultiTouchPanel.git

更新:
git pull origin

取出指定版本:
git checkout v4 // don‘t need .idc file again

23. Andriod系統使用多點觸控螢幕流程_Reader線程

 

 

24. Andriod系統使用多點觸控螢幕流程_InputStage

在APP_0009_InputStage v1基礎上修改, 如下擷取v1代碼:
git clone https://github.com/weidongshan/APP_0009_InputStage.git

git clone https://git.coding.net/weidongshan/APP_0009_InputStage.git

更新:
git pull origin

取出指定版本:
git checkout v1 // override onKeyPreIme/onKeyDown/onKeyUp, and setOnKeyListener

本節源碼:
git checkout v2 // print StackTraceString for touch event

本節測例在按鍵監聽執行函數中把棧空間列印出來分析方法間的調用關係

android中通過Log.d(TAG,Log.getStackTraceString(new  Throwable()))就可以列印堆棧,找到函數調用的地方,從此處往上就是該函數被調用的關係,列印出來的資訊最下面是頂層函數,即下面調用上面

觸摸事件處理過程:

Activity.dispatchTouchEvent--->Windows--->Decor--->...--->某個控制項.dispatchTouchEvent

 

 

Android對觸摸事件的處理過程總入口是Activity.dispatchTouchEcent,最終會通過window發給decorview,在有decorview分發給某個控制項

控制項對觸摸操作的處理過程如下(入口是View.dispatchTouchEvent):
a. 如果事先使用 setOnTouchListener設定了監聽器,
調用監聽器的 onTouch 函數: li.mOnTouchListener.onTouch(this, event)
b. 接著調用View.onTouchEvent(event)
c. 最後, 對於鬆開的事件, 如果事件使用setOnClickListener設定了監聽器,
調用監聽器的 onClick 函數: li.mOnClickListener.onClick(this)

注意到使用者可以設定2個監聽器: setOnTouchListener, setOnClickListener
前者可以處理所有觸摸事件(按下/鬆開/滑動等), 後者只能處理鬆開事件

怎麼編程?
a. 如果想在所有控制項之前處理觸摸事件, 可以重寫Activity的dispatchTouchEvent函數,
它最先被調用
b. 對於某個控制項, 使用setOnTouchListener設定監聽器處理所有類型的觸摸事件
使用setOnClickListener設定監聽器處理鬆開的觸摸事件
c. 也可以重寫控制項的onTouchEvent函數(不推薦)

10.14 android輸入系統_多點觸摸驅動測試及Reader線程、InputStage分析

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.