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

Parents
  • 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.

Reply
  • 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.

Children
No Data
Related