iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >Linux input怎么使用
  • 308
分享到

Linux input怎么使用

2023-06-16 14:06:03 308人浏览 泡泡鱼
摘要

本篇内容主要讲解“linux input怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux input怎么使用”吧!输入设备都有共性:中断驱动+字符io,基于分层的思想,Linux

本篇内容主要讲解“linux input怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux input怎么使用”吧!

输入设备都有共性:中断驱动+字符io,基于分层的思想,Linux内核将这些设备的公有的部分提取出来,基于cdev提供接口,设计了输入子系统,所有使用输入子系统构建的设备都使用主设备号13,同时输入子系统也支持自动创建设备文件,这些文件采用阻塞的IO读写方式,被创建在"/dev/input/"下。如下图所示。内核中的输入子系统自底向上分为设备驱动层,输入核心层,事件处理层。由于每种输入的设备上报的事件都各有不同,所以为了应用层能够很好识别上报的事件,内核中也为应用层封装了标准的接口来描述一个事件,这些接口在"/include/upai/linux/input"中。

  • 设备驱动层是具体硬件相关的实现,也是驱动开发中主要完成的部分,

  • 输入核心层主要提供一些api供设备驱动层调用,通过这些API设备驱动层上报的数据就可以传递到事件处理层,

  • 事件处理层负责创建设备文件以及将上报的事件传递到用户空间, 

Linux input怎么使用

input的使用

input对象描述了一个输入设备,包括它可能上报的事件,这些事件使用位图来描述,内核提供的相应的工具帮助我们构建一个input对象,大家可以参考内核文档"Documentation/input/input-programming.txt",里面对于input子系统的使用有详细的描述。

//input设备对象  struct input_dev {          const char *name;          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)];          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 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)];            struct input_handle __rcu *grab;            struct device dev;            struct list_head        h_list;          struct list_head        node;  };

struct input_dev

--122--> 这个name不是设备名,input子系统的设备名在子系统源码中指定的,不是这。

--129--> 设备支持的输入事件位图,EV_KEY,EV_REL, etc

--130--> 对于按键事件,设备支持的输入子事件位图

--132--> 对于相对坐标事件,设备支持的相对坐标子事件位图

--133--> 对于绝对坐标事件,设备支持的绝对坐标子事件位图

--134--> 混杂设备的支持的子事件位图

--180-->表示这是一个device。

--182-->h_list是用来链接相关handle的链表

--183-->node用来链接其他input_dev的链表

分配/释放

//drivers/input/input.c //创建一个input对象  struct input_dev *input_allocate_device(void);//释放一个input对象  void input_free_device(struct input_dev *dev);

初始化

初始化一个input对象是使用input子系统编写驱动的主要工作,内核在头文件"include/uapi/linux/input.h"中规定了一些常见输入设备的常见的输入事件,这些宏和数组就是我们初始化input对象的工具。这些宏同时用在用户空间的事件解析和驱动的事件注册,可以看作是驱动和用户空间的通信协议,所以理解其中的意义十分重要。在input子系统中,每一个事件的发生都使用事件(type)->子事件(code)->值(value)三级来描述,比如,按键事件->按键F1子事件->按键F1子事件触发的值是高电平1。注意,事件和子事件和值是相辅相成的,只有注册了事件EV_KEY,才可以注册子事件BTN_0,也只有这样做才是有意义的。

下面就是内核约定的事件类型,对应应用层的事件对象的type域

Linux input怎么使用

下面这些是按键子事件的类型,可以看到对PC键值的定义

Linux input怎么使用

除了对常用的事件进行描述,内核同样提供了工具将这些事件正确的填充到input对象中描述事件的位图中。

/  struct input_event {     struct timeval time;     __u16 type;     __u16 code;     __s32 value; };

input分析

上文已经说过,input子系统使用三层结构来实现驱动事件到应用层的传递。具体的,这三个层次每一个层次都由一条结构体链表组成,在设备驱动层,核心结构体是input_dev;在input核心层,是input_handle;在事件处理层,是input_handler。内核通过链表和指针将三者结合到一起,最终实现了input_dev和input_handler的多对多的映射关系,这种关系可用下图简单描述。

Linux input怎么使用

模板

下面的这个模板首先使用input子系统上报按键事件,然后在应用层读取。

input按键设备驱动

{            key@26{                       compatible = "xj4412,key";                       interrupt-parent = <&gpx1>;                       interrupts = <2 2>;            }; };
static struct input_dev *button_dev; static int button_irq; static int irqflags; static irqreturn_t button_interrupt(int irq, void *dummy){     input_report_key(button_dev, BTN_0, 0);     input_report_key(button_dev, BTN_0, 1);     input_sync(button_dev);    return IRQ_HANDLED; }  static int button_init(void){     request_irq(button_irq, button_interrupt,irqflags, "button", NULL)) ;          button_dev = input_allocate_device();     button_dev->name = "button";     button_dev->evbit[0] = BIT_MASK(EV_KEY);     button_dev->keybit[BIT_WORD(BTN_0)] = BIT_MASK(BTN_0);          input_reGISter_device(button_dev);    return 0; } static int button_exit(void){     input_free_device(button_dev);     free_irq(button_irq, button_interrupt);    return 0;    } static int key_probe(struct platfORM_device *pdev){     struct resource *irq_res;     irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);     if(irq_res){         button_irq = irq_res->start;         irqflags = irq_res->flags & IRQF_TRIGGER_MASK;     }else{          return -EINVAL;          }    return button_init(); } static int key_remove(struct platform_device *dev){     return button_exit(); } struct of_device_id of_tbl[] = {     {.compatible = "xj4412,key",},     {}, }; MODULE_DEVICE_TABLE(of, of_tbl);struct platform_driver key_drv = {     .probe = key_probe,     .remove = key_remove,     .driver.name = "keydrv",     .driver.of_match_table = of_tbl, }; module_platform_driver_register(key_drv); MODULE_LICENSE("GPL");

应用层获取键值

#include <linux/input.h> struct input_event {    struct timeval time;     unsigned short type;     unsigned short code;    int value; }; int main(int arGC, char * const argv[]){     int fd = 0;     struct input_event event[3] = {0};      //3!!!,驱动上传了2个事件,第三个用来装空元素      int ret = 0;     fd = open(argv[1],O_RDONLY);     while(1){         ret = read(fd,&event,sizeof(event));         printf("ret:%d,val0:%d,val1:%d,val12:%d\n",ret,event[0].value,event[1].value,event[2].value);          //2!!!,***一个是空         sleep(1);     }     return 0; }

到此,相信大家对“Linux input怎么使用”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Linux input怎么使用

本文链接: https://www.lsjlt.com/news/283992.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Linux input怎么使用
    本篇内容主要讲解“Linux input怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux input怎么使用”吧!输入设备都有共性:中断驱动+字符IO,基于分层的思想,Linux...
    99+
    2023-06-16
  • python中的input()怎么使用
    这篇文章主要介绍了python中的input()怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python中的input()怎么使用文章都会有所收获,下面我们一起来看看吧。input() 的用法Pyth...
    99+
    2023-06-30
  • 怎么使用HTML5的input元素
    本篇内容介绍了“怎么使用HTML5的input元素”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!表单元素之...
    99+
    2024-04-02
  • matlab中input函数怎么使用
    在MATLAB中,可以使用`input`函数来获取用户的输入。`input`函数的基本语法是:```user_input = inp...
    99+
    2023-08-23
    matlab input
  • HTML 5中怎么使用 Input 类型
    这篇文章给大家介绍HTML 5中怎么使用 Input 类型,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。EMAIL<input type="email&quo...
    99+
    2024-04-02
  • 怎么使用div模仿input效果
    这篇文章主要介绍了怎么使用div模仿input效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 实现效果 这里我们定义一个显示内容的d...
    99+
    2024-04-02
  • Html的Form input标签怎么使用
    这篇文章主要介绍“Html的Form input标签怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Html的Form input标签怎么使用”文章能帮助大家...
    99+
    2024-04-02
  • python的input,print,eval函数怎么使用
    本篇内容介绍了“python的input,print,eval函数怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!input()函数i...
    99+
    2023-06-22
  • html隐藏的input元素怎么使用
    这篇文章主要介绍“html隐藏的input元素怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“html隐藏的input元素怎么使用”文章能帮助大家解决问题。隐藏的input元素的语法HTML隐...
    99+
    2023-07-06
  • 微信小程序中怎么使用input标签
    这篇文章主要介绍微信小程序中怎么使用input标签,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!微信小程序中input标签详解及简单实例使用input标签,我们都会,在微信小程序中使...
    99+
    2024-04-02
  • 使用react怎么获取input输入框的值
    本篇文章给大家分享的是有关使用react怎么获取input输入框的值,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。react 获取input 输入框的值的多种方式第一种方式 非...
    99+
    2023-06-14
  • html5中input的required使用遇到问题怎么办
    这篇文章将为大家详细讲解有关html5中input的required使用遇到问题怎么办,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。form提交时隐藏input发生的错误问题描述在form表单提交的时候,...
    99+
    2023-06-09
  • 怎么使用JavaScript修改input元素的属性值
    这篇文章主要介绍“怎么使用JavaScript修改input元素的属性值”,在日常操作中,相信很多人在怎么使用JavaScript修改input元素的属性值问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使...
    99+
    2023-07-06
  • Python基础 input()的使用
    input()函数用于读取标准输入注意:input函数的返回值类型为字符串 >>> num=input("Please input a number:") Please input a nu...
    99+
    2023-01-31
    基础 Python input
  • 怎么在python中使用input()函数转换字符串
    这篇文章将为大家详细讲解有关怎么在python中使用input()函数转换字符串,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Python的优点有哪些1、简单易用,与C/C++、Java、C...
    99+
    2023-06-14
  • PHP中php://input如何使用
    这篇文章主要讲解了“PHP中php://input如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP中php://input如何使用”吧!php://input可以读取没有处理过的...
    99+
    2023-06-22
  • python如何使用input()函数
    小编给大家分享一下python如何使用input()函数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!inputinput():该函数接受一个标准输入数据,返回为...
    99+
    2023-06-03
  • Linux Chrony怎么使用
    这篇文章主要介绍了Linux Chrony怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux Chrony怎么使用文章都会有所收获,下面我们一起来看看吧。Chrony是NTP(Network Ti...
    99+
    2023-06-27
  • Linux pyDash怎么使用
    这篇文章主要介绍“Linux pyDash怎么使用”,在日常操作中,相信很多人在Linux pyDash怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux pyDash怎么使用”的疑惑有所帮助!...
    99+
    2023-06-28
  • Linux crontab怎么使用
    这篇文章主要介绍了Linux crontab怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux crontab怎么使用文章都会有所收获,下面我们一起来看看吧。####1. crontab命令选项代...
    99+
    2023-06-28
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作