From 1813f81b12b4d83a393f4f70a0cff98368e0bb92 Mon Sep 17 00:00:00 2001 From: Julien Bernard Date: Mon, 22 Mar 2021 14:27:34 +0100 Subject: [PATCH] Respond to other OUT control requests with a ZLP --- usb/device/dev_lowlevel/dev_lowlevel.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/usb/device/dev_lowlevel/dev_lowlevel.c b/usb/device/dev_lowlevel/dev_lowlevel.c index cf53170..2d4d55c 100644 --- a/usb/device/dev_lowlevel/dev_lowlevel.c +++ b/usb/device/dev_lowlevel/dev_lowlevel.c @@ -340,6 +340,13 @@ void usb_handle_string_descriptor(volatile struct usb_setup_packet *pkt) { usb_start_transfer(usb_get_endpoint_configuration(EP0_IN_ADDR), &ep0_buf[0], len); } +/** + * @brief Sends a zero length status packet back to the host. + */ +void usb_acknowledge_out_request(void) { + usb_start_transfer(usb_get_endpoint_configuration(EP0_IN_ADDR), NULL, 0); +} + /** * @brief Handles a SET_ADDR request from the host. The actual setting of the device address in * 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) { printf("Set address %d\r\n", dev_addr); // Will set address in the callback phase should_set_address = true; - usb_start_transfer(usb_get_endpoint_configuration(EP0_IN_ADDR), NULL, 0); + usb_acknowledge_out_request(); } /** @@ -366,7 +373,7 @@ void usb_set_device_address(volatile struct usb_setup_packet *pkt) { void usb_set_device_configuration(volatile struct usb_setup_packet *pkt) { // Only one configuration so just acknowledge the request printf("Device Enumerated\r\n"); - usb_start_transfer(usb_get_endpoint_configuration(EP0_IN_ADDR), NULL, 0); + usb_acknowledge_out_request(); configured = true; } @@ -388,6 +395,7 @@ void usb_handle_setup_packet(void) { } else if (req == USB_REQUEST_SET_CONFIGURATION) { usb_set_device_configuration(pkt); } else { + usb_acknowledge_out_request(); printf("Other OUT request (0x%x)\r\n", pkt->bRequest); } } else if (req_direction == USB_DIR_IN) {