刚開始学习linux这门课就被分配编写一个设备的input子系统驱动。这对我的确有点困难。只是实际的操作中发现困难远比我想象的要大的多。本以为依照老师课上的步骤就行非常快的完毕这项任务。后来发现是我想多了。

刚一開始我就陷入了一个困境,理不清究竟input子系统驱动哪些是我须要做的哪些是系统已经为我们完毕的。为此花费了我一个星期的时间才真正的从这个困惑里走出来。当然后边还有非常多其它的困难这里我就不多说了,以下我就来总结一下input子系统学习的过程。

首先我们要清楚input子系统分为几层,各层都有些什么,以及各自的功能

一、input子系统分层
input子系统分为三层如图所看到的。须要强调的是我们须要做的仅仅是完毕设备驱动层的编程。这一点困惑了我一个星期。
1.1 设备驱动层
提供驱动层对详细输入设备硬件寄存器的读写问以及将底层硬件对用户输入訪问的响应转换为标准的输入事件,再通过事件核心层提交给事件处理层;设备驱动层完毕详细硬件设备驱动的实现。

这一层中包括一个input_dev结构体,它是用来描写叙述一个设备的信息的。

包括了对设备的各项设置及操作函数。

1.2 事件核心层
输入子系统的核心部分,负责初始化和管理整个输入子系统,它对设备驱动层提供输入设备的注冊和初始化函数完毕输入设备在事件核心层的注冊;同一时候它也对事件处理层提供接口函数以完毕事件处理层设备在事件核心层的注冊;建立设备驱动层的输入设备和事件处理层设备之间的关联。
这一层包括一个input_handle结构体。它做为input_dev和input_handler之间的桥梁 ,将handle的list_headd_node加入到handle关联的dev的h_list中, 将handle的list_headh_node加入到handle关联的handler的h_list中。
1.3 事件处理层
为用户空间的应用程序提供统一訪问设备的接口和驱动层提交来的事件处理。

使设备驱动部分不再关心对设备文件的操作而仅仅需关心对各硬件寄存器的操作和提交的输入事件就可以 。
这一层包括了input_handler结构体,它是作为事件处理器相应用程序的接口。

input子系统的三层分别各自拥有一个结构体,驱动功能的实现就是这三个结构体连接传递信息的过程。
到底这三个结构体怎样实现连接,在总结完input子系统驱动实现的整个过程之后在整体描写叙述。
二、input子系统驱动的实现过程

2.1 分配一个输入设备

struct input_dev *dev;//声明一个输入设备结构体

Struct input_dev

{

       

const char *name;//输入设备的名称

...

struct input_id id;//输入设备的ID号

...

unsigned long evbit[BITS_TO_LONGS(EV_CNT)];//输入设备所支持的事件类型

unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];//保存设备所支持的事件码

...

//输入设备文件接口操作函数指针

int (*open)(struct input_dev *dev);

void (*close)(struct input_dev *dev);

int (*flush)(struct input_dev *dev, struct file *file);

int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value);

struct input_handle __rcu *grab;

struct device dev;// 表示SYS设备模型中的一个设备

struct list_head        h_list;//

struct list_head        node;

}

dev=input_allocate_device(void);//为声明的结构体分配空间

2.2 驱动支持什么事件

这一步我们能够设置输入设备支持哪些事件类型。以鼠标为例我们能够设置设备支持按键事件和相对坐标事件,在设置完支持的事件类型后还须要设置事件类型的码表,即该事件所包括的子事件。

input_dev->evbit[0] = BIT(EV_KEY); //赋值使输入设备支持按键类型

input_dev->keybit[BITS_TO_LONGS(KEY_CNT)=BIT(BTN_LEFT)| BIT(BTN_RIGHT)|BIT(BTN_MIDDLE); //按键类型的键码,左键、右键、中键

2.3 注冊一个输入设备

这一步调用的是input_register_device()函数。该函数是输入子系统核心层提供的函数。该函数将 input_dev结构体注冊到输入子系统核心中。input_register_device()函数假设注冊失败,必须调用 input_free_device()函数释放分配的input_dev的空间。

假设该函数注冊成功,在卸载函数中应该调用 input_unregister_device()函数来注销输入设备结构体。注冊输入设备的过程就是为输入设备设置默认值,并将其挂在input_dev_list链上,与挂载在 input_handler_list 中的 handler 相匹配。假设匹配成功,就会调用 handler 的 connect函数。

int input_register_device(struct input_dev *dev)。//向input子系统注冊一个新的输入设备

2.4 驱动事件报告

这一步是有设备驱动层向核心层报告发生的事件,比如按键事件。相对坐标事件等。这些事件全都汇总到核心层由核心层统一分配到事件处理层。

input_report_key(dev,BTN_LEFT,value);

实质是函数:input_event(dev,type,value);

2.5 释放和注销设备

这一步用来注销输入设备并清除为该设备分配的空间。

void input_unregister_device(struct input_dev *dev);

void input_free_device(struct input_dev *dev);

通过以上的介绍我们了解了整个input子系统驱动程序的编写流程,以下让我们依据usb鼠标驱动程序来看一看input子系统驱动程序的实现过程。

以下就来说一说三个结构体的连接过程

在我们编写的设备驱动中调用input_register_device()来注冊一个设备。 input_register_device()完毕的主要功能就是初始化一些默认的值,将自己的device结构加入到linux设备模型其中。将input_dev加入到input_dev_list链表中。然后寻找合适的handler与input_handler配对,配对的核心函数是input_attach_handler。

input_attach_handler的主要功能则是调用了两个函数。一个是input_match_device进行配对,一个connect处理配对成功兴许工作。这些函数我们能够在linux内核源代码中进行查看。

对于connect函数,每种事件处理器的实现都有差异,但原理都同样,以事件处理器evdev为例,其connect函数为evdev_connect()。evdev_connect函数做配对后的善后工作,分配一个evdev结构体,并初始化相关成员。evdev结构体中有input_handle结构,在函数evdev_connect()中实现该结构体的初始化并调用 input_register_handle实现注冊。

input_register_handle()就是把一个handle结构体通过d_node链表项。分别链接到input_dev的h_list,input_handler的h_list上。

从而实现了3个结构体的连接。

总结

    Input子系统驱动的编写须要我们理清哪些操作是须要我们做的,哪些操作是子系统已经为我们完毕了的。这一点非常重要,唯独我们明确了自己须要做些什么才干让我们更快的学会input子系统程序的编写。在这一个过程中我就走了非常多弯路。起先对input子系统不是太多了解,通过网上查找相关介绍和浏览上课的PPT,我看到了非常多关于input子系统驱动的介绍。

但这些介绍不只包括了我们须要做的并且还包括了系统已经为我们完毕了的。

这给我的学习带来了非常大的困扰,我不明确到底我该从何下手编写一个完整的

input子系统设备驱动了。通过一遍又一遍的浏览体会我最终明确了哪些是我须要做的。在这个过程中我也学会了怎样查看linux内核源代码。

转载于:https://www.cnblogs.com/yfceshi/p/7110644.html

input子系统驱动学习之中的一个相关推荐

  1. Linux Framebuffer驱动剖析之中的一个—软件需求

    嵌入式企鹅圈将以本文作为2015年的终结篇,以回应第一篇<Linux字符设备驱动剖析>.嵌入式企鹅圈一直专注于嵌入式Linux和物联网IOT双方面的原创技术分享,稍后会公布嵌入式企鹅圈的2 ...

  2. Python 学习之中的一个:在Mac OS X下基于Sublime Text搭建开发平台包括numpy,scipy

    1 前言 Python有许多IDE能够用,官方自己也带了一个,Eclipse也能够. 但我在使用各种IDE之后,发现用Sublime Text是最好用的一个.因此.我都是用Sublime Text来编 ...

  3. 【嵌入式环境下linux内核及驱动学习笔记-(16)linux总线、设备、驱动模型之input框架】

    目录 1.Linux内核输入子系统概念导入 1.1 输入设备工作机制 1.2 运行框架 1.3 分层思想 2.驱动开发步骤 2.1 在init()或probe()函数中 2.2 在exit()或rem ...

  4. 31 Linux input子系统按键驱动--4IO驱动16按键

    31.1 前言 按键是设备中是最常见的人机交互方式,本节中将学习两部分. (1)如何4个GPIO 16个按键的实现: (2)Linux input按键驱动开发实例编程: 31.2 4个IO驱动16按键 ...

  5. Linux 驱动开发 四十八:Linux INPUT 子系统实验

    一.input 子系统简介 input 就是输入的意思,因此 input 子系统就是管理输入的子系统,是 Linux 内核针对某一类设备而创建的框架. 比如按键输入.键盘.鼠标.触摸屏等等这些都属于输 ...

  6. 八、INPUT子系统和内核自带的GPIO按键驱动

    Input子系统驱动框架 = 设备层 + 核心层 + 事件处理层 其中,设备层部分的代码跟具体的输入设备相关,由驱动工程师来具体实现,负责监测并上报具体的输入事件.核心层起承上启下的作用,接受设备层上 ...

  7. linux v4l2系统详解,Linux摄像头驱动学习之:(一)V4L2_框架分析

    这段时间开始搞安卓camera底层驱动了,把以前的的Linux视频驱动回顾一下,本篇主要概述一下vfl2(video for linux 2). 一. V4L2框架: video for linux ...

  8. Android Input子系统-含实例源码

    Android Input子系统-含实例源码 1 Input子系统作用 Android很多外设都是用到输入输出设备,比如touchscreen,键盘,音量键等,输入 设备对应Android 框架是An ...

  9. Android4.2 Input子系统

    一.Android的Input子系统启动过程 1.init进程通过Zygote启动SystemServer 2.SystemServer通过WM启动InputManager的两个线程 二.事件分发整体 ...

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

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

最新文章

  1. Vagrant控制管理器——“Hobo”
  2. 23个CVPR 2020收录的新数据集,都在这里了!
  3. WSO2 ESB(1)
  4. 新手学python还是c语言_py和c语言究竟新手该学哪个?
  5. freemaker页面字符串特殊字符显示异常处理
  6. 文字超出部分显示..._matplotlib图形内的文字、注释、箭头
  7. postfix 部署ssl后还是25_宝塔面板的邮局管理器Postfix无法启动解决办法
  8. 知识点笔记(二维数组排序、统计数组重复个数、)
  9. 【opencv】visualstudio实现opencvblobslib编译
  10. scrapy的name变量_scrapy 如何设置全局变量?
  11. Win11_vs2010镜像安装方法
  12. jspx语法的基础知识
  13. Flink(55):Flink高级特性之流式文件写入(Streaming File Sink)
  14. QQ心跳包格式分析 监听局域网QQ号代码
  15. gpd微型计算机,对便携性的终极追求,GPD P2 MAX迷你轻薄本
  16. 小猫爪:嵌入式小知识01-存储器
  17. Windows Sever 2008 本地安全策略之登陆策略
  18. 破解宝塔所有插件只需一句代码
  19. 项目一 Windows Server 2012 R2服务器安装与配置
  20. 防止XSS漏洞攻击常用解决方案

热门文章

  1. SuperPoint学习---demo代码理解
  2. PyTorch中的梯度微分机制
  3. 经典机器学习系列(四)【神经网络详解】
  4. 机器博弈 (四)博弈规则的设计
  5. 使用git软件上传文件到自己的github当中去
  6. 前台传参到后台出现中文乱码问题
  7. tkinter中frame布局控件
  8. 在Spring Boot中使用Spring Security实现权限控制
  9. python-format函数
  10. Jquery中拿到相同的对应的所有的标签