This is cleaner IMO. * usb_hid_item deals with parsing the report descriptor. * usb_hid_usage has tables that define each usage.