This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

sending media keys over the keyboard HID

Hi,

sorry if this is a stupid question, but i'm fairly new to BLE (nRF8001), and even newer at report descriptors.

I'm trying to send some media keys, just volume up/down to start with.

i've edited the HID_keyboard template file in the arduino SDK, using the HID_mouse as an example - as it has media keys.

Please see my report descriptor below.

in the nRFgo studio program, i've edited the report descriptor/report map, added the new report ID characteristic and assigned a pipe to it, set to notify. Again i got this from the HID_mouse example.

My questions are:

    • how many bytes do i need to send (i notice the max is set to 3)
    • i know i need to send 0x10 for volume down, 0x20 for volume up, but what other data do i need to send? e.g. do i need to reference the report ID

can anyone suggest why it might not be working on iOS7

Note: the keyboard portion of the code works correctly.


report descriptor:

0x05, 0x01, // Usage Page (Generic Desktop) 0x09, 0x06, // Usage (Keyboard) 0xA1, 0x01, // Collection (Application)

0x85, 0x01, // Report Id 1 0x05, 0x07, // Usage Page (Key Codes) 0x19, 0xe0, // Usage Minimum (224) 0x29, 0xe7, // Usage Maximum (231) 0x15, 0x00, // Logical Minimum (0) 0x25, 0x01, // Logical Maximum (1) 0x75, 0x01, // Report Size (1) 0x95, 0x08, // Report Count (8) 0x81, 0x02, // Input (Data, Variable, Absolute)

0x95, 0x01, // Report Count (1) 0x75, 0x08, // Report Size (8) 0x81, 0x01, // Input (Constant) reserved byte(1)

0x95, 0x05, // Report Count (5) 0x75, 0x01, // Report Size (1) 0x05, 0x08, // Usage Page (Page# for LEDs) 0x19, 0x01, // Usage Minimum (1) 0x29, 0x05, // Usage Maximum (5) 0x91, 0x02, // Output (Data, Variable, Absolute), Led report 0x95, 0x01, // Report Count (1) 0x75, 0x03, // Report Size (3) 0x91, 0x01, // Output (Data, Variable, Absolute), Led report padding

0x95, 0x06, // Report Count (6) 0x75, 0x08, // Report Size (8) 0x15, 0x00, // Logical Minimum (0) 0x25, 0x65, // Logical Maximum (101) 0x05, 0x07, // Usage Page (Key codes) 0x19, 0x00, // Usage Minimum (0) 0x29, 0x65, // Usage Maximum (101) 0x81, 0x00, // Input (Data, Array) Key array(6 bytes)

0x09, 0x05, // Usage (Vendor Defined) 0x15, 0x00, // Logical Minimum (0) 0x26, 0xFF, 0x00, // Logical Maximum (255) 0x75, 0x08, // Report Count (2) 0x95, 0x02, // Report Size (8 bit) 0xB1, 0x02, // Feature (Data, Variable, Absolute) 0xC0 // End Collection (Application)

// Report ID 2: Advanced buttons

0x05, 0x0C, // Usage Page (Consumer) 0x09, 0x01, // Usage (Consumer Control) 0xA1, 0x01, // Collection (Application) 0x85, 0x02, // Report Id 2

0x15, 0x00, // Logical minimum (0) 0x25, 0x01, // Logical maximum (1) 0x75, 0x01, // Report Size (1) 0x95, 0x01, // Report Count (1)

0x09, 0xCD, // Usage (Play/Pause) 0x81, 0x06, // Input (Data,Value,Relative,Bit Field) 0x0A, 0x83, 0x01, // Usage (AL Consumer Control Configuration) 0x81, 0x06, // Input (Data,Value,Relative,Bit Field) 0x09, 0xB5, // Usage (Scan Next Track) 0x81, 0x06, // Input (Data,Value,Relative,Bit Field)
0x09, 0xB6, // Usage (Scan Previous Track) 0x81, 0x06, // Input (Data,Value,Relative,Bit Field)

0x09, 0xEA, //Usage (Volume Down)
0x81, 0x06, // Input (Data,Value,Relative,Bit Field) 0x09, 0xE9, //Usage (Volume Up) 0x81, 0x06, // Input (Data,Value,Relative,Bit Field) 0x0A, 0x25, 0x02, // Usage (AC Forward) 0x81, 0x06, // Input (Data,Value,Relative,Bit Field) 0x0A, 0x24, 0x02, // Usage (AC Back) 0x81, 0x06, // Input (Data,Value,Relative,Bit Field)

0xC0 // End Collection (Application)


function to send the data:

if (lib_aci_is_pipe_available(&aci_state, PIPE_HID_SERVICE_HID_REPORT_ID2_TX) && (aci_state.data_credit_available == 2)) {

sendMedia[0] = 0X20;		//volume up data
sendMedia[1] = 0x00;		
sendMedia[2] = 0x00;


lib_aci_send_data(PIPE_HID_SERVICE_HID_REPORT_ID2_TX, &sendMedia[0], 3);
aci_state.data_credit_available--;


sendMedia[0] = 0x00;		//no press data
sendMedia[1] = 0x00;
sendMedia[2] = 0x00;


lib_aci_send_data(PIPE_HID_SERVICE_HID_REPORT_ID2_TX, &sendMedia[0], 3);
aci_state.data_credit_available--;

} //available credit


kind regards, Damian

  • Hi,

    thanks for your quick response.

    Yes i have seen that video, and i believe i have implemented the report map correctly. i've now attached the nRFgo studio file.

    The keyboard part of it is working correctly, only the added media keys that are not working.

    my query is more around the transmission of the data once paired. If you look at my function to send the data, i'm not sure if i'm sending the correct number of bytes, and if the data should be in the first byte, or second byte, etc.

    Or i could be completely wrong, like i said, i'm new at this.

    thanks again, Damian

    hid_keyboard_with_media_keys.xml

  • Hi Damian,

    I took a look at your HID report map. In the report ID 2, where you are trying to add advanced keys, I didn't see the report count and size set to your control usage(e.g. VolumeUp).

    For your question

      • how many bytes do i need to send (i notice the max is set to 3) For this question, I would suggest you read some related material about HID device. Or a quick and alternative way is taking careful look at the report map in report ID 1 about the report size and count. In Nordic's example for keyboard, you would have to send a 8-byte array. Because there are eight counts of size 8 reports.

    And from my point of view, both of your questions are actual the same one. Hope it helps.

    Jay

  • I would suggest that you change the keyboard input report to Report ID of 1 since you are adding a new input report. The media keys should then be made Report ID 2 (input report).

    You may also want to change the output report to have a Report ID of 1 (output report).

    You need to update the USB descriptor and the Report Reference characteristic descriptor with the above details.

    Let me know if any of the suggestions help.

  • Hi Jay, thanks for your response.

    this was a copy and paste from the HID_mouse example, so i just assumed that the report size and count was correct, but you could be right. Looking at the size it appears to be set to 1 bit, but i require sending 1 byte.

    Is this how you interpret it? i think i've got a lot more reading to do.

    thanks, Damian

Related