mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-12-16 18:13:49 +01:00
sys/usbus/msc: fix EP sizes and buffer alignment for HS in DMA-mode
This commit is contained in:
parent
8c99576247
commit
44e9db86c0
@ -31,6 +31,15 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBUS MSC bulk data endpoint size.
|
||||||
|
*/
|
||||||
|
#if defined(MODULE_PERIPH_USBDEV_HS_UTMI) || defined(MODULE_PERIPH_USBDEV_HS_ULPI)
|
||||||
|
#define USBUS_MSC_EP_DATA_SIZE 512
|
||||||
|
#else
|
||||||
|
#define USBUS_MSC_EP_DATA_SIZE 64
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Number of IN EPs required for the MSC interface
|
* @brief Number of IN EPs required for the MSC interface
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -31,8 +31,8 @@
|
|||||||
|
|
||||||
#include "mtd.h"
|
#include "mtd.h"
|
||||||
|
|
||||||
static unsigned char _ep_out_buf[CONFIG_USBUS_EP0_SIZE];
|
static usbdev_ep_buf_t _ep_out_buf[USBUS_MSC_EP_DATA_SIZE];
|
||||||
static unsigned char _ep_in_buf[CONFIG_USBUS_EP0_SIZE];
|
static usbdev_ep_buf_t _ep_in_buf[USBUS_MSC_EP_DATA_SIZE];
|
||||||
|
|
||||||
/* Internal handler definitions */
|
/* Internal handler definitions */
|
||||||
static void _event_handler(usbus_t *usbus, usbus_handler_t *handler,
|
static void _event_handler(usbus_t *usbus, usbus_handler_t *handler,
|
||||||
@ -120,7 +120,7 @@ static void _write_xfer(usbus_msc_device_t *msc)
|
|||||||
if (msc->state == DATA_TRANSFER_OUT) {
|
if (msc->state == DATA_TRANSFER_OUT) {
|
||||||
msc->state = GEN_CSW;
|
msc->state = GEN_CSW;
|
||||||
/* Data was processed, ready next transfer */
|
/* Data was processed, ready next transfer */
|
||||||
usbdev_ep_xmit(msc->ep_out->ep, msc->out_buf, CONFIG_USBUS_EP0_SIZE);
|
usbdev_ep_xmit(msc->ep_out->ep, msc->out_buf, USBUS_MSC_EP_DATA_SIZE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -243,11 +243,24 @@ int usbus_msc_add_lun(usbus_t *usbus, mtd_dev_t *dev)
|
|||||||
/* If new registered MTD device need more memory than the
|
/* If new registered MTD device need more memory than the
|
||||||
previous, realloc a new buffer */
|
previous, realloc a new buffer */
|
||||||
if (block_size > msc->buffer_size) {
|
if (block_size > msc->buffer_size) {
|
||||||
msc->buffer = realloc(msc->buffer, block_size);
|
if (IS_USED(MODULE_ESP32_SDK)) {
|
||||||
|
/* ESP32x does not support posix_memalign */
|
||||||
|
msc->buffer = realloc(msc->buffer, block_size);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
free(msc->buffer);
|
||||||
|
msc->buffer = aligned_alloc(USBDEV_CPU_DMA_ALIGNMENT, block_size);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* No buffer allocated yet, so allocate one */
|
/* No buffer allocated yet, so allocate one */
|
||||||
msc->buffer = malloc(block_size);
|
if (IS_USED(MODULE_ESP32_SDK)) {
|
||||||
|
/* ESP32x does not support posix_memalign */
|
||||||
|
msc->buffer = malloc(block_size);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
msc->buffer = aligned_alloc(USBDEV_CPU_DMA_ALIGNMENT, block_size);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!msc->buffer) {
|
if (!msc->buffer) {
|
||||||
@ -338,11 +351,11 @@ static void _init(usbus_t *usbus, usbus_handler_t *handler)
|
|||||||
|
|
||||||
/* Create required endpoints */
|
/* Create required endpoints */
|
||||||
msc->ep_in = usbus_add_endpoint(usbus, &msc->iface, USB_EP_TYPE_BULK,
|
msc->ep_in = usbus_add_endpoint(usbus, &msc->iface, USB_EP_TYPE_BULK,
|
||||||
USB_EP_DIR_IN, CONFIG_USBUS_EP0_SIZE);
|
USB_EP_DIR_IN, USBUS_MSC_EP_DATA_SIZE);
|
||||||
assert(msc->ep_in);
|
assert(msc->ep_in);
|
||||||
msc->ep_in->interval = 0;
|
msc->ep_in->interval = 0;
|
||||||
msc->ep_out = usbus_add_endpoint(usbus, &msc->iface, USB_EP_TYPE_BULK,
|
msc->ep_out = usbus_add_endpoint(usbus, &msc->iface, USB_EP_TYPE_BULK,
|
||||||
USB_EP_DIR_OUT, CONFIG_USBUS_EP0_SIZE);
|
USB_EP_DIR_OUT, USBUS_MSC_EP_DATA_SIZE);
|
||||||
assert(msc->ep_out);
|
assert(msc->ep_out);
|
||||||
msc->ep_out->interval = 0;
|
msc->ep_out->interval = 0;
|
||||||
|
|
||||||
@ -382,7 +395,7 @@ static int _control_handler(usbus_t *usbus, usbus_handler_t *handler,
|
|||||||
/* Return the number of MTD devices available on the board */
|
/* Return the number of MTD devices available on the board */
|
||||||
usbus_control_slicer_put_bytes(usbus, &data, sizeof(data));
|
usbus_control_slicer_put_bytes(usbus, &data, sizeof(data));
|
||||||
/* Prepare to receive first bytes from Host */
|
/* Prepare to receive first bytes from Host */
|
||||||
usbdev_ep_xmit(msc->ep_out->ep, msc->out_buf, CONFIG_USBUS_EP0_SIZE);
|
usbdev_ep_xmit(msc->ep_out->ep, msc->out_buf, USBUS_MSC_EP_DATA_SIZE);
|
||||||
break;
|
break;
|
||||||
case USB_MSC_SETUP_REQ_BOMSR:
|
case USB_MSC_SETUP_REQ_BOMSR:
|
||||||
DEBUG_PUTS("[msc]: TODO: implement reset setup request");
|
DEBUG_PUTS("[msc]: TODO: implement reset setup request");
|
||||||
@ -421,10 +434,11 @@ static void _transfer_handler(usbus_t *usbus, usbus_handler_t *handler,
|
|||||||
if (msc->state == DATA_TRANSFER_OUT) {
|
if (msc->state == DATA_TRANSFER_OUT) {
|
||||||
/* If the next pkt is supposed to be a WRITE10 transfer,
|
/* If the next pkt is supposed to be a WRITE10 transfer,
|
||||||
directly redirect content to appropriate buffer */
|
directly redirect content to appropriate buffer */
|
||||||
usbdev_ep_xmit(msc->ep_out->ep, &msc->buffer[msc->block_offset], 64);
|
usbdev_ep_xmit(msc->ep_out->ep, &msc->buffer[msc->block_offset],
|
||||||
|
USBUS_MSC_EP_DATA_SIZE);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
usbdev_ep_xmit(ep, msc->out_buf, CONFIG_USBUS_EP0_SIZE);
|
usbdev_ep_xmit(ep, msc->out_buf, USBUS_MSC_EP_DATA_SIZE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user