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...