У меня есть hid_discriptor, который выглядит так:
// from USB HID Specification 1.1, Appendix B.1
const uint8_t hid_descriptor_keyboard_boot_mode[] = {
/*
Keyboard
*/
0x05, 0x01, // Usage Page (Generic Desktop)
0x09, 0x06, // Usage (Keyboard)
0xa1, 0x01, // Collection (Application)
0x85, 0x01, // Report ID 1
// Modifier byte
0x75, 0x01, // Report Size (1)
0x95, 0x08, // Report Count (8)
0x05, 0x07, // Usage Page (Key codes)
0x19, 0xe0, // Usage Minimum (Keyboard LeftControl)
0x29, 0xe7, // Usage Maxium (Keyboard Right GUI)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x81, 0x02, // Input (Data, Variable, Absolute)
// Reserved byte
0x75, 0x01, // Report Size (1)
0x95, 0x08, // Report Count (8)
0x81, 0x03, // Input (Constant, Variable, Absolute)
// LED report + padding
0x95, 0x05, // Report Count (5)
0x75, 0x01, // Report Size (1)
0x05, 0x08, // Usage Page (LEDs)
0x19, 0x01, // Usage Minimum (Num Lock)
0x29, 0x05, // Usage Maxium (Kana)
0x91, 0x02, // Output (Data, Variable, Absolute)
0x95, 0x01, // Report Count (1)
0x75, 0x03, // Report Size (3)
0x91, 0x03, // Output (Constant, Variable, Absolute)
// Keycodes
0x95, 0x06, // Report Count (6)
0x75, 0x08, // Report Size (8)
0x15, 0x00, // Logical Minimum (0)
0x25, 0xff, // Logical Maximum (1)
0x05, 0x07, // Usage Page (Key codes)
0x19, 0x00, // Usage Minimum (Reserved (no event indicated))
0x29, 0xff, // Usage Maxium (Reserved)
0x81, 0x00, // Input (Data, Array)
0xc0, // End collection
};
, который работает для кодов клавиатуры;
Однако я также хотел бы добавить потребительский контроль к своему образцу, чтобы я также мог отправлять громкость вверх / вниз и т. Д.
/*
Consumer Control
*/
0x05, 0x0C, // Usage Page (Consumer Devices)
0x09, 0x01, // Usage (Consumer Control)
0xA1, 0x01, // Collection (Application)
0x85, 0x02, // Report ID
0x75, 0x09, 0x01, // Report Size
0x95, 0x09, 0x01, // Report Count
0x15, 0x00, // Logical Minimum (0)
0x26, 0xFF, 0x07, // Logical Maximum (2047)
0x19, 0x00, // Usage Minimum (0)
0x2A, 0xFF, 0x07, // Usage Maximum (2047)
0x81, 0x00, // Input (Data, Ary, Abs)
0xC0,
Вопрос в том, что в предоставленном демо-коде ; код для отправки отчета: 1011 *
static void send_report(int modifier, int keycode){
uint8_t report[] = { /* 0xa1, */ modifier, 0, 0, keycode, 0, 0, 0, 0, 0};
hids_device_send_input_report(con_handle, report, sizeof(report));
}
Это работает с точки зрения отправки нажатий клавиш; когда я отслеживаю этот вызов в исходном коде, он переходит к этой функции ;
void hids_device_send_input_report(hci_con_handle_t con_handle, const uint8_t * report, uint16_t report_len){
hids_device_t * instance = hids_device_get_instance_for_con_handle(con_handle);
if (!instance){
log_error("no instance for handle 0x%02x", con_handle);
return;
}
att_server_notify(con_handle, instance->hid_report_input_value_handle, report, report_len);
}
Который на самом деле использует instance->hid_report_input_value_handle
вместо hid_descriptor_keyboard_boot_mode; я также знаю почему (если люди задаются вопросом); В спецификации упоминается ;
Подкласс 1 HID определяет два дескриптора для загрузочных устройств. Устройства могут
добавьте дополнительные данные в эти отчеты о загрузке, но первые 8 байтов отчетов с клавиатуры и первые 3 байта отчетов мыши должны соответствовать формату, определенному дескриптором Boot Report, чтобы данные правильно интерпретировались BIOS.
... чик ...
Когда драйвер класса HID загружен, он выдаст протокол изменения,
переход от протокола загрузки к протоколу отчета после прочтения дескриптора отчета интерфейса загрузки.
Так после протокола изменения вызывается; отчет загружается в hid_report_input_value_handle
. Так что до сих пор все ясно.
Тогда возникает главный вопрос; КАК мне отправить контроль потребителя на мое сопряженное устройство? Это просто вопрос добавления reportId? например, * 1 037 *
Для клавиш клавиатуры в качестве события нажатия клавиши:
uint8_t report[] = { 0x01, modifier, 0, 0, keycode, 0, 0, 0, 0, 0};
hids_device_send_input_report(con_handle, report, sizeof(report));
И для контроля потребителя (воспроизведение / пауза) в качестве события нажатия клавиши:
uint8_t report[] = { 0x02, 0xCD, 0x00};
hids_device_send_input_report(con_handle, report, sizeof(report));
Это правильно? Любое руководство будет приветствоваться, BLE является новым для меня, поэтому вопрос.