Android InputFliger流程分析,从内核 Hid到EventHub,InputRead,InputDispatcher(一)

最近在做Android触摸项目,需要把触摸框的数据精准传输到应用层,同时对上报的数据做公司业务处理,即对触摸点的x,y,w,h,tooltype做相应定制.

有三个方案可以解决该问题.

1.定制自己的driver,在driver里面处理数据,然后通过inpu_event进行标示输入事件上报

2.在InputFliger里面对数据进行处理,然后Dispatcher到应用层

3.应用层自己处理,底层只负责上报.

如果是标准的HID协议,没有加私有定制,方案2比较好.如果是非标的HID协议,方案1比较好.如果时间比较紧,方案3,相当于把问题绕过去,让应用层自己处理.方案3的缺点就是对于不同个框得挨个适配,不好维护,架构也不对.

下面按方案2来梳理触控数据的数据流向,方便自己对公司的业务就行处理.

一.内核层

1.usbhid设备的初始化流程,在内核里面通过printk("fun %s,line %d",__FUNCTION__,__LINE__)打印获得,可以看到先是出发的usbhid/hid-core.c里面的probe函数.然后通过hid_add_device()执行到bus(bus类型是hid)里面的hid_device_probe()函数.重点的判断有无自己的probe函数,即有无机制的驱动,如果有自己驱动会去执行,无则hid_open_report().

代码如下:

usbhid/hid-core.c

static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id *id)
1271 {
1272     struct usb_host_interface *interface = intf->cur_altsetting;
1273     struct usb_device *dev = interface_to_usbdev(intf);
1274     struct usbhid_device *usbhid;
1275     struct hid_device *hid;
1276     unsigned int n, has_in = 0;
1277     size_t len;
1278     int ret;
1279     printk("fun %s, line %d\n",__FUNCTION__,__LINE__);
...

11357     ret = hid_add_device(hid);
1358     printk("fun %s, line %d\n",__FUNCTION__,__LINE__);
1359     if (ret) {
1360         if (ret != -ENODEV)
1361             hid_err(intf, "can't add hid device: %d\n", ret);
1362         goto err_free;
1363     }
1364 
1365     return 0;
1366 err_free:
1367     kfree(usbhid);
1368 err:
1369     hid_destroy_device(hid);
1370     return ret;
1371 }

hid-core.c

22 static in
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值