Skip to content

Commit c9bb527

Browse files
committed
Fix ST test failures due to endpoint reconfiguration
Also always use the max endpoint size for SetTxFifo since re-configuring fifos when endpoints are added or removed causes tests to fail.
1 parent b959913 commit c9bb527

File tree

1 file changed

+56
-23
lines changed

1 file changed

+56
-23
lines changed

usb/device/targets/TARGET_STM/USBPhy_STM32.cpp

Lines changed: 56 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,19 @@
4141
#define LOG_OUT_TO_EP(ep) ((ep) | 0x00)
4242
#define IDX_TO_EP(ep) (((ep) >> 1)|((ep) & 1) << 7)
4343

44+
/* endpoint defines */
45+
#define NUM_ENDPOINTS 4
46+
#define MAX_PACKET_NON_ISO 64
47+
#define MAX_PACKET_ISO (256 + 128) // Spec can go up to 1023, only ram for this though
48+
#define ENDPOINT_NON_ISO (USB_EP_ATTR_ALLOW_BULK | USB_EP_ATTR_ALLOW_INT)
49+
50+
static const uint32_t tx_ep_sizes[NUM_ENDPOINTS] = {
51+
MAX_PACKET_NON_ISO,
52+
MAX_PACKET_NON_ISO,
53+
MAX_PACKET_NON_ISO,
54+
MAX_PACKET_ISO
55+
};
56+
4457
uint32_t HAL_PCDEx_GetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo)
4558
{
4659
uint32_t len;
@@ -274,11 +287,28 @@ void USBPhyHw::init(USBPhyEvents *events)
274287
hpcd.State = HAL_PCD_STATE_RESET;
275288
HAL_PCD_Init(&hpcd);
276289

290+
291+
uint32_t total_bytes = 0;
292+
293+
/* Reserve space in the RX buffer for:
294+
* - 1 isochonous packet
295+
* - 2 max sized non-isochonous packets
296+
* - setup buffer - 10 words as specified by Reference Manual
297+
* - global nak out - 1 words as specified by Reference Manual
298+
*/
299+
uint32_t fifo_size = (MAX_PACKET_ISO + 4) + (MAX_PACKET_NON_ISO + 4) * 2 + (10 * 4) + (1 * 4);
300+
HAL_PCDEx_SetRxFiFo(&hpcd, (fifo_size / 4));
301+
total_bytes += fifo_size;
302+
303+
/* Reserve Tx space up front */
304+
for (int i = 0; i < NUM_ENDPOINTS; i++) {
305+
fifo_size = tx_ep_sizes[i] + 4;
306+
HAL_PCDEx_SetTxFiFo(&hpcd, i, fifo_size / 4);
307+
total_bytes += fifo_size;
308+
}
309+
277310
/* 1.25 kbytes */
278-
/* min value 16 (= 16 x 4 bytes) */
279-
/* max value 256 (= 1K bytes ) */
280-
/* maximum sum is 0x140 */
281-
HAL_PCDEx_SetRxFiFo(&hpcd, (MAXTRANSFER_SIZE / 4));
311+
MBED_ASSERT(total_bytes <= 1280);
282312

283313
// Configure interrupt vector
284314
NVIC_SetVector(USBHAL_IRQn, (uint32_t)&_usbisr);
@@ -340,24 +370,24 @@ void USBPhyHw::remote_wakeup()
340370
const usb_ep_table_t *USBPhyHw::endpoint_table()
341371
{
342372
static const usb_ep_table_t table = {
343-
1280, // 1.25K for endpoint buffers
373+
1280, // 1.25K for endpoint buffers but space is allocated up front
344374
{
345-
{USB_EP_ATTR_ALLOW_CTRL | USB_EP_ATTR_DIR_IN_AND_OUT, 1, 80},
346-
{USB_EP_ATTR_ALLOW_ALL | USB_EP_ATTR_DIR_IN_AND_OUT, 1, 4},
347-
{USB_EP_ATTR_ALLOW_ALL | USB_EP_ATTR_DIR_IN_AND_OUT, 1, 4},
348-
{USB_EP_ATTR_ALLOW_ALL | USB_EP_ATTR_DIR_IN_AND_OUT, 1, 4},
349-
{USB_EP_ATTR_ALLOW_ALL | USB_EP_ATTR_DIR_IN_AND_OUT, 1, 4},
350-
{0 | USB_EP_ATTR_DIR_IN_AND_OUT, 1, 4},
351-
{0 | USB_EP_ATTR_DIR_IN_AND_OUT, 1, 4},
352-
{0 | USB_EP_ATTR_DIR_IN_AND_OUT, 1, 4},
353-
{0 | USB_EP_ATTR_DIR_IN_AND_OUT, 1, 4},
354-
{0 | USB_EP_ATTR_DIR_IN_AND_OUT, 1, 4},
355-
{0 | USB_EP_ATTR_DIR_IN_AND_OUT, 1, 4},
356-
{0 | USB_EP_ATTR_DIR_IN_AND_OUT, 1, 4},
357-
{0 | USB_EP_ATTR_DIR_IN_AND_OUT, 1, 4},
358-
{0 | USB_EP_ATTR_DIR_IN_AND_OUT, 1, 4},
359-
{0 | USB_EP_ATTR_DIR_IN_AND_OUT, 1, 4},
360-
{0 | USB_EP_ATTR_DIR_IN_AND_OUT, 1, 4}
375+
{USB_EP_ATTR_ALLOW_CTRL | USB_EP_ATTR_DIR_IN_AND_OUT, 0, 0},
376+
{ENDPOINT_NON_ISO | USB_EP_ATTR_DIR_IN_AND_OUT, 0, 0},
377+
{ENDPOINT_NON_ISO | USB_EP_ATTR_DIR_IN_AND_OUT, 0, 0},
378+
{USB_EP_ATTR_ALLOW_ALL | USB_EP_ATTR_DIR_IN_AND_OUT, 0, 0},
379+
{0 | USB_EP_ATTR_DIR_IN_AND_OUT, 0, 0},
380+
{0 | USB_EP_ATTR_DIR_IN_AND_OUT, 0, 0},
381+
{0 | USB_EP_ATTR_DIR_IN_AND_OUT, 0, 0},
382+
{0 | USB_EP_ATTR_DIR_IN_AND_OUT, 0, 0},
383+
{0 | USB_EP_ATTR_DIR_IN_AND_OUT, 0, 0},
384+
{0 | USB_EP_ATTR_DIR_IN_AND_OUT, 0, 0},
385+
{0 | USB_EP_ATTR_DIR_IN_AND_OUT, 0, 0},
386+
{0 | USB_EP_ATTR_DIR_IN_AND_OUT, 0, 0},
387+
{0 | USB_EP_ATTR_DIR_IN_AND_OUT, 0, 0},
388+
{0 | USB_EP_ATTR_DIR_IN_AND_OUT, 0, 0},
389+
{0 | USB_EP_ATTR_DIR_IN_AND_OUT, 0, 0},
390+
{0 | USB_EP_ATTR_DIR_IN_AND_OUT, 0, 0}
361391
}
362392
};
363393
return &table;
@@ -409,9 +439,12 @@ void USBPhyHw::ep0_stall()
409439
bool USBPhyHw::endpoint_add(usb_ep_t endpoint, uint32_t max_packet, usb_ep_type_t type)
410440
{
411441
uint32_t len;
412-
if (max_packet > MAXTRANSFER_SIZE) return false;
442+
443+
/*
444+
* Endpoints are configured in init since re-configuring
445+
* fifos when endpoints are added or removed causes tests to fail.
446+
*/
413447
if (endpoint & 0x80) {
414-
HAL_PCDEx_SetTxFiFo(&hpcd, endpoint & 0x7f, (max_packet / 4) + 1);
415448
len = HAL_PCDEx_GetTxFiFo(&hpcd,endpoint & 0x7f);
416449
MBED_ASSERT(len >= max_packet);
417450
}

0 commit comments

Comments
 (0)