再談談linux input 子系統事件型別

2021-10-09 18:45:19 字數 1056 閱讀 9112

/* 向上層上報乙個scancode */

input_event(dev, ev_msc, msc_scan, code);

將事件上報給事件處理控制代碼意味這事件將真正到達事件處理層,對於pc keyboard的event handle就是sysrq,kbd,eventx,這些handle對應的handler分別是sysrq_handler,kbd_handler,evdev_handler。每次上報乙個事件,都會由input_pass_event函式去遍歷這些event handle再有這些event handle 找到對應的handler,最後呼叫handler->event()函式對事件進行最終的處理。 回看atkbd_interrupt的三次input_event呼叫: 第一次type為ev_msc,code為msc_raw,但有/sys/class/input/input0/capabilities/msc 為0x10可知(第4位為0),一般pc keyboard都不支援上報raw型別事件。也就是說對於那些對event裝置感興趣的應用程式而言是無法從這裡獲得raw scancode的。 第二次type為ev_msc,code為msc_scan 正好是pc keyboard唯一支援的ev_msc事件型別,所以可以在此上報scancode 事件。其實從**裡可以看到raw scancode和scancode 區別在於前者可以多幾種scancode。 第三次type為ev_key,code為scancode,這才算是上報一次普通的按鍵事件。 最後一路跟蹤到了kbd_handler,裡面將呼叫kbd_event進行最終的處理。另外兩個,sysrq_event和evdev_event不再講了,前者處理sysrq特殊按鍵組合的事件,後者涉及evdev client和使用者層掛接的問題

對於乙個常規按鍵,kbd_event會在整個流程中被呼叫兩次,第一次是event_type=ev_msc ,event_code=msc_scan ,這次其實是會被忽略。另外hw_raw(handle->dev) 這個巨集對於pc keyboard恒為0,所以再次重複一遍,pc keyboard永遠也不會將raw scancode上報處理。 第二次是event_type=ev_key,event_code=keycode,這才是需要關心的。

談談座標系的變換

座標系的變換分兩類 一類是座標系中,點的位置不變,變的只是座標的值,或者說改變的只是同乙個點在不同系下的描述 二類是點的座標值不改變,點的位置發生改變適應新的座標系,或者說相同的座標值在不同的座標系中有不同的幾何解釋,從而得到不同的位置。我們討論的是前一種情況。一 基底 座標系最根本的是基底,點p的...

再談子陣列 子串問題

這類問題都是求乙個滿足某種條件的連續的段,相對於子串行。字串和陣列的主要區別是,前者因為由字元而不是數值組成,一般不會有最大值,最小值,求和這種問題。對於字串的子串問題,一般條件是子串符合某種pattern 回文 有序 或者滿足某種統計特徵 子串內無重複字元,最多重複2次,包含了給定字符集的所有字元...

python之再談談列表,字典,元組

列表 coding utf 8 列表,定義在方括號的形式中,可以進行切片操作。它沒有固定型別的約束,即可以包含不同的資料型別。l 1,abc 2.3 print len l print 40 print l print 40 l.pop 0 print l print 40 l.sort print...