Input子系统的初始化函数为input_init(),如下:

static int __init input_init(void)
{int err;input_init_abs_bypass();err = class_register(&input_class);if (err) {printk(KERN_ERR "input: unable to register input_dev class\n");return err;}err = input_proc_init();if (err)goto fail1;err = register_chrdev(INPUT_MAJOR, "input", &input_fops);if (err) {printk(KERN_ERR "input: unable to register char major %d", INPUT_MAJOR);goto fail2;}return 0;fail2:    input_proc_exit();fail1:    class_unregister(&input_class);return err;
}

在这个初始化函数里,先注册了一个名为”input”的类.所有input device都属于这个类.在sysfs中表现就是.所有input device所代表的目录都位于/dev/class/input下面.

然后调用input_proc_init()在/proc下面建立相关的交互文件.

再后调用register_chrdev()注册了主设备号为INPUT_MAJOR(13).次设备号为0~255的字符设备.它的操作指针为input_fops.
在这里,我们看到.所有主设备号13的字符设备的操作最终都会转入到input_fops中./dev/input/event0~/dev/input/event4的主设备号为13.操作也不例外的落在了input_fops中.
Input_fops定义如下:
static const struct file_operations input_fops = {.owner = THIS_MODULE,.open = input_open_file,
};

打开文件所对应的操作函数为input_open_file.代码如下示:

static int input_open_file(struct inode *inode, struct file *file)
{struct input_handler *handler;const struct file_operations *old_fops, *new_fops = NULL;int err;err = mutex_lock_interruptible(&input_mutex);if (err)return err;/* No load-on-demand here? */handler = input_table[iminor(inode) >> 5];if (handler)new_fops = fops_get(handler->fops);mutex_unlock(&input_mutex);/** That's _really_ odd. Usually NULL ->open means "nothing special",* not "no device". Oh, well...*/if (!new_fops || !new_fops->open) {fops_put(new_fops);err = -ENODEV;goto out;}old_fops = file->f_op;file->f_op = new_fops;err = new_fops->open(inode, file);if (err) {fops_put(file->f_op);file->f_op = fops_get(old_fops);}fops_put(old_fops);
out:return err;
}

iminor(inode)为打开文件所对应的次设备号.input_table是一个struct  input_handler全局数组.在这里.它先设备结点的次设备号右移5位做为索引值到input_table中取对应项.从这里我们也可以看到.一 个handle代表1<<5个设备节点(因为在input_table中取值是以次备号右移5位为索引的.即低5位相同的次备号对应的是同一 个索引).在这里,终于看到了input_talbe大显身手的地方了.input_talbe[ ]中取值和input_talbe[  ]的赋值,这两个过程是相对应的.

在input_table中找到对应的handler之后,就会检验这个handle是否存,是否带有fops文件操作集.如果没有.则返回一个设备不存在的错误.
然后将handler中的fops替换掉当前的fops.如果新的fops中有open()函数,则调用它.

转载于:https://www.cnblogs.com/hello2mhb/p/3366751.html

linux 输入子系统(4)---- input子系统的初始化相关推荐

  1. linux 设备驱动 百度,Linux设备驱动之input子系统

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 作者:武汉华嵌嵌入式培训中心 讲师 李家凯 对于输入类设备如键盘.鼠标.触摸屏之类的Linux驱动,内核提供input子系统,使得这类设备的处理变得非常便 ...

  2. linux驱动系列学习之input子系统(二)

    一.input子系统简介 linux系统支持的输入设备众多,例如键盘.鼠标.按键.触摸屏等,linux系统通过抽象出一个input子系统去支持众多的输入设备.input子系统分为三层:上层:输入事件处 ...

  3. driver: Linux设备模型之input子系统详解

    本节从整体上讲解了输入子系统的框架结构.有助于读者从整体上认识linux的输入子系统.在陷入代码分析的过程中,通过本节的知识能够找准方向,明白原理. 本节重点: 输入子系统的框架结构 各层对应内核中的 ...

  4. linux编译input驱动,Linux驱动开发之input子系统

    本文对mousedev.Amimouse和input子系统进行分析,旨在提纲挈领,给出它们之间的调用关系(或者说关联).阅读本文,需要与阅读Linux 2.6内核源码交叉进行,除非你是超人. 背景: ...

  5. 三个子系统_「正点原子Linux连载」第五十八章Linux INPUT子系统实验(一)

    1)实验平台:正点原子Linux开发板 2)摘自<正点原子I.MX6U嵌入式Linux驱动开发指南> 关注官方微信号公众号,获取更多资料:正点原子 第五十八章Linux INPUT子系统实 ...

  6. Linux按键输入实验(体验一下输入驱动,实际开发使用input子系统处理)

    目录 Linux下按键驱动原理(使用原子操作) 硬件原理图分析 实验程序编写 修改设备树文件 按键驱动程序编写 编写测试APP(循环读取按键值) 运行测试 编译驱动程序和测试APP 运行测试(whil ...

  7. linux input输入子系统分析《四》:input子系统整体流程全面分析

    1      input输入子系统整体流程 本节分析input子系统在内核中的实现,包括输入子系统(Input Core),事件处理层(Event Handler)和设备驱动层.由于上节代码讲解了设备 ...

  8. linux输入子系统概述,Linux输入子系统(Input Subsystem)

    Linux 的输入子系统不仅支持鼠标.键盘等常规输入设备,而且还支持蜂鸣器.触摸屏等设备.本章将对 Linux 输 入子系统进行详细的分析. 一 前言 输入子系统又叫 input 子系统.其构建非常灵 ...

  9. Linux输入事件类型EV_SW,Linux的input输入子系统:总体框架

    一.input输入子系统总体框架 Linux输入子系统将输入驱动抽象为三层:设备驱动层.核心层.事件处理层. 设备驱动层:将底层的硬件输入事件转化为统一事件形式,向输入核心(Input Core)汇报 ...

最新文章

  1. JAVA - package与import解析(一)
  2. 有名信号量sem_open和内存信号量sem_init创建信号量的区别
  3. 常见的集成逻辑门(CMOS\TTL\ECL)
  4. ubuntu/wireshark --Lua: Error during loading: [string /usr/share/wireshark/init.lua]:45问题解决
  5. 文件系统性能测试工具 IOZONE工具
  6. 小米10 twrp刷入开发版
  7. Unity跳一跳小游戏简单代码
  8. 史蒂夫·乔布斯的故事:启示录还是警世钟?
  9. python打印日历_python 打印日历
  10. JavaScript妙用
  11. 混合云,让你看的清清楚楚明明白白真真切切
  12. containerd环境下build镜像
  13. 好用的ROS开发软件(持续更新~)
  14. JVM#Java高墙之GC与内存分配策略
  15. Thiago2(TPO AI.ROSTO):集成式AI换脸软件(Autodesk Flame)
  16. 2021-11-01第一节课总结
  17. 1083: 阶乘尾数零的个数
  18. Altium Designer使用技巧之相同模块复用
  19. Golang标准库CHM格式文档
  20. uno牌的玩法图解_UNO一起优诺出牌套路及玩法规则介绍:经典场规则及小技巧

热门文章

  1. 反编译Silverlight项目
  2. RecyclerListView的使用
  3. React Native开发总结(一)
  4. Error: listen EADDRINUSE: address already in use :::5000
  5. windows10系统如何设置标题栏显色
  6. 我们这些中年人,多处在管理层面
  7. 人要抱着希望才能活得好
  8. 夫妻俩70岁积蓄70万元,俩人退休金8000元,还需要理财吗?
  9. 初一的学生,上了初中成绩就下降了一大截,该怎么办?
  10. 女人离婚后不要孩子,你怎么看?