Skip to content

Commit cfb37d4

Browse files
committed
[USB HID] Harden init
Avoid call twice Init/Deinit of HID composite. Signed-off-by: Frederic.Pillon <[email protected]>
1 parent a8f3c37 commit cfb37d4

File tree

4 files changed

+56
-23
lines changed

4 files changed

+56
-23
lines changed

cores/arduino/stm32/usb/hid/usbd_hid_composite_if.c

+40-17
Original file line numberDiff line numberDiff line change
@@ -46,35 +46,58 @@ extern "C" {
4646
/* USB Device Core HID composite handle declaration */
4747
USBD_HandleTypeDef hUSBD_Device_HID;
4848

49+
static bool HID_keyboard_initialized = false;
50+
static bool HID_mouse_initialized = false;
51+
4952
/**
5053
* @brief Initialize USB devices
51-
* @param none
54+
* @param HID_Interface device type: HID_KEYBOARD or HID_MOUSE
5255
* @retval none
5356
*/
54-
void HID_Composite_Init(void)
57+
void HID_Composite_Init(HID_Interface device)
5558
{
56-
/* Init Device Library */
57-
USBD_Init(&hUSBD_Device_HID, &HID_Desc, 0);
58-
59-
/* Add Supported Class */
60-
USBD_RegisterClass(&hUSBD_Device_HID, USBD_COMPOSITE_HID_CLASS);
61-
62-
/* Start Device Process */
63-
USBD_Start(&hUSBD_Device_HID);
59+
if (IS_HID_INTERFACE(device) &&
60+
!HID_keyboard_initialized && !HID_mouse_initialized) {
61+
/* Init Device Library */
62+
if (USBD_Init(&hUSBD_Device_HID, &HID_Desc, 0) == USBD_OK) {
63+
/* Add Supported Class */
64+
if (USBD_RegisterClass(&hUSBD_Device_HID, USBD_COMPOSITE_HID_CLASS) == USBD_OK) {
65+
/* Start Device Process */
66+
USBD_Start(&hUSBD_Device_HID);
67+
HID_keyboard_initialized = true;
68+
HID_mouse_initialized = true;
69+
}
70+
}
71+
}
72+
if (device == HID_KEYBOARD) {
73+
HID_keyboard_initialized = HID_mouse_initialized;
74+
}
75+
if (device == HID_MOUSE) {
76+
HID_mouse_initialized = HID_keyboard_initialized;
77+
}
6478
}
6579

6680
/**
6781
* @brief DeInitialize USB devices
68-
* @param none
82+
* @param HID_Interface device type: HID_KEYBOARD or HID_MOUSE
6983
* @retval none
7084
*/
71-
void HID_Composite_DeInit(void)
85+
void HID_Composite_DeInit(HID_Interface device)
7286
{
73-
/* Stop Device Process */
74-
USBD_Stop(&hUSBD_Device_HID);
75-
76-
/* DeInit Device Library */
77-
USBD_DeInit(&hUSBD_Device_HID);
87+
if (IS_HID_INTERFACE(device) &&
88+
((HID_keyboard_initialized && !HID_mouse_initialized) ||
89+
(HID_mouse_initialized && !HID_keyboard_initialized))) {
90+
/* Stop Device Process */
91+
USBD_Stop(&hUSBD_Device_HID);
92+
/* DeInit Device Library */
93+
USBD_DeInit(&hUSBD_Device_HID);
94+
}
95+
if (device == HID_KEYBOARD) {
96+
HID_keyboard_initialized = false;
97+
}
98+
if (device == HID_MOUSE) {
99+
HID_mouse_initialized = false;
100+
}
78101
}
79102

80103
/**

cores/arduino/stm32/usb/hid/usbd_hid_composite_if.h

+12-2
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,19 @@
4343
extern "C" {
4444
#endif
4545

46+
/* Exported types ------------------------------------------------------------*/
47+
typedef enum {
48+
HID_KEYBOARD,
49+
HID_MOUSE
50+
} HID_Interface;
51+
52+
/* Exported macro ------------------------------------------------------------*/
53+
#define IS_HID_INTERFACE(DEVICE) (((DEVICE) == HID_KEYBOARD) ||\
54+
((DEVICE) == HID_MOUSE))
55+
4656
/* Exported functions ------------------------------------------------------- */
47-
void HID_Composite_Init(void);
48-
void HID_Composite_DeInit(void);
57+
void HID_Composite_Init(HID_Interface device);
58+
void HID_Composite_DeInit(HID_Interface device);
4959

5060
void HID_Composite_mouse_sendReport(uint8_t *report, uint16_t len);
5161
void HID_Composite_keyboard_sendReport(uint8_t *report, uint16_t len);

libraries/Keyboard/src/Keyboard.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ Keyboard_::Keyboard_(void)
3434

3535
void Keyboard_::begin(void)
3636
{
37-
HID_Composite_Init();
37+
HID_Composite_Init(HID_KEYBOARD);
3838
}
3939

4040
void Keyboard_::end(void)
4141
{
42-
HID_Composite_DeInit();
42+
HID_Composite_DeInit(HID_KEYBOARD);
4343
}
4444

4545
void Keyboard_::sendReport(KeyReport *keys)

libraries/Mouse/src/Mouse.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ Mouse_::Mouse_(void) : _buttons(0)
3434

3535
void Mouse_::begin(void)
3636
{
37-
HID_Composite_Init();
37+
HID_Composite_Init(HID_MOUSE);
3838
}
3939

4040
void Mouse_::end(void)
4141
{
42-
HID_Composite_DeInit();
42+
HID_Composite_DeInit(HID_MOUSE);
4343
}
4444

4545
void Mouse_::click(uint8_t b)

0 commit comments

Comments
 (0)