Android中Input型输入设备驱动原理分析<二>
来源:互联网 发布:网络用语wtf什么意思 编辑:程序博客网 时间:2024/04/29 16:03
驱动层只是把输入设备注册到输入子系统中,驱动层的代码本身是没有创建设备节点的,而是由EventHander层调用InputCore中的函数来实现,当某个事件触发时都将通过input _event()来将input event传送到input.c中,再由input.c分配事件到每一个"input handler"
2)input _event()是怎么实现的
void input_event(struct input_dev *dev,unsigned int type, unsigned int code, int value)
{
unsigned long flags;
if (is_event_supported(type, dev->evbit, EV_MAX)) {
spin_lock_irqsave(&dev->event_lock, flags);
add_input_randomness(type, code, value);
input_handle_event(dev, type, code, value);
spin_unlock_irqrestore(&dev->event_lock, flags);
}
}
{
int disposition = INPUT_IGNORE_EVENT;
switch (type) {
case EV_SYN:
switch (code) {
case SYN_CONFIG:
disposition = INPUT_PASS_TO_ALL;
break;
case SYN_REPORT:
if (!dev->sync) {
dev->sync = true;
disposition = INPUT_PASS_TO_HANDLERS;
}
break;
case SYN_MT_REPORT:
dev->sync = false;
disposition = INPUT_PASS_TO_HANDLERS;
break;
}
break;
case EV_KEY:
if (is_event_supported(code, dev->keybit, KEY_MAX) &&
!!test_bit(code, dev->key) != value) {
if (value != 2) {
__change_bit(code, dev->key);
if (value)
input_start_autorepeat(dev, code);
else
input_stop_autorepeat(dev);
}
disposition = INPUT_PASS_TO_HANDLERS;
}
break;
case EV_SW:
if (is_event_supported(code, dev->swbit, SW_MAX) &&
!!test_bit(code, dev->sw) != value) {
__change_bit(code, dev->sw);
disposition = INPUT_PASS_TO_HANDLERS;
}
break;
case EV_ABS:
if (is_event_supported(code, dev->absbit, ABS_MAX))
disposition = input_handle_abs_event(dev, code, &value);
break;
case EV_REL:
if (is_event_supported(code, dev->relbit, REL_MAX) && value)
disposition = INPUT_PASS_TO_HANDLERS;
break;
case EV_MSC:
if (is_event_supported(code, dev->mscbit, MSC_MAX))
disposition = INPUT_PASS_TO_ALL;
break;
case EV_LED:
if (is_event_supported(code, dev->ledbit, LED_MAX) &&
!!test_bit(code, dev->led) != value) {
__change_bit(code, dev->led);
disposition = INPUT_PASS_TO_ALL;
}
break;
case EV_SND:
if (is_event_supported(code, dev->sndbit, SND_MAX)) {
if (!!test_bit(code, dev->snd) != !!value)
__change_bit(code, dev->snd);
disposition = INPUT_PASS_TO_ALL;
}
break;
case EV_REP:
if (code <= REP_MAX && value >= 0 && dev->rep[code] != value) {
dev->rep[code] = value;
disposition = INPUT_PASS_TO_ALL;
}
break;
case EV_FF:
if (value >= 0)
disposition = INPUT_PASS_TO_ALL;
break;
case EV_PWR:
disposition = INPUT_PASS_TO_ALL;
break;
}
if (disposition != INPUT_IGNORE_EVENT && type != EV_SYN)
dev->sync = false;
if ((disposition & INPUT_PASS_TO_DEVICE) && dev->event)
dev->event(dev, type, code, value);
if (disposition & INPUT_PASS_TO_HANDLERS)
input_pass_event(dev, type, code, value);
}
- Android中Input型输入设备驱动原理分析(二)
- Android中Input型输入设备驱动原理分析<二>
- Android中Input型输入设备驱动原理分析(一)
- Android中Input型输入设备驱动原理分析<一>
- Android中Input型输入设备驱动原理分析
- Android中Input型输入设备驱动原理分析
- Android中Input型输入设备驱动原理分析(一)
- Android中Input型输入设备驱动原理分析
- Android中Input型输入设备驱动原理分析<一>
- Input型输入设备驱动原理分析
- input 输入设备平台驱动
- 输入设备驱动(input子系统)
- linux input设备驱动分析
- input输入子系统驱动分析
- ads7846驱动及android系统input输入子系统分析
- linux input输入子系统分析《二》:s3c2440的ADC简单驱动实例分析
- linux input输入子系统分析《二》:s3c2440的ADC简单驱动实例分析
- linux input输入子系统分析《二》:s3c2440的ADC简单驱动实例分析
- Android ApiDemos示例解析(170):Views->Lists->3. Cursor (Phones)
- 编程中的对齐
- Linq实现查询列表某一列,并绑定到DropDownList(原)
- 大端 小端
- NiosII下UCOS和移植Linux教程
- Android中Input型输入设备驱动原理分析<二>
- Spring单元测试
- Dell开机报Alert! Previous fan failure错误
- Quartz 2D编程指南(1) - 概览
- 揭开正则表达式的神秘面纱
- 数组指针 指针数组 指向数组 的区别
- 全局搜索的时候报错problems encountered during text search
- 扫描线算法-求线段交点数量
- .NET开发不可错过的25款必备工具