Android觸摸屏輸入系統

1.觸摸屏硬件原理

1.1電阻觸摸屏

    中斷產生。觸摸屏芯片根據觸摸按下時電阻分壓值發生變化而產生中斷,該中斷輸入給CPU。產生的條件很簡單,主要有VDD,GND信號即可。因此,我們在調試時,可以在沒有驅動的情況下去測量中斷腳,是否在有觸摸時發生變化,以前驗證模塊的好壞。

 1.2電容觸摸屏

    中斷產生和電阻屏類似,只不過電容屏是由於人體接觸時形成耦合電容,從而電流發生變化。

電容屏的接口一般都會有一個nRST信號,便於驅動裏對模塊做復位操作。

2.Linux驅動

   這裏以i2c接口的電阻屏爲例,並採用中斷加輪詢獲取座標值。

2.1註冊i2c設備

   註冊i2c_board_info結構體。在machine_xxx_board_init(位於arch/arm/mach-xxx路徑下)裏面,包括type(driver name),Slave address,irq(中斷引腳)和platform_data等。

    註冊i2c設備。在驅動文件先填充i2c_driver結構體,包括driver.name,id_table,probe。然後再調用i2c_add_driver即可以註冊一個i2c設備。

2.2註冊中斷

  接下來,我們要在probe函數裏面做一些其他的初始化工作。

  初始化一個delayed work。調用INIT_DELAYED_WORK。

  探測設備。可以使用i2c_smbus_read_byte_data讀取設備的ID寄存器,當然如果沒有ID寄存器,也可以隨便讀取一個寄存器,如果返回值小於0,那可以認爲該設備不存在。

  註冊中斷。過程爲申請GPIO(即中斷引腳)-->設置GPIO方向-->設置GPIO上拉(或者下拉)-->申請irq。這裏的調用接口爲gpio_request-->gpio_direction_input-->gpio_pull_updown-->gpio_to_irq-->request_irq。

2.3註冊輸入子系統

     分配內存。調用input_allocate_device。

     設置觸摸屏參數。調用input_set_abs_params,設置ABS_X,ABS_Y等參數。

     註冊input。調用input_register_device。

2.4校準參數初始化

2.5添加sysfs接口

     可以按需求添加一個sysfs接口,如打印調試信息開關。調用driver_create_file。

2.6添加一級休眠處理

    一級休眠是android的休眠策略。填充early_suspend結構體,調用接口register_early_suspend。

    最後進行芯片的初始化,如配置設備的寄存器等。

3.Android層處理

    驅動程序將輸入設備以/dev/input的節點呈現給上層,對於觸摸屏輸入事件,android層經過Native framwork的EventHub處理和Java framework的KeyInputDevice-->KeyEvent(滑動時爲RawInputEvent-->MotionEvent)處理,上報給應用程序,上報的形式爲onKeyDown/onKeyUp或者onTouchEvent/onTrackballEvent。

 源文件:

frameworks/base/libs/ui/EventHub.cpp

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