diff --git a/cores/arduino/stm32/usb/hid/usbd_hid_composite_if.c b/cores/arduino/stm32/usb/hid/usbd_hid_composite_if.c index 68982f4a7f..7d649754d8 100644 --- a/cores/arduino/stm32/usb/hid/usbd_hid_composite_if.c +++ b/cores/arduino/stm32/usb/hid/usbd_hid_composite_if.c @@ -46,35 +46,58 @@ extern "C" { /* USB Device Core HID composite handle declaration */ USBD_HandleTypeDef hUSBD_Device_HID; +static bool HID_keyboard_initialized = false; +static bool HID_mouse_initialized = false; + /** * @brief Initialize USB devices - * @param none + * @param HID_Interface device type: HID_KEYBOARD or HID_MOUSE * @retval none */ -void HID_Composite_Init(void) +void HID_Composite_Init(HID_Interface device) { - /* Init Device Library */ - USBD_Init(&hUSBD_Device_HID, &HID_Desc, 0); - - /* Add Supported Class */ - USBD_RegisterClass(&hUSBD_Device_HID, USBD_COMPOSITE_HID_CLASS); - - /* Start Device Process */ - USBD_Start(&hUSBD_Device_HID); + if (IS_HID_INTERFACE(device) && + !HID_keyboard_initialized && !HID_mouse_initialized) { + /* Init Device Library */ + if (USBD_Init(&hUSBD_Device_HID, &HID_Desc, 0) == USBD_OK) { + /* Add Supported Class */ + if (USBD_RegisterClass(&hUSBD_Device_HID, USBD_COMPOSITE_HID_CLASS) == USBD_OK) { + /* Start Device Process */ + USBD_Start(&hUSBD_Device_HID); + HID_keyboard_initialized = true; + HID_mouse_initialized = true; + } + } + } + if (device == HID_KEYBOARD) { + HID_keyboard_initialized = HID_mouse_initialized; + } + if (device == HID_MOUSE) { + HID_mouse_initialized = HID_keyboard_initialized; + } } /** * @brief DeInitialize USB devices - * @param none + * @param HID_Interface device type: HID_KEYBOARD or HID_MOUSE * @retval none */ -void HID_Composite_DeInit(void) +void HID_Composite_DeInit(HID_Interface device) { - /* Stop Device Process */ - USBD_Stop(&hUSBD_Device_HID); - - /* DeInit Device Library */ - USBD_DeInit(&hUSBD_Device_HID); + if (IS_HID_INTERFACE(device) && + ((HID_keyboard_initialized && !HID_mouse_initialized) || + (HID_mouse_initialized && !HID_keyboard_initialized))) { + /* Stop Device Process */ + USBD_Stop(&hUSBD_Device_HID); + /* DeInit Device Library */ + USBD_DeInit(&hUSBD_Device_HID); + } + if (device == HID_KEYBOARD) { + HID_keyboard_initialized = false; + } + if (device == HID_MOUSE) { + HID_mouse_initialized = false; + } } /** diff --git a/cores/arduino/stm32/usb/hid/usbd_hid_composite_if.h b/cores/arduino/stm32/usb/hid/usbd_hid_composite_if.h index eb271985a9..ec4bc40cda 100644 --- a/cores/arduino/stm32/usb/hid/usbd_hid_composite_if.h +++ b/cores/arduino/stm32/usb/hid/usbd_hid_composite_if.h @@ -43,9 +43,19 @@ extern "C" { #endif +/* Exported types ------------------------------------------------------------*/ +typedef enum { + HID_KEYBOARD, + HID_MOUSE +} HID_Interface; + +/* Exported macro ------------------------------------------------------------*/ +#define IS_HID_INTERFACE(DEVICE) (((DEVICE) == HID_KEYBOARD) ||\ + ((DEVICE) == HID_MOUSE)) + /* Exported functions ------------------------------------------------------- */ -void HID_Composite_Init(void); -void HID_Composite_DeInit(void); +void HID_Composite_Init(HID_Interface device); +void HID_Composite_DeInit(HID_Interface device); void HID_Composite_mouse_sendReport(uint8_t *report, uint16_t len); void HID_Composite_keyboard_sendReport(uint8_t *report, uint16_t len); diff --git a/libraries/Keyboard/src/Keyboard.cpp b/libraries/Keyboard/src/Keyboard.cpp index 112dd1cce5..9074f0f6db 100644 --- a/libraries/Keyboard/src/Keyboard.cpp +++ b/libraries/Keyboard/src/Keyboard.cpp @@ -34,12 +34,12 @@ Keyboard_::Keyboard_(void) void Keyboard_::begin(void) { - HID_Composite_Init(); + HID_Composite_Init(HID_KEYBOARD); } void Keyboard_::end(void) { - HID_Composite_DeInit(); + HID_Composite_DeInit(HID_KEYBOARD); } void Keyboard_::sendReport(KeyReport *keys) diff --git a/libraries/Mouse/src/Mouse.cpp b/libraries/Mouse/src/Mouse.cpp index 3a875e39f0..56f23be295 100644 --- a/libraries/Mouse/src/Mouse.cpp +++ b/libraries/Mouse/src/Mouse.cpp @@ -34,12 +34,12 @@ Mouse_::Mouse_(void) : _buttons(0) void Mouse_::begin(void) { - HID_Composite_Init(); + HID_Composite_Init(HID_MOUSE); } void Mouse_::end(void) { - HID_Composite_DeInit(); + HID_Composite_DeInit(HID_MOUSE); } void Mouse_::click(uint8_t b)