博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux Kernel input ev操作
阅读量:4152 次
发布时间:2019-05-25

本文共 2950 字,大约阅读时间需要 9 分钟。

static struct input_handler evdev_handler = {	.event		= evdev_event,	.events		= evdev_events,	.connect	= evdev_connect,	.disconnect	= evdev_disconnect,	.legacy_minors	= true,	.minor		= EVDEV_MINOR_BASE,	.name		= "evdev",	.id_table	= evdev_ids,};static int __init evdev_init(void){	return input_register_handler(&evdev_handler);}static void __exit evdev_exit(void){	input_unregister_handler(&evdev_handler);}module_init(evdev_init);module_exit(evdev_exit);
 
 
static const struct file_operations evdev_fops = {	.owner		= THIS_MODULE,	.read		= evdev_read,	.write		= evdev_write,	.poll		= evdev_poll,	.open		= evdev_open,	.release	= evdev_release,	.unlocked_ioctl	= evdev_ioctl,#ifdef CONFIG_COMPAT	.compat_ioctl	= evdev_ioctl_compat,#endif	.fasync		= evdev_fasync,	.flush		= evdev_flush,	.llseek		= no_llseek,};
/* * Create new evdev device. Note that input core serializes calls * to connect and disconnect. */static int evdev_connect(struct input_handler *handler, struct input_dev *dev,			 const struct input_device_id *id){	struct evdev *evdev;	int minor;	int dev_no;	int error;	minor = input_get_new_minor(EVDEV_MINOR_BASE, EVDEV_MINORS, true);	if (minor < 0) {		error = minor;		pr_err("failed to reserve new minor: %d\n", error);		return error;	}	evdev = kzalloc(sizeof(struct evdev), GFP_KERNEL);	if (!evdev) {		error = -ENOMEM;		goto err_free_minor;	}	INIT_LIST_HEAD(&evdev->client_list);	spin_lock_init(&evdev->client_lock);	mutex_init(&evdev->mutex);	init_waitqueue_head(&evdev->wait);	evdev->exist = true;	dev_no = minor;	/* Normalize device number if it falls into legacy range */	if (dev_no < EVDEV_MINOR_BASE + EVDEV_MINORS)		dev_no -= EVDEV_MINOR_BASE;	dev_set_name(&evdev->dev, "event%d", dev_no);	evdev->handle.dev = input_get_device(dev);	evdev->handle.name = dev_name(&evdev->dev);	evdev->handle.handler = handler;	evdev->handle.private = evdev;	evdev->dev.devt = MKDEV(INPUT_MAJOR, minor);	evdev->dev.class = &input_class;	evdev->dev.parent = &dev->dev;	evdev->dev.release = evdev_free;	device_initialize(&evdev->dev);	error = input_register_handle(&evdev->handle);	if (error)		goto err_free_evdev;	cdev_init(&evdev->cdev, &evdev_fops);	evdev->cdev.kobj.parent = &evdev->dev.kobj;	error = cdev_add(&evdev->cdev, evdev->dev.devt, 1);	if (error)		goto err_unregister_handle;	error = device_add(&evdev->dev);	if (error)		goto err_cleanup_evdev;	return 0; err_cleanup_evdev:	evdev_cleanup(evdev); err_unregister_handle:	input_unregister_handle(&evdev->handle); err_free_evdev:	put_device(&evdev->dev); err_free_minor:	input_free_minor(minor);	return error;}static void evdev_disconnect(struct input_handle *handle){	struct evdev *evdev = handle->private;	device_del(&evdev->dev);	evdev_cleanup(evdev);	input_free_minor(MINOR(evdev->dev.devt));	input_unregister_handle(handle);	put_device(&evdev->dev);}static const struct input_device_id evdev_ids[] = {	{ .driver_info = 1 },	/* Matches all devices */	{ },			/* Terminating zero entry */};

转载地址:http://hwhti.baihongyu.com/

你可能感兴趣的文章
GoogleNet总结
查看>>
pandas学习笔记-------时间戳转日期时间型数据
查看>>
python 打印类的所有属性和方法
查看>>
python 去掉字符串头尾及内部指定字符
查看>>
python 字符串大小写转换
查看>>
pandas学习笔记---------时间间隔运算
查看>>
python解析二进制文件以及不同进制数值间的转换
查看>>
BatchNormalization总结
查看>>
MSB/LSB(big endian/little endian)
查看>>
Ubuntu下将一个文件压缩为多个分卷并解压恢复
查看>>
Linux中split和cat命令的简单组合使用
查看>>
解决import TensorFlow时“.../.../site-packages/dateutil/tz.py“报错
查看>>
Python2启动jupyter lab报错
查看>>
caffe的各种数据层和对应的python定义接口以及部署时的修改问题
查看>>
tf.train.get_checkpoint_state (path)解析
查看>>
Python input()和raw_input()函数
查看>>
71、for循环中引用setTimeout问题
查看>>
72、隐藏元素的方法以及区别
查看>>
73、position定位有几种以及区别
查看>>
74、flex:1 代表什么意思
查看>>