首页 > 其他分享 >input子系统一

input子系统一

时间:2024-03-31 15:22:39浏览次数:15  
标签:0000 ABS 事件 input EV 子系统 define

参考资料: 正点原子Linux设备驱动 韦东山第二期   input子系统框架图:   0 用户空间:用户空间可直接访问驱动节点,/dev/input/event0,1,2,也可以通过1tslib/libinput库来使用输入设备 输入系统事件层:处理核心层上报的输入事件,给用户层提供访问接口 输入系统核心层:承上启下,接收来自底层的输入事件,转发给上层的handler 输入系统驱动层:硬件相关的驱动,从硬件获得数据,转换为标准得输入事件,向上汇报   假设应用程序直接访问/dev/input/event0设备节点,或者使用tslib访问设备节点,数据得流程如下: 1、APP发起读操作,若无数据则休眠 2、用户操作设备,硬件上产生中断 3、输入系统驱动层对应的驱动程序处理中断 读取到数据,转换为标准的输入事件,向核心层汇报 所谓输入事件就是一个“struct input_event”结构体 4、核心层可以决定把输入事件转发给上面那个handler处理: 从handler的名字来看,就是用来处理输入操作的,多种handler,如evdev_handler、khd_handler、joydev_handler等等 最常用的是evdev_handler:它只是把input_event结构体保存在内核buffer等 当APP正在等待数据时,evdev_handler会把它唤醒,这样APP就可以处理返回数据 5、APP对输入事件的处理: APP获取数据的方法有两种:直接访问设备节点(比如/dev/input/event0,1,2,,,),或者通过tslib、libinput这类库来间接访问设备节点   驱动程序上报的数据含义三项重要内容: type:哪类?比如EV_KEY,按键类 在include/uapi/linux/input.h 中,如下:

 #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)
code:哪个?比如KEY_A value:值,比如0表示松开,1表示按下,2表示长按   举个例子: 触摸屏上的触点怎么表示:type是EV_ABS,第一项code表示x方向的位置ABS_X为0,value可以0-1024等。第二项type仍然是EV_ABS,code表示y的坐标ABS_Y,value可以0-1024等   应用层得到一系列的输入事件,就是一个个"struct input_event",定义如下:
struct input_event {
    struct timeval time;
    __u16 type;
    u16 code;
    __s32 value;
};

struct timeval {
    __kernel_time_t tv_sec;
    __kernel_susecondes_t tv_usec;
};
每个输入事件Input_event中都含有发生时间,timeval表示的是“子系统启动以来过了多长时间”,它是一个结构体,含有“tv_sec、tv_usev”两项(即秒,微妙)。   驱动上报完一系列数据后,会上报一个“同步事件”,表示数据上报完毕,APP读到“同步事件”时,就知道已经读完了当前的数据 同步事件也是一个input_event结构体,它的type、code、value三项都是0  
root@ATK-IMX6U:~# hexdump /dev/input/event1
0000000 06e2 6107 a4db 0008 0003 0039 0000 0000
0000010 06e2 6107 a4db 0008 0003 0035 013f 0000
0000020 06e2 6107 a4db 0008 0003 0036 010c 0000
0000030 06e2 6107 a4db 0008 0003 0030 0038 0000
0000040 06e2 6107 a4db 0008 0003 0032 0038 0000
0000050 06e2 6107 a4db 0008 0000 0000 0000 0000            // 全0的同步事件,前面表示构成了一整个输入事件
0000060 06e2 6107 37ee 0009 0003 0039 ffff ffff
------  --------  --------  ---  ---   --------
 序号     秒        微妙    type  code   value
  如何确认设备信息? 输入设备的设备节点名为/dev/input/eventX。查看设备节点,可执行以下命令:
ls /dev/input/* -l
或
ls /dev/event* -l
如何确认这些设备节点对应什么硬件呢?可以执行:
cat /proc/bus/input/devices
IMX6ULL的执行结果如下:
root@ATK-IMX6U:~# cat /proc/bus/input/devices
I: Bus=0019 Vendor=0000 Product=0000 Version=0000                    // 与input_dev的id进行对应
N: Name="20cc000.snvs:snvs-powerkey"                            // 与input_dev的name进行对应
P: Phys=snvs-pwrkey/input0                                        // 与input_dev的phys进行对应
S: Sysfs=/devices/platform/soc/2000000.aips-bus/20cc000.snvs/20cc000.snvs:snvs-powerkey/input/input0
U: Uniq=
H: Handlers=kbd event0
B: PROP=0
B: EV=3
B: KEY=100000 0 0 0

I: Bus=0018 Vendor=dead Product=beef Version=28bb
N: Name="goodix-ts"
P: Phys=input/ts
S: Sysfs=/devices/virtual/input/input2
U: Uniq=
H: Handlers=event1
B: PROP=3
B: EV=b                            // 0x1011,意味设备支持EV_SYN 0号事件,EV_KEY 1号事件,EV_ABS 3号事件
B: KEY=e520 0 0 0 0 0 0 0 0 0 0
B: ABS=2658000 3                // 哪一些绝对位移的事件呢?两个都是unsigned,265800000000003,每一位都代表一个abs事件,即支持0号、1号abs事件,即ABS_X和ABS_Y等等
    还有47/48/50/53/54号事件,即:0x0/0x1/0x2f/0x30/0x32/0x35/0x36
    0x2f:ABS_MT_SLOT 多点触摸屏
    0x35:ABS_MT_POSITION_X 多点触摸屏的X位移
    0x36:ABS_MT_POSITION_Y 多点触摸屏的y位移 
    0x39:ABS_MT_TRACKING_ID 多点触摸ID,表示哪一个手指

I: Bus=0019 Vendor=0001 Product=0001 Version=0100
N: Name="gpio_keys@0"
P: Phys=gpio-keys/input0
S: Sysfs=/devices/platform/gpio_keys@0/input/input3
U: Uniq=
H: Handlers=kbd event2
B: PROP=0
B: EV=100003
B: KEY=40000 0 0 0
  内核如何描述一个输入设备: 使用Input_dev结构体来表示输入设备,内容如下:
 // include/linux/input.h
  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)];        // 支持哪类事件?ABS绝对位移事件,KEY按键类事件,REL相对位移事件
         unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];    // 支持按键类事件的话,支持哪些按键
         unsigned long relbit[BITS_TO_LONGS(REL_CNT)];    // 支持相对位移事件的话,支持哪些
         unsigned long absbit[BITS_TO_LONGS(ABS_CNT)];    // 支持绝对位移事件的话,支持哪些,例如x方向,y方向,压力方向
         unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)];
         unsigned long ledbit[BITS_TO_LONGS(LED_CNT)];
         unsigned long sndbit[BITS_TO_LONGS(SND_CNT)];
         unsigned long ffbit[BITS_TO_LONGS(FF_CNT)];
         unsigned long swbit[BITS_TO_LONGS(SW_CNT)];

 

 

 

 

标签:0000,ABS,事件,input,EV,子系统,define
From: https://www.cnblogs.com/lethe1203/p/18106761

相关文章

  • 电子系统集成
    单路DAC和多路模拟开关生成多路信号源题目:利用一个DAC0832和一个模拟开关设计8路模拟信号源,要求控制器为8051单片机,每路信号源的输出电压为0~5V,信号频率均为1KHz,输出精度优于2%,要求画出原理图(电源部分可不画),每路信号源一个周期内的量化点数可以一样,计算模拟开关的切换速度,写出关......
  • HTML学习 之 <input>标签
    目录标签属性type属性textpasswordnumberemailcheckboxradio<input>标签用于搜集用户信息。在html中,<input>标签可以没有结束标签,但在xhtml中<input>必须被正确地关闭。<input>标签属性<input>标签属性共约有29个,比较常用的是下面这几个:type规定input元素的类型......
  • 转:cpu性能和功耗相关的内核子系统
    http://arthurchiao.art/blog/linux-cpu-2-zh/ 1.1调度器:时分复用+任务调度——sched1.3有任务:用哪个频率执行任务?——cpufreq1.4无任务:执行轻量级占坑程序——idletask从原理来说,非常简单。产品经理:什么都不做。从实现来说,非常模糊。程序员:“什么都不做”的代......
  • vue3背景下,el-input嵌套在弹出框中,自动聚焦“失效”?如何实现自动聚焦
    情景:在一个弹出框中,有一个el-input输入框,想要实现当弹出框出现时,input会自动聚焦。使用input的原生属性autofocus去自动获取焦点失效;使用ref获取el-input元素也显示undefined!!!<el-dialogv-model="dialogFormVisible"width="300">.......<el-input......
  • elementui组件el-input 类型为number时,去掉上下箭头,并且解决输入中文后光标上移问题
    //去掉number输入框的上下箭头.def-input-numberinput::-webkit-outer-spin-button,.def-input-numberinput::-webkit-inner-spin-button{-webkit-appearance:none;}.def-input-numberinput[type="number"]{-moz-appearance:textfield;}//解决inputnumber框......
  • Windows的Linux子系统迁移
    默认Windows的Linux子系统(WSL)安装的C盘,如果有用作Docker镜像制作很容易磁盘不够用。可采取如下步骤迁移(以下在WindowsPowerShell中进行的,但在CMD.exe中执行效果相同):1、执行一下命令查看Linux子系统的发行版名称(distroname)PSD:\>wsl-l-vNAME......
  • 求助,路过的大佬帮忙看一下!!!!elment中input组件使用prefix-icon="el-icon-search"不加载
    背景:创建了一个简单的vue工程想用测试一下el-input组件的功能,没有显示图标。代码如下所示<template><el-inputv-model="value"placeholder="请输入内容":disabled="false":show-password="true":clearable="true"prefix......
  • input子系统
    input子系统  输入设备包括鼠标、键盘、触摸屏、按钮等,它们都能产生输入事件,产生输入数据给计算机系统。  Linux系统为了统一管理输入设备,实现了一套能够兼容所有输入设备的框架,这个框架就是input子系统。  驱动开发人员基于input子系统开发输入设备的驱动程序,input......
  • wsl2 ubuntu子系统安装显卡驱动与cuda
    wsl2安装参考文档:http://t.csdnimg.cn/ClwJ9演示安装ubuntu22列出可安装的子系统命令:wsl--list--onlinePSC:\Users\linyu>wsl--list--online以下是可安装的有效分发的列表。使用'wsl.exe--install<Distro>'安装。NAMEF......
  • JS添加input text、input button
    <body><formid="form1"runat="server"><divid="div1"class="a1"name="aaa"><inputtype="text"class="a3"name="name"value="3"/&g......