91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

驅(qū)動(dòng)之路#10:淺談 Input 子系統(tǒng)

BSP調(diào)試從0到1 ? 來(lái)源:嵌入式分享 ? 作者:嵌入式分享 ? 2026-03-03 08:17 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

歡迎關(guān)注,每周更新!?

本合集分享的是,我當(dāng)初學(xué)習(xí)Linux驅(qū)動(dòng)的來(lái)時(shí)路——《《驅(qū)動(dòng)之路》開篇:自序&前言》。

正文

回答3個(gè)問(wèn)題:

(1)什么是 Input 子系統(tǒng)?

(2)為什么需要 Input 子系統(tǒng)?

(3)如何使用 Input 子系統(tǒng)?

1 什么是 Input 子系統(tǒng)?

Input 子系統(tǒng)是 Linux 內(nèi)核中一套統(tǒng)一管理輸入設(shè)備的框架,主要是為了將鍵盤、鼠標(biāo)、觸摸屏、按鍵、搖桿等各類輸入設(shè)備的硬件差異抽象化,為上層應(yīng)用提供統(tǒng)一的輸入事件接口(如/dev/input/eventX),這樣可以避免為每種設(shè)備單獨(dú)編寫驅(qū)動(dòng)程序。一句話總結(jié)其作用:“屏蔽硬件差異、提供統(tǒng)一接口”。

2 為什么需要 Input 子系統(tǒng)?

假如沒(méi)有 Input 子系統(tǒng),想要使用一個(gè)輸入設(shè)備,我們需要為每一種設(shè)備單獨(dú)編寫完整的驅(qū)動(dòng)程序,包括硬件初始化、數(shù)據(jù)讀取、事件解析等所有邏輯。這是由于每個(gè)輸入設(shè)備(比如 USB 鍵盤、GPIO 按鍵、I2C 觸摸屏、紅外遙控器)的通信協(xié)議、數(shù)據(jù)格式、觸發(fā)方式都不同。

另外,每新增一種輸入設(shè)備(如新型觸摸屏)時(shí),不僅要編寫全新驅(qū)動(dòng),還可能與現(xiàn)有設(shè)備沖突,甚至需要修改上層應(yīng)用才能適配。這樣不僅導(dǎo)致 Linux 內(nèi)核代碼冗余嚴(yán)重,而且開發(fā)成本和維護(hù)成本極高。

面對(duì)以上種種問(wèn)題,"封裝"與"分層"這兩大經(jīng)典的程序設(shè)計(jì)思想再次發(fā)威,Input 子系統(tǒng)正是基于這樣思想設(shè)計(jì)出來(lái)解決以上問(wèn)題的。

Input 子系統(tǒng)有如下主要作用:

硬件差異屏蔽:不同輸入設(shè)備的通信協(xié)議(如 USB、I2C、SPI、GPIO)和數(shù)據(jù)格式不同,Input 子系統(tǒng)通過(guò)統(tǒng)一的驅(qū)動(dòng)模型,將底層硬件細(xì)節(jié)封裝,上層無(wú)需關(guān)心設(shè)備是 USB 鍵盤還是 GPIO 按鍵;

統(tǒng)一事件接口:所有輸入設(shè)備最終都通過(guò) /dev/input/eventX節(jié)點(diǎn)暴露給用戶空間,應(yīng)用程序可通過(guò)標(biāo)準(zhǔn)的 read ()/poll () 等系統(tǒng)調(diào)用讀取事件(如按鍵按下 / 松開、坐標(biāo)移動(dòng)、手勢(shì)等);

事件標(biāo)準(zhǔn)化:定義了統(tǒng)一的事件類型(如 EV_KEY、EV_ABS、EV_REL)和事件碼(如 KEY_0、ABS_X),確保不同設(shè)備的事件格式一致,上層應(yīng)用可跨設(shè)備兼容。

3 如何使用 Input 子系統(tǒng)?

要想正確使用 Input 子系統(tǒng),不得不理清其3 層架構(gòu):事件處理層、核心層以及驅(qū)動(dòng)層。核心源代碼位于/drivers/input/目錄。

事件處理層(evdev.c):接收核心層轉(zhuǎn)發(fā)的事件,為上層應(yīng)用提供訪問(wèn)接口(如/dev/input/eventX設(shè)備節(jié)點(diǎn))。

核心層(input.c):管理所有輸入設(shè)備,提供驅(qū)動(dòng)注冊(cè) / 注銷接口,轉(zhuǎn)發(fā)驅(qū)動(dòng)層事件到合適的事件層

驅(qū)動(dòng)層(輸入設(shè)備驅(qū)動(dòng)程序,如gpio_keys.c 等):直接操作硬件(如 GPIO 中斷、讀取電平),將硬件信號(hào)轉(zhuǎn)換為 “標(biāo)準(zhǔn)化輸入事件”。從底層硬件到上層應(yīng)用鏈路如下:

wKgZPGmmKTKAck2TAABhaKdwoW4590.png

從硬件底層到用戶空間數(shù)據(jù)是如何層層傳遞的?假如用戶空間直接訪問(wèn)/dev/input/event0設(shè)備節(jié)點(diǎn),數(shù)據(jù)的流程大致如下:

(1)用戶空間應(yīng)用程序通過(guò)read()系統(tǒng)調(diào)用讀取/dev/input/eventX設(shè)備節(jié)點(diǎn)。如果此時(shí)內(nèi)核輸入緩沖區(qū)中沒(méi)有可用的事件數(shù)據(jù),該read()調(diào)用會(huì)使應(yīng)用程序進(jìn)入休眠狀態(tài),等待數(shù)據(jù)到達(dá)。

(2)當(dāng)用戶進(jìn)行操作(如觸摸屏幕、按下按鍵)時(shí),輸入設(shè)備的硬件會(huì)產(chǎn)生一個(gè)中斷信號(hào)(例如,觸摸芯片的中斷引腳電平發(fā)生變化)。

(3)當(dāng)驅(qū)動(dòng)程序檢測(cè)到這個(gè)電平時(shí),輸入系統(tǒng)驅(qū)動(dòng)層對(duì)應(yīng)的驅(qū)動(dòng)程序會(huì)調(diào)用中斷處理函數(shù):讀取到數(shù)據(jù),轉(zhuǎn)換為標(biāo)準(zhǔn)的輸入事件,向核心層匯報(bào)。

(4)Input核心層接收到事件后,會(huì)根據(jù)設(shè)備和事件的類型,上報(bào)事件層——將其分發(fā)給已注冊(cè)并匹配的事件處理器(Input Handler),例如evdev_handler。當(dāng)用戶空間正在等待數(shù)據(jù)時(shí),evdev_handler會(huì)把它喚醒,這樣用戶空間就可以獲取到硬件底層的上報(bào)數(shù)據(jù)。

最后,了解下用戶空間獲得數(shù)據(jù)的兩種方法:

直接訪問(wèn)設(shè)備節(jié)點(diǎn)(比如/dev/input/event0,1,2,...);

通過(guò)tslib、libinput 這類庫(kù)來(lái)間接訪問(wèn)設(shè)備節(jié)點(diǎn),這些庫(kù)簡(jiǎn)化了對(duì)數(shù)據(jù)的處理。

如果想繼續(xù)深入理解 Input 子系統(tǒng)是如何將不同輸入設(shè)備的硬件差異統(tǒng)一成標(biāo)準(zhǔn)的輸入事件?請(qǐng)聽(tīng)下回分解。

(完)

本人專注 Linux 驅(qū)動(dòng) & Linux/Android BSP 開發(fā)調(diào)試,可接外包項(xiàng)目/技術(shù)支持/問(wèn)題定位。有需求或交個(gè)朋友可加微信:【Chen_WeChat2026】。

審核編輯 黃宇

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

    關(guān)注

    12

    文章

    1954

    瀏覽量

    88522
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11758

    瀏覽量

    219009
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    迅為RK3568開發(fā)板驅(qū)動(dòng)指南GPIO子系統(tǒng)GPIO子系統(tǒng)API函數(shù)的引入

    迅為RK3568開發(fā)板驅(qū)動(dòng)指南GPIO子系統(tǒng)GPIO子系統(tǒng)API函數(shù)的引入
    的頭像 發(fā)表于 05-29 14:05 ?1014次閱讀
    迅為RK3568開發(fā)板<b class='flag-5'>驅(qū)動(dòng)</b>指南GPIO<b class='flag-5'>子系統(tǒng)</b>GPIO<b class='flag-5'>子系統(tǒng)</b>API函數(shù)的引入

    迅為RK3568驅(qū)動(dòng)指南GPIO子系統(tǒng) GPIO操作函數(shù)實(shí)驗(yàn)

    迅為電子RK3568開發(fā)板驅(qū)動(dòng)指南GPIO子系統(tǒng) GPIO操作函數(shù)實(shí)驗(yàn)
    的頭像 發(fā)表于 05-28 15:24 ?1331次閱讀
    迅為RK3568<b class='flag-5'>驅(qū)動(dòng)</b>指南GPIO<b class='flag-5'>子系統(tǒng)</b> GPIO操作函數(shù)實(shí)驗(yàn)

    RK3568驅(qū)動(dòng)指南|第十二篇 GPIO子系統(tǒng)-第135章 GPIO子系統(tǒng)與pinctrl子系統(tǒng)相結(jié)合實(shí)驗(yàn)

    RK3568驅(qū)動(dòng)指南|第十二篇 GPIO子系統(tǒng)-第135章 GPIO子系統(tǒng)與pinctrl子系統(tǒng)相結(jié)合實(shí)驗(yàn)
    的頭像 發(fā)表于 05-23 13:47 ?1015次閱讀
    RK3568<b class='flag-5'>驅(qū)動(dòng)</b>指南|第十二篇 GPIO<b class='flag-5'>子系統(tǒng)</b>-第135章 GPIO<b class='flag-5'>子系統(tǒng)</b>與pinctrl<b class='flag-5'>子系統(tǒng)</b>相結(jié)合實(shí)驗(yàn)

    迅為RK3568驅(qū)動(dòng)指南GPIO子系統(tǒng)實(shí)戰(zhàn):實(shí)現(xiàn)動(dòng)態(tài)切換引腳復(fù)用功能

    迅為RK3568驅(qū)動(dòng)指南GPIO子系統(tǒng)實(shí)戰(zhàn):實(shí)現(xiàn)動(dòng)態(tài)切換引腳復(fù)用功能
    的頭像 發(fā)表于 05-22 14:27 ?2088次閱讀
    迅為RK3568<b class='flag-5'>驅(qū)動(dòng)</b>指南GPIO<b class='flag-5'>子系統(tǒng)</b>實(shí)戰(zhàn):實(shí)現(xiàn)動(dòng)態(tài)切換引腳復(fù)用功能

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-input子系統(tǒng)之基于input子系統(tǒng)的光線傳感器驅(qū)動(dòng)

    光照強(qiáng)度測(cè)量的應(yīng)用,包括自動(dòng)調(diào)光系統(tǒng)、室內(nèi)照明控制、移動(dòng)設(shè)備和環(huán)境監(jiān)測(cè)等。 驅(qū)動(dòng)編寫 例程代碼路徑:ELF 1開發(fā)板資料包\\03-例程源碼\\03-2 驅(qū)動(dòng)例程源碼\\08_input
    發(fā)表于 04-16 11:05

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-input子系統(tǒng)之基于input子系統(tǒng)的按鍵驅(qū)動(dòng)

    例程代碼路徑:ELF 1開發(fā)板資料包\\03-例程源碼\\03-2 驅(qū)動(dòng)例程源碼\\08_input子系統(tǒng)\\keyboard下面以控制開發(fā)板上的K2為例進(jìn)行講解。修改設(shè)備樹(一)查看原理圖和引腳
    發(fā)表于 04-16 10:57

    飛凌嵌入式ElfBoard ELF 1板卡-input子系統(tǒng)之基于input子系統(tǒng)的光線傳感器驅(qū)動(dòng)

    的應(yīng)用,包括自動(dòng)調(diào)光系統(tǒng)、室內(nèi)照明控制、移動(dòng)設(shè)備和環(huán)境監(jiān)測(cè)等。驅(qū)動(dòng)編寫例程代碼路徑:ELF 1開發(fā)板資料包\\03-例程源碼\\03-2 驅(qū)動(dòng)例程源碼\\08_input
    發(fā)表于 04-16 10:39

    飛凌嵌入式ElfBoard ELF 1板卡-input子系統(tǒng)之基于input子系統(tǒng)的按鍵驅(qū)動(dòng)

    例程代碼路徑:ELF 1開發(fā)板資料包\\03-例程源碼\\03-2 驅(qū)動(dòng)例程源碼\\08_input子系統(tǒng)\\keyboard下面以控制開發(fā)板上的K2為例進(jìn)行講解。修改設(shè)備樹(一)查看原理圖和引腳
    發(fā)表于 04-15 10:58

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-input子系統(tǒng)input子系統(tǒng)簡(jiǎn)單構(gòu)建流程

    _driver的輸入設(shè)備驅(qū)動(dòng)程序,它使用Input子系統(tǒng)提供的API來(lái)創(chuàng)建和注冊(cè)輸入設(shè)備。在驅(qū)動(dòng)程序的初始化函數(shù)my_input_drive
    發(fā)表于 04-15 10:54

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-input子系統(tǒng)input子系統(tǒng)簡(jiǎn)介

    使用了設(shè)備驅(qū)動(dòng)程序來(lái)管理輸入設(shè)備。每個(gè)輸入設(shè)備都由一個(gè)驅(qū)動(dòng)程序進(jìn)行控制,驅(qū)動(dòng)程序負(fù)責(zé)與硬件進(jìn)行通信并將輸入事件傳遞給Input子系統(tǒng)。輸入事
    發(fā)表于 04-15 10:42

    飛凌嵌入式ElfBoard ELF 1板卡-input子系統(tǒng)input子系統(tǒng)簡(jiǎn)單構(gòu)建流程

    _driver的輸入設(shè)備驅(qū)動(dòng)程序,它使用Input子系統(tǒng)提供的API來(lái)創(chuàng)建和注冊(cè)輸入設(shè)備。在驅(qū)動(dòng)程序的初始化函數(shù)my_input_drive
    發(fā)表于 04-15 10:29

    飛凌嵌入式ElfBoard ELF 1板卡-input子系統(tǒng)input子系統(tǒng)簡(jiǎn)介

    使用了設(shè)備驅(qū)動(dòng)程序來(lái)管理輸入設(shè)備。每個(gè)輸入設(shè)備都由一個(gè)驅(qū)動(dòng)程序進(jìn)行控制,驅(qū)動(dòng)程序負(fù)責(zé)與硬件進(jìn)行通信并將輸入事件傳遞給Input子系統(tǒng)。輸入事
    發(fā)表于 04-15 10:27

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-Pinctrl和GPIO子系統(tǒng)之GPIO子系統(tǒng)

    GPIO(General Purpose Input/Output)子系統(tǒng)是用于控制和管理通用輸入/輸出引腳的一部分。它提供了一種標(biāo)準(zhǔn)化的方式來(lái)訪問(wèn)和操作硬件平臺(tái)上的GPIO引腳,使開發(fā)人員能夠通過(guò)
    發(fā)表于 03-25 13:29

    飛凌嵌入式ElfBoard ELF 1板卡-Pinctrl和GPIO子系統(tǒng)之GPIO子系統(tǒng)

    GPIO(General Purpose Input/Output)子系統(tǒng)是用于控制和管理通用輸入/輸出引腳的一部分。它提供了一種標(biāo)準(zhǔn)化的方式來(lái)訪問(wèn)和操作硬件平臺(tái)上的GPIO引腳,使開發(fā)人員能夠通過(guò)
    發(fā)表于 03-24 15:41

    飛凌嵌入式ElfBoard ELF 1板卡-Pinctrl和GPIO子系統(tǒng)之Pinctrl子系統(tǒng)

    pinctrl(Pin Control)子系統(tǒng)是Linux內(nèi)核中的一個(gè)模塊化子系統(tǒng),用于管理和控制硬件引腳(Pin)的配置和功能。它提供了一種統(tǒng)一的接口,使驅(qū)動(dòng)程序可以對(duì)硬件引腳進(jìn)行靈活的配置和控制
    發(fā)表于 03-22 09:23