|
41 | 41 | #define LOG_OUT_TO_EP(ep) ((ep) | 0x00)
|
42 | 42 | #define IDX_TO_EP(ep) (((ep) >> 1)|((ep) & 1) << 7)
|
43 | 43 |
|
| 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 | + |
44 | 57 | uint32_t HAL_PCDEx_GetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo)
|
45 | 58 | {
|
46 | 59 | uint32_t len;
|
@@ -274,11 +287,28 @@ void USBPhyHw::init(USBPhyEvents *events)
|
274 | 287 | hpcd.State = HAL_PCD_STATE_RESET;
|
275 | 288 | HAL_PCD_Init(&hpcd);
|
276 | 289 |
|
| 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 | + |
277 | 310 | /* 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); |
282 | 312 |
|
283 | 313 | // Configure interrupt vector
|
284 | 314 | NVIC_SetVector(USBHAL_IRQn, (uint32_t)&_usbisr);
|
@@ -340,24 +370,24 @@ void USBPhyHw::remote_wakeup()
|
340 | 370 | const usb_ep_table_t *USBPhyHw::endpoint_table()
|
341 | 371 | {
|
342 | 372 | 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 |
344 | 374 | {
|
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} |
361 | 391 | }
|
362 | 392 | };
|
363 | 393 | return &table;
|
@@ -409,9 +439,12 @@ void USBPhyHw::ep0_stall()
|
409 | 439 | bool USBPhyHw::endpoint_add(usb_ep_t endpoint, uint32_t max_packet, usb_ep_type_t type)
|
410 | 440 | {
|
411 | 441 | 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 | + */ |
413 | 447 | if (endpoint & 0x80) {
|
414 |
| - HAL_PCDEx_SetTxFiFo(&hpcd, endpoint & 0x7f, (max_packet / 4) + 1); |
415 | 448 | len = HAL_PCDEx_GetTxFiFo(&hpcd,endpoint & 0x7f);
|
416 | 449 | MBED_ASSERT(len >= max_packet);
|
417 | 450 | }
|
|
0 commit comments