I use CSR1010 and wrote a BLE HID over Gatt application which sends only Play/Pause, Volume Increment/Decrement to iOS.
The report descriptor of the consumer report was configured as:
05 0C (GLOBAL) USAGE_PAGE 0x000C Consumer Device Page
09 01 (LOCAL) USAGE 0x000C0001 Consumer Control (CA=Application Collection)
A1 01 (MAIN) COLLECTION 0x01 Application (Usage=0x000C0001: Page=Consumer Device Page, Usage=Consumer Control, Type=CA)
85 01 (GLOBAL) REPORT_ID 0x01 (1)
19 00 (LOCAL) USAGE_MINIMUM 0x000C0000 Unassigned
2A 9C02 (LOCAL) USAGE_MAXIMUM 0x000C029C AC Distribute Vertically (Sel=Selector)
15 00 (GLOBAL) LOGICAL_MINIMUM 0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0
26 9C02 (GLOBAL) LOGICAL_MAXIMUM 0x029C (668)
95 01 (GLOBAL) REPORT_COUNT 0x01 (1) Number of fields
75 10 (GLOBAL) REPORT_SIZE 0x10 (16) Number of bits per field
81 00 (MAIN) INPUT 0x00000000 (1 field x 16 bits) 0=Data 0=Array 0=Absolute 0=Ignored 0=Ignored 0=PrefState 0=NoNull
C0 (MAIN) END_COLLECTION Application
I validated this report descriptor using hidrdd so I am quite confident that it will be parsed fine.
The raw data bytes sent to iOS as shown in the sniffer were 05 0c 09 01 a1 01 85 01 19 00 2a 9c 02 15 00 26 9c 02 95 01 75 10 81 00 c0
which is exactly as configured.
I also saw from the sniff result that iOS registered for notification from Client Character Configuration of the consumer report characteristic.
Everything looks good but when I send 2 bytes 0xcd 0x00
(Play/Pause) to iOS, nothing happens.
Now I just felt like I did everything I could but iOS was still unhappy. There is no way to tell what iOS is unhappy about because there is no iOS app involved. Can anybody who has experience in this give me some pointers?
[EDIT] Added some screenshots of the sniffer below:
When you include a report id in your report descriptor then all HID reports (on that interface) must be prefixed with a report id. In your case you would need to send a 3 byte report:
0x01 0xcd 0x00
...or remove the report id from your report descriptor.