Linux内核input子系统解析(2)

1、Input输入子系统数据结构关系图

Linux内核input子系统解析

2、input_handler结构体

以evdev.c中的evdev_handler为例:

static struct input_handler evdev_handler = {
                .event = evdev_event, //向系统报告input事件,系统通过read方法读取
                .connect = evdev_connect, //和input_dev匹配后调用connect构建
                .disconnect = evdev_disconnect,
                .fops = &evdev_fops, //event设备文件的操作方法
                .minor = EVDEV_MINOR_BASE, //次设备号基准值
                .name = "evdev",
                .id_table = evdev_ids, //匹配规则
        };

3、input字符设备注册过程

drivers/input/input.c中:
        static int __init input_init(void)
        {
                int err;
                err = class_register(&input_class);
                ……
                err = register_chrdev(INPUT_MAJOR, "input", &input_fops);
                ……
        }

input_fops定义:

static const struct file_operations input_fops = {
                .owner = THIS_MODULE,
                .open = input_open_file,
        };

Input_dev和input_handler匹配后调用input_handler的connect。以evdev_handler为例:

static int evdev_connect(struct input_handler *handler, struct input_dev *dev,const struct input_device_id *id)
        {
                struct evdev *evdev; 
                struct class_device *cdev;
                dev_t devt;
                int minor;
                int error;

        for (minor = 0; minor < EVDEV_MINORS && evdev_table[minor]; minor++);
                if (minor == EVDEV_MINORS) {
                        printk(KERN_ERR "evdev: no more free evdev devices\n");
                        return -ENFILE;
                }

        evdev = kzalloc(sizeof(struct evdev), GFP_KERNEL);//为每个匹配evdev_handler的设备创建一个evdev。
                if (!evdev)
                        return -ENOMEM;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/ppjfx.html