Jiri Kosina wrote: > Hi Li, > > first, please apologize my delay in the reply, the patches are quite > large and I have been busy with lots of different things lately. > > hehe, you are welcome. I had not touch this patch since last month, OK, let hid reload into the cache of my brain.
> There had been quite a long discussion some time ago, regarding the proper > way to design hidbus. As far as I recall it, we came to the conclusion > that the best way would be to allow defining of two different hooks - one > for raw data and another for parsed reports and let drivers decice which > one they want to use. I am missing the possibility to hook the parsed data > in your implementation, or did I just overlook something? > For parsed data? they are in it ~_~ +struct hid_hook { + int (*hid_event)(struct hid_field*, struct hid_usage*, __s32, int); + int (*pre_report_event)(struct hid_report*, int); + int (*report_event)(struct hid_report*, int); They works with parsed data, however with different call time, and different parameters. + void (*setup_usage)(struct hid_field*, struct hid_usage*); + struct usage_page_block *usage_page_table; +}; They are convenience API for parsed data, just like hid simple interface. Here is the core process logic in hid_input_report(): + if (!hid_report_pre_event(hid, report, interrupt)) + return 0; for (n = 0; n < report->maxfield; n++) hid_input_field(hid, report->field[n], data, interrupt); /* hid_event() and convenience API */ + hid_report_event(hid, report, interrupt); > Second, what is the exact point with hid_report_pre_event()? It is missing > any explanatory comment (which applies to other code in your patches BTW) > and I seem to be missing the point too. > > Ah, this may have a bit of overdesign. but removing it is easy. I think they can work before hid_input_field(), but take hid_report as input parameter. they are can work as hid_report filter. > Third, as far as my memory goes, I think we agreed that in order to design > the layering properly and allow individual specialized drivers to work > properly, the HID bus code should provide a way to register a driver for a > specific VID/PID and also the report id (one or more). Then all reports > for which there is no specialized driver are going to be handled by the > default HID->input driver (or could be handled into hidraw if the > in-kernel HID parser is unable to parse them). The reports for ids with a > special driver are handed over to the driver. I unfortunately seem to be > missing this functionality in the patch too ... ? > > Yes, you are right! May be, my memory is overflow? ;) I recall we agreed we need register with VID/PID before. and I also think let driver itself match report is better idea. As I guess, needing to match report id is special and special and special case. I do not like this make hid core complex. It seem that hid_report_pre_event() is good chance. > Last but not least, I have gone through this code several times, but I > still don't fully understand why the 'hid_transport' abstraction is > needed. I am still convinced that the current model works well, and there > should be absolutely no need for hid_(un)register_transport() and the > related things. Could some explanation please be put somewhere? (ideally > in the patch's changelog entry). > > OK, firse please see these two hid_transport instances: +static struct hid_transport hid_bt_transport = { + .bus = BUS_BLUETOOTH, + .event = hidp_hidinput_event, + .open = hidp_open, + .close = hidp_close, + .update_busid = hidp_update_busid, + .module = THIS_MODULE, +}; +static struct hid_transport hid_usb_transport = { + .bus = BUS_USB, + .module = THIS_MODULE, + .event = usb_hidinput_input_event, + .open = usbhid_open, + .close = usbhid_close, + .update_busid = usbhid_update_busid, + .raw_report = usbhid_raw_report, +}; I think whatever bluetooth or USB behind, although all hid driver is apparently equality, however, in fact, they are not so. the lightweight driver need some information from "standard" driver, I think the hid_transport is good place to find them. so hidp_hidinput_event()/usb_hidinput_input_event() live here. So, the author of driver need not take care of these commom code in their sweet driver, the only thing they need do is just fill hid_driver->bus with correct bus id. Of course, we also can remove hid_transport abstraction, instead of, just add these methods as EXPORT_GPL symbols, but I think this way more flexible, it also enable the drivers above same bus share pure data (hid_transport->private). > And more generally - the patches seem a little bit bigger than they could > be, I am not sure whether the layering and data structures you have are > not a little bit overdesigned. But this will need some more review. > > ^_^ These patches is named prototype, so the modification is unavoidable. Good luck. - Li Yu ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ linux-usb-devel@lists.sourceforge.net To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel