原文地址:http://blog.csdn.net/yinwei520/article/details/6652941
17.1.2 注册函数input_register_device()(1)
button_init()函数中的28行调用了input_register_device()函数注册输入设备结构体。input_register_device()函数是输入子系统核心(input core)提供的函数。该函数将input_dev结构体注册到输入子系统核心中,input_dev结构体必须由前面讲的input_allocate_device()函数来分配。input_register_device()函数如果注册失败,必须调用input_free_device()函数释放分配的空间。如果该函数注册成功,在卸载函数中应该调用input_unregister_device()函数来注销输入设备结构体。
1.input_register_device()函数
input_register_device()函数的代码如下:
-
-
-
-
-
-
-
-
-
-
-
-
-
int input_register_device(struct input_dev *dev)
-
{
-
static atomic_t input_no = ATOMIC_INIT(0);
-
struct input_handler *handler;
-
const char *path;
-
int error;
-
-
-
__set_bit(EV_SYN, dev->evbit);
-
-
-
__clear_bit(KEY_RESERVED, dev->keybit);
-
-
-
input_cleanse_bitmasks(dev);
-
-
-
-
-
-
init_timer(&dev->timer);
-
if (!dev->rep[REP_DELAY] && !dev->rep[REP_PERIOD]) {
-
dev->timer.data = (long) dev;
-
dev->timer.function = input_repeat_key;
-
dev->rep[REP_DELAY] = 250;
-
dev->rep[REP_PERIOD] = 33;
-
}
-
-
if (!dev->getkeycode)
-
dev->getkeycode = input_default_getkeycode;
-
-
if (!dev->setkeycode)
-
dev->setkeycode = input_default_setkeycode;
-
-
dev_set_name(&dev->dev, "input%ld",
-
(unsigned long) atomic_inc_return(&input_no) - 1);
-
-
error = device_add(&dev->dev);
-
if (error)
-
return error;
-
-
path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL);
-
printk(KERN_INFO "input: %s as %s\n",
-
dev->name ? dev->name : "Unspecified device", path ? path : "N/A");
-
kfree(path);
-
-
error = mutex_lock_interruptible(&input_mutex);
-
if (error) {
-
device_del(&dev->dev);
-
return error;
-
}
-
-
list_add_tail(&dev->node, &input_dev_list);
-
-
list_for_each_entry(handler, &input_handler_list, node)
-
input_attach_handler(dev, handler);
-
-
input_wakeup_procfs_readers();
-
-
mutex_unlock(&input_mutex);
-
-
return 0;
-
}
下面对该函数的主要代码进行分析。
第03~06行,定义了一些函数中将要用到的局部变量。
第07行,调用__set_bit()函数设置input_dev所支持的事件类型。事件类型由input_dev的evbit成员来表示,在这里将其EV_SYN置位,表示设备支持所有的事件。注意,一个设备可以支持一种或者多种事件类型。常用的事件类型如下:
-
#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 电源管理事件
dev_set_name设置input_dev中的device的名字,名字以input0、input1、input2、input3、input4等的形式出现在sysfs文件系统中。
使用device_add()函数将input_dev包含的device结构注册到Linux设备模型中,并可以在sysfs文件系统中表现出来。
打印设备的路径,输出调试信息。
调用list_add_tail()函数将input_dev加入input_dev_list链表中,input_dev_list链表中包含了系统中所有的input_dev设备。
阅读(2619) | 评论(0) | 转发(0) |