Datasheet

Table Of Contents
Description
The USB host has two types of transactions: normal software initiated transfer, and interrupt transfers,
where the host polls an interrupt endpoint after a specific amount of time. For example, polling a mouse
every 1ms to check for movement. Interrupt transfer are single buffered, but the controller doesn’t reset the
buffer selector to zero. This means that if a software initiated transfer happened then the interrupt transfer
can potentially raise the buffer done flag with BUF1 selected instead of BUF0. The fix is to ignore the
BUFF_CPU_SHOULD_HANDLE register for interrupt endpoints.
Workaround
Affects
RP2040B0, RP2040B1
Fixed by
Software
RP2040-E4
Reference
RP2040-E4
Summary
USB host writes to upper half of buffer status in single buffered mode.
Description
The USB host maintains a buffer selector which switches between BUF0 and BUF1. This should only be
toggled in double buffered mode but is toggled in single buffered mode too. For a transaction lasting
multiple packets (i.e. length more than 8 bytes in low speed mode, and length more than 64 bytes in full
speed mode), the buffer status can be written back to the BUF1 half of the status register when the buffer
select is incorrectly set to BUF1. Note this does not affect reading new buffer information from the buffer
control register, as the controller ignores the buffer selector in single buffered mode when reading the
buffer control register.
Workaround
Shift endpoint control register to the right by 16 bits if the buffer selector is BUF1. You can use
BUFF_CPU_SHOULD_HANDLE find the value of the buffer selector when the bufer was marked as done.
Affects
RP2040B0, RP2040B1
Fixed by
Software
RP2040-E5
Reference
RP2040-E5
Summary
USB device fails to exit RESET state on busy USB bus.
RP2040 Datasheet
USB 642