0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

input子系統(tǒng)介紹和架構(gòu)

CHANBAEK ? 來源:嵌入式軟件開發(fā)交流 ? 作者:嵌入式軟件開發(fā)交 ? 2023-03-16 18:01 ? 次閱讀

input子系統(tǒng)介紹

Linux內(nèi)核為了能夠處理各種不同類型的輸入設(shè)備,比如: 觸摸屏 ,鼠標 , 鍵盤 , 操縱桿等設(shè)備 ,設(shè)計并實現(xiàn)了Linux 輸入子系統(tǒng) ,它為驅(qū)動和應(yīng)用提供了統(tǒng)一的接口函數(shù),方便實現(xiàn)各種輸入設(shè)備的驅(qū)動。

input子系統(tǒng)架構(gòu)

圖片

(1)驅(qū)動層功能 :負責和底層的硬件設(shè)備打交道,將底層硬件設(shè)備對用戶輸入的響應(yīng)轉(zhuǎn)換為標準的輸入事件以后再向上發(fā)送給輸入子系統(tǒng)核心層。

(2)Input系統(tǒng)核心層 :由driver/input/input.c及相關(guān)頭文件實現(xiàn),它對下提供了設(shè)備驅(qū)動層的接口,對上提供了事件處理層的編程接口。

(3)事件處理層 :將硬件設(shè)備上報的事件分發(fā)到用戶空間和內(nèi)核。

重要結(jié)構(gòu)體

  • input_dev
//輸入設(shè)備
struct input_dev {
  const char *name;    //設(shè)備名稱
  const char *phys;   //設(shè)備的物理路徑
  const char *uniq;    //唯一ID
  struct input_id id;  //輸入ID


  unsigned long propbit[BITS_TO_LONGS(INPUT_PROP_CNT)]; //設(shè)備屬性
    //所支持的input事件,(鍵盤, 按鍵,坐標等)
  unsigned long evbit[BITS_TO_LONGS(EV_CNT)];   //事件類型
   //下面是根據(jù)具體設(shè)備來決定設(shè)置哪些
  unsigned long keybit[BITS_TO_LONGS(KEY_CNT)]; //按鍵
  unsigned long relbit[BITS_TO_LONGS(REL_CNT)]; //相對坐標
  unsigned long absbit[BITS_TO_LONGS(ABS_CNT)]; //絕對坐標
  unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)]; //其他事件(混雜事件)
  unsigned long ledbit[BITS_TO_LONGS(LED_CNT)]; //帶LED
  unsigned long sndbit[BITS_TO_LONGS(SND_CNT)]; //音效
  unsigned long ffbit[BITS_TO_LONGS(FF_CNT)];   //力反饋效果
  unsigned long swbit[BITS_TO_LONGS(SW_CNT)];   //帶開關(guān)


  unsigned int hint_events_per_packet;  //每個包中的平均事件數(shù)


  unsigned int keycodemax;
  unsigned int keycodesize;
  void *keycode; //掃描碼到鍵碼的映射


  int (*setkeycode)(struct input_dev *dev,
        const struct input_keymap_entry *ke,
        unsigned int *old_keycode);
  int (*getkeycode)(struct input_dev *dev,
        struct input_keymap_entry *ke);


  struct ff_device *ff;


  unsigned int repeat_key;  //保存上次按下的按鍵
  struct timer_list timer;


  int rep[REP_CNT];


  struct input_mt *mt;  //多點觸摸狀態(tài)


  struct input_absinfo *absinfo; //絕對坐標信息
    //保存設(shè)備的當前狀態(tài)
  unsigned long key[BITS_TO_LONGS(KEY_CNT)];
  unsigned long led[BITS_TO_LONGS(LED_CNT)];
  unsigned long snd[BITS_TO_LONGS(SND_CNT)];
  unsigned long sw[BITS_TO_LONGS(SW_CNT)];


  int (*open)(struct input_dev *dev);
  void (*close)(struct input_dev *dev);
  int (*flush)(struct input_dev *dev, struct file *file);
  int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value);


  struct input_handle __rcu *grab;


  spinlock_t event_lock;
  struct mutex mutex;


  unsigned int users;
  bool going_away;


  struct device dev;  //設(shè)備


  struct list_head  h_list;
  struct list_head  node;


  unsigned int num_vals;
  unsigned int max_vals;
  struct input_value *vals;
};

input_dev代表了一個輸入設(shè)備,結(jié)構(gòu)體里面就是保存了輸入設(shè)備的信息,以及不同輸入設(shè)備的不同事件。

API函數(shù)

//分配一個輸入設(shè)備
struct input_dev *input_allocate_device(void)
//釋放輸入設(shè)備
void input_free_device(struct input_dev *dev)
//注冊輸入設(shè)備到輸入核心層
int input_register_device(struct input_dev *dev)
//注銷輸入設(shè)備
void input_unregister_device(struct input_dev *dev)
/*
報告輸入事件
參數(shù)說明:
    dev: 產(chǎn)生事件的設(shè)備
    type: 事件的類型
    code:事件碼
    value:事件的值
*/
void input_event(struct input_dev *dev,
     unsigned int type, unsigned int code, int value)
//報告按鍵事件,內(nèi)部調(diào)用input_event   
void input_report_key(struct input_dev *dev, unsigned int code, int value)
//報告相對坐標
void input_report_rel(struct input_dev *dev, unsigned int code, int value)
//報告絕對坐標 
void input_report_abs(struct input_dev *dev, unsigned int code, int value)
//報告同步事件,用來告訴上層,本次的事件已經(jīng)完成了
void input_sync(struct input_dev *dev) 


//用來設(shè)置設(shè)備所產(chǎn)生的事件以及上報的按鍵值
#define set_bit(nr,p)    ATOMIC_BITOP(set_bit,nr,p)
#define clear_bit(nr,p)    ATOMIC_BITOP(clear_bit,nr,p)

輸入設(shè)備事件類型

EV_SYN 0x00 //同步事件
EV_KEY 0x01 //按鍵事件
EV_REL 0x02 //相對坐標
EV_ABS 0x03 //絕對坐標
EV_MSC 0x04 //其它
EV_LED 0x11 //LED
EV_SND 0x12 //聲音
EV_REP 0x14 //Repeat
EV_FF 0x15 //力反饋
EV_PWR //電源
EV_FF_STATUS //狀態(tài)

每個事件類型下面會有一些事件碼(Event Codes),它會更精準的描述事件類型。

總結(jié)

輸入設(shè)備驅(qū)動的內(nèi)容并不多,主要還是要對設(shè)備的工作原理有深入的了解,才能編寫對應(yīng)驅(qū)動。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1348

    瀏覽量

    40153
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11171

    瀏覽量

    208479
  • 鍵盤
    +關(guān)注

    關(guān)注

    4

    文章

    857

    瀏覽量

    39496
  • 子系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    109

    瀏覽量

    12364
  • 結(jié)構(gòu)體
    +關(guān)注

    關(guān)注

    1

    文章

    127

    瀏覽量

    10812
收藏 人收藏

    評論

    相關(guān)推薦

    關(guān)于Linux設(shè)備驅(qū)動中input子系統(tǒng)介紹

    對于輸入類設(shè)備如鍵盤、鼠標、觸摸屏之類的Linux驅(qū)動,內(nèi)核提供input子系統(tǒng),使得這類設(shè)備的處理變得非常便捷??傮w上來講,input子系統(tǒng)由三部分組成: 事件驅(qū)動
    發(fā)表于 01-09 16:06 ?2678次閱讀

    linux驅(qū)動-Input輸入子系統(tǒng)

    以前,看過國嵌關(guān)于input子系統(tǒng)的視頻課程,說實話,我看完后腦子里很亂,給我的印象好像是input子系統(tǒng)驅(qū)動是一個全新的驅(qū)動架構(gòu),疑惑相當
    發(fā)表于 05-21 00:05

    Linux設(shè)備驅(qū)動之input子系統(tǒng)

    作者:武漢華嵌嵌入式培訓中心講師李老師對于輸入類設(shè)備如鍵盤、鼠標、觸摸屏之類的Linux驅(qū)動,內(nèi)核提供input子系統(tǒng),使得這類設(shè)備的處理變得非常便捷??傮w上來講,input子系統(tǒng)由三
    發(fā)表于 03-15 15:28

    linux input子系統(tǒng)input core、input drivers和event handles

    linux input子系統(tǒng)簡單介紹
    發(fā)表于 04-01 16:06

    如何使用Linux內(nèi)核中的input子系統(tǒng)

    輸入設(shè)備總類繁雜,包括按鍵,鍵盤,觸摸屏,鼠標,搖桿等等,它們本身都是字符設(shè)備,不過內(nèi)核為了能將這些設(shè)備的共性抽象出來,簡化驅(qū)動的開發(fā),建立了一個 Input 子系統(tǒng)。用戶只需要根據(jù)內(nèi)核提供
    發(fā)表于 12-29 07:20

    迅為i.MX6ULL終結(jié)者Linux INPUT子系統(tǒng)實驗Input子系統(tǒng)

    文章目錄1 input子系統(tǒng)簡介2 input驅(qū)動程序編寫流程3 input_event結(jié)構(gòu)體1 input
    發(fā)表于 01-11 10:41

    介紹input子系統(tǒng)

    文章目錄前言input子系統(tǒng)按鍵檢測C代碼微信公眾號前言這是前3篇:嵌入式Linux i.MX開發(fā)板嵌入式Linux NFS嵌入式Linux 交叉編譯工具鏈嵌入式Linux LED GPIO本篇介紹
    發(fā)表于 11-04 08:14

    【OpenHarmony資料合集】Sensor子系統(tǒng)/圖形子系統(tǒng)/Ability子系統(tǒng)介紹

    ,移動互聯(lián)網(wǎng)的快速發(fā)展,在數(shù)字時代,傳感器在智能交通,智能工業(yè),智能穿戴等領(lǐng)域有著廣闊的應(yīng)用空間?! ?.1 OpenHarmony架構(gòu)圖  2、OpenHarmony資料合集之圖形子系統(tǒng) 標準系統(tǒng)的圖形
    發(fā)表于 03-14 16:35

    Linux input 子系統(tǒng)范例和基本函數(shù)解析

    */ /*中斷處理函數(shù)*/ static irqreturn_t button_interrupt(int irq, void *dummy) { /*向輸入子系統(tǒng)報告產(chǎn)生按鍵事件*/ input_report_key(button_dev, BTN_0, inb(BUT
    發(fā)表于 11-21 14:58 ?2317次閱讀

    詳細了解Linux設(shè)備模型中的input子系統(tǒng)

    linux輸入子系統(tǒng)(linux input subsystem)從上到下由三層實現(xiàn),分別為:輸入子系統(tǒng)事件處理層(EventHandler)、輸入子系統(tǒng)核心層(InputCore)和
    發(fā)表于 05-12 09:04 ?1019次閱讀
    詳細了解Linux設(shè)備模型中的<b class='flag-5'>input</b><b class='flag-5'>子系統(tǒng)</b>

    驅(qū)動之路-input子系統(tǒng)

    一、input子系統(tǒng)系統(tǒng)框架Linux內(nèi)核實現(xiàn)了一套input子系統(tǒng),很多輸入設(shè)備,比如說按鍵、鍵盤、鼠標、觸摸屏等等都可以
    發(fā)表于 04-02 14:33 ?472次閱讀

    面向運載火箭能源子系統(tǒng)架構(gòu)設(shè)計方法

    面向運載火箭能源子系統(tǒng)架構(gòu)設(shè)計方法
    發(fā)表于 06-30 16:57 ?5次下載

    嵌入式Linux input

    文章目錄前言input子系統(tǒng)按鍵檢測C代碼微信公眾號前言這是前3篇:嵌入式Linux i.MX開發(fā)板嵌入式Linux NFS嵌入式Linux 交叉編譯工具鏈嵌入式Linux LED GPIO本篇介紹
    發(fā)表于 11-01 16:31 ?2次下載
    嵌入式Linux <b class='flag-5'>input</b>

    OpenHarmony Dev-Board-SIG專場:OpenHarmony音頻子系統(tǒng)以及相機子系統(tǒng)架構(gòu)

    OpenHarmony Dev-Board-SIG專場:OpenHarmony音頻子系統(tǒng)以及相機子系統(tǒng)架構(gòu)
    的頭像 發(fā)表于 12-28 15:01 ?1464次閱讀
    OpenHarmony Dev-Board-SIG專場:OpenHarmony音頻<b class='flag-5'>子系統(tǒng)</b>以及相機<b class='flag-5'>子系統(tǒng)</b><b class='flag-5'>架構(gòu)</b>

    Linux驅(qū)動學習筆記:input子系統(tǒng)機制

    input子系統(tǒng)所有的設(shè)備主設(shè)備號都是13,在使用input系統(tǒng)的時候不需要去注冊字符設(shè)備,只需要向系統(tǒng)申請一個
    發(fā)表于 06-23 14:28 ?2200次閱讀
    Linux驅(qū)動學習筆記:<b class='flag-5'>input</b><b class='flag-5'>子系統(tǒng)</b>機制