arduino / arduino/ArduinoCore-mbed
USBAudio (Giga R1) Faulting - USBPhy_STM32.cpp connected to Mac
- Dominant language
- C
- Stars
- 411
- Forks
- 225
- PR merge metrics
- No merged PRs in 30d
Description
Hi Guys,
I'm not sure where to post this, So I thought I would start here.
Taking the following test code:
```
#include "PluggableUSBAudio.h"
#define BUF_SIZE (128)
USBAudio audio(true, 44100, 2, 44100, 2);
static uint8_t buf[BUF_SIZE];
void setup()
{
for (uint32_t u = 0; u < BUF_SIZE; u+=2)
{
buf[u] = 0;
}
}
void loop()
{
if(audio.read(buf, BUF_SIZE))
{
audio.write(buf, BUF_SIZE);
}
}
```
This causes the Giga R1 to fault due to an assert on line 617 of `USBPhy_STM32.cpp`, basically the TX fifo buffer is smaller than the packet size.
```
MBED_ASSERT(len >= max_packet);
```
The TX fifo buffers are created from line 423:
```
uint32_t total_bytes = 0;
/* Reserve space in the RX buffer for:
* - 1 isochonous packet
* - 2 max sized non-isochonous packets
* - setup buffer - 10 words as specified by Reference Manual
* - global nak out - 1 words as specified by Reference Manual
*/
uint32_t fifo_size = (MAX_PACKET_SIZE_ISO + 4) + (MAX_PACKET_SIZE_NON_ISO + 4) * 2 + (10 * 4) + (1 * 4);
HAL_PCDEx_SetRxFiFo(&hpcd, (fifo_size / 4));
total_bytes += fifo_size;
/* Reserve Tx space up front */
for (int i = 0; i < NUM_ENDPOINTS; i++) {
fifo_size = tx_ep_sizes[i] + 4;
HAL_PCDEx_SetTxFiFo(&hpcd, i, fifo_size / 4);
total_bytes += fifo_size;
}
```
And the tx_sp_sizes array is statically declared on line 54:
```
static const uint32_t tx_ep_sizes[NUM_ENDPOINTS] = {
MAX_PACKET_SIZE_NON_ISO,
MAX_PACKET_SIZE_NON_ISO,
MAX_PACKET_SIZE_NON_ISO,
#if defined(TARGET_STM32H7)
MAX_PACKET_SIZE_NON_ISO,
MAX_PACKET_SIZE_NON_ISO,
#endif
MAX_PACKET_SIZE_ISO
};
```
Those size defines are declared on line 49:
```
#define MAX_PACKET_SIZE_NON_ISO 64
#define MAX_PACKET_SIZE_ISO (256 + 128) // Spec can go up to 1023, only ram for this though
```
Now connected to a Mac the packet size can be 180 when the Mac is configuring the device, but we have a fifo size of 64. So the assert is hit.
If I change the `MAX_PACKET_SIZE_NON_ISO` to 180 then the example code works, and it will echo audio back.
Does anyone know about the USBAudio and USBPhy_STM32 and what might be going on here?
Cheers
Andy
Contributor guide
No contributing guide indexed for this repository
Research direction
Start with USBPhy_STM32.cpp, especially the tx_ep_sizes definition, FIFO setup around line 423, and the assertion near line 617. Reproduce the supplied USBAudio loop on a Giga R1 connected to a Mac and inspect the packet and FIFO sizes during configuration. Done means the example no longer asserts and can echo audio successfully without an undersized TX FIFO.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- c
- Domain
- embedded-iot
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100