LINUX驱动之输入子系统(二)

前言

在linux内核中,input设备用input_dev结构体描述,使用input子系统实现输入设备驱动的时候,驱动和核心工作时向系统报告按键,触摸屏,键盘,鼠标等输入,不再需要关心文件操作接口,因为input子系统已经完成了文件操作接口,驱动报告的事经过inputCore和Eventhandler最终到达用户空间,也就是说以前需要自已构造“open,read,write”等函数,而现在是输入子系统框架中定义好的,参看 “evdev.c”,输入子系统右边的纯软件部分“处理方式”层由内核提供好了,我们只需要做左边“硬 件相关的操作”这部分,所以我们这次我们只需要创建一个Input_dev结构体变量,初始化这个变量的值,然后注册,在需要时上报按键调用input_event()函数就可以了,input driver编写要点如下
在这里插入图片描述
在这里插入图片描述
1.分配,注册,注销input设备

struct input_dev *input_allocate_device(void)
int input_register_device(struct input_dev *dev);
void input_unregister_device(struct input_dev *dev);

==2.==设置input设备支持的事件类型,事件码,事件值的范围,input_id等信息一个设备可以支持一个或多个事件类型,每个事件类型下面还需要设置具体的触发事件码,比如:EV_KEY事件,需要定义其支持哪些按键事件码,evbit[]表示能产生哪类事件,keybit[]表示能产生哪些按键
evbit 事件类型

#define EV_SYN 0x00 /*表示设备支持所有的事件*/
#define EV_KEY 0x01 /*键盘或者按键,表示一个键码*/
#define EV_REL 0x02 /*鼠标设备,表示一个相对的光标位置结果*/
#define EV_ABS 0x03 /*手写板产生的值,其是一个绝对整数值*/
#define EV_MSC 0x04 /*其他类型*/
#define EV_LED 0x11 /*LED灯设备*/
#define EV_SND 0x12 /*蜂鸣器,输入声音*/
#define EV_REP 0x14 /*允许重复按键类型*/
#define EV_PWR 0x16 /*电源管理事件*/

code
事件的代码.如果事件的类型是EV_KEY,该代码code为设备键盘代码.代码值0-127为键盘上的按键代码,0x110~0x116 为鼠标上按键代码,其中0x110(BTN_LEFT)为鼠标左键,0x111(BTN_RIGHT)为鼠标右键,0x112(BTN_ MIDDLE)为鼠标中键.其它代码含义看include/linux/input.h文件
value:
事件的值.如果事件的类型是EV_KEY,当按键按下时值为1,松开时值为0。
==3.==如果需要,设置input设备的打开,关闭,写入数据时的处理方法
==4.==在发生输入事件时,向子系统报告事件
input_sync()用于事件同步,它告知事件的接收者:驱动已经发出了一个完整的报告。
例如,在触摸屏设备驱动中,一次坐标及按下状态的整个报告过程如下:
input_report_abs(input_dev, ABS_X, x); //X坐标
input_report_abs(input_dev, ABS_Y, y); //Y坐标
input_report_abs(input_dev, ABS_PRESSURE, pres); //压力
input_sync(input_dev); //同步

查看键盘evdev支持哪一些dev

static const struct input_device_id evdev_ids[] = {
   
	{
    .driver_info = 1 },	/* Matches all devices */
	{
    },			/* Terminating zero entry */
};
....
static struct input_handler evdev_handler = {
   
	.event =	evdev_event,
	.connect =	evdev_connect,
	.disconnect =	evdev_disconnect,
	.fops =		&evdev_fops,
	.minor =	EVDEV_MINOR_BASE,
	.name =		"evdev",
	.id_table =	evdev_ids,
};

“Matches all devices”注释说明这个“evdev_ids[]”支持所有的设备.那么也就会支持我们要写按键设备.这时,evdev_ids[]支持这个“buttons_dev”后,就会调用"evdev_handler"这个“input_handler”结构中“.connect =evdev_connect”.

如何创建设备节点

static int __init input_init(void)
{
   
	int err;

	err = class_regi
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值