STM32: USB: compact code and silent a buggy doxygen warning
[bertos.git] / bertos / cpu / cortex-m3 / drv / usb_stm32.c
index 154f0a04743a1b8f9b874a633031162730cfa93d..ad91a9b83f8f578a2beefd501c6fca590bdc9817 100644 (file)
@@ -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)
        {