@@ -340,6 +340,13 @@ void usb_handle_string_descriptor(volatile struct usb_setup_packet *pkt) {
340
340
usb_start_transfer (usb_get_endpoint_configuration (EP0_IN_ADDR ), & ep0_buf [0 ], len );
341
341
}
342
342
343
+ /**
344
+ * @brief Sends a zero length status packet back to the host.
345
+ */
346
+ void usb_acknowledge_out_request (void ) {
347
+ usb_start_transfer (usb_get_endpoint_configuration (EP0_IN_ADDR ), NULL , 0 );
348
+ }
349
+
343
350
/**
344
351
* @brief Handles a SET_ADDR request from the host. The actual setting of the device address in
345
352
* hardware is done in ep0_in_handler. This is because we have to acknowledge the request first
@@ -354,7 +361,7 @@ void usb_set_device_address(volatile struct usb_setup_packet *pkt) {
354
361
printf ("Set address %d\r\n" , dev_addr );
355
362
// Will set address in the callback phase
356
363
should_set_address = true;
357
- usb_start_transfer ( usb_get_endpoint_configuration ( EP0_IN_ADDR ), NULL , 0 );
364
+ usb_acknowledge_out_request ( );
358
365
}
359
366
360
367
/**
@@ -366,7 +373,7 @@ void usb_set_device_address(volatile struct usb_setup_packet *pkt) {
366
373
void usb_set_device_configuration (volatile struct usb_setup_packet * pkt ) {
367
374
// Only one configuration so just acknowledge the request
368
375
printf ("Device Enumerated\r\n" );
369
- usb_start_transfer ( usb_get_endpoint_configuration ( EP0_IN_ADDR ), NULL , 0 );
376
+ usb_acknowledge_out_request ( );
370
377
configured = true;
371
378
}
372
379
@@ -388,6 +395,7 @@ void usb_handle_setup_packet(void) {
388
395
} else if (req == USB_REQUEST_SET_CONFIGURATION ) {
389
396
usb_set_device_configuration (pkt );
390
397
} else {
398
+ usb_acknowledge_out_request ();
391
399
printf ("Other OUT request (0x%x)\r\n" , pkt -> bRequest );
392
400
}
393
401
} else if (req_direction == USB_DIR_IN ) {
0 commit comments