0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

驱动之路#10:浅谈 Input 子系统

BSP调试从0到1 来源:嵌入式分享 作者:嵌入式分享 2026-03-03 08:17 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

欢迎关注,每周更新!☞

本合集分享的是,我当初学习Linux驱动的来时路——《《驱动之路》开篇:自序&前言》。

正文

回答3个问题:

(1)什么是 Input 子系统?

(2)为什么需要 Input 子系统?

(3)如何使用 Input 子系统?

1 什么是 Input 子系统?

Input 子系统是 Linux 内核中一套统一管理输入设备的框架,主要是为了将键盘、鼠标、触摸屏、按键、摇杆等各类输入设备的硬件差异抽象化,为上层应用提供统一的输入事件接口(如/dev/input/eventX),这样可以避免为每种设备单独编写驱动程序。一句话总结其作用:“屏蔽硬件差异、提供统一接口”。

2 为什么需要 Input 子系统?

假如没有 Input 子系统,想要使用一个输入设备,我们需要为每一种设备单独编写完整的驱动程序,包括硬件初始化、数据读取、事件解析等所有逻辑。这是由于每个输入设备(比如 USB 键盘、GPIO 按键、I2C 触摸屏、红外遥控器)的通信协议、数据格式、触发方式都不同。

另外,每新增一种输入设备(如新型触摸屏)时,不仅要编写全新驱动,还可能与现有设备冲突,甚至需要修改上层应用才能适配。这样不仅导致 Linux 内核代码冗余严重,而且开发成本和维护成本极高。

面对以上种种问题,"封装"与"分层"这两大经典的程序设计思想再次发威,Input 子系统正是基于这样思想设计出来解决以上问题的。

Input 子系统有如下主要作用:

硬件差异屏蔽:不同输入设备的通信协议(如 USB、I2C、SPI、GPIO)和数据格式不同,Input 子系统通过统一的驱动模型,将底层硬件细节封装,上层无需关心设备是 USB 键盘还是 GPIO 按键;

统一事件接口:所有输入设备最终都通过 /dev/input/eventX节点暴露给用户空间,应用程序可通过标准的 read ()/poll () 等系统调用读取事件(如按键按下 / 松开、坐标移动、手势等);

事件标准化:定义了统一的事件类型(如 EV_KEY、EV_ABS、EV_REL)和事件码(如 KEY_0、ABS_X),确保不同设备的事件格式一致,上层应用可跨设备兼容。

3 如何使用 Input 子系统?

要想正确使用 Input 子系统,不得不理清其3 层架构:事件处理层、核心层以及驱动层。核心源代码位于/drivers/input/目录。

事件处理层(evdev.c):接收核心层转发的事件,为上层应用提供访问接口(如/dev/input/eventX设备节点)。

核心层(input.c):管理所有输入设备,提供驱动注册 / 注销接口,转发驱动层事件到合适的事件层

驱动层(输入设备驱动程序,如gpio_keys.c 等):直接操作硬件(如 GPIO 中断、读取电平),将硬件信号转换为 “标准化输入事件”。从底层硬件到上层应用链路如下:

wKgZPGmmKTKAck2TAABhaKdwoW4590.png

从硬件底层到用户空间数据是如何层层传递的?假如用户空间直接访问/dev/input/event0设备节点,数据的流程大致如下:

(1)用户空间应用程序通过read()系统调用读取/dev/input/eventX设备节点。如果此时内核输入缓冲区中没有可用的事件数据,该read()调用会使应用程序进入休眠状态,等待数据到达。

(2)当用户进行操作(如触摸屏幕、按下按键)时,输入设备的硬件会产生一个中断信号(例如,触摸芯片的中断引脚电平发生变化)。

(3)当驱动程序检测到这个电平时,输入系统驱动层对应的驱动程序会调用中断处理函数:读取到数据,转换为标准的输入事件,向核心层汇报。

(4)Input核心层接收到事件后,会根据设备和事件的类型,上报事件层——将其分发给已注册并匹配的事件处理器(Input Handler),例如evdev_handler。当用户空间正在等待数据时,evdev_handler会把它唤醒,这样用户空间就可以获取到硬件底层的上报数据。

最后,了解下用户空间获得数据的两种方法:

直接访问设备节点(比如/dev/input/event0,1,2,...);

通过tslib、libinput 这类库来间接访问设备节点,这些库简化了对数据的处理。

如果想继续深入理解 Input 子系统是如何将不同输入设备的硬件差异统一成标准的输入事件?请听下回分解。

(完)

本人专注 Linux 驱动 & Linux/Android BSP 开发调试,可接外包项目/技术支持/问题定位。有需求或交个朋友可加微信:【Chen_WeChat2026】。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动
    +关注

    关注

    12

    文章

    1989

    浏览量

    88684
  • Linux
    +关注

    关注

    88

    文章

    11807

    浏览量

    219512
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    驱动之路#20:Pinctrl 在手,引脚复用很顺手

    : 步骤 2:内核解析设备树,初始化引脚配置 Linux 内核启动时,Pinctrl 子系统会执行以下操作: 解析i2c0)绑定,等待驱动使
    的头像 发表于 04-07 21:18 444次阅读
    <b class='flag-5'>驱动</b><b class='flag-5'>之路</b>#20:Pinctrl 在手,引脚复用很顺手

    AD9864中频数字化子系统数据手册解读

    AD9864中频数字化子系统数据手册解读 一、引言 在当今的通信和电子领域,中频数字化子系统扮演着至关重要的角色。AD9864作为一款通用的中频子系统,能够对10 MHz至300 MH
    的头像 发表于 04-03 09:05 99次阅读

    驱动之路#03:LCD 时序参数分析

      题图:浙江普陀山客运中心最近获得2021年度凡尔赛建筑奖。 欢迎关注,每周更新!☞ 本合集分享的是,我当初学习Linux驱动的来时路——《《驱动之路》开篇:自序13 tvb: 垂直上宽/后肩
    的头像 发表于 02-10 08:27 1932次阅读
    <b class='flag-5'>驱动</b><b class='flag-5'>之路</b>#03:LCD 时序参数分析

    RDMA设计37:RoCE v2 子系统模型设计

    本博文主要交流设计思路,在本博客已给出相关博文160多篇,希望对初学者有用。注意这里只是抛砖引玉,切莫认为参考这就可以完成商用IP设计。 RoCE v2 子系统模型是用来模拟 RoCE v2 功能
    发表于 02-06 16:19

    家电电子系统设计:Littelfuse技术方案解析

    家电电子系统设计:Littelfuse技术方案解析 在当今家电市场,技术的飞速发展促使家电不断智能化、高效化和安全化。作为电子工程师,我们在设计家电电子系统时,需要综合考虑市场趋势、技术应用以及产品
    的头像 发表于 12-16 09:50 636次阅读

    驱动隔离芯片:电子系统的安全与效能守护者

    在当今科技飞速发展的时代,电子系统的复杂性和集成度不断提升,对信号传输的安全性、稳定性和高效性提出了前所未有的挑战。从工业自动化的精密控制到新能源汽车的动力管理,从通信网络的高速数据传输到医疗设备的精准监测,驱动隔离芯片作为电子系统
    的头像 发表于 10-25 15:19 769次阅读

    Fakra接口标准以及它能为汽车电子系统带来什么

    Fakra接口标准是一种全球通用的汽车电子系统连接技术,它的主要作用是为汽车电子系统提供一种可靠的、全球通用的接口标准。它能够提高汽车电子系统的可靠性、整体性能和灵活性,使汽车电子系统
    的头像 发表于 09-17 14:50 3855次阅读
    Fakra接口标准以及它能为汽车电<b class='flag-5'>子系统</b>带来什么

    基于 ROS + ADI 芯片方案 的 人形机器人子系统级BOM清单(以腿部子系统为例)

    基于 ROS + ADI 芯片方案 的 人形机器人子系统级BOM清单 (以 腿部子系统 为例),包括核心感知、执行与通信模块,配合主控系统通过 ROS2 实现分布式控制与状态反馈。 一、腿部
    的头像 发表于 06-17 17:06 2245次阅读

    迅为RK3568开发板新增topeet子系统-在产品中新增子系统

    build/subsystem_config.json文件中增加名为topeet的子系统,在3.4节已经新建了topeet 文件夹存放子系统代码。添加 topeet 子系统进行一个登记,说明
    发表于 06-16 10:43

    RK3568驱动指南|第十二篇 GPIO子系统-第130章 GPIO的调试方法

    RK3568驱动指南|第十二篇 GPIO子系统-第130章 GPIO的调试方法
    的头像 发表于 06-03 11:32 1432次阅读
    RK3568<b class='flag-5'>驱动</b>指南|第十二篇 GPIO<b class='flag-5'>子系统</b>-第130章 GPIO的调试方法

    迅为RK3568开发板驱动指南GPIO子系统GPIO子系统API函数的引入

    迅为RK3568开发板驱动指南GPIO子系统GPIO子系统API函数的引入
    的头像 发表于 05-29 14:05 1162次阅读
    迅为RK3568开发板<b class='flag-5'>驱动</b>指南GPIO<b class='flag-5'>子系统</b>GPIO<b class='flag-5'>子系统</b>API函数的引入

    迅为RK3568驱动指南GPIO子系统 GPIO操作函数实验

    迅为电子RK3568开发板驱动指南GPIO子系统 GPIO操作函数实验
    的头像 发表于 05-28 15:24 1489次阅读
    迅为RK3568<b class='flag-5'>驱动</b>指南GPIO<b class='flag-5'>子系统</b> GPIO操作函数实验

    迅为RK3568开发板驱动指南GPIO子系统三级节点操作函数实验

    迅为RK3568开发板驱动指南GPIO子系统三级节点操作函数实验
    的头像 发表于 05-26 15:39 1659次阅读
    迅为RK3568开发板<b class='flag-5'>驱动</b>指南GPIO<b class='flag-5'>子系统</b>三级节点操作函数实验

    RK3568驱动指南|第十二篇 GPIO子系统-第135章 GPIO子系统与pinctrl子系统相结合实验

    RK3568驱动指南|第十二篇 GPIO子系统-第135章 GPIO子系统与pinctrl子系统相结合实验
    的头像 发表于 05-23 13:47 1189次阅读
    RK3568<b class='flag-5'>驱动</b>指南|第十二篇 GPIO<b class='flag-5'>子系统</b>-第135章 GPIO<b class='flag-5'>子系统</b>与pinctrl<b class='flag-5'>子系统</b>相结合实验

    迅为RK3568驱动指南GPIO子系统实战:实现动态切换引脚复用功能

    迅为RK3568驱动指南GPIO子系统实战:实现动态切换引脚复用功能
    的头像 发表于 05-22 14:27 2324次阅读
    迅为RK3568<b class='flag-5'>驱动</b>指南GPIO<b class='flag-5'>子系统</b>实战:实现动态切换引脚复用功能