X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;ds=sidebyside;f=bertos%2Fcpu%2Fcortex-m3%2Fdrv%2Fusb_stm32.c;h=ad91a9b83f8f578a2beefd501c6fca590bdc9817;hb=0e8d3b095f4b5ba3ac5c080c0e9edb5226c38bad;hp=154f0a04743a1b8f9b874a633031162730cfa93d;hpb=93308de29d9092161217cfff1b1375b482937214;p=bertos.git diff --git a/bertos/cpu/cortex-m3/drv/usb_stm32.c b/bertos/cpu/cortex-m3/drv/usb_stm32.c index 154f0a04..ad91a9b8 100644 --- a/bertos/cpu/cortex-m3/drv/usb_stm32.c +++ b/bertos/cpu/cortex-m3/drv/usb_stm32.c @@ -58,6 +58,7 @@ #include "usb_stm32.h" +#define ALIGNED(x) __attribute__ ((__aligned__(x))) #define ALIGN_UP(value, align) (((value) & ((align) - 1)) ? \ (((value) + ((align) - 1)) & ~((align) - 1)) : \ (value)) @@ -147,6 +148,15 @@ static stm32_UsbMemSlot *mem_use; #define EP_MAX_SLOTS 16 static stm32_UsbMemSlot memory_buffer[EP_MAX_SLOTS]; +/* Endpoint TX and RX buffers */ +/// \cond +/* XXX: use the empty cond section to silent a buggy doxygen warning */ +static bool rx_done, tx_done; +static size_t rx_size, tx_size; +static uint8_t rx_buffer[_MIN(CONFIG_USB_RXBUFSIZE, USB_RX_MAX_SIZE)] ALIGNED(4); +static uint8_t tx_buffer[_MIN(CONFIG_USB_TXBUFSIZE, USB_TX_MAX_SIZE)] ALIGNED(4); +/// \endcond + /* Allocate a free block of the packet memory */ static stm32_UsbMemSlot *usb_malloc(void) { @@ -675,12 +685,18 @@ out: \ static stm32_UsbIoStatus __usb_ep_read(int ep, void *buffer, ssize_t size, void (*complete)(int)) { - if (UNLIKELY(ep >= ENP_MAX_NUMB)) + if (UNLIKELY((ep >= ENP_MAX_NUMB) || (ep & 0x01))) { + LOG_ERR("%s: invalid EP number %d\n", __func__, ep); + ASSERT(0); + return STALLED; + } + if (UNLIKELY((size_t)buffer & 0x03)) + { + LOG_ERR("%s: unaligned buffer @ %p\n", __func__, buffer); ASSERT(0); return STALLED; } - ASSERT(!(ep & 0x01)); return USB_EP_IO(ep, read, buffer, size, complete); } @@ -688,12 +704,18 @@ __usb_ep_read(int ep, void *buffer, ssize_t size, void (*complete)(int)) static stm32_UsbIoStatus __usb_ep_write(int ep, const void *buffer, ssize_t size, void (*complete)(int)) { - if (UNLIKELY(ep >= ENP_MAX_NUMB)) + if (UNLIKELY((ep >= ENP_MAX_NUMB) || !(ep & 0x01))) { + LOG_ERR("%s: invalid EP number %d\n", __func__, ep); + ASSERT(0); + return STALLED; + } + if (UNLIKELY((size_t)buffer & 0x03)) + { + LOG_ERR("%s: unaligned buffer @ %p\n", __func__, buffer); ASSERT(0); return STALLED; } - ASSERT(ep & 0x01); return USB_EP_IO(ep, write, buffer, size, complete); } @@ -1080,11 +1102,6 @@ static void usb_status_handler(UNUSED_ARG(int, EP)) } } -static bool rx_done; -static size_t rx_size; -static uint8_t rx_buffer[_MIN(CONFIG_USB_RXBUFSIZE, USB_RX_MAX_SIZE)] - __attribute__ ((__aligned__(4))); - static void usb_endpointRead_complete(int ep) { if (UNLIKELY(ep >= ENP_MAX_NUMB)) @@ -1103,12 +1120,6 @@ ssize_t usb_endpointRead(int ep, void *buffer, ssize_t size) int ep_num = usb_ep_logical_to_hw(ep); ssize_t max_size = sizeof(rx_buffer); - if (UNLIKELY((size_t)buffer & 0x03)) - { - LOG_ERR("unaligned buffer @ %p\n", buffer); - ASSERT(0); - } - /* Non-blocking read for EP0 */ if (ep_num == CTRL_ENP_OUT) { @@ -1145,11 +1156,6 @@ ssize_t usb_endpointRead(int ep, void *buffer, ssize_t size) return rx_size; } -static bool tx_done; -static size_t tx_size; -static uint8_t tx_buffer[_MIN(CONFIG_USB_TXBUFSIZE, USB_TX_MAX_SIZE)] - __attribute__ ((__aligned__(4))); - static void usb_endpointWrite_complete(int ep) { if (UNLIKELY(ep >= ENP_MAX_NUMB)) @@ -1168,12 +1174,6 @@ ssize_t usb_endpointWrite(int ep, const void *buffer, ssize_t size) int ep_num = usb_ep_logical_to_hw(ep); ssize_t max_size = sizeof(tx_buffer); - if (UNLIKELY((size_t)buffer & 0x03)) - { - LOG_ERR("unaligned buffer @ %p\n", buffer); - ASSERT(0); - } - /* Non-blocking write for EP0 */ if (ep_num == CTRL_ENP_IN) {