1、什么是输入子系统
我们设计驱动的时候,可以不使用子系统模型;但是使用了子系统模型,可以提高驱动的性能、简化驱动设计、使驱动可以提供一个标准的接口。
1.1、linux内核中,驱动程序的子系统
1)输入子系统:适合于输入类型的设备,如:鼠标、键盘、触摸屏、按键、游戏杆、拨码开关、….
2)RTC子系统:实时时钟
3)I2C子系统:I2C总线设备
4)SPI子系统:SPI总线设备
5)显示子系统:LCD显示设备,frame buffer
6)网设备子系统:网卡驱动
7)声卡子系统:OSS 或ALSA
8)USB子系统
1.2、什么是输入子系统
输入子系统模型,也是字符设备驱动模型的封装(如:杂项设备驱动模型)。但是比较适合与设计输入类型设备的设备驱动。
linux内核支持的输入设备类型:
在#include <linux/intput.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)
3、查看输入子系统
4、查看输入设备的设备文件
由此可以看出:输入子系统设备的主设备号是13.
5、读取输入子系统的内容
#cat /proc/evnet1
#cat /dev/input/event0
注意:在linux中,输入设备一般都是使用输入子系统模型来设计的,这样驱动程序可以给应用程序一个标准的数据接口
二、输入子系统中,应用程序从驱动程序中,读出的数据
数据:应用程序从驱动程序中,读出的数据是一个标准的结构体,在linux的应用程序和驱动程序中,都支持该结构体
结构体的定义:
#include <linux/input.h>
struct input_event {
struct timeval time; //时间戳
__u16 type; //输入设备的事件类型
__u16 code; //该类型下的编码
__s32 value; //编码的值
};
例:
读取键盘的按键”a”
type —-> EV_KEY —>键盘类型的输入事件
code —-> KEY_A —->按键a的编码
value —-> 1–> 按键按下; 0—>按键松开,2—>按键连击
读取触摸屏的坐标
type —-> EV_ABS —>绝对坐标类型的输入事件
code —-> ABS_X —->坐标x,ABS_Y —->坐标y
value —-> 坐标的值
注意:
1)驱动程序使用的头文件在哪里?
在内核源码包的inlucde目录下。如:
内核源码包/include/linux/input.h
2)使用gcc编译的应用程序,使用的头文件在哪里?
ubuntu系统: /usr/include/linux/input.h
3)使用交叉工具链编译应用程序,使用的头文件在哪里?
在交叉工具链中: