diff --git a/epicardium/ble/ble_main.c b/epicardium/ble/ble_main.c index f952c560db75b8cbc95db25366e56dd60817ccc9..b6d662bed65704cc500d00f9df8ab712ad67aa10 100644 --- a/epicardium/ble/ble_main.c +++ b/epicardium/ble/ble_main.c @@ -235,9 +235,9 @@ static const attsCccSet_t bleCccSet[BLE_NUM_CCC_IDX] = {ESS_PRES_CH_CCC_HDL, ATT_CLIENT_CFG_NOTIFY, DM_SEC_LEVEL_NONE}, /* BLE_ESS_PRES_CCC_IDX */ {HID_MOUSE_BOOT_IN_CH_CCC_HDL, ATT_CLIENT_CFG_NOTIFY, DM_SEC_LEVEL_NONE}, /* HIDAPP_MBI_CCC_HDL */ {HID_KEYBOARD_BOOT_IN_CH_CCC_HDL, ATT_CLIENT_CFG_NOTIFY, DM_SEC_LEVEL_NONE}, /* HIDAPP_KBI_CCC_HDL */ - {HID_INPUT_REPORT_1_CH_CCC_HDL, ATT_CLIENT_CFG_NOTIFY, DM_SEC_LEVEL_NONE}, /* HIDAPP_IN_CONSUMER_CCC_HDL */ - {HID_INPUT_REPORT_2_CH_CCC_HDL, ATT_CLIENT_CFG_NOTIFY, DM_SEC_LEVEL_NONE}, /* HIDAPP_IN_KEYBOARD_CCC_HDL */ - {HID_INPUT_REPORT_3_CH_CCC_HDL, ATT_CLIENT_CFG_NOTIFY, DM_SEC_LEVEL_NONE}, /* HIDAPP_IN_MOUSE_CCC_HDL */ + {HID_INPUT_REPORT_1_CH_CCC_HDL, ATT_CLIENT_CFG_NOTIFY, DM_SEC_LEVEL_NONE}, /* HIDAPP_IN_KEYBOARD_CCC_HDL */ + {HID_INPUT_REPORT_2_CH_CCC_HDL, ATT_CLIENT_CFG_NOTIFY, DM_SEC_LEVEL_NONE}, /* HIDAPP_IN_MOUSE_CCC_HDL */ + {HID_INPUT_REPORT_3_CH_CCC_HDL, ATT_CLIENT_CFG_NOTIFY, DM_SEC_LEVEL_NONE}, /* HIDAPP_IN_CONSUMER_CCC_HDL */ }; /************************************************************************************************** diff --git a/epicardium/ble/cccd.h b/epicardium/ble/cccd.h index d3c063d06a0da1953f2987adcd1523c5bc66c3fd..ea91c630617a13ad159146cf782d6860dd50a88e 100644 --- a/epicardium/ble/cccd.h +++ b/epicardium/ble/cccd.h @@ -9,9 +9,9 @@ enum BLE_ESS_PRES_CCC_IDX, /*! Environmental sensing service, pressure characteristic */ HIDAPP_MBI_CCC_HDL, /*! HID Boot Mouse Input characteristic */ HIDAPP_KBI_CCC_HDL, /*! HID Boot Keyboard Input characteristic */ - HIDAPP_IN_CONSUMER_CCC_HDL, /*! HID Input Report characteristic for consumer control inputs */ HIDAPP_IN_KEYBOARD_CCC_HDL, /*! HID Input Report characteristic for keyboard inputs */ HIDAPP_IN_MOUSE_CCC_HDL, /*! HID Input Report characteristic for mouse inputs */ + HIDAPP_IN_CONSUMER_CCC_HDL, /*! HID Input Report characteristic for consumer control inputs */ BLE_NUM_CCC_IDX }; diff --git a/epicardium/ble/hid.c b/epicardium/ble/hid.c index be67305bbef87ef6cde3c9472a8fdb13fa0db02e..0edcd89dc6f3b70797faf1dc2aeb72ff37ad8d7a 100644 --- a/epicardium/ble/hid.c +++ b/epicardium/ble/hid.c @@ -19,80 +19,111 @@ /*! HidApp Report Map (Descriptor) */ /* clang-format off */ + +/* Based on https://github.com/adafruit/Adafruit_CircuitPython_BLE/blob/master/adafruit_ble/services/standard/hid.py */ const uint8_t hidReportMap[] = { - 0x05, 0x0C, /* Usage Page (Consumer) */ - 0x09, 0x01, /* Usage (Consumer Control) */ - 0xA1, 0x01, /* Collection (Application) */ - 0x85, HIDAPP_CONSUMER_REPORT_ID,/* Report ID (HIDAPP_CONSUMER_REPORT_ID) */ - 0x75, 0x10, /* Report Size (16) */ - 0x95, 0x01, /* Report Count (1) */ - 0x15, 0x01, /* Logical Minimum (1) */ - 0x26, 0x8C, 0x02, /* Logical Maximum (652) */ - 0x19, 0x01, /* Usage Minimum (Consumer Control) */ - 0x2A, 0x8C, 0x02, /* Usage Maximum (AC Send) */ - 0x81, 0x00, /* Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position) */ - 0xC0, /* End Collection */ - 0x05, 0x01, /* Usage Page (Generic Desktop) */ - 0x09, 0x06, /* Usage (Keyboard) */ - 0xA1, 0x01, /* Collection (Application) */ - 0x85, HIDAPP_KEYBOARD_REPORT_ID, /* report ID (HIDAPP_KEYBOARD_REPORT_ID) */ - 0x75, 0x01, /* Report Size (1) */ - 0x95, 0x08, /* Report Count (8) */ - 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) */ - 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 (Constant), 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) */ - 0xC0, /* End Collection (Application) */ - 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */ - 0x09, 0x02, /* USAGE (Mouse) */ - 0xa1, 0x01, /* COLLECTION (Application) */ - 0x85, HIDAPP_MOUSE_REPORT_ID, /* report ID (HIDAPP_MOUSE_REPORT_ID) */ - 0x09, 0x01, /* USAGE (Pointer) */ - 0xa1, 0x00, /* COLLECTION (Physical) */ - 0x95, 0x03, /* REPORT_COUNT (3) */ - 0x75, 0x01, /* REPORT_SIZE (1) */ - 0x05, 0x09, /* USAGE_PAGE (Button) */ - 0x19, 0x01, /* USAGE_MINIMUM (Button 1) */ - 0x29, 0x03, /* USAGE_MAXIMUM (Button 3) */ - 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ - 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ - 0x81, 0x02, /* INPUT (Data, Variable, Absolute) */ - 0x95, 0x01, /* REPORT_COUNT (1) */ - 0x75, 0x05, /* REPORT_SIZE (5) */ - 0x81, 0x01, /* INPUT (Constant) */ - 0x75, 0x08, /* REPORT_SIZE (8) */ - 0x95, 0x02, /* REPORT_COUNT (2) */ - 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */ - 0x09, 0x30, /* USAGE (X) */ - 0x09, 0x31, /* USAGE (Y) */ - 0x15, 0x81, /* LOGICAL_MINIMUM (-127) */ - 0x25, 0x7f, /* LOGICAL_MAXIMUM (127) */ - 0x81, 0x06, /* INPUT (Data, Variable, Relative) */ - 0xc0, /* End Collection (Physical) */ - 0xc0 /* End Collection (Application) */ + 0x05, 0x01, /* Usage Page (Generic Desktop Ctrls) */ + 0x09, 0x06, /* Usage (Keyboard) */ + 0xA1, 0x01, /* Collection (Application) */ + 0x85, HIDAPP_KEYBOARD_REPORT_ID, /* Report ID (1) */ + 0x05, 0x07, /* Usage Page (Kbrd/Keypad) */ + 0x19, 0xE0, /* Usage Minimum (\xE0) */ + 0x29, 0xE7, /* Usage Maximum (\xE7) */ + 0x15, 0x00, /* Logical Minimum (0) */ + 0x25, 0x01, /* Logical Maximum (1) */ + 0x75, 0x01, /* Report Size (1) */ + 0x95, 0x08, /* Report Count (8) */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) */ + 0x81, 0x01, /* Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position) */ + 0x19, 0x00, /* Usage Minimum (\x00) */ + 0x29, 0x89, /* Usage Maximum (\x89) */ + 0x15, 0x00, /* Logical Minimum (0) */ + 0x25, 0x89, /* Logical Maximum (137) */ + 0x75, 0x08, /* Report Size (8) */ + 0x95, 0x06, /* Report Count (6) */ + 0x81, 0x00, /* Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position) */ + 0x05, 0x08, /* Usage Page (LEDs) */ + 0x19, 0x01, /* Usage Minimum (Num Lock) */ + 0x29, 0x05, /* Usage Maximum (Kana) */ + 0x15, 0x00, /* Logical Minimum (0) */ + 0x25, 0x01, /* Logical Maximum (1) */ + 0x75, 0x01, /* Report Size (1) */ + 0x95, 0x05, /* Report Count (5) */ + 0x91, 0x02, /* Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) */ + 0x95, 0x03, /* Report Count (3) */ + 0x91, 0x01, /* Output (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) */ + 0xC0, /* End Collection */ + 0x05, 0x01, /* Usage Page (Generic Desktop Ctrls) */ + 0x09, 0x02, /* Usage (Mouse) */ + 0xA1, 0x01, /* Collection (Application) */ + 0x09, 0x01, /* Usage (Pointer) */ + 0xA1, 0x00, /* Collection (Physical) */ + 0x85, HIDAPP_MOUSE_REPORT_ID, /* Report ID (2) */ + 0x05, 0x09, /* Usage Page (Button) */ + 0x19, 0x01, /* Usage Minimum (\x01) */ + 0x29, 0x05, /* Usage Maximum (\x05) */ + 0x15, 0x00, /* Logical Minimum (0) */ + 0x25, 0x01, /* Logical Maximum (1) */ + 0x95, 0x05, /* Report Count (5) */ + 0x75, 0x01, /* Report Size (1) */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) */ + 0x95, 0x01, /* Report Count (1) */ + 0x75, 0x03, /* Report Size (3) */ + 0x81, 0x01, /* Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position) */ + 0x05, 0x01, /* Usage Page (Generic Desktop Ctrls) */ + 0x09, 0x30, /* Usage (X) */ + 0x09, 0x31, /* Usage (Y) */ + 0x15, 0x81, /* Logical Minimum (-127) */ + 0x25, 0x7F, /* Logical Maximum (127) */ + 0x75, 0x08, /* Report Size (8) */ + 0x95, 0x02, /* Report Count (2) */ + 0x81, 0x06, /* Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position) */ + 0x09, 0x38, /* Usage (Wheel) */ + 0x15, 0x81, /* Logical Minimum (-127) */ + 0x25, 0x7F, /* Logical Maximum (127) */ + 0x75, 0x08, /* Report Size (8) */ + 0x95, 0x01, /* Report Count (1) */ + 0x81, 0x06, /* Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position) */ + 0xC0, /* End Collection */ + 0xC0, /* End Collection */ + 0x05, 0x0C, /* Usage Page (Consumer) */ + 0x09, 0x01, /* Usage (Consumer Control) */ + 0xA1, 0x01, /* Collection (Application) */ + 0x85, HIDAPP_CONSUMER_REPORT_ID, /* Report ID (3) */ + 0x75, 0x10, /* Report Size (16) */ + 0x95, 0x01, /* Report Count (1) */ + 0x15, 0x01, /* Logical Minimum (1) */ + 0x26, 0x8C, 0x02, /* Logical Maximum (652) */ + 0x19, 0x01, /* Usage Minimum (Consumer Control) */ + 0x2A, 0x8C, 0x02, /* Usage Maximum (AC Send) */ + 0x81, 0x00, /* Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position) */ + 0xC0, /* End Collection */ +#if 0 + 0x05, 0x01, /* Usage Page (Generic Desktop Ctrls) */ + 0x09, 0x05, /* Usage (Game Pad) */ + 0xA1, 0x01, /* Collection (Application) */ + 0x85, 0x05, /* Report ID (5) */ + 0x05, 0x09, /* Usage Page (Button) */ + 0x19, 0x01, /* Usage Minimum (\x01) */ + 0x29, 0x10, /* Usage Maximum (\x10) */ + 0x15, 0x00, /* Logical Minimum (0) */ + 0x25, 0x01, /* Logical Maximum (1) */ + 0x75, 0x01, /* Report Size (1) */ + 0x95, 0x10, /* Report Count (16) */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) */ + 0x05, 0x01, /* Usage Page (Generic Desktop Ctrls) */ + 0x15, 0x81, /* Logical Minimum (-127) */ + 0x25, 0x7F, /* Logical Maximum (127) */ + 0x09, 0x30, /* Usage (X) */ + 0x09, 0x31, /* Usage (Y) */ + 0x09, 0x32, /* Usage (Z) */ + 0x09, 0x35, /* Usage (Rz) */ + 0x75, 0x08, /* Report Size (8) */ + 0x95, 0x04, /* Report Count (4) */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) */ + 0xC0, /* End Collection */ +#endif }; /* clang-format on */ @@ -103,11 +134,11 @@ const uint16_t hidReportMapLen = sizeof(hidReportMap); static const hidReportIdMap_t hidAppReportIdSet[] = { /* type ID handle */ - {HID_REPORT_TYPE_INPUT, HIDAPP_CONSUMER_REPORT_ID, HID_INPUT_REPORT_1_HDL}, /* Consumer Control Input Report */ - {HID_REPORT_TYPE_INPUT, HIDAPP_KEYBOARD_REPORT_ID, HID_INPUT_REPORT_2_HDL}, /* Keyboard Input Report */ + {HID_REPORT_TYPE_INPUT, HIDAPP_KEYBOARD_REPORT_ID, HID_INPUT_REPORT_1_HDL}, /* Keyboard Input Report */ {HID_REPORT_TYPE_OUTPUT, HIDAPP_KEYBOARD_REPORT_ID, HID_OUTPUT_REPORT_HDL}, /* Keyboard Output Report */ {HID_REPORT_TYPE_FEATURE, HIDAPP_KEYBOARD_REPORT_ID, HID_FEATURE_REPORT_HDL}, /* Keyboard Feature Report */ - {HID_REPORT_TYPE_INPUT, HIDAPP_MOUSE_REPORT_ID, HID_INPUT_REPORT_3_HDL}, /* Mouse Input Report */ + {HID_REPORT_TYPE_INPUT, HIDAPP_MOUSE_REPORT_ID, HID_INPUT_REPORT_2_HDL}, /* Mouse Input Report */ + {HID_REPORT_TYPE_INPUT, HIDAPP_CONSUMER_REPORT_ID, HID_INPUT_REPORT_3_HDL}, /* Consumer Control Input Report */ {HID_REPORT_TYPE_INPUT, HID_KEYBOARD_BOOT_ID, HID_KEYBOARD_BOOT_IN_HDL}, /* Boot Keyboard Input Report */ {HID_REPORT_TYPE_OUTPUT, HID_KEYBOARD_BOOT_ID, HID_KEYBOARD_BOOT_OUT_HDL}, /* Boot Keyboard Output Report */ {HID_REPORT_TYPE_INPUT, HID_MOUSE_BOOT_ID, HID_MOUSE_BOOT_IN_HDL}, /* Boot Mouse Input Report */ @@ -142,18 +173,10 @@ static void hidAppReportInit(void) uint8_t oBuffer[HIDAPP_OUTPUT_REPORT_LEN]; uint8_t fBuffer[HIDAPP_FEATURE_REPORT_LEN]; - /* Consumer Control Input report */ - memset(iConsumerBuffer, 0, HIDAPP_CONSUMER_INPUT_REPORT_LEN); - AttsSetAttr( - HID_INPUT_REPORT_1_HDL, - HIDAPP_CONSUMER_INPUT_REPORT_LEN, - iConsumerBuffer - ); - /* Keyboard Input report */ memset(iKeyboardBuffer, 0, HIDAPP_KEYBOARD_INPUT_REPORT_LEN); AttsSetAttr( - HID_INPUT_REPORT_2_HDL, + HID_INPUT_REPORT_1_HDL, HIDAPP_KEYBOARD_INPUT_REPORT_LEN, iKeyboardBuffer ); @@ -161,11 +184,19 @@ static void hidAppReportInit(void) /* Mouse Input report */ memset(iMouseBuffer, 0, HIDAPP_MOUSE_INPUT_REPORT_LEN); AttsSetAttr( - HID_INPUT_REPORT_3_HDL, + HID_INPUT_REPORT_2_HDL, HIDAPP_MOUSE_INPUT_REPORT_LEN, iMouseBuffer ); + /* Consumer Control Input report */ + memset(iConsumerBuffer, 0, HIDAPP_CONSUMER_INPUT_REPORT_LEN); + AttsSetAttr( + HID_INPUT_REPORT_3_HDL, + HIDAPP_CONSUMER_INPUT_REPORT_LEN, + iConsumerBuffer + ); + /* Output report */ memset(oBuffer, 0, HIDAPP_OUTPUT_REPORT_LEN); AttsSetAttr(HID_OUTPUT_REPORT_HDL, HIDAPP_OUTPUT_REPORT_LEN, oBuffer); diff --git a/epicardium/ble/hid.h b/epicardium/ble/hid.h index 9e41986eb4a7d4ff17ee5826d413956e468f9c99..6edd627a1770589ae3d20bee49057fd399fc7fd9 100644 --- a/epicardium/ble/hid.h +++ b/epicardium/ble/hid.h @@ -2,13 +2,13 @@ /* The input report fits in one byte */ #define HIDAPP_KEYBOARD_INPUT_REPORT_LEN 8 -#define HIDAPP_MOUSE_INPUT_REPORT_LEN 3 +#define HIDAPP_MOUSE_INPUT_REPORT_LEN 4 #define HIDAPP_CONSUMER_INPUT_REPORT_LEN 2 #define HIDAPP_OUTPUT_REPORT_LEN 1 #define HIDAPP_FEATURE_REPORT_LEN 1 /* HID Report IDs */ -#define HIDAPP_CONSUMER_REPORT_ID 1 -#define HIDAPP_KEYBOARD_REPORT_ID 2 -#define HIDAPP_MOUSE_REPORT_ID 3 +#define HIDAPP_KEYBOARD_REPORT_ID 1 +#define HIDAPP_MOUSE_REPORT_ID 2 +#define HIDAPP_CONSUMER_REPORT_ID 3 diff --git a/pycardium/modules/hid.c b/pycardium/modules/hid.c index f8823b794a97c425c1f2e8488261c6fd0fba950f..62e198fd6a468dab687967f7fbdb95400fd60ad4 100644 --- a/pycardium/modules/hid.c +++ b/pycardium/modules/hid.c @@ -8,7 +8,7 @@ static mp_obj_t mp_hid_set_control(mp_obj_t control_code) { int code = mp_obj_get_int(control_code); uint8_t data[] = { code, code >> 8 }; - int ret = epic_hid_send_report(1, data, sizeof(data)); + int ret = epic_hid_send_report(3, data, sizeof(data)); return mp_obj_new_int(ret); } static MP_DEFINE_CONST_FUN_OBJ_1(hid_set_control_obj, mp_hid_set_control);