input 输入子系统架构-非常好了

配置思科交换机冗余链路汇聚 本文对交换机端口汇聚配置进行说明 阅读详情

本文转载,地址:http://mcuos.com/thread-4532-1-1.html,版权问题,马上删除

input 输入子系统架构Overview

1 输入子系统架构Overview        输入子系统(Input Subsystem)的架构如下图所示



        输入子系统由 输入子系统核心层( Input Core ),驱动层和事件处理层(Event Handler)三部份组成。一个输入事件,如鼠标移动,键盘按键按下,joystick的移动等等通过 Driver -> InputCore -> Eventhandler -> userspace 的顺序到达用户空间传给应用程序。
        其中Input Core 即 Input Layer 由 driver/input/input.c及相关头文件实现。对下提供了设备驱动的接口,对上提供了Event Handler层的编程接口。
1.1 主要数据结构
表 1
Input Subsystem main data structure

数据结构


用途


定义位置


 

具体数据结构的分配和初始化


Struct input_dev
驱动层物理Input设备的基本数据结构
Input.h
通常在具体的设备驱动中分配和填充具体的设备结构
Struct Evdev
Struct Mousedev
Struct Keybdev…
Event Handler层逻辑Input设备的数据结构
Evdev.c
Mousedev.c
Keybdev.c
Evdev.c/Mouedev.c …中分配


Struct Input_handler
Event Handler的结构
Input.h
Event Handler层,定义一个具体的Event Handler
Struct Input_handle
用来创建驱动层DevHandler链表的链表项结构
Input.h
Event Handler层中分配,包含在Evdev/Mousedev…中。

 


1.2 输入子系统架构示例图


图2  输入子系统架构示例图



2 输入链路的创建过程        由于input子系统通过分层将一个输入设备的输入过程分隔为独立的两部份:驱动到Input Core,Input Core到Event Handler。所以整个链路的这两部分的接口的创建是独立的。
2.1 硬件设备的注册        驱动层负责和底层的硬件设备打交道,将底层硬件对用户输入的响应转换为标准的输入事件以后再向上发送给Input Core。
        驱动层通过调用Input_register_device函数和Input_unregister_device函数来向输入子系统中注册和注销输入设备。
这两个函数调用的参数是一个Input_dev结构,这个结构在driver/input/input.h中定义。驱动层在调用Input_register_device之前需要填充该结构中的部分字段
#include <linux/input.h>
#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
struct input_dev ex1_dev;
static int __init ex1_init(void)
{
    /* extra safe initialization */
    memset(&ex1_dev, 0, sizeof(struct input_dev));
    init_input_dev(&ex1_dev);
    /* set up descriptive labels */
    ex1_dev.name = "Example 1 device";
    /* phys is unique on a running system */
    ex1_dev.phys = "A/Fake/Path";
    ex1_dev.id.bustype = BUS_HOST;
    ex1_dev.id.vendor = 0x0001;
    ex1_dev.id.product = 0x0001;
    ex1_dev.id.version = 0x0100;
   
    /* this device has two keys (A and B) */
    set_bit(EV_KEY, ex1_dev.evbit);
    set_bit(KEY_B, ex1_dev.keybit);
    set_bit(KEY_A, ex1_dev.keybit);
   
    /* and finally register with the input core */
    input_register_device(&ex1_dev);
   
    return 0;
}
        其中比较重要的是evbit字段用来定义该输入设备可以支持的(产生和响应)的事件的类型。
包括:
Ø EV_RST   0x00  Reset
Ø 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_KEY事件,支持哪些按键等。
2.2 Event Handler层2.2.1 注册Input Handler        驱动层只是把输入设备注册到输入子系统中,在驱动层的代码中本身并不创建设备结点。应用程序用来与设备打交道的设备结点的创建由Event Handler层调用Input core中的函数来实现。而在创建具体的设备节点之前,Event Handler层需要先注册一类设备的输入事件处理函数及相关接口
        以MouseDev Handler为例:
static struct input_handler mousedev_handler = {
event:  mousedev_event,
connect:  mousedev_connect,
disconnect: mousedev_disconnect,
fops:  &mousedev_fops,
minor:  MOUSEDEV_MINOR_BASE,
};
static int __init mousedev_init(void)
{
input_register_handler(&mousedev_handler);
memset(&mousedev_mix, 0, sizeof(struct mousedev));z
init_waitqueue_head(&mousedev_mix.wait);
mousedev_table[MOUSEDEV_MIX] = &mousedev_mix;
mousedev_mix.exist = 1;
mousedev_mix.minor = MOUSEDEV_MIX;
mousedev_mix.devfs = input_register_minor("mice", MOUSEDEV_MIX, MOUSEDEV_MINOR_BASE);
printk(KERN_INFO "mice: PS/2 mouse device common for all mice/n");
return 0;
}
        在Mousedev_init中调用input.c中定义的input_register_handler来注册一个鼠标类型的Handler. 这里的Handler不是具体的用户可以操作的设备,而是鼠标类设备的统一的处理函数接口。
2.2.2 设备节点的创建        接下来,mousedev_init函数调用input_register_minor注册一个通用mice设备,这才是与用户相关联的具体的设备接口。然而这里在init函数中创建一个通用的Mice设备只是鼠标类Event Handler层的特例。在其它类型的EventHandler层中,并不一定会创建一个通用的设备。
        标准的流程见是硬件驱动向Input子系统注册一个硬件设备后,在input_register_device中调用已经注册的所有类型的Input Handler的connect函数,每一个具体的Connect函数会根据注册设备所支持的事件类型判断是否与自己相关,如果相关就调用input_register_minor创建一个具体的设备节点。
void input_register_device(struct input_dev *dev)
{
……
while (handler) {
  if ((handle = handler->connect(handler, dev)))
   input_link_handle(handle);
  handler = handler->next;
}
}
        此外如果已经注册了一些硬件设备,此后再注册一类新的Input Handler,则同样会对所有已注册的Device调用新的Input Handler的Connect函数已确定是否需要创建新的设备节点:
void input_register_handler(struct input_handler *handler)
{
……
while (dev) {
  if ((handle = handler->connect(handler, dev)))
   input_link_handle(handle);
  dev = dev->next;
}
}
        从上面的分析中可以看到一类Input Handler可以和多个硬件设备相关联,创建多个设备节点。而一个设备也可能与多个Input Handler相关联,创建多个设备节点。
        直观起见,物理设备,Input Handler,逻辑设备之间的多对多关系可见下图:


图3  物理设备,Input Handler,逻辑设备关系图


3 设备的打开和读写    用户程序通过Input Handler层创建的设备节点的Open,read,write等函数打开和读写输入设备。
3.1 Open    设备节点的Open函数,首先会调用一类具体的Input Handler的Open函数,处理一些和该类型设备相关的通用事务,比如初始化事件缓冲区等。然后通过Input.c中的input_open_device函数调用驱动层中具体硬件设备的Open函数。
3.2 Read    大多数Input Handler的Read函数等待在Event Layer层逻辑设备的wait队列上。当设备驱动程序通过调用Input_event函数将输入以事件的形式通知给输入子系统的时候,相关的Input Handler的event函数被调用,该event函数填充事件缓冲区后将等待队列唤醒。
    在驱动层中,读取设备输入的一种可能的实现机制是扫描输入的函数睡眠在驱动设备的等待队列上,在设备驱动的中断函数中唤醒等待队列,而后扫描输入函数将设备输入包装成事件的形式通知给输入子系统。
3.3 Write    2.4内核中没有固定的模式,根据具体的Input Handler,可能不实现,也可能通过调用Input_event将写入的数据以事件的形式再次通知给输入子系统,或者调用设备驱动的Write函数等等。
    2.6内核的代码中,通过调用Input_event将写入的数据以事件的形式再次通知给输入子系统,而后在Input.c中根据事件的类型,将需要反馈给物理设备的事件通过调用物理设备的Event函数传给设备驱动处理,如EV_LED事件:
void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
{
......
case EV_LED:
         if (code > LED_MAX || !test_bit(code, dev->ledbit) || !!test_bit(code, dev->led) == value)
            return;
         change_bit(code, dev->led);
         if (dev->event) dev->event(dev, type, code, value);
         break;
......
}
4 其它    本文中对Input子系统架构的分析主要是基于2.4.20内核,在2.6内核中对Input子系统做了很大的扩充增加了对许多设备的支持(如触摸屏,键盘等)。不过整体的框架还是一致的。
    另,参考了linux journal上的两篇文章:
The Linux USB Input Subsystem, Part I | Linux Journal
Using the Input Subsystem, Part II | Linux Journal

相关推荐

Input子系统架构包括内核层与框架层详解

android input inputFlinger 第1章 Android Input子系统架构

input子系统的框架和重要数据结构详解

回顾字符设备驱动程序框架的编写;讲解input子系统给的框架:涵盖了 Input 核心层、处理层与设备树集成等关键概念;讲解input子系统的相关重要结构体:input_dev、input_handler、input_handle、input_event、input_value

caiji0169的博客 2397

2024全球空气质量(6 个城市,52000 条记录)数据集 CSV

空气污染每年导致大约 700 万人过早死亡 (WHO)。此数据集使研究人员和数据科学家能够:分析全球污染差异调查空气质量对健康的影响开发环境监测预测模型记录52,000+ 每日测量时间范围2024 年 1 月至 12 月 GMT 时区城市6 个全球分布地点污染物一氧化碳、二氧化碳、一氧化碳、一氧化硫、一氧化硫、一氧化碳、一氧化碳、二氧化硫、PM2.5、PM10指数欧洲 AQI组合数据集 (Air_Quality.csv)所有具有标识符的城市City完成 2024 年每日记录特定于城市的文件(例如London_Air_Quality.csv)没有列的相同指标City非常适合局部分析

Linux Input子系统深度解析:从框架到实战

Input子系统通过分层设计,实现了输入设备的统一管理与标准化交互,解决了传统驱动的碎片化问题,降低了驱动开发与应用适配的复杂度。核心层作为枢纽,提供了统一的接口与数据缓存机制;驱动层只需关注硬件适配与数据转换,即可快速接入系统;应用层无需关心底层细节,通过标准接口即可获取输入数据。本文从架构解析、核心功能、开发流程三个维度,结合按键驱动实战案例,详细介绍了Input子系统的工作机制与应用方法。

mossangk的博客 389

input子系统架构分析

一、input输入子系统框架 输入子系统输入子系统核心层( Input Core ),驱动层和事件处理层(Event Handler)三部份组成。一个输入事件,如鼠标移动,键盘按键按下等等通过 input driver -> Input core -> Event handler -> userspace 到达用户空间传给应用程序 二、Input driver编写要点

highfly591的专栏 343

input 子系统架构总结

Linux输入子系统(Input Subsystem)         Linux输入子系统不仅支持鼠标、键盘等常规输入设备,而且还支持蜂鸣器、触摸屏等设备。本章将对 Linux 输 入子系统进行详细的分析。 一    前言                 输入子系统又叫 input 子系统。其构建非常灵活,只需要调用一些简单的函数,就可以将一个输入设备的功

曼云-->孤峰 2万+

input子系统的架构分析及应用

input子系统的架构 以前我们写的裸板程序中,驱动程序一般分为以下几步: (1)构造我们自己的file_operations (2) 注册设备字符register_chrdev,将我们的file_operations告诉内核 (3)然后就可以通过入口函数module_init(),调用上面创建的字符设备 上面是一个简单的字符设备的书写框架,但是要做到通用,肯定必须抽象出一...

lee_jimmy的博客 1559

Linux 输入子系统架构分析 input子系统

内核的输入子系统是对分散的,多种不同类别的输入设备(如键盘,鼠标,跟踪球,操纵杆,触摸屏,加速计和手写板)等字符设备进行统一处理的一层抽象,就是在字符设备驱动上抽象出的一层。输入子系统包括两类驱动程序:事件驱动程序和设备驱动程序。事件驱动程序负责和应用程序的接口,而设备驱动程序负责和底层输入设备的通信。鼠标事件生成文件mousedev属于事件驱动程序,而PS/2鼠标驱动程序是设备驱动程序。事件驱动

liupeng900605的专栏 1498

关于linux input device输入子系统架构及android中的框架

关于linux input device输入子系统架构及android中的框架 应用app和windowmanagerservice的input event通信方式 在Native层的InputChannel就是一个通道,仅仅是一个通道,仅仅具有通信功能,不包含其他的。至于从数据流动方向,与InputChannel无关。数据流向是由InputPublisher和InputConsumer在组合了...

weixin_34360651的博客 407

linux输入子系统(一) —— 架构分析

初识linux输入子系统   linux输入子系统linux input subsystem)从上到下由三层实现,分别为:输入子系统事件处理层(EventHandler)、输入子系统核心层(InputCore)和输入子系统设备驱动层。 设备驱动层:主要实现对硬件设备的读写访问,中断设置,并把硬件产生的事件转换为核心层定义的规范提交给事件处理层。 核心层:为设备驱动层提供了规范和接口。...

yetaibing1990的博客 1600

android dispatch input输入子系统,Input子系统架构包括内核层与框架层详解.doc

Input子系统架构包括内核层与框架层详解概要1Android Input子系统架构Input服务的启动在Android的开机过程中,系统中的服务很多都是由SystemServer中启动的。SystemServer的代码中有这么一句话。Framework/base/services/java/com/android/server/SystemServer.javaSlog.i(TAG, "Wind...

weixin_36337403的博客 392

输入子系统解析

这节来了解输入子系统架构,以前写的驱动架构,相应的应用程序不能通用,不能加到已有的应用上去,这节来了解通用的写法。

ymangu的专栏 1196

LINUX 输入子系统分析

<br />1 输入子系统架构Overview<br />        输入子系统Input Subsystem)的架构如下图所示<br /> <br /> <br />        输入子系统输入子系统核心层( Input Core),驱动层和事件处理层(Event Handler)三部份组成。一个输入事件,如鼠标移动,键盘按键按下,joystick的移动等等通过Driver -> InputCore -> Eventhandler -> userspace的顺序到达用户空间传给应用程序。<br

qupanpan110的专栏 1658

Linux input输入子系统

上面结构体的链表的关系如下面两图所示(这个图好难画-.-,就在网上找了一个,原文连接当我们使用注册一个设备的时候,就会将设备添加到链表中,同时便利进行匹配,匹配成功就会调用函数进行连接input_event: 表示一个输入事件evdev_client: 表示一个用户空间的应用程序或实体设备与输入设备之间的连接evdev: 输入设备驱动程序的接口实现,应用程序可以通过evdev与evdev_client之间的交互,实现输入事件的读取和输入。

qq_66623299的博客 1342

10.输入子系统

在内核写好一些程序的基础上修改! input_init分析: drivers/input/input.c: input_init > err = register_chrdev(INPUT_MAJOR, "input", &input_fops); static const struct file_operations input_fops = { .owner = THIS_MODULE, .open = input_open_file, }; 问:怎么读按键? inp.

嵌入式与Linux那些事的博客 1001

Linux设备驱动--input输入子系统

常见输入设备:按键、键盘、触摸屏、鼠标 等。典型的字符设备驱动。 内核中一个通用的按键驱动: drivers/input/keyboard/gpio_keys.c基于input架构实现了一个通用的GPIO按键驱动 用户空间接口 /dev/input/event0/1/2/… /dev/input/mouse0/1/2/… /dev/input/sj0/1/2/… … 输入子系统框架 —— 《linux设备驱动开发详解》 分层模型 核心层 创建input设备类 根据输入设备种类、分发事件到不同事件

欲盖弥彰1314 1110

Linux输入子系统框架分析

输入子系统简介: 1.linux系统支持的输入设备很多,例如键盘、鼠标、触摸屏、手柄或者一些体感设备等等,linux是如何管理如此之多的不同类型、不同原理、不同输入信息的设备呢?其实就是通过input输入子系统这套软件体系来完成的。 2.输入子系统有设备驱动层、输入子系统核心、事件处理层三部分组成。 ·  驱动层:将底层的硬件输入转化为统一事件形式,向输入核心(input core)汇报。 ...

u012830148的博客 482

输入子系统编写按键驱动

回顾:以中断方式处理的“按键驱动”程序。 1,确定主设备号。 2,构造一个“file_operations”结构体。 3,open 函数中申请中断: 4,read 函数中,若没有按键按下就休眠: 有按键按下后,中断程序被调用:在中断服务程序里确定是哪个按键按下。最后唤醒按键程序: 而这个驱动的测试程序是: 1,先 open 某个设备文件: 2,接着读: 上面的驱动程序和测试程序的缺点: 上面打开了...

qq_42230338的博客 527

3 Linux input子系统之input_dev注册

6、遍历input_handler链表上,对链表中的每一个input_handler执行input_attach_handler函数。5、将input_dev添加到input_dev_list链表。2、设置input_devce结构体中有关处理重复按键的成员。3、设置input_devce结构体中 获取和设置按键的函数。会向input核心层上报事件,input核心层再通知到。1、设置input_devce结构体中的事件标志位。,然后再将结果返回给用户空间。4、添加到设备驱动模型中。

枫潇潇 374

深入Linux输入子系统:从驱动开发到调试实战全解析

Linux系统开发中,输入子系统是连接物理输入设备与用户应用的核心框架,它遵循机制与策略分离的设计哲学。其核心原理基于典型的三层架构驱动层负责硬件交互与原始数据采集,核心层进行事件路由与抽象,事件层则通过标准接口(如evdev)向用户空间提供统一的事件流。这一设计的技术价值在于实现了硬件多样性的统一抽象,为上层应用提供了稳定、一致的输入API。在嵌入式设备、工控HMI、移动终端等应用场景中,深入理解输入子系统对于开发稳定的触摸屏、键盘、鼠标等设备驱动至关重要。本文聚焦于input_register_de

weixin_29174013的博客 262

[Linux 基础] -- 韦东山第二期视频 input输入子系统总结

概述: 输入子系统有三个核心结构体:input_dev, input_handle, input_handler: input_dev 表示一个输入设备,包含输入设备的一些相关信息; input_handler 表示对输入事件的具体处理,它为输入设备的功能实现了一个接口; input_handle 用来连接输入设备和输入事件。 输入子系统的主要任务就是把这三个结构体连接...

u014674293的博客 725
上一篇: 内核关键函数KernelIoControl分析-非常好,很详细
下一篇: hotel california
linucos
博客等级 码龄17年 38粉丝 43原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值