我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Linux输入子系统是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Linux输入子系统是什么

这篇“Linux输入子系统是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux输入子系统是什么”文章吧。

Linux内核为了能够处理各种不同类型的输入设备,比如 触摸屏 ,鼠标 , 键盘 , 操纵杆 ,设计并实现了为驱动层程序的实现提供统一接口函数;为上层应用提供试图统一的抽象层 , 即是Linux 输入子系统 。

Linux输入子系统是什么

驱动层

将底层的硬件输入转化为统一事件形式,想输入核心(Input Core)汇报。

输入子系统3核心层

它承上启下为驱动层提供输入设备注册与操作接口,如:input_register_device;通知事件处理层对事件进行处理;在/Proc下产生相应的设备信息。

事件处理层

主要是和用户空间交互(Linux中在用户空间将所有的设备都当作文件来处理,由于在一般的驱动程序中都有提供fops接口,以及在/dev下生成相应的设备文件nod,这些操作在输入子系统中由事件处理层完成)。

设备描述

input_dev结构是实现设备驱动核心工作:向系统报告按键、触摸屏等输入事件(event,通过input_event结构描述),不再需要关心文件操作接口。驱动报告事件经过inputCore和Eventhandler到达用户空间。

注册输入设备函数:

int input_register_device(struct input_dev *dev)

注销输入设备函数:

void input_unregister_device(struct input_dev *dev)

驱动实现——初始化(事件支持)set_bit()告诉input输入子系统支持哪些事件,哪些按键。例如:

set_bit(EV_KEY,button_dev.evbit)  (其中button_dev是struct input_dev类型)

**struct input_dev**中有两个成员为: **1)**evbit事件类型(包括EV_RST,EV_REL,EV_MSC,EV_KEY,EV_ABS,EV_REP等)。 **2)**keybit按键类型(当事件类型为EV_KEY时包括BTN_LEFT,BTN_0,BTN_1,BTN_MIDDLE等)。

驱动实现——报告事件用于报告EV_KEY,EV_REL,EV_ABS事件的函数分别为:

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)

驱动实现——报告结束input_sync()同步用于告诉input core子系统报告结束,触摸屏设备驱动中,一次点击的整个报告过程如下:

input_reprot_abs(input_dev,ABS_X,x);   //x坐标input_reprot_abs(input_dev,ABS_Y,y);   // y坐标input_reprot_abs(input_dev,ABS_PRESSURE,1);input_sync(input_dev);//同步结束

实例分析(按键中断程序):

//按键初始化static int __init button_init(void){//申请中断   if(request_irq(BUTTON_IRQ,button_interrupt,0,”button”,NUll))       return –EBUSY;   set_bit(EV_KEY,button_dev.evbit); //支持EV_KEY事件   set_bit(BTN_0,button_dev.keybit); //支持设备两个键   set_bit(BTN_1,button_dev.keybit); //   input_register_device(&button_dev);//注册input设备}Static void button_interrupt(int irq,void *dummy,struct pt_regs *fp){   input_report_key(&button_dev,BTN_0,inb(BUTTON_PORT0));//读取寄存器BUTTON_PORT0的值   input_report_key(&button_dev,BTN_1,inb(BUTTON_PORT1));   input_sync(&button_dev);}

总结:input子系统仍然是字符设备驱动程序,但是代码量减少很多,*input子系统只需要完成两个工作:初始化和事件报告(这里在linux中是通过中断来实现的)。*

实例

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include struct input_dev *button_dev;struct button_irq_desc {   int irq;   int pin;   int pin_setting;   int number;   char *name;};static struct button_irq_desc button_irqs [] = {   {IRQ_EINT8 , S3C2410_GPG0 , S3C2410_GPG0_EINT8 , 0, "KEY0"},   {IRQ_EINT11, S3C2410_GPG3 , S3C2410_GPG3_EINT11 , 1, "KEY1"},   {IRQ_EINT13, S3C2410_GPG5 , S3C2410_GPG5_EINT13 , 2, "KEY2"},   {IRQ_EINT14, S3C2410_GPG6 , S3C2410_GPG6_EINT14 , 3, "KEY3"},   {IRQ_EINT15, S3C2410_GPG7 , S3C2410_GPG7_EINT15 , 4, "KEY4"},   {IRQ_EINT19, S3C2410_GPG11, S3C2410_GPG11_EINT19, 5, "KEY5"},};static int key_values = 0;static irqreturn_t buttons_interrupt(int irq, void *dev_id){   struct button_irq_desc *button_irqs = (struct button_irq_desc *)dev_id;   int down;   udelay(0);down = !s3c2410_gpio_getpin(button_irqs->pin); //down: 1(按下),0(弹起)if (!down) {      key_values = button_irqs->number;   //printk("====>rising key_values=%d\n",key_values);   if(key_values==0)       input_report_key(button_dev, KEY_1, 0);   if(key_values==1)       input_report_key(button_dev, KEY_2, 0);   if(key_values==2)       input_report_key(button_dev, KEY_3, 0);   if(key_values==3)       input_report_key(button_dev, KEY_4, 0);   if(key_values==4)       input_report_key(button_dev, KEY_5, 0);   if(key_values==5)       input_report_key(button_dev, KEY_6, 0);      input_sync(button_dev);   }else {   key_values = button_irqs->number;   //printk("====>falling key_values=%d\n",key_values);   if(key_values==0)       input_report_key(button_dev, KEY_1, 1);   if(key_values==1)       input_report_key(button_dev, KEY_2, 1);   if(key_values==2)       input_report_key(button_dev, KEY_3, 1);   if(key_values==3)       input_report_key(button_dev, KEY_4, 1);   if(key_values==4)       input_report_key(button_dev, KEY_5, 1);   if(key_values==5)       input_report_key(button_dev, KEY_6, 1);   input_sync(button_dev);   }   return IRQ_RETVAL(IRQ_HANDLED);}static int s3c24xx_request_irq(void){   int i;   int err = 0;   for (i = 0; i if (button_irqs[i].irq continue;       }              err = request_irq(button_irqs[i].irq, buttons_interrupt, IRQ_TYPE_EDGE_BOTH,       button_irqs[i].name, (void *)&button_irqs[i]);       if (err)           break;   }      if (err) {       i--;       for (; i >= 0; i--) {           if (button_irqs[i].irq continue;           }           disable_irq(button_irqs[i].irq);         free_irq(button_irqs[i].irq, (void *)&button_irqs[i]);       }       return -EBUSY;   }   return 0;}static int __init dev_init(void){      s3c24xx_request_irq();      button_dev = input_allocate_device();   if (!button_dev) {       printk(KERN_ERR "Unable to allocate the input device !!\n");       return -ENOMEM;   }   button_dev->name = "s3c2440_button";   button_dev->id.bustype = BUS_RS232;   button_dev->id.vendor = 0xDEAD;   button_dev->id.product = 0xBEEF;   button_dev->id.version = 0x0100;   button_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT(EV_SYN);   //set_bit(EV_KEY, button_dev->evbit)//支持EV_KEY事件      set_bit(KEY_1, button_dev->keybit);   set_bit(KEY_2, button_dev->keybit);   set_bit(KEY_3, button_dev->keybit);   set_bit(KEY_4, button_dev->keybit);   set_bit(KEY_5, button_dev->keybit);   set_bit(KEY_6, button_dev->keybit);   //printk("KEY_RESERVED=%d ,KEY_1=%d",KEY_RESERVED,KEY_1);   input_register_device(button_dev); //注册input设备   printk ("initialized\n");   return 0;}static void __exit dev_exit(void){   int i;   for (i = 0; i if (button_irqs[i].irq continue;       }       free_irq(button_irqs[i].irq, (void *)&button_irqs[i]);   }   input_unregister_device(button_dev);}module_init(dev_init);module_exit(dev_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("David Xie");

以上就是关于“Linux输入子系统是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Linux输入子系统是什么

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

下载Word文档

猜你喜欢

Linux输入子系统是什么

这篇“Linux输入子系统是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux输入子系统是什么”文章吧。Linux
2023-06-27

Linux输入子系统框架原理解析

input输入子系统框架 linux输入子系统(linux input subsystem)从上到下由三层实现,分别为:输入子系统事件处理层(EventHandler)、输入子系统核心层(InputCore)和输入子系统设备驱动层。 一个输
2022-06-03

Linux系统中怎么输入emoji

这篇文章主要介绍Linux系统中怎么输入emoji,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!emoji 是在 Unicode 字符空间里的有趣表情图,它们已经风靡于整个互联网。emoji 可以用来在社交媒体上表示
2023-06-28

你知道输入/输出系统原理是什么吗?

  今天小编给大家带来的是,输入输出系统式计算机相信听到输入输出系统式计算机这个词那肯定是一头雾水,不了解什么是输入输出系统式计算机不过没关系,今天小编就带领大家学习一下输入输出系统式计算机。感兴趣的小伙伴可以学习学习哦。  输入输出系统  输入输出系统式计算机的重要组成部分,是沟通计算机与外部世界的桥梁。本章主要讲授
你知道输入/输出系统原理是什么吗?
2024-04-18

linux系统电视盒子到底是什么

经常看到各种大神说今天刷了什么linux系统可以干嘛干嘛了,刷了乌班图可以干嘛干嘛了,但是身为一个小白,对这种名词都是一知半解。所以这边给大家科普一下,什么是linux系统?电视盒子刷了这个可以干啥?什么是linux系统呢?
2023-06-05

怎么在Linux系统中输入emoji

这篇文章将为大家详细讲解有关怎么在Linux系统中输入emoji,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用 GNOME 桌面可以让你在文字中轻松加入 emoji。emoji 是潜藏在 Unicod
2023-06-16

嵌入式linux系统指的是什么

本文小编为大家详细介绍“嵌入式linux系统指的是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“嵌入式linux系统指的是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。嵌入式linux系统是指对标准li
2023-06-30

什么是Linux系统

本篇内容介绍了“什么是Linux系统”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  什么是Linux系统?  Linux操作系统,其实跟其
2023-06-05

Linux系统怎么安装中文输入法

这篇文章主要为大家分析了Linux系统怎么安装中文输入法的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“Linux系统怎么安装中文输入法”的知识吧。Linux
2023-06-28

如何在Linux 系统中输入 emoji

如何在Linux 系统中输入 emoji,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。导读使用 GNOME 桌面可以让你在文字中轻松加入 emoji。emoji 是潜藏在 Un
2023-06-05

Linux系统之间高效传输的方法是什么

这篇文章给大家介绍Linux系统之间高效传输的方法是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。两台Linux服务器之间如何传输文件?难道先从这台服务器下载下来,然后再上传到另外一台服务器上面去吗?当然不是,这个
2023-06-28

suse linux系统是什么

本文小编为大家详细介绍“suse linux系统是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“suse linux系统是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。suse linux就是一个Lin
2023-07-05

Linux是什么系统?Linux系统有何优势?

  提及操作系统,可能很多人都会想起Linux,Linux发现到现在可谓是拥有很多铁粉,对于了解它的人都知道,Linux在我们的生活当中有着非常重要的作用,覆盖了我们生活的各个方面。今天为大家介绍一下Linux是什么操作系统?Linux系统
2023-06-05

Win8系统设置默认输入法的方法是什么

Win8系统设置默认输入法的方法是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在win8系统就自带有微软的输入法,一般来说会设置成默认输入法。有的用户习惯
2023-06-28

Linux切换输入法的操作是什么

在Linux系统中,切换输入法的操作可以通过以下几种方式进行:1. 使用系统自带的快捷键:常见的快捷键是Ctrl + Space,按下这个快捷键可以在不同的输入法之间进行切换。2. 使用输入法的自带快捷键:部分输入法自带了切换输入法的快捷键
2023-09-23

查看linux是什么系统

Linux是一种开源操作系统,其内核由Linus Torvalds于1991年首次发布。Linux系统基于Unix思想,具有高度的可定制性和稳定性。它被广泛应用于服务器、个人计算机、嵌入式设备以及移动设备等领域。Linux系统以其稳定性、安
2023-08-25

什么是Linux系统日志

本篇内容介绍了“什么是Linux系统日志”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!系统的那些讯息以及应该记录在那些档案, 或如何显示,
2023-06-10

Linux系统中script是什么

这篇文章主要介绍了Linux系统中script是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。script是什么scirpt就是一个命令,可以制作一份记录输出到终端的记录
2023-06-28

linux档案系统是什么

今天小编给大家分享一下linux档案系统是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。linux档案就是目录(文件)。
2023-07-04

嵌入式linux系统移植的步骤是什么

嵌入式Linux系统移植的步骤通常包括以下几个步骤:选择合适的硬件平台:根据项目需求,选择合适的硬件平台,包括处理器、芯片组、硬件接口等。创建开发环境:搭建开发环境,包括安装交叉编译工具链、配置开发环境等。获取源代码:从官方或第三方渠道获取
2023-10-26

编程热搜

目录