From 16c37f9db1e8f0c6e37bd44d60df0149a90d9f37 Mon Sep 17 00:00:00 2001 From: Darian Leung Date: Wed, 22 Nov 2023 00:47:38 +0800 Subject: [PATCH] change(usb/host): Remove data buffer headers from URBs This commit removes the ability to reserve a header in the data buffer of an allocated URB. The header was required for a now defunct implementation of a synchronous USB Host library API. Thus, headers are no longer required in URB data buffers. --- components/usb/hub.c | 2 +- components/usb/private_include/usb_private.h | 9 +++------ components/usb/usb_host.c | 2 +- components/usb/usb_private.c | 13 ++++++------- 4 files changed, 11 insertions(+), 15 deletions(-) diff --git a/components/usb/hub.c b/components/usb/hub.c index 519890d135..7f24a60a6d 100644 --- a/components/usb/hub.c +++ b/components/usb/hub.c @@ -938,7 +938,7 @@ esp_err_t hub_install(hub_config_t *hub_config) HUB_DRIVER_EXIT_CRITICAL(); // Allocate Hub driver object hub_driver_t *hub_driver_obj = heap_caps_calloc(1, sizeof(hub_driver_t), MALLOC_CAP_DEFAULT); - urb_t *enum_urb = urb_alloc(sizeof(usb_setup_packet_t) + ENUM_CTRL_TRANSFER_MAX_DATA_LEN, 0, 0); + urb_t *enum_urb = urb_alloc(sizeof(usb_setup_packet_t) + ENUM_CTRL_TRANSFER_MAX_DATA_LEN, 0); if (hub_driver_obj == NULL || enum_urb == NULL) { return ESP_ERR_NO_MEM; } diff --git a/components/usb/private_include/usb_private.h b/components/usb/private_include/usb_private.h index ccdcd44a23..4fb25cc4ee 100644 --- a/components/usb/private_include/usb_private.h +++ b/components/usb/private_include/usb_private.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -43,7 +43,6 @@ struct urb_s { uint32_t hcd_var; // Host Lib Layer: void *usb_host_client; // Currently only used when submitted to shared pipes (i.e., Device default pipes) - size_t usb_host_header_size; // USB Host may need the data buffer to have a transparent header bool usb_host_inflight; // Debugging variable, used to prevent re-submitting URBs already inflight // Public transfer structure. Must be last due to variable length array usb_transfer_t transfer; @@ -76,15 +75,13 @@ typedef bool (*usb_proc_req_cb_t)(usb_proc_req_source_t source, bool in_isr, voi * * - Data buffer is allocated in DMA capable memory * - The constant fields of the URB are also set - * - The data_buffer field of the URB is set to point to start of the allocated data buffer AFTER the header. To access - * the header, users need a negative offset from data_buffer. + * - The data_buffer field of the URB is set to point to start of the allocated data buffer. * * @param data_buffer_size Size of the URB's data buffer - * @param header_size Size of header to put in front of URB's data buffer * @param num_isoc_packets Number of isochronous packet descriptors * @return urb_t* URB object */ -urb_t *urb_alloc(size_t data_buffer_size, size_t header_size, int num_isoc_packets); +urb_t *urb_alloc(size_t data_buffer_size, int num_isoc_packets); /** * @brief Free a URB diff --git a/components/usb/usb_host.c b/components/usb/usb_host.c index e0182d5660..88649d2fec 100644 --- a/components/usb/usb_host.c +++ b/components/usb/usb_host.c @@ -1245,7 +1245,7 @@ exit: esp_err_t usb_host_transfer_alloc(size_t data_buffer_size, int num_isoc_packets, usb_transfer_t **transfer) { - urb_t *urb = urb_alloc(data_buffer_size, 0, num_isoc_packets); + urb_t *urb = urb_alloc(data_buffer_size, num_isoc_packets); if (urb == NULL) { return ESP_ERR_NO_MEM; } diff --git a/components/usb/usb_private.c b/components/usb/usb_private.c index 9508597641..5d082c19d0 100644 --- a/components/usb/usb_private.c +++ b/components/usb/usb_private.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -8,17 +8,16 @@ #include "usb_private.h" #include "usb/usb_types_ch9.h" -urb_t *urb_alloc(size_t data_buffer_size, size_t header_size, int num_isoc_packets) +urb_t *urb_alloc(size_t data_buffer_size, int num_isoc_packets) { urb_t *urb = heap_caps_calloc(1, sizeof(urb_t) + (sizeof(usb_isoc_packet_desc_t) * num_isoc_packets), MALLOC_CAP_DEFAULT); - uint8_t *data_buffer = heap_caps_malloc(data_buffer_size + header_size, MALLOC_CAP_DMA); + uint8_t *data_buffer = heap_caps_malloc(data_buffer_size, MALLOC_CAP_DMA); if (urb == NULL || data_buffer == NULL) { goto err; } - urb->usb_host_header_size = header_size; // Indicate that this URB's data_buffer has a header in front of it. - // Case as dummy transfer to write to initialize const fields + // Cast as dummy transfer so that we can assign to const fields usb_transfer_dummy_t *dummy_transfer = (usb_transfer_dummy_t *)&urb->transfer; - dummy_transfer->data_buffer = (uint8_t *)(data_buffer + header_size); + dummy_transfer->data_buffer = data_buffer; dummy_transfer->data_buffer_size = data_buffer_size; dummy_transfer->num_isoc_packets = num_isoc_packets; return urb; @@ -33,6 +32,6 @@ void urb_free(urb_t *urb) if (urb == NULL) { return; } - heap_caps_free((uint8_t *)(urb->transfer.data_buffer - urb->usb_host_header_size)); + heap_caps_free(urb->transfer.data_buffer); heap_caps_free(urb); }