最近在做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