Android event事件上報方法

2021-07-05 04:43:59 字數 3181 閱讀 8870

android linux有一套核心與應用層通訊的機制,其中應用比較廣泛的就是input系統,即驅動通過linux的input系統,上報事件,例如按鍵、耳機插拔、觸控螢幕資訊等,在adb命令列中輸入getevent可以看到當前系統註冊的事件型別

root@msm8916_32:/ # getevent

getevent

add device 1: /dev/input/event13

name:     "msm8x16-snd-card-mtp headset jack"    //耳機插拔事件

add device 2: /dev/input/event12

name:     "msm8x16-snd-card-mtp button jack"    //耳機按鍵事件

add device 3: /dev/input/event10         //pmic按鍵事件

name:     "qpnp_pon"

add device 4: /dev/input/event9

name:     "pressure"

add device 5: /dev/input/event4           //指南針

name:     "compass"

could not get driver version for /dev/input/mouse0, not a typewriter

add device 6: /dev/input/event2

name:     "hbtp_vm"

add device 7: /dev/input/event1    //觸控螢幕

name:     "ft5x36"

add device 8: /dev/input/event0

could not get driver version for /dev/input/mice, not a typewriter

add device 9: /dev/input/event3

name:     "gyroscope"

add device 10: /dev/input/event8

name:     "proximity"

add device 11: /dev/input/event7       //光感

name:     "light"

add device 12: /dev/input/event6

name:     "bma_interrupt"

add device 13: /dev/input/event5

name:     "bma2x2-accel"

add device 14: /dev/input/event11    //gpio按鍵事件

name:     "gpio-keys"

如果我們想在驅動中新加入一種事件型別,該怎麼做呢?

1. 定義input裝置  struct input_dev *input; 

2. 為input裝置分配空間:  input = input_allocate_device();

3. 呼叫input_set_capability(struct input_dev *dev, unsigned int type, unsigned int code),設定輸入裝置支援的型別,例如input_set_capability(mbhc->headset_jack.jack->input_dev, ev_key, 0xf9);表示使mbhc->headset_jack.jack->input_dev支援ev_key型別的0xf9編碼輸入。注意這個函式不能少,否則執行第四步時核心不會上報事件

4. 在需要輸入的地方呼叫input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value),也可以呼叫input_report_key、input_report_switch等函式

5. 呼叫input_sync(struct input_dev *dev),同步上報事件,如果不呼叫input_sync(struct input_dev *dev),上報event事件會有延時。

例如:***_init()

struct input_dev *input;

input = input_allocate_device();

ret = request_threaded_irq(gpio_to_irq(cradle_detect_gpio), null, cradle_detect_irq, irqf_trigger_rising | irqf_trigger_falling | irqf_oneshot, "cradle_detect", data);   //申請中斷

static irqreturn_t cradle_detect_irq(int irq, void *data)

struct wcd_mbhc *mbhc = data;

int ret = irq_handled;

unsigned int code = 0xf9;

input_set_capability(mbhc->headset_jack.jack->input_dev, ev_key, code);

if (0 == __gpio_get_value(cradle_detect_gpio))

執行結果,在命令列執行cat /proc/kmsg可以看到檢測到按鍵

<6>[ 3140.814354] howard detect cradle irq 493 gpio value 0

<6>[ 3140.814363] howard cradle_detect_gpio low, reporting event

<6>[ 3141.106513] howard detect cradle irq 493 gpio value 1

<6>[ 3141.106522] howard cradle_detect_gpio high, reporting event

用getevent可以看到有號碼為0xf9的型別為1(ev_key)的事件上報:

/dev/input/event13: 0001 00f9 00000000

/dev/input/event13: 0000 0000 00000000

/dev/input/event13: 0001 00f9 00000001

/dev/input/event13: 0000 0000 00000000

Ext Grid上雙擊觸發事件

extjs 4的ext.grid.panel的行雙擊事件使用的是itemdblclick方法。itemdblclick方法的定義如 itemdblclick this,record,item,index,e,eopts extjs 4中ext.grid.panel的itemdblclick方法引數說...

Notification系統及其上的事件驅動

典型的notification一般有兩種架構,一種是點對點,一種是發布訂閱模型。主要討論發布訂閱模型。主要的類如下 topic,可以發布的話題。包含乙個topic的元資料。subscription,乙個消費者 可以是系統或者使用者 的乙個訂閱,乙個訂閱可以訂閱乙個topic,並且可以設定一些fiel...

vue router link 上新增點選事件

根據vue2.0官方文件關於父子元件通訊的原則,父元件通過prop傳遞資料給子元件,子元件觸發事件給父元件。但父元件想在子元件上監聽自己的click的話,需要加上native修飾符。所以如果在想要在router link上新增事件的話需要 click.native這樣寫 router link to...