日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuà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多種電梯按鈕,做成了一面展示墻,按上去每個都會亮。孩子們和大人都很喜歡。

歡迎關注,每周更新!?

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

正文

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

但是對于 Input 子系統(tǒng)這樣復雜的框架,要徹底理解從硬件底層到用戶空間的數(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ù)

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

wKgZO2mvZN2AO6OtAAFAxbsqrOc979.png

驅(qū)動層到核心層

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

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

步驟 1:獲取設備配置信息

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

wKgZO2mvZN2AeJ07AAEDJMVRvDE707.png

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

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

wKgZO2mvZN6ASV88AAESzXXDnpA111.png

步驟 3:申請 GPIO 和中斷

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

wKgZO2mvZN6Abl0WAAA-eoy6v4c995.png

步驟 4:注冊輸入設備

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

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

wKgZO2mvZN6AQLLqAABLPDcqWHY584.png

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

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

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

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

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

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

gpio_keys_irq_isr:設備樹中的用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)用關系比較復雜,調(diào)用關系如下。

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

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

wKgZO2mvZN-AZFU2AAWPtQGk01k574.png

當用戶空間讀取/dev/input/eventX時,實際上是從對應客戶端的環(huán)形緩沖區(qū)中讀取數(shù)據(jù)。數(shù)據(jù)最后保存在每個打開設備文件的進程所對應的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 中斷服務程序被調(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ù)的用戶空間應用程序。

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

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

drivers/input/keyboard/gpio_keys.c- 具體輸入設備驅(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)試,可接外包項目/技術支持/問題定位。有需求或交個朋友可加微信:【Chen_WeChat2026】。

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

審核編輯 黃宇

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

    關注

    12

    文章

    1994

    瀏覽量

    88727
  • 子系統(tǒng)

    關注

    0

    文章

    116

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    驅(qū)動之路#20:Pinctrl 在手,引腳復用很順手

    : 步驟 2:內(nèi)核解析設備樹,初始化引腳配置 Linux 內(nèi)核啟動時,Pinctrl 子系統(tǒng)會執(zhí)行以下操作: 解析i2c0)綁定,等待驅(qū)動使
    的頭像 發(fā)表于 04-07 21:18 ?500次閱讀
    <b class='flag-5'>驅(qū)動</b><b class='flag-5'>之路</b>#20:Pinctrl 在手,引腳復用很順手

    AirCloud 協(xié)議:物聯(lián)網(wǎng)設備數(shù)據(jù)上報實現(xiàn)與實操指南

    物聯(lián)網(wǎng)設備開發(fā)過程中,便捷實現(xiàn)云端接入、保障數(shù)據(jù)穩(wěn)定傳輸是兩大核心訴求。LuatOS 的 AirCloud 物聯(lián)網(wǎng)云服務通信協(xié)議,可高效實現(xiàn)設備數(shù)據(jù)上報核心功能,還支持七類數(shù)據(jù)的定期或
    的頭像 發(fā)表于 03-25 12:34 ?181次閱讀
    AirCloud 協(xié)議:物聯(lián)網(wǎng)設備<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>上報</b>實現(xiàn)與實操指南

    LuatOS:AirCloud 云協(xié)議——物聯(lián)網(wǎng)設備數(shù)據(jù)上報實操詳解

    物聯(lián)網(wǎng)設備開發(fā)中,便捷上云與穩(wěn)定數(shù)傳是核心需求,LuatOS 的 AirCloud 物聯(lián)網(wǎng)云服務通信協(xié)議可實現(xiàn)數(shù)據(jù)上報核心功能,支持七類數(shù)據(jù)的定期 / 觸發(fā)式上報。本文將講解該協(xié)議相關
    的頭像 發(fā)表于 03-19 18:23 ?183次閱讀
    LuatOS:AirCloud 云協(xié)議——物聯(lián)網(wǎng)設備<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>上報</b>實操詳解

    RDMA設計37:RoCE v2 子系統(tǒng)模型設計

    子系統(tǒng)模型并將其整合到驗證平臺中,使得 RoCE v2 高速數(shù)據(jù)傳輸系統(tǒng)能夠進行復雜網(wǎng)絡環(huán)境下的仿真驗證。RoCE v2 子系統(tǒng)模型包含兩個 AXIS 總線接口、一個虛擬內(nèi)存管理器、
    發(fā)表于 02-06 16:19

    4G工業(yè)網(wǎng)關實現(xiàn)PLC數(shù)據(jù)采集與HTTP協(xié)議上報

    HTTP(超文本傳輸協(xié)議)是互聯(lián)網(wǎng)最基礎的應用層協(xié)議,在工業(yè)物聯(lián)網(wǎng)(IIoT)中也被廣泛用于設備上云、數(shù)據(jù)上報系統(tǒng)集成通信,其標準化、跨平臺和易實現(xiàn)的特點,使其成為工業(yè)網(wǎng)關與云平臺之間的重要橋梁
    的頭像 發(fā)表于 12-23 10:22 ?464次閱讀
    4G工業(yè)網(wǎng)關實現(xiàn)PLC<b class='flag-5'>數(shù)據(jù)</b>采集與HTTP協(xié)議<b class='flag-5'>上報</b>

    驅(qū)動隔離芯片:電子系統(tǒng)的安全與效能守護者

    在當今科技飛速發(fā)展的時代,電子系統(tǒng)的復雜性和集成度不斷提升,對信號傳輸?shù)陌踩?、穩(wěn)定性和高效性提出了前所未有的挑戰(zhàn)。從工業(yè)自動化的精密控制到新能源汽車的動力管理,從通信網(wǎng)絡的高速數(shù)據(jù)傳輸?shù)结t(yī)療設備的精準監(jiān)測,驅(qū)動隔離芯片作為電
    的頭像 發(fā)表于 10-25 15:19 ?790次閱讀

    設備有了 “跨系統(tǒng)不孤島:設備數(shù)據(jù)直接連 ERP 自動走流程

    設備管理的未來,不是 “人盯設備”,而是 “數(shù)據(jù)驅(qū)動流程”。當設備數(shù)據(jù)主動流進 ERP,流程自動運轉(zhuǎn),企業(yè)才能擺脫 “孤島” 束縛,從 “被
    的頭像 發(fā)表于 10-13 10:35 ?507次閱讀
    設備有了 “跨<b class='flag-5'>系統(tǒng)</b>不孤島:設備<b class='flag-5'>數(shù)據(jù)</b>直接連 ERP 自動走<b class='flag-5'>流程</b>”

    基于 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 ?2323次閱讀

    迅為RK3568開發(fā)板新增topeet子系統(tǒng)-在產(chǎn)品中新增子系統(tǒng)

    build/subsystem_config.json文件中增加名為topeet的子系統(tǒng),在3.4節(jié)已經(jīng)新建了topeet 文件夾存放子系統(tǒng)代碼。添加 topeet 子系統(tǒng)進行一個登記,說明
    發(fā)表于 06-16 10:43

    RK3568驅(qū)動指南|第十二篇 GPIO子系統(tǒng)-第130章 GPIO的調(diào)試方法

    RK3568驅(qū)動指南|第十二篇 GPIO子系統(tǒng)-第130章 GPIO的調(diào)試方法
    的頭像 發(fā)表于 06-03 11:32 ?1484次閱讀
    RK3568<b class='flag-5'>驅(qū)動</b>指南|第十二篇 GPIO<b class='flag-5'>子系統(tǒng)</b>-第130章 GPIO的調(diào)試方法

    迅為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 ?1219次閱讀
    迅為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 ?1546次閱讀
    迅為RK3568<b class='flag-5'>驅(qū)動</b>指南GPIO<b class='flag-5'>子系統(tǒng)</b> GPIO操作函數(shù)實驗

    迅為RK3568開發(fā)板驅(qū)動指南GPIO子系統(tǒng)三級節(jié)點操作函數(shù)實驗

    迅為RK3568開發(fā)板驅(qū)動指南GPIO子系統(tǒng)三級節(jié)點操作函數(shù)實驗
    的頭像 發(fā)表于 05-26 15:39 ?1698次閱讀
    迅為RK3568開發(fā)板<b class='flag-5'>驅(qū)動</b>指南GPIO<b class='flag-5'>子系統(tǒng)</b>三級節(jié)點操作函數(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 ?1225次閱讀
    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é)合實驗

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

    迅為RK3568驅(qū)動指南GPIO子系統(tǒng)實戰(zhàn):實現(xiàn)動態(tài)切換引腳復用功能
    的頭像 發(fā)表于 05-22 14:27 ?2398次閱讀
    迅為RK3568<b class='flag-5'>驅(qū)動</b>指南GPIO<b class='flag-5'>子系統(tǒng)</b>實戰(zhàn):實現(xiàn)動態(tài)切換引腳復用功能
    麻阳| 巴马| 上高县| 天津市| 铜山县| 贵州省| 兴义市| 青铜峡市| 永登县| 大关县| 丰原市| 晋中市| 沙田区| 津市市| 九龙城区| 昌宁县| 抚远县| 兴山县| 略阳县| 含山县| 玉环县| 胶南市| 自治县| 枣强县| 北京市| 莎车县| 巫山县| 新郑市| 浠水县| 闽清县| 织金县| 蒙城县| 隆安县| 墨竹工卡县| 富阳市| 曲松县| 区。| 龙山县| 资溪县| 昭觉县| 新乡县|