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

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

3天内不再提示

input子系统介绍和架构

CHANBAEK 来源:嵌入式软件开发交流 作者:嵌入式软件开发交 2023-03-16 18:01 次阅读

input子系统介绍

Linux内核为了能够处理各种不同类型的输入设备,比如: 触摸屏 ,鼠标 , 键盘 , 操纵杆等设备 ,设计并实现了Linux 输入子系统 ,它为驱动和应用提供了统一的接口函数,方便实现各种输入设备的驱动。

input子系统架构

图片

(1)驱动层功能 :负责和底层的硬件设备打交道,将底层硬件设备对用户输入的响应转换为标准的输入事件以后再向上发送给输入子系统核心层。

(2)Input系统核心层 :由driver/input/input.c及相关头文件实现,它对下提供了设备驱动层的接口,对上提供了事件处理层的编程接口。

(3)事件处理层 :将硬件设备上报的事件分发到用户空间和内核。

重要结构体

  • input_dev
//输入设备
struct input_dev {
  const char *name;    //设备名称
  const char *phys;   //设备的物理路径
  const char *uniq;    //唯一ID
  struct input_id id;  //输入ID


  unsigned long propbit[BITS_TO_LONGS(INPUT_PROP_CNT)]; //设备属性
    //所支持的input事件,(键盘, 按键,坐标等)
  unsigned long evbit[BITS_TO_LONGS(EV_CNT)];   //事件类型
   //下面是根据具体设备来决定设置哪些
  unsigned long keybit[BITS_TO_LONGS(KEY_CNT)]; //按键
  unsigned long relbit[BITS_TO_LONGS(REL_CNT)]; //相对坐标
  unsigned long absbit[BITS_TO_LONGS(ABS_CNT)]; //绝对坐标
  unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)]; //其他事件(混杂事件)
  unsigned long ledbit[BITS_TO_LONGS(LED_CNT)]; //带LED
  unsigned long sndbit[BITS_TO_LONGS(SND_CNT)]; //音效
  unsigned long ffbit[BITS_TO_LONGS(FF_CNT)];   //力反馈效果
  unsigned long swbit[BITS_TO_LONGS(SW_CNT)];   //带开关


  unsigned int hint_events_per_packet;  //每个包中的平均事件数


  unsigned int keycodemax;
  unsigned int keycodesize;
  void *keycode; //扫描码到键码的映射


  int (*setkeycode)(struct input_dev *dev,
        const struct input_keymap_entry *ke,
        unsigned int *old_keycode);
  int (*getkeycode)(struct input_dev *dev,
        struct input_keymap_entry *ke);


  struct ff_device *ff;


  unsigned int repeat_key;  //保存上次按下的按键
  struct timer_list timer;


  int rep[REP_CNT];


  struct input_mt *mt;  //多点触摸状态


  struct input_absinfo *absinfo; //绝对坐标信息
    //保存设备的当前状态
  unsigned long key[BITS_TO_LONGS(KEY_CNT)];
  unsigned long led[BITS_TO_LONGS(LED_CNT)];
  unsigned long snd[BITS_TO_LONGS(SND_CNT)];
  unsigned long sw[BITS_TO_LONGS(SW_CNT)];


  int (*open)(struct input_dev *dev);
  void (*close)(struct input_dev *dev);
  int (*flush)(struct input_dev *dev, struct file *file);
  int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value);


  struct input_handle __rcu *grab;


  spinlock_t event_lock;
  struct mutex mutex;


  unsigned int users;
  bool going_away;


  struct device dev;  //设备


  struct list_head  h_list;
  struct list_head  node;


  unsigned int num_vals;
  unsigned int max_vals;
  struct input_value *vals;
};

input_dev代表了一个输入设备,结构体里面就是保存了输入设备的信息,以及不同输入设备的不同事件。

API函数

//分配一个输入设备
struct input_dev *input_allocate_device(void)
//释放输入设备
void input_free_device(struct input_dev *dev)
//注册输入设备到输入核心层
int input_register_device(struct input_dev *dev)
//注销输入设备
void input_unregister_device(struct input_dev *dev)
/*
报告输入事件
参数说明:
    dev: 产生事件的设备
    type: 事件的类型
    code:事件码
    value:事件的值
*/
void input_event(struct input_dev *dev,
     unsigned int type, unsigned int code, int value)
//报告按键事件,内部调用input_event   
void input_report_key(struct input_dev *dev, unsigned int code, int value)
//报告相对坐标
void input_report_rel(struct input_dev *dev, unsigned int code, int value)
//报告绝对坐标 
void input_report_abs(struct input_dev *dev, unsigned int code, int value)
//报告同步事件,用来告诉上层,本次的事件已经完成了
void input_sync(struct input_dev *dev) 


//用来设置设备所产生的事件以及上报的按键值
#define set_bit(nr,p)    ATOMIC_BITOP(set_bit,nr,p)
#define clear_bit(nr,p)    ATOMIC_BITOP(clear_bit,nr,p)

输入设备事件类型

EV_SYN 0x00 //同步事件
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_PWR //电源
EV_FF_STATUS //状态

每个事件类型下面会有一些事件码(Event Codes),它会更精准的描述事件类型。

总结

输入设备驱动的内容并不多,主要还是要对设备的工作原理有深入的了解,才能编写对应驱动。

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

    关注

    3

    文章

    1316

    浏览量

    39949
  • Linux
    +关注

    关注

    87

    文章

    11030

    浏览量

    207269
  • 键盘
    +关注

    关注

    4

    文章

    848

    浏览量

    39185
  • 子系统
    +关注

    关注

    0

    文章

    102

    浏览量

    12299
  • 结构体
    +关注

    关注

    1

    文章

    126

    浏览量

    10774
收藏 人收藏

    评论

    相关推荐

    关于Linux设备驱动中input子系统介绍

    对于输入类设备如键盘、鼠标、触摸屏之类的Linux驱动,内核提供input子系统,使得这类设备的处理变得非常便捷。总体上来讲,input子系统由三部分组成: 事件驱动
    发表于 01-09 16:06 2612次阅读

    linux驱动-Input输入子系统

    以前,看过国嵌关于input子系统的视频课程,说实话,我看完后脑子里很乱,给我的印象好像是input子系统驱动是一个全新的驱动架构,疑惑相当
    发表于 05-21 00:05

    【华嵌科技】Linux设备驱动之input子系统

    对于输入类设备如键盘、鼠标、触摸屏之类的Linux驱动,内核提供input子系统,使得这类设备的处理变得非常便捷。总体上来讲,input子系统由三部分组成: 事件驱动
    发表于 07-27 15:27

    Linux设备驱动之input子系统

    作者:武汉华嵌嵌入式培训中心讲师李老师对于输入类设备如键盘、鼠标、触摸屏之类的Linux驱动,内核提供input子系统,使得这类设备的处理变得非常便捷。总体上来讲,input子系统由三
    发表于 03-15 15:28

    linux input子系统input core、input drivers和event handles

    linux input子系统简单介绍
    发表于 04-01 16:06

    如何使用Linux内核中的input子系统

    输入设备总类繁杂,包括按键,键盘,触摸屏,鼠标,摇杆等等,它们本身都是字符设备,不过内核为了能将这些设备的共性抽象出来,简化驱动的开发,建立了一个 Input 子系统。用户只需要根据内核提供
    发表于 12-29 07:20

    迅为i.MX6ULL终结者Linux INPUT子系统实验Input子系统

    文章目录1 input子系统简介2 input驱动程序编写流程3 input_event结构体1 input
    发表于 01-11 10:41

    介绍input子系统

    文章目录前言input子系统按键检测C代码微信公众号前言这是前3篇:嵌入式Linux i.MX开发板嵌入式Linux NFS嵌入式Linux 交叉编译工具链嵌入式Linux LED GPIO本篇介绍
    发表于 11-04 08:14

    【OpenHarmony资料合集】Sensor子系统/图形子系统/Ability子系统介绍

    ,移动互联网的快速发展,在数字时代,传感器在智能交通,智能工业,智能穿戴等领域有着广阔的应用空间。  1.1 OpenHarmony架构图  2、OpenHarmony资料合集之图形子系统 标准系统的图形
    发表于 03-14 16:35

    Linux input 子系统范例和基本函数解析

    体*/ /*中断处理函数*/ static irqreturn_t button_interrupt(int irq, void *dummy) { /*向输入子系统报告产生按键事件*/ input_report_key(button_dev, BTN_0, inb(BU
    发表于 11-21 14:58 2263次阅读

    详细了解Linux设备模型中的input子系统

    linux输入子系统(linux input subsystem)从上到下由三层实现,分别为:输入子系统事件处理层(EventHandler)、输入子系统核心层(InputCore)和
    发表于 05-12 09:04 969次阅读
    详细了解Linux设备模型中的<b class='flag-5'>input</b><b class='flag-5'>子系统</b>

    驱动之路-input子系统

    一、input子系统系统框架Linux内核实现了一套input子系统,很多输入设备,比如说按键、键盘、鼠标、触摸屏等等都可以
    发表于 04-02 14:33 396次阅读

    嵌入式Linux input

    文章目录前言input子系统按键检测C代码微信公众号前言这是前3篇:嵌入式Linux i.MX开发板嵌入式Linux NFS嵌入式Linux 交叉编译工具链嵌入式Linux LED GPIO本篇介绍
    发表于 11-01 16:31 2次下载
    嵌入式Linux <b class='flag-5'>input</b>

    OpenHarmony Dev-Board-SIG专场:OpenHarmony音频子系统以及相机子系统架构

    OpenHarmony Dev-Board-SIG专场:OpenHarmony音频子系统以及相机子系统架构
    的头像 发表于 12-28 15:01 1344次阅读
    OpenHarmony Dev-Board-SIG专场:OpenHarmony音频<b class='flag-5'>子系统</b>以及相机<b class='flag-5'>子系统</b><b class='flag-5'>架构</b>

    Linux驱动学习笔记:input子系统机制

    input子系统所有的设备主设备号都是13,在使用input系统的时候不需要去注册字符设备,只需要向系统申请一个
    发表于 06-23 14:28 1572次阅读
    Linux驱动学习笔记:<b class='flag-5'>input</b><b class='flag-5'>子系统</b>机制