Skip to content

Commit 393fe8e

Browse files
committed
stm32: usb: register control handlers in config callback
As found in 6f2b39c1be6a8b9531264d92138dc2629d51cfa0, you can't just register a control callback by itself, you can only register them in the set config callback, (or, at least, _after_ set config has been done. This has been compile tested only for the extra examples that were found to have this failing pattern.
1 parent dd0e483 commit 393fe8e

File tree

4 files changed

+48
-20
lines changed

4 files changed

+48
-20
lines changed

examples/stm32/f1/lisa-m-1/usb_dfu/usbdfu.c

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,17 @@ static int usbdfu_control_request(usbd_device *usbd_dev, struct usb_setup_data *
229229
return 0;
230230
}
231231

232+
static void usbdfu_set_config(usbd_device *usbd_dev, uint16_t wValue)
233+
{
234+
(void)wValue;
235+
236+
usbd_register_control_callback(
237+
usbd_dev,
238+
USB_REQ_TYPE_CLASS | USB_REQ_TYPE_INTERFACE,
239+
USB_REQ_TYPE_TYPE | USB_REQ_TYPE_RECIPIENT,
240+
usbdfu_control_request);
241+
}
242+
232243
int main(void)
233244
{
234245
usbd_device *usbd_dev;
@@ -258,11 +269,7 @@ int main(void)
258269
GPIO_CNF_OUTPUT_PUSHPULL, GPIO2);
259270

260271
usbd_dev = usbd_init(&stm32f107_usb_driver, &dev, &config, usb_strings, 4, usbd_control_buffer, sizeof(usbd_control_buffer));
261-
usbd_register_control_callback(
262-
usbd_dev,
263-
USB_REQ_TYPE_CLASS | USB_REQ_TYPE_INTERFACE,
264-
USB_REQ_TYPE_TYPE | USB_REQ_TYPE_RECIPIENT,
265-
usbdfu_control_request);
272+
usbd_register_set_config_callback(usbd_dev, usbdfu_set_config);
266273

267274
gpio_clear(GPIOC, GPIO2);
268275

examples/stm32/f1/other/usb_dfu/usbdfu.c

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,17 @@ static int usbdfu_control_request(usbd_device *usbd_dev, struct usb_setup_data *
229229
return 0;
230230
}
231231

232+
static void usbdfu_set_config(usbd_device *usbd_dev, uint16_t wValue)
233+
{
234+
(void)wValue;
235+
236+
usbd_register_control_callback(
237+
usbd_dev,
238+
USB_REQ_TYPE_CLASS | USB_REQ_TYPE_INTERFACE,
239+
USB_REQ_TYPE_TYPE | USB_REQ_TYPE_RECIPIENT,
240+
usbdfu_control_request);
241+
}
242+
232243
int main(void)
233244
{
234245
usbd_device *usbd_dev;
@@ -259,11 +270,7 @@ int main(void)
259270
rcc_periph_clock_enable(RCC_OTGFS);
260271

261272
usbd_dev = usbd_init(&stm32f107_usb_driver, &dev, &config, usb_strings, 4, usbd_control_buffer, sizeof(usbd_control_buffer));
262-
usbd_register_control_callback(
263-
usbd_dev,
264-
USB_REQ_TYPE_CLASS | USB_REQ_TYPE_INTERFACE,
265-
USB_REQ_TYPE_TYPE | USB_REQ_TYPE_RECIPIENT,
266-
usbdfu_control_request);
273+
usbd_register_set_config_callback(usbd_dev, usbdfu_set_config);
267274

268275
gpio_set(GPIOA, GPIO15);
269276
gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ,

examples/stm32/f1/stm32-h103/usb_iap/usbiap.c

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,18 @@ static int usbdfu_control_request(usbd_device *usbd_dev, struct usb_setup_data *
229229
return 0;
230230
}
231231

232+
static void usbdfu_set_config(usbd_device *usbd_dev, uint16_t wValue)
233+
{
234+
(void)wValue;
235+
236+
usbd_register_control_callback(
237+
usbd_dev,
238+
USB_REQ_TYPE_CLASS | USB_REQ_TYPE_INTERFACE,
239+
USB_REQ_TYPE_TYPE | USB_REQ_TYPE_RECIPIENT,
240+
usbdfu_control_request);
241+
}
242+
243+
232244
int main(void)
233245
{
234246
usbd_device *usbd_dev;
@@ -257,11 +269,7 @@ int main(void)
257269
gpio_set_mode(GPIOA, GPIO_MODE_INPUT, 0, GPIO15);
258270

259271
usbd_dev = usbd_init(&stm32f103_usb_driver, &dev, &config, usb_strings, 4, usbd_control_buffer, sizeof(usbd_control_buffer));
260-
usbd_register_control_callback(
261-
usbd_dev,
262-
USB_REQ_TYPE_CLASS | USB_REQ_TYPE_INTERFACE,
263-
USB_REQ_TYPE_TYPE | USB_REQ_TYPE_RECIPIENT,
264-
usbdfu_control_request);
272+
usbd_register_set_config_callback(usbd_dev, usbdfu_set_config);
265273

266274
gpio_set(GPIOA, GPIO15);
267275
gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ,

examples/stm32/f1/stm32-h107/usb_simple/usb_simple.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,16 @@ static int simple_control_callback(usbd_device *usbd_dev, struct usb_setup_data
9696
return 1;
9797
}
9898

99+
static void usb_set_config_cb(usbd_device *usbd_dev, uint16_t wValue)
100+
{
101+
(void)wValue;
102+
usbd_register_control_callback(
103+
usbd_dev,
104+
USB_REQ_TYPE_VENDOR,
105+
USB_REQ_TYPE_TYPE,
106+
simple_control_callback);
107+
}
108+
99109
int main(void)
100110
{
101111
usbd_device *usbd_dev;
@@ -111,11 +121,7 @@ int main(void)
111121
GPIO_CNF_OUTPUT_PUSHPULL, GPIO6);
112122

113123
usbd_dev = usbd_init(&stm32f107_usb_driver, &dev, &config, usb_strings, 3, usbd_control_buffer, sizeof(usbd_control_buffer));
114-
usbd_register_control_callback(
115-
usbd_dev,
116-
USB_REQ_TYPE_VENDOR,
117-
USB_REQ_TYPE_TYPE,
118-
simple_control_callback);
124+
usbd_register_set_config_callback(usbd_dev, usb_set_config_cb);
119125

120126
while (1)
121127
usbd_poll(usbd_dev);

0 commit comments

Comments
 (0)