projects
/
bertos.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
STM32: USB: use distinct EP buffers
[bertos.git]
/
bertos
/
cpu
/
cortex-m3
/
drv
/
usb_stm32.c
diff --git
a/bertos/cpu/cortex-m3/drv/usb_stm32.c
b/bertos/cpu/cortex-m3/drv/usb_stm32.c
index 7c802d600ffd26f06ece450897f6e7c3dd30685a..924f86d2095e22204576cdfe051d569835402d1f 100644
(file)
--- a/
bertos/cpu/cortex-m3/drv/usb_stm32.c
+++ b/
bertos/cpu/cortex-m3/drv/usb_stm32.c
@@
-58,7
+58,10
@@
#include "usb_stm32.h"
#include "usb_stm32.h"
+/* XXX: consider to move this to cfg/compiler.h */
#define ALIGNED(x) __attribute__ ((__aligned__(x)))
#define ALIGNED(x) __attribute__ ((__aligned__(x)))
+
+/* XXX: consider to move this to cfg/macros.h */
#define ALIGN_UP(value, align) (((value) & ((align) - 1)) ? \
(((value) + ((align) - 1)) & ~((align) - 1)) : \
(value))
#define ALIGN_UP(value, align) (((value) & ((align) - 1)) ? \
(((value) + ((align) - 1)) & ~((align) - 1)) : \
(value))
@@
-89,7
+92,8
@@
struct stm32_usb
static struct stm32_usb *usb = (struct stm32_usb *)USB_BASE_ADDR;
/* Endpoint descriptors: used for handling requests to use with endpoints */
static struct stm32_usb *usb = (struct stm32_usb *)USB_BASE_ADDR;
/* Endpoint descriptors: used for handling requests to use with endpoints */
-static stm32_UsbEp ep_cnfg[ENP_MAX_NUMB];
+static stm32_UsbEp ep_cnfg[EP_MAX_NUM];
+STATIC_ASSERT(EP_MAX_NUM <= EP_MAX_HW_NUM);
/* USB EP0 control descriptor */
static const UsbEndpointDesc USB_CtrlEpDescr0 =
/* USB EP0 control descriptor */
static const UsbEndpointDesc USB_CtrlEpDescr0 =
@@
-145,15
+149,18
@@
static UsbDevice *usb_dev;
static stm32_UsbMemSlot *mem_use;
/* USB packet memory management: memory buffer metadata */
static stm32_UsbMemSlot *mem_use;
/* USB packet memory management: memory buffer metadata */
-#define EP_MAX_SLOTS 16
-static stm32_UsbMemSlot memory_buffer[EP_MAX_SLOTS];
+static stm32_UsbMemSlot memory_buffer[EP_MAX_NUM];
/* 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;
/* 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 ep_buffer[_MIN(CONFIG_USB_BUFSIZE, USB_XFER_MAX_SIZE)] ALIGNED(4);
+
+#define EP_BUFFER_SIZE _MIN(CONFIG_USB_BUFSIZE, USB_XFER_MAX_SIZE)
+STATIC_ASSERT(!(EP_BUFFER_SIZE & 0x03));
+
+static uint8_t ep_buffer[EP_MAX_NUM][EP_BUFFER_SIZE] ALIGNED(4);
/// \endcond
/* Allocate a free block of the packet memory */
/// \endcond
/* Allocate a free block of the packet memory */
@@
-207,13
+214,13
@@
static bool usb_alloc_buffer(uint16_t *pOffset, uint32_t *size,
mem = mem->next;
}
/* Check for out-of-memory condition */
mem = mem->next;
}
/* Check for out-of-memory condition */
- if (
(*pOffset + max_size) >= USB_BDT_OFFSET
)
+ if (
UNLIKELY((*pOffset + max_size) >= USB_BDT_OFFSET)
)
return false;
/*
* Allocate a new memory block, next to the last allocated block.
*/
mem_useNew = usb_malloc();
return false;
/*
* Allocate a new memory block, next to the last allocated block.
*/
mem_useNew = usb_malloc();
- if (
mem_useNew == NULL
)
+ if (
UNLIKELY(mem_useNew == NULL)
)
return false;
/* Insert the block to the list of allocated blocks */
if (mem_use == NULL)
return false;
/* Insert the block to the list of allocated blocks */
if (mem_use == NULL)
@@
-684,7
+691,7
@@
out: \
static stm32_UsbIoStatus
__usb_ep_read(int ep, void *buffer, ssize_t size, void (*complete)(int))
{
static stm32_UsbIoStatus
__usb_ep_read(int ep, void *buffer, ssize_t size, void (*complete)(int))
{
- if (UNLIKELY((ep >= E
NP_MAX_NUMB
) || (ep & 0x01)))
+ if (UNLIKELY((ep >= E
P_MAX_NUM
) || (ep & 0x01)))
{
LOG_ERR("%s: invalid EP number %d\n", __func__, ep);
ASSERT(0);
{
LOG_ERR("%s: invalid EP number %d\n", __func__, ep);
ASSERT(0);
@@
-703,7
+710,7
@@
__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))
{
static stm32_UsbIoStatus
__usb_ep_write(int ep, const void *buffer, ssize_t size, void (*complete)(int))
{
- if (UNLIKELY((ep >= E
NP_MAX_NUMB
) || !(ep & 0x01)))
+ if (UNLIKELY((ep >= E
P_MAX_NUM
) || !(ep & 0x01)))
{
LOG_ERR("%s: invalid EP number %d\n", __func__, ep);
ASSERT(0);
{
LOG_ERR("%s: invalid EP number %d\n", __func__, ep);
ASSERT(0);
@@
-1103,7
+1110,7
@@
static void usb_status_handler(UNUSED_ARG(int, EP))
static void usb_endpointRead_complete(int ep)
{
static void usb_endpointRead_complete(int ep)
{
- if (UNLIKELY(ep >= E
NP_MAX_NUMB
))
+ if (UNLIKELY(ep >= E
P_MAX_NUM
))
{
ASSERT(0);
return;
{
ASSERT(0);
return;
@@
-1117,7
+1124,7
@@
static void usb_endpointRead_complete(int ep)
ssize_t usb_endpointRead(int ep, void *buffer, ssize_t size)
{
int ep_num = usb_ep_logical_to_hw(ep);
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(ep_buffer);
+ ssize_t max_size = sizeof(ep_buffer
[ep_num]
);
/* Non-blocking read for EP0 */
if (ep_num == CTRL_ENP_OUT)
/* Non-blocking read for EP0 */
if (ep_num == CTRL_ENP_OUT)
@@
-1134,9
+1141,9
@@
ssize_t usb_endpointRead(int ep, void *buffer, ssize_t size)
usb_status_handler(ep_num);
else
{
usb_status_handler(ep_num);
else
{
- __usb_ep_read(ep_num, ep_buffer, size,
+ __usb_ep_read(ep_num, ep_buffer
[ep_num]
, size,
usb_status_handler);
usb_status_handler);
- memcpy(buffer, ep_buffer, size);
+ memcpy(buffer, ep_buffer
[ep_num]
, size);
}
return size;
}
}
return size;
}
@@
-1147,17
+1154,18
@@
ssize_t usb_endpointRead(int ep, void *buffer, ssize_t size)
rx_size = 0;
/* Blocking read */
rx_size = 0;
/* Blocking read */
- __usb_ep_read(ep_num, ep_buffer, size, usb_endpointRead_complete);
+ __usb_ep_read(ep_num, ep_buffer[ep_num], size,
+ usb_endpointRead_complete);
while (!rx_done)
cpu_relax();
while (!rx_done)
cpu_relax();
- memcpy(buffer, ep_buffer, rx_size);
+ memcpy(buffer, ep_buffer
[ep_num]
, rx_size);
return rx_size;
}
static void usb_endpointWrite_complete(int ep)
{
return rx_size;
}
static void usb_endpointWrite_complete(int ep)
{
- if (UNLIKELY(ep >= E
NP_MAX_NUMB
))
+ if (UNLIKELY(ep >= E
P_MAX_NUM
))
{
ASSERT(0);
return;
{
ASSERT(0);
return;
@@
-1171,7
+1179,7
@@
static void usb_endpointWrite_complete(int ep)
ssize_t usb_endpointWrite(int ep, const void *buffer, ssize_t size)
{
int ep_num = usb_ep_logical_to_hw(ep);
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(ep_buffer);
+ ssize_t max_size = sizeof(ep_buffer
[ep_num]
);
/* Non-blocking write for EP0 */
if (ep_num == CTRL_ENP_IN)
/* Non-blocking write for EP0 */
if (ep_num == CTRL_ENP_IN)
@@
-1188,8
+1196,8
@@
ssize_t usb_endpointWrite(int ep, const void *buffer, ssize_t size)
usb_status_handler(ep_num);
else
{
usb_status_handler(ep_num);
else
{
- memcpy(ep_buffer, buffer, size);
- __usb_ep_write(ep_num, ep_buffer, size,
+ memcpy(ep_buffer
[ep_num]
, buffer, size);
+ __usb_ep_write(ep_num, ep_buffer
[ep_num]
, size,
usb_status_handler);
}
return size;
usb_status_handler);
}
return size;
@@
-1201,8
+1209,9
@@
ssize_t usb_endpointWrite(int ep, const void *buffer, ssize_t size)
tx_size = 0;
/* Blocking write */
tx_size = 0;
/* Blocking write */
- memcpy(ep_buffer, buffer, size);
- __usb_ep_write(ep_num, ep_buffer, size, usb_endpointWrite_complete);
+ memcpy(ep_buffer[ep_num], buffer, size);
+ __usb_ep_write(ep_num, ep_buffer[ep_num], size,
+ usb_endpointWrite_complete);
while (!tx_done)
cpu_relax();
while (!tx_done)
cpu_relax();