Linux设备驱动剖析之Input(三)
00000518 /* get current state of buttons */ 00000519 for (i = 0; i < pdata->nbuttons; i++) 00000520 gpio_keys_report_event(&ddata->data[i]); 00000521 input_sync(input); 00000522 00000523 device_init_wakeup(&pdev->dev, wakeup); 00000524 00000525 return 0; 00000526 00000527 fail3: 00000528 sysfs_remove_group(&pdev->dev.kobj, &gpio_keys_attr_group); 00000529 fail2: 00000530 while (--i >= 0) { 00000531 free_irq(gpio_to_irq(pdata->buttons[i].gpio), &ddata->data[i]); 00000532 if (ddata->data[i].timer_debounce) 00000533 del_timer_sync(&ddata->data[i].timer); 00000534 cancel_work_sync(&ddata->data[i].work); 00000535 gpio_free(pdata->buttons[i].gpio); 00000536 } 00000537 00000538 platform_set_drvdata(pdev, NULL); 00000539 fail1: 00000540 input_free_device(input); 00000541 kfree(ddata); 00000542 00000543 return error; 00000544 }
520、521行,为了避免与后面的内容重复,为了讲解的连贯性,把它们放到讲完事件驱动程序之后再讲。现在Input设备已经注册进input core了,剩下就是将handler也注册进input core,这样Input事件就能够通过input core到达事件驱动程序,最后到达用户空间,这也是我们的最终目的。
好了,下面开始讲事件驱动程序,以drivers/input/evdev.c为例,这是一个通用的事件驱动程序,可以支持所有的Input设备。好了,“态度决定一切,从初始化函数开始。”
00000914 static int __init evdev_init(void) 00000915 { 00000916 return input_register_handler(&evdev_handler); 00000917 }
先看916行input_register_handler函数参数evdev_handler的定义:
00000904 static struct input_handler evdev_handler = { 00000905 .event = evdev_event, 00000906 .connect = evdev_connect, 00000907 .disconnect = evdev_disconnect, 00000908 .fops = &evdev_fops, 00000909 .minor = EVDEV_MINOR_BASE, 00000910 .name = "evdev", 00000911 .id_table = evdev_ids, 00000912 };
先有个印象,后面用到的时候再细讲。
916行,调用input_register_handler函数注册handler,这是input core里的函数,定义如下:
00001837 int input_register_handler(struct input_handler *handler) 00001838 { 00001839 struct input_dev *dev; 00001840 int retval; 00001841 00001842 retval = mutex_lock_interruptible(&input_mutex); 00001843 if (retval) 00001844 return retval; 00001845 00001846 INIT_LIST_HEAD(&handler->h_list); 00001847 00001848 if (handler->fops != NULL) { 00001849 if (input_table[handler->minor >> 5]) { 00001850 retval = -EBUSY; 00001851 goto out; 00001852 } 00001853 input_table[handler->minor >> 5] = handler; 00001854 } 00001855 00001856 list_add_tail(&handler->node, &input_handler_list); 00001857 00001858 list_for_each_entry(dev, &input_dev_list, node) 00001859 input_attach_handler(dev, handler); 00001860 00001861 input_wakeup_procfs_readers(); 00001862 00001863 out: 00001864 mutex_unlock(&input_mutex); 00001865 return retval; 00001866 }
1846行,初始化用来连接handle的链表。
1848行,if条件成立,1849行,handler->minor的值为EVDEV_MINOR_BASE,即64。input_table是一个struct input_handler类型的指针数组,定义如下:
00000047 static struct input_handler *input_table[8];
handler->minor右移5位后的值为2,因此这里判断input_table[2]的值是否以0,因为是第一次进来,显然是为0的。
1853行,将input_table[2]指向此handler。
1856行,将handler加入到input_handler_list链表的尾部。
1858、1859行,很眼熟是吧,没错,之前说过的,只不过这里是遍历的是input_dev_list这条链表,而在input_register_device函数中遍历的是input_handler_list这条链表。这表明一个Input设备可以有多个handler,一个handler也可以依附多个Input设备。这里有必要把input_attach_handler函数的代码再贴一遍:
00000840 static int input_attach_handler(struct input_dev *dev, struct input_handler *handler) 00000841 { 00000842 const struct input_device_id *id; 00000843 int error; 00000844 00000845 id = input_match_device(handler, dev); 00000846 if (!id) 00000847 return -ENODEV; 00000848 00000849 error = handler->connect(handler, dev, id); 00000850 if (error && error != -ENODEV) 00000851 printk(KERN_ERR 00000852 "input: failed to attach handler %s to device %s, " 00000853 "error: %d\n", 00000854 handler->name, kobject_name(&dev->dev.kobj), error); 00000855 00000856 return error; 00000857 }
因为evdev.c能够匹配使有的Input设备,至于为什么可以,在讲input_match_device函数时已经讲过了,忘记了的话可以回去看看,所以会执行849行的connect函数,实质上就是evdev.c里的evdev_connect函数,下面看它的定义:
00000824 static int evdev_connect(struct input_handler *handler, struct input_dev *dev, 00000825 const struct input_device_id *id) 00000826 { 00000827 struct evdev *evdev; 00000828 int minor; 00000829 int error; 00000830 00000831 for (minor = 0; minor < EVDEV_MINORS; minor++) 00000832 if (!evdev_table[minor]) 00000833 break; 00000834 00000835 if (minor == EVDEV_MINORS) { 00000836 printk(KERN_ERR "evdev: no more free evdev devices\n"); 00000837 return -ENFILE; 00000838 } 00000839 00000840 evdev = kzalloc(sizeof(struct evdev), GFP_KERNEL); 00000841 if (!evdev) 00000842 return -ENOMEM; 00000843 00000844 INIT_LIST_HEAD(&evdev->client_list); 00000845 spin_lock_init(&evdev->client_lock); 00000846 mutex_init(&evdev->mutex); 00000847 init_waitqueue_head(&evdev->wait); 00000848 00000849 dev_set_name(&evdev->dev, "event%d", minor); 00000850 evdev->exist = true; 00000851 evdev->minor = minor; 00000852 00000853 evdev->handle.dev = input_get_device(dev); 00000854 evdev->handle.name = dev_name(&evdev->dev); 00000855 evdev->handle.handler = handler; 00000856 evdev->handle.private = evdev; 00000857 00000858 evdev->dev.devt = MKDEV(INPUT_MAJOR, EVDEV_MINOR_BASE + minor); 00000859 evdev->dev.class = &input_class; 00000860 evdev->dev.parent = &dev->dev; 00000861 evdev->dev.release = evdev_free; 00000862 device_initialize(&evdev->dev); 00000863 00000864 error = input_register_handle(&evdev->handle); 00000865 if (error) 00000866 goto err_free_evdev; 00000867 00000868 error = evdev_install_chrdev(evdev); 00000869 if (error) 00000870 goto err_unregister_handle; 00000871 00000872 error = device_add(&evdev->dev); 00000873 if (error) 00000874 goto err_cleanup_evdev; 00000875 00000876 return 0; 00000877 00000878 err_cleanup_evdev: 00000879 evdev_cleanup(evdev); 00000880 err_unregister_handle: 00000881 input_unregister_handle(&evdev->handle); 00000882 err_free_evdev: 00000883 put_device(&evdev->dev); 00000884 return error; 00000885 } 827行,struct evdev的定义: 00000026 struct evdev { 00000027 int open; 00000028 int minor; 00000029 struct input_handle handle; 00000030 wait_queue_head_t wait; 00000031 struct evdev_client *grab; 00000032 struct list_head client_list; 00000033 spinlock_t client_lock; /* protects client_list */ 00000034 struct mutex mutex; 00000035 struct device dev; 00000036 bool exist; 00000037 };
27行,open,当用户open此设备时,open的值加1。
28行,minor,次设备号,主设备都一样,用次设备号来区别不同的设备。
29行,handle,很熟悉了。
30行,wait,等待队列。
31行,grab,可以为evdev实例指定一个struct evdev_client实例,这样在传递Input消息时就只会传递给这一个struct evdev_client实例,而不会传递给所有的struct evdev_client实例。每open一次就会生成一个struct evdev_client实例。
32行,client_list,用来把所有的struct client_list实例连接在一起。
33、34行,同步相关的锁。
35行,dev,用来嵌入到设备模型中。
36行,exist,struct evdev被成功实例化后,exist的值就为true。
下面看struct evdev_client的定义:
00000039 struct evdev_client { 00000040 int head; 00000041 int tail; 00000042 spinlock_t buffer_lock; /* protects access to buffer, head and tail */ 00000043 struct fasync_struct *fasync; 00000044 struct evdev *evdev; 00000045 struct list_head node; 00000046 int bufsize; 00000047 struct input_event buffer[]; 00000048 };
40、41行,作为环形缓冲区的索引值,环形缓冲区就是用来存储Input事件消息的。
42行,buffer_lock,缓冲区的锁。
43行,fasync,异步通知相关的。
44行,evdev,所属的struct evdev实例。
45行,node,作为节点链入struct evdev实例所形成的链表中。
46行,bufsize,环形缓冲区的长度。
47行,buffer,struct input_event类型的数组,也就是环形缓冲区,数组长度可变。
下面看struct input_event,在include/linux/input.h中定义的:
00000026 struct input_event { 00000027 struct timeval time; 00000028 __u16 type; 00000029 __u16 code; 00000030 __s32 value; 00000031 };
27行,time,消息产生的时间。
28行,type,消息的类型。
29行,code,消息的值,对于按键事件的话,就对应键盘上的按键。
30行,value,对于本文来说,表示IO电平的取反值。
回到evdev_connect函数,831至833行,evdev_table是一个struct evdev类型的数组,定义如下:
00000050 static struct evdev *evdev_table[EVDEV_MINORS];
其中EVDEV_MINORS的值为32。
那么831至833行的意思就很明显了,就是从evdev_table数组中找到第一个值为0的元素,这样minor就表示这个元素在evdev_table数组中的索引值,或者说下标值。
835至838行,如果minor等于EVDEV_MINORS,就表示evdev_table数组溢出了,不能往下走了,返回出错吧。
840至842行,为struct evdev实例分配内存。
844至847行,一些初始化。
850行,evdev->exist = true,和之前说的一致。
851行,记录下次设备号。
853至862行,注意一下858行,生成设备号,主设备号为INPUT_MAJOR,即13,次设备号为EVDEV_MINOR_BASE + minor,EVDEV_MINOR_BASE的值为64,就是说次设备号是从64开始往上递增的。
864行,注册handle,input_register_handle函数的定义为:
00001940 int input_register_handle(struct input_handle *handle) 00001941 { 00001942 struct input_handler *handler = handle->handler; 00001943 struct input_dev *dev = handle->dev; 00001944 int error; 00001945 00001946 /* 00001947 * We take dev->mutex here to prevent race with 00001948 * input_release_device(). 00001949 */ 00001950 error = mutex_lock_interruptible(&dev->mutex); 00001951 if (error) 00001952 return error; 00001953 00001954 /* 00001955 * Filters go to the head of the list, normal handlers 00001956 * to the tail. 00001957 */ 00001958 if (handler->filter) 00001959 list_add_rcu(&handle->d_node, &dev->h_list); 00001960 else 00001961 list_add_tail_rcu(&handle->d_node, &dev->h_list); 00001962 00001963 mutex_unlock(&dev->mutex); 00001964 00001965 /* 00001966 * Since we are supposed to be called from ->connect() 00001967 * which is mutually exclusive with ->disconnect() 00001968 * we can't be racing with input_unregister_handle() 00001969 * and so separate lock is not needed here. 00001970 */ 00001971 list_add_tail_rcu(&handle->h_node, &handler->h_list); 00001972 00001973 if (handler->start) 00001974 handler->start(handle); 00001975 00001976 return 0; 00001977 }
1958行,if条件不成立,所以执行1961行,将handle加入到Input设备的h_list链表的尾部。
1971行,将handle加入到handler的h_list链表的尾部。
1973行,如果handler有定义start函数,那么就调用之,显然,对于evdev.c这个handler是没有定义start函数的。
回到evdev_connect函数,868至870行,调用evdev_install_chrdev函数,定义如下:
00000773 static int evdev_install_chrdev(struct evdev *evdev) 00000774 { 00000775 /* 00000776 * No need to do any locking here as calls to connect and 00000777 * disconnect are serialized by the input core 00000778 */ 00000779 evdev_table[evdev->minor] = evdev; 00000780 return 0; 00000781 }
很简单,就是将evdev_table数组对应的元素指向该struct evdev实例。
872行,将dev加入到设备模型中。
至此evdev.c的初始化过程完毕。现在系统里已经具备Input设备和Input事件驱动程序,Input消息产生后应该就能到达事件驱动程序的缓冲区,等着用户程序将Input消息读取出来。下面就分析这一个过程。
首先应该知道Input消息产生的源头是按键的按下,按键按下后会触发中断,然后进入中断处理程序,所以应该从按键的中断处理程序看起,就是drivers/input/keyboard/gpio_keys.c里的gpio_keys_isr函数,它的定义如下:
00000346 static irqreturn_t gpio_keys_isr(int irq, void *dev_id) 00000347 { 00000348 struct gpio_button_data *bdata = dev_id; 00000349 struct gpio_keys_button *button = bdata->button; 00000350 00000351 BUG_ON(irq != gpio_to_irq(button->gpio)); 00000352 00000353 if (bdata->timer_debounce) 00000354 mod_timer(&bdata->timer, 00000355 jiffies + msecs_to_jiffies(bdata->timer_debounce)); 00000356 else 00000357 schedule_work(&bdata->work); 00000358 00000359 return IRQ_HANDLED; 00000360 }
353行,如果按键需要延时消抖的话,那么就启动定时器,否则调用357行的schedule_work函数,将work投入到工作队列里,这样,在一段时间过后work指定的函数将会被执行,这里假设是第一种情况,那么下面看定时器的超时处理函数gpio_keys_timer的定义:
00000339 static void gpio_keys_timer(unsigned long _data) 00000340 { 00000341 struct gpio_button_data *data = (struct gpio_button_data *)_data; 00000342 00000343 schedule_work(&data->work); 00000344 }
同样是调用schedule_work函数。接下来要看的是work指定的函数gpio_keys_work_func。
00000331 static void gpio_keys_work_func(struct work_struct *work) 00000332 { 00000333 struct gpio_button_data *bdata = 00000334 container_of(work, struct gpio_button_data, work); 00000335 00000336 gpio_keys_report_event(bdata); 00000337 }
336行,gpio_keys_report_event函数,前面说这个函数放到后面再说,现在就放到这里说,看内核代码需要保持一颗清醒的头脑哈。下面看它的定义:
00000320 static void gpio_keys_report_event(struct gpio_button_data *bdata) 00000321 { 00000322 struct gpio_keys_button *button = bdata->button; 00000323 struct input_dev *input = bdata->input; 00000324 unsigned int type = button->type ?: EV_KEY; 00000325 int state = (gpio_get_value(button->gpio) ? 1 : 0) ^ button->active_low; 00000326 00000327 input_event(input, type, button->code, !!state); 00000328 input_sync(input); 00000329 }
325行,调用gpio_get_value函数获取IO口的电平并将它异或上active_low,假设active_low的值为1,按键按下时IO的电平一般来说是低电平,即0,那么此时state的值就为1(异或:同为0,异为1)。
327行,调用input_event函数,向input core报告按键事件,在drivers/input/input.c中定义,如下:
00000346 void input_event(struct input_dev *dev, 00000347 unsigned int type, unsigned int code, int value) 00000348 { 00000349 unsigned long flags; 00000350 00000351 if (is_event_supported(type, dev->evbit, EV_MAX)) { 00000352 00000353 spin_lock_irqsave(&dev->event_lock, flags); 00000354 add_input_randomness(type, code, value); 00000355 input_handle_event(dev, type, code, value); 00000356 spin_unlock_irqrestore(&dev->event_lock, flags); 00000357 } 00000358 }
351行,is_event_supported函数的定义:
00000049 static inline int is_event_supported(unsigned int code, 00000050 unsigned long *bm, unsigned int max) 00000051 { 00000052 return code <= max && test_bit(code, bm); 00000053 }
函数返回1的条件是:事件类型的值不能大于input core支持的最大值并且Input设备的事件位图中相应的位已经置1。
回到input_event函数,假设if的条件成立,354行,随机数相关,没怎么了解并且对后面的分析没有影响,因此飘过。
355行,input_handle_event,这函数比较重要,看它的定义:
00000215 static void input_handle_event(struct input_dev *dev, 00000216 unsigned int type, unsigned int code, int value) 00000217 { 00000218 int disposition = INPUT_IGNORE_EVENT; 00000219 00000220 switch (type) { 00000221 00000222 case EV_SYN: 00000223 switch (code) { 00000224 case SYN_CONFIG: 00000225 disposition = INPUT_PASS_TO_ALL; 00000226 break; 00000227 00000228 case SYN_REPORT: 00000229 if (!dev->sync) { 00000230 dev->sync = true; 00000231 disposition = INPUT_PASS_TO_HANDLERS; 00000232 } 00000233 break; 00000234 case SYN_MT_REPORT: 00000235 dev->sync = false; 00000236 disposition = INPUT_PASS_TO_HANDLERS; 00000237 break; 00000238 } 00000239 break; 00000240 00000241 case EV_KEY: 00000242 if (is_event_supported(code, dev->keybit, KEY_MAX) && 00000243 !!test_bit(code, dev->key) != value) { 00000244 00000245 if (value != 2) { 00000246 __change_bit(code, dev->key); 00000247 if (value) 00000248 input_start_autorepeat(dev, code); 00000249 else 00000250 input_stop_autorepeat(dev); 00000251 } 00000252 00000253 disposition = INPUT_PASS_TO_HANDLERS; 00000254 } 00000255 break; 00000256 00000257 case EV_SW: 00000258 if (is_event_supported(code, dev->swbit, SW_MAX) && 00000259 !!test_bit(code, dev->sw) != value) { 00000260 00000261 __change_bit(code, dev->sw); 00000262 disposition = INPUT_PASS_TO_HANDLERS; 00000263 } 00000264 break; 00000265 00000266 case EV_ABS: 00000267 if (is_event_supported(code, dev->absbit, ABS_MAX)) 00000268 disposition = input_handle_abs_event(dev, code, &value); 00000269 00000270 break; 00000271 00000272 case EV_REL: 00000273 if (is_event_supported(code, dev->relbit, REL_MAX) && value) 00000274 disposition = INPUT_PASS_TO_HANDLERS; 00000275 00000276 break; 00000277 00000278 case EV_MSC: 00000279 if (is_event_supported(code, dev->mscbit, MSC_MAX)) 00000280 disposition = INPUT_PASS_TO_ALL; 00000281 00000282 break; 00000283 00000284 case EV_LED: 00000285 if (is_event_supported(code, dev->ledbit, LED_MAX) && 00000286 !!test_bit(code, dev->led) != value) { 00000287 00000288 __change_bit(code, dev->led); 00000289 disposition = INPUT_PASS_TO_ALL; 00000290 } 00000291 break; 00000292 00000293 case EV_SND: 00000294 if (is_event_supported(code, dev->sndbit, SND_MAX)) { 00000295 00000296 if (!!test_bit(code, dev->snd) != !!value) 00000297 __change_bit(code, dev->snd); 00000298 disposition = INPUT_PASS_TO_ALL; 00000299 } 00000300 break; 00000301 00000302 case EV_REP: 00000303 if (code <= REP_MAX && value >= 0 && dev->rep[code] != value) { 00000304 dev->rep[code] = value; 00000305 disposition = INPUT_PASS_TO_ALL; 00000306 } 00000307 break; 00000308 00000309 case EV_FF: 00000310 if (value >= 0) 00000311 disposition = INPUT_PASS_TO_ALL; 00000312 break; 00000313 00000314 case EV_PWR: 00000315 disposition = INPUT_PASS_TO_ALL; 00000316 break; 00000317 } 00000318 00000319 if (disposition != INPUT_IGNORE_EVENT && type != EV_SYN) 00000320 dev->sync = false; 00000321 00000322 if ((disposition & INPUT_PASS_TO_DEVICE) && dev->event) 00000323 dev->event(dev, type, code, value); 00000324 00000325 if (disposition & INPUT_PASS_TO_HANDLERS) 00000326 input_pass_event(dev, type, code, value); 00000327 }
220至317行,又是一个排比句,根据不同的事件类型执行相应的处理。这里由于type的值为EV_KEY,所以会执行242至255行之间的代码。
242行,if的第一个条件肯定是满足的。
243行,test_bit就是检查dev->key这个数组里的某一位的值,因为在初始化Input设备时这个数组全部被清0,所以test_bit的返回值为0,而value的值为1,因此第二个条件也满足,执行245行,if条件也满足,246行,__change_bit改变dev->key数组里对应位的值,即原来为1的话现在就为0,原来为0的话现在就为1。
247至250行,autorepeat相关的,这里没有用到这个功能,略过。
253行,disposition = INPUT_PASS_TO_HANDLERS,然后就跳出switch,到达319行,很明显,319、322行的if条件都不满足,而325行的if条件满足,所以执行326行的input_pass_event函数。