Hi Erik, On Thu, Apr 23, 2020 at 11:07 AM Erik Andresen <erik@xxxxxxxxxxx> wrote: > > Hi, > > > I have a simple bluetooth hid device which does work in Android but not with Linux 4.19/Bluez 5. It does have two collections in its hid description: > 0xA1, 0x01, // Collection (Application) > 0x85, 0x02, // Report ID (2) > (...) > 0xC0, // End Collection > 0xA1, 0x01, // Collection (Application) > 0x85, 0x01, // Report ID (1) > (...) > 0xC0, // End Collection > > Complete description is attached. > > Since there are multiple collections I understand that every report has to be prefixed with the id, so I send > [2,0,0,0x52,0,0,0,0,0] (9 bytes) for the keycode 0x52, ID is 2. > > Output from btmon is: > > ACL Data RX: Handle 3585 flags 0x02 dlen 16 #2072 [hci0] 485.047387 > ATT: Handle Value Notification (0x1b) len 11 > Handle: 0x0015 > Data: 020000520000000000 > > This looks good for me so far, unfortunately Linux does not pick it up, in dmesg I get: > drivers/hid/hid-core.c: undefined report_id 0 received > > cat /sys/kernel/debug/hid/0005:0000:0000.0003/events # gives me: > report (size 10) (numbered) = 00 02 00 00 52 00 00 00 00 00 > so I get 10 bytes instead the 9 I send > > So far I traced it to hog-lib.c, report_value_cb() of bluez where this extra 0 is prepended in the if (hog->has_report_id) block. > report->id is 0 at this point. If I skip this extra addition of the zero or manually set id=2 here it works as expected. Does someone has an idea what I do wrong or what I'm missing? Afaik each report ID will need to have its own characteristic, at least that is how HIDS has put the spec, but if I got you right the report->id is never initialized on report_reference_cb so this might be how Android is detecting if there is a report ID or not, we should be able to confiirm this if we have access to the HCI trace when discovering the services. > greetings, > Erik Andresen -- Luiz Augusto von Dentz