chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

驅(qū)動之路#11:Input子系統(tǒng)數(shù)據(jù)上報流程

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

掃碼添加小助手

加入工程師交流群

題圖:日本東京有一家專門生產(chǎn)電梯按鈕的公司,該公司把生產(chǎn)過的1000多種電梯按鈕,做成了一面展示墻,按上去每個都會亮。孩子們和大人都很喜歡。

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

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

正文

Input 子系統(tǒng)框架的復(fù)雜程度有三四層樓那么高。幸運的是,復(fù)雜那部分代碼大佬前輩們已經(jīng)實現(xiàn),我們只需搞懂 Input 子系統(tǒng)的框架,然后套用框架實現(xiàn)具體輸入設(shè)備 driver 端驅(qū)動程序即可。因此,可以說 ai 時代搞懂框架比理解每行代碼更重要。

但是對于 Input 子系統(tǒng)這樣復(fù)雜的框架,要徹底理解從硬件底層到用戶空間的數(shù)據(jù)上報流程談何容易,必須要找到一個抓手作為切入點。

然而,分析gpio_keys.c驅(qū)動正是掌握 Linux Input 子系統(tǒng)數(shù)據(jù)上報流程的絕佳途徑,因為它是一個典型且相對簡單的 Input 驅(qū)動實例。

在分析前,請先回顧《驅(qū)動之路#01:Hello World!》和 Input 子系統(tǒng)的三層架構(gòu):驅(qū)動層、核心層以及事件處理層。

wKgZO2mvZN2AbU7PAAIG2CMGLgw758.png

下面是一個 step-by-step 的指南,帶你從gpio_keys.c出發(fā),徹底理解 Input 子系統(tǒng)的工作機制。

特別說明:本文重點在于理解 Input 子系統(tǒng)數(shù)據(jù)上報流程,而非gpio_keys.c驅(qū)動分析。

從module_init開始:驅(qū)動入口函數(shù)

閱讀一個字符設(shè)備驅(qū)動程序從入口函數(shù)開始,在 gpio_keys.c 中可以看到 gpio_keys_init 注冊了 gpio_keys_device_driver。當(dāng) driver 與 device 匹配后,gpio_keys_probe 函數(shù)就會被調(diào)用,接下來重點分析gpio_keys_probe 函數(shù)。

wKgZO2mvZN2AO6OtAAFAxbsqrOc979.png

驅(qū)動層到核心層

驅(qū)動核心: gpio_keys_probe 函數(shù)分析

probe函數(shù)在驅(qū)動與設(shè)備匹配成功后被調(diào)用,可以看到 probe函數(shù)有 4 步關(guān)鍵操作。

步驟 1:獲取設(shè)備配置信息

首先通過dev_get_platdata(dev)從平臺設(shè)備中獲取靜態(tài)定義的平臺數(shù)據(jù)。如果沒有靜態(tài)平臺數(shù)據(jù),則再通過gpio_keys_get_devtree_pdata(dev)從設(shè)備樹中解析配置??傊?,無論是設(shè)備樹還是傳統(tǒng)平臺數(shù)據(jù),最終都解析到pdata中。

wKgZO2mvZN2AeJ07AAEDJMVRvDE707.png

步驟 2:分配和初始化struct input_dev

通過devm_input_allocate_device()創(chuàng)建一個輸入設(shè)備對象input_dev,這是驅(qū)動層與核心層交互的第一步。

wKgZO2mvZN6ASV88AAESzXXDnpA111.png

步驟 3:申請 GPIO 和中斷

probe 函數(shù)沒有直接包含中斷處理函數(shù)的實現(xiàn),而是通過調(diào)用 gpio_keys_setup_key() 完成了中斷函數(shù)的注冊、中斷觸發(fā)方式等配置。

wKgZO2mvZN6Abl0WAAA-eoy6v4c995.png

步驟 4:注冊輸入設(shè)備

通過 input_register_device()將 input_dev 注冊到 Input 子系統(tǒng)核心層,調(diào)用此函數(shù)后,Input 核心層會接手管理這個輸入設(shè)備并嘗試為它匹配合適的事件處理器(Handler),如 evdev。

注冊成功后,用戶空間就可以看到/dev/input/eventX 設(shè)備節(jié)點了。

wKgZO2mvZN6AQLLqAABLPDcqWHY584.png

以上是 probe 函數(shù)關(guān)鍵操作的分析。

中斷處理函數(shù)分析

中斷處理函數(shù)是數(shù)據(jù)上報流程的起點,當(dāng)用戶按下或松開按鍵時,GPIO 電平變化觸發(fā)中斷,此函數(shù)被執(zhí)行。

經(jīng)過前面分析知道,中斷服務(wù)函數(shù)相關(guān)配置在gpio_keys_setup_key() 中完成,接下來分析 gpio_keys_setup_key() 。

可以看到有兩種IRQ函數(shù)

gpio_keys_gpio_isr:設(shè)備樹中的用gpios描述引腳時調(diào)用;

gpio_keys_irq_isr:設(shè)備樹中的用interrupts描述引腳時調(diào)用。

它們有各自的優(yōu)缺點,但不是本文的重點,這里不展開分析。

wKgZO2mvZN6AGUc_AANaoLNwqDQ103.png

我們分析相對簡單的 gpio_keys_irq_isr 中斷函數(shù)的處理流程,其中,

核心:調(diào)用input_event(input, EV_KEY, *bdata->code,1)和input_sync(input)進行上報數(shù)據(jù)。

input_event():向 Input 核心層上報一個原始事件。這個事件包含了事件類型(EV_KEY)、事件碼(如 KEY_POWER)和值(1 或 0)。

input_sync():上報一個同步事件,告訴核心層 “這一組事件已經(jīng)完整上報完畢”。

wKgZO2mvZN6AMdO2AATY92t5pNQ363.png

至此,數(shù)據(jù)已經(jīng)從硬件驅(qū)動層上報到核心層。

核心層到事件層數(shù)據(jù)流

數(shù)據(jù)從核心層傳遞到事件層函數(shù)調(diào)用關(guān)系比較復(fù)雜,調(diào)用關(guān)系如下。

其中,input_handle_event函數(shù)是 Input 核心層的事件分發(fā)中心,它會將事件傳遞給所有與該input_dev關(guān)聯(lián)的input_handler(事件處理器)。

而數(shù)據(jù)從核心層傳遞到事件層,是調(diào)用evdev_events 函數(shù)來實現(xiàn),然后通過evdev_pass_values函數(shù)被分發(fā)到各個客戶端。

wKgZO2mvZN-AZFU2AAWPtQGk01k574.png

當(dāng)用戶空間讀取/dev/input/eventX時,實際上是從對應(yīng)客戶端的環(huán)形緩沖區(qū)中讀取數(shù)據(jù)。數(shù)據(jù)最后保存在每個打開設(shè)備文件的進程所對應(yīng)的evdev_client的環(huán)形緩沖區(qū)中。

wKgZO2mvZN-AaTuOAAGpAHHV4Kw875.png

數(shù)據(jù)流:gpio_keys.c驅(qū)動->input_event -> input_handle_event -> input_pass_values -> evdev_events -> evdev_pass_values ->寫入evdev_client的 buffer ->用戶空間read讀取。

總結(jié)整個流程

硬件:用戶按下按鍵 -> GPIO 電平變化 -> 觸發(fā)中斷。

驅(qū)動層 (gpio_keys.c):

gpio_keys_irq_isr 或gpio_keys_gpio_isr 中斷服務(wù)程序被調(diào)用。

調(diào)用input_event()和input_sync()向上層(核心層)上報事件。

核心層 (input.c):

input_event()->input_handle_event()接收事件。

核心層將事件分發(fā)給所有匹配的 input_handler。

事件處理層 (evdev.c):

evdev_event()接收事件。

將事件打包成struct input_event并寫入內(nèi)核緩沖區(qū)(buffer)。

喚醒正在等待數(shù)據(jù)的用戶空間應(yīng)用程序。

用戶空間:應(yīng)用程序的 read()調(diào)用返回,讀取到 struct input_event 數(shù)據(jù)并進行解析。

看完本文,可自行閱讀源碼分析,關(guān)鍵代碼閱讀順序:

drivers/input/keyboard/gpio_keys.c- 具體輸入設(shè)備驅(qū)動程序

drivers/input/input.c- 核心框架

drivers/input/evdev.c- 事件處理

include/linux/input.h- 數(shù)據(jù)結(jié)構(gòu)和 API

(完)

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

更多原創(chuàng)技術(shù)文章:《README 2026》。

審核編輯 黃宇

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

    關(guān)注

    12

    文章

    1957

    瀏覽量

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

    關(guān)注

    0

    文章

    116

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    基于 ROS + ADI 芯片方案 的 人形機器人子系統(tǒng)級BOM清單(以腿部子系統(tǒng)為例)

    基于 ROS + ADI 芯片方案 的 人形機器人子系統(tǒng)級BOM清單 (以 腿部子系統(tǒng) 為例),包括核心感知、執(zhí)行與通信模塊,配合主控系統(tǒng)通過 ROS2 實現(xiàn)分布式控制與狀態(tài)反饋。 一、腿部
    的頭像 發(fā)表于 06-17 17:06 ?2048次閱讀

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

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

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

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

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

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

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

    \\bh1726 BH1726光線傳感器采用了i2c接口,所以需要將其注冊成i2c設(shè)備,來讀取其內(nèi)部寄存器的測量值,然后通過input子系統(tǒng)上報到用戶空間,下面來看一下驅(qū)動的具體實現(xiàn)
    發(fā)表于 04-16 11:05

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

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

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

    \\bh1726BH1726光線傳感器采用了i2c接口,所以需要將其注冊成i2c設(shè)備,來讀取其內(nèi)部寄存器的測量值,然后通過input子系統(tǒng)上報到用戶空間,下面來看一下驅(qū)動的具體實現(xiàn)
    發(fā)表于 04-16 10:39

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

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

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

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

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

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

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

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

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

    使用了設(shè)備驅(qū)動程序來管理輸入設(shè)備。每個輸入設(shè)備都由一個驅(qū)動程序進行控制,驅(qū)動程序負(fù)責(zé)與硬件進行通信并將輸入事件傳遞給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)化的方式來訪問和操作硬件平臺上的GPIO引腳,使開發(fā)人員能夠通過
    發(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)化的方式來訪問和操作硬件平臺上的GPIO引腳,使開發(fā)人員能夠通過
    發(fā)表于 03-24 15:41

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

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