首页 > 系统相关 >linux input子系统

linux input子系统

时间:2023-03-16 23:23:18浏览次数:25  
标签:err dev linux input EV proc 子系统 define

为什么要用INPUT子系统

在不采用input子系统,而是自己实现的按键字符驱动中,会自己注册驱动,提供file_operations接口,并在读接口中,读取按键的电平值上传给应用。在linux系统中(linux4.9.88),构建了input子系统,所有采用input子系统的设备,在有输入事件后都会主动上报输入事件。

在输入设备中会有以下几个问题:

  a. 何时上报?是在输入设备输入事件中断产生时上报。

  b. 如何上报?输入设备在中断函数中调用input提供的input_report_key函数。

 

kernel源码分析

static int __init input_init(void)
{
    int err;

    err = class_register(&input_class);
    if (err) {
        pr_err("unable to register input_dev class\n");
        return err;
    }

    err = input_proc_init();
    if (err)
        goto fail1;

    err = register_chrdev_region(MKDEV(INPUT_MAJOR, 0),
                     INPUT_MAX_CHAR_DEVICES, "input");
    if (err) {
        pr_err("unable to register char major %d", INPUT_MAJOR);
        goto fail2;
    }
        ......
}

 

先注册一个 input 类型的 class

static int __init input_proc_init(void)
{
    struct proc_dir_entry *entry;

    proc_bus_input_dir = proc_mkdir("bus/input", NULL);
    if (!proc_bus_input_dir)
        return -ENOMEM;

    entry = proc_create("devices", 0, proc_bus_input_dir,
                &input_devices_proc_ops);
    if (!entry)
        goto fail1;

    entry = proc_create("handlers", 0, proc_bus_input_dir,
                &input_handlers_proc_ops);
        ......
}

 

 

然后在 /proc/input 下创建两个文件,用于向应用层提供 input 类型的设备信息

用户层

应用层代码会通过如下结构体读取事件信息

    struct input_event {
        struct timeval time;
        unsigned short type;
        unsigned short code;
        unsigned int value;
    };

 

 tv_sec / tv_usec:事件产生的事件

type:事件类型,如果是按键就选 EV_KEY,如下图:

#define EV_SYN            0x00
#define EV_KEY            0x01
#define EV_REL            0x02
#define EV_ABS            0x03
#define EV_MSC            0x04
#define EV_SW             0x05
#define EV_LED            0x11
#define EV_SND            0x12
#define EV_REP            0x14
#define EV_FF             0x15
#define EV_PWR            0x16
#define EV_FF_STATUS      0x17
#define EV_MAX            0x1f
#define EV_CNT            (EV_MAX+1)

 

EV_CNT 决定了事件类型的最大数量

code:哪个设备产生的事件,对于键盘按键,code 的取值小于 BTN_MISC,每一个code值对应键盘的一个按键,如下图:

 

 

 value:对于按键,可以设置产生事件value等于1、没产生事件value等于0

 

应用代码实例:

static struct input_event inputevent; 

err = read(fd, &inputevent, sizeof(inputevent));

 

 

驱动层

input 设备类型结构体

struct input_dev {
    const char *name;
    const char *phys;
    const char *uniq;
    struct input_id id;

    unsigned long propbit[BITS_TO_LONGS(INPUT_PROP_CNT)];
    unsigned long evbit[BITS_TO_LONGS(EV_CNT)]; // 1比特对应一个事件类型,EV_CNT为32,即最大32个事件类型,只需要一个 unsigned long 类型变量,所以 BITS_TO_LONGS(EV_CNT) == 1
  unsigned long keybit[BITS_TO_LONGS(KEY_CNT)]; 
  ......
  ktime_t timestamp[INPUT_CLK_MAX];
  bool inhibited;
};

 

 

struct input_dev *input_allocate_device(void);

 

动态申请了一个 struct input_dev 类型变量dev,并初始化dev->dev.kobj.name = "input0",这个就是设备节点的名字;dev->dev的class name为 "input"

int __must_check input_register_device(struct input_dev *);

 

如果 input_dev.dev没有设置父设备,kobj 是 /sys/devices/virtual/input,并作为 input_dev.dev的父设备。如果 input_dev.dev 没有设置 init_name,inpu_dev.dev的名字默认为 inputX(X表示数字,每添加一个,数字加1)

 

 

 

evdev这个设备干啥用

 

 

 

梳理这个驱动用途

 

标签:err,dev,linux,input,EV,proc,子系统,define
From: https://www.cnblogs.com/god-of-death/p/17224630.html

相关文章

  • Rocky Linux 系列5 --- rsync
    一、概要1.环境(1)RockyLinux9.1(2)rsync3.2.72.概念rsync是一个开源的速度很快的数据传输工具。License是GNU(GeneralPublicLicense)它具备以下功能和优势......
  • Unity 学习使用InputSystem接收键盘的输入
    目录快速实践配置InputAction创建场景编写代码理论学习ActionInputActionTypeInputBinding快速实践配置InputAction右键点击工程(project)面板空白处,弹出菜单栏,选择Cr......
  • 使用旧电脑玩Linux
    今天给大家讲讲使用旧电脑玩Linux,大家应该都知道旧电脑的硬件一般比较落后,特别是一些非常老的电脑,目前还在使用的是机械硬盘,如是要跑windows可想而知,但是Linux系统对硬件性......
  • 《Linux就该这么学》-重定向与环境变量
    1.输入输出重定向是相对于命令而言(输入重定向常见而输出不常见)如:$manbash>read.me是将原本执行命令后要输出到屏幕上的内容输出到文件中2.命令>>文件2>&1或......
  • 使用旧电脑玩Linux
    今天给大家讲讲使用旧电脑玩Linux,大家应该都知道旧电脑的硬件一般比较落后,特别是一些非常老的电脑,目前还在使用的是机械硬盘,如是要跑windows可想而知,但是Linux系统对硬件性......
  • 用CPU来加速你的Linux命令
    我们都知道grep,bzip2,wc,awk,sed等等,都是单线程的,只能使用一个CPU内核。那么如何才能使用这些内核?要想让Linux命令使用所有的CPU内核,我们需要用到GNUParallel命令,......
  • Linux之ab命令
    ab是apachebench命令的缩写,ab是apache自带的压力测试工具。ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试。比如nginx......
  • Linux目录祥解
    1. /:根目录,文件的最顶端,整个文件系统的根目录。2./bin:存放系统需要的重要文件,ls,cp,mkdir等,usr/bin也存放了一些系统命令,这些命令对应的文件都是可执行的,普通用户可以使......
  • Linux根目录详解
    /  根目录:根目录,文件的最顶端,整个文件系统的根目录/bin  用户二进制文件:存放系统所需的重要命令/sbin  系统二进制文件:存放一些系统管理的命令,一般只能由超级......
  • Linux根目录详解
    /   根目录:根目录,文件的最顶端,整个文件系统的根目录/bin   用户二进制文件:存放系统所需的重要命令/sbin  系统二进制文件:存放一些系统管理的命令,一般只能由超级权......