Android 4.0触摸屏消息(writing)
“消息”一词最早出现于《易经》:“日中则昃,月盈则食,天地盈虚,与时消息。“意思是说,太阳到了中午就要逐渐西斜,月亮圆了就逐渐亏缺,天地间的事物,或丰盈或虚弱,都随着时间的推移而变化,有时消减,有时滋长。由此可见,中国古代就把客观世界的变化,把它们的发生、发展和结局,把它们的枯荣、聚散、沉浮、升降、兴衰、动静、得失等等变化中的事实称之为”消息“。----------摘自度娘。因此,在此处我们所要学习的消息也是有这样的一种产生,发展和结束的过程。而产生就是指当硬件接受到人的触摸的情况之下,通过中断将消息上报,从而我们能够通过上层的线程得到这个消息,而具体是如何处理的都将通过线程内部或者线程间的调用完成,最后通过分发线程将消息分发出去供消费者去消耗。
在深入学习之前我们先要思考如下几个问题:
1 消息是如何让系统得到的?
2 消息是如何被系统读取和处理的?
3 应用程序开发者是如何利用消息的?
1 首先kernel中我们会使用下面的函数来上报事件。(linux/input.h)
设置:
1227 unsigned long evbit[BITS_TO_LONGS(EV_CNT)];
1228 unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];
1229 unsigned long relbit[BITS_TO_LONGS(REL_CNT)];
1230 unsigned long absbit[BITS_TO_LONGS(ABS_CNT)];
上报:
1474 static inline void input_report_key(struct input_dev *dev, unsigned int code, int value)
1475 {
1476 input_event(dev, EV_KEY, code, !!value);
1477 }
1478
1479 static inline void input_report_rel(struct input_dev *dev, unsigned int code, int value)
1480 {
1481 input_event(dev, EV_REL, code, value);
1482 }
1483
1484 static inline void input_report_abs(struct input_dev *dev, unsigned int code, int value)
1485 {
1486 input_event(dev, EV_ABS, code, value);
1487 }
其中调用的input_event函数如下:
347 void input_event(struct input_dev *dev,
348 unsigned int type, unsigned int code, int value)
349 {
350 unsigned long flags;
351
352 if (is_event_supported(type, dev->evbit, EV_MAX)) {
353
354 spin_lock_irqsave(&dev->event_lock, flags);
355 add_input_randomness(type, code, value);
356 input_handle_event(dev, type, code, value);
357 spin_unlock_irqrestore(&dev->event_lock, flags);
358 }
359 }
360 EXPORT_SYMBOL(input_event);
此处的input_handle_event()会调用到input_pass_event()函数
77 static void input_pass_event(struct input_dev *dev,
78 unsigned int type, unsigned int code, int value)
79 {
80 struct input_handler *handler;
81 struct input_handle *handle;
82
83 rcu_read_lock();
84
85 handle = rcu_dereference(dev->grab);
86 if (handle)
87 handle->handler->event(handle, type, code, value);
88 else {
89 bool filtered = false;
90
91 list_for_each_entry_rcu(handle, &dev->h_list, d_node) {
92 if (!handle->open)
93 continue;
94
95 handler = handle->handler;
96 if (!handler->filter) {
97 if (filtered)
98 break;
99
100 handler->event(handle, type, code, value);
101
102 } else if (handler->filter(handle, type, code, value))
103 filtered = true;
104 }
105 }
106
107 rcu_read_unlock();
108 }
上面的handler就是函数evdev_handler()。定义在evdev.c文件中。在evdev_init()中通过调用input_register_handler(&ev_handler)的注册完成了input_dev和evdev_handler的关联。并且调用了evdev_event()函数完成了对evdev_pass_event()将数据存放在buffer中。代码如下:
59 static void evdev_pass_event(struct evdev_client *client,
60 struct input_event *event)
61 {
62 /* Interrupts are disabled, just acquire the lock. */
63 spin_lock(&client->buffer_lock);
64
65 wake_lock_timeout(&client->wake_lock, 5 * HZ);
66 client->buffer[client->head++] = *event;
67 client->head &= client->bufsize - 1;
68
69 if (unlikely(client->head == client->tail)) {
补充:移动开发 , Android ,