rockbox/firmware
Marcin Bukat 70c546113d rk27xx: bring the hardware-tested UDC fixes to the current USB core
The rk27xx UDC driver was fixed and stress-tested on a generic rk2705
against the USB core of early 2026 - including a port to the control
request API of that time. Meanwhile the core took over the EP0 state
machine (usb_core_setup_received()) and endpoint allocation, and the
driver was converted to both without the fixes. This carries them over.

Transfers and resets (a mass-storage stress test fell off the bus after
10,000 - 27,000 operations without these):
- Transfers are set up with interrupts disabled: the interrupt handler
  advances buf/cnt of the same endpoint for the next packet.
- ep_write()'s wait for TXFULL to clear is bounded by an iteration count.
  It also runs in the interrupt handler, where current_tick never
  advances, so a tick timeout spun forever.
- A bus reset cancels transfers - usb_drv_cancel_all_transfers() was
  empty - instead of re-initialising the completion semaphores, which
  loses a thread blocked on one for good; blocked senders are woken with
  an error and the enabled endpoints NAKed and flushed. The reset handler
  also calls usb_core_bus_reset(), which it never did.
- Blocking sends time out after a second and report the error.
- An ACK with no transfer armed (one cancelled by a reset) is ignored.

Configuration:
- The configuration number is DEV_INFO [11:8]; it was read as bits 10:7,
  bit 7 being DEV_EN, so configuration 1 was reported as 2.
- The UDC completes SET_ADDRESS and SET_CONFIGURATION itself, raising no
  interrupt, so udc_helper() - which reports them from DEV_INFO - also
  runs from a tick task while the device is unconfigured. After a bus
  reset of a configured device the host re-sends SET_CONFIGURATION and
  goes straight to a bulk command that NAKs without interrupting: without
  the tick, the device never came back.

EP0, with the core now running the control state machine:
- Right after connect the UDC reports one SETUP with both registers zero;
  no host sends that, and it is ignored.
- A SETUP clears a stall, and ends - reported to the core as failed -
  any EP0 transfer still in flight, which belongs to a request the host
  abandoned; otherwise the core would wait for it forever. EP0 stall uses
  the EP0 registers, not endpoints[0], a stub without registers.
- Control reads are clipped to wLength and end with a zero length packet
  when a short answer fills whole packets.
- The core arms status stages with no buffer; they land in a dummy one.
- A status OUT arriving while the data IN is still going - the host took
  less than was offered - ends the data stage too.
- At a bus reset EP0 transfers are dropped silently: the core resets its
  own EP0 state.

Tested on a generic rk2705. The transfer, reset and configuration fixes
first against the USB core of early 2026: RAM-disk, NAND and SD stress
tests over USB mass storage, and usbreset recovery. Then the driver as it
is here, on the current core: enumeration, and a mass-storage stress test
of three LUNs at once (RAM disk, NAND, SD) that also passes after an eject
and a cold power cycle.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Change-Id: I1b2d03ca8f688f2a0e7b28ead64b7ab050a0a9e8
2026-09-30 15:28:54 +02:00
..
asm asm: ARMv7-M: replace unity-gain write_samples() asm with memcpy 2026-07-15 22:56:05 -04:00
common Add "rbfs" prefix to native filesystem functions 2026-09-17 16:22:31 -04:00
drivers rk27xx codec: mix in only the tuner's line, keep the DAC 2026-09-30 08:07:15 -04:00
export rk27generic: FM radio screen keys, tuner noted as an RDA5807P 2026-09-30 08:07:47 -04:00
include Add "rbfs" prefix to native filesystem functions 2026-09-17 16:22:31 -04:00
kernel 3ds: Port refactor. 2026-09-01 08:39:07 -04:00
libc chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
reggen stm32h743: implement timer API 2026-07-11 17:23:36 -04:00
target rk27xx: bring the hardware-tested UDC fixes to the current USB core 2026-09-30 15:28:54 +02:00
usbstack rk27xx: keep interrupt and bulk endpoints in separate groups 2026-09-28 16:55:21 +02:00
arabjoin.c
arabjoin.h unicode: Support characters beyond the first unicode plane 2025-09-12 09:24:30 -04:00
ata_idle_notify.c chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
backlight-sw-fading.c chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
backlight.c chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
bidi.c bidi: do not pass non-ASCII codepoints to ispunct() 2026-07-01 21:03:38 -04:00
buflib_malloc.c chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
buflib_mempool.c chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
chunk_alloc.c chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
COPYING
core_alloc.c Fix building Warble when configured as the iPod Video 2026-08-25 08:01:09 -04:00
debug.c chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
eeprom_settings.c firmware: move iriver flash helper functions into target tree 2026-09-23 13:44:45 -04:00
elf_loader.c chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
enc_base.c chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
events.c chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
firmware.make chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
font.c Add "rbfs" prefix to native filesystem functions 2026-09-17 16:22:31 -04:00
font_cache.c unicode: Support characters beyond the first unicode plane 2025-09-12 09:24:30 -04:00
general.c chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
hangul.c unicode: Support characters beyond the first unicode plane 2025-09-12 09:24:30 -04:00
lc-rock.c Add "rbfs" prefix to native filesystem functions 2026-09-17 16:22:31 -04:00
linuxboot.c chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
logf.c chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
lru.c
panic.c chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
pcm.c pcm_sink: allow per-sink swvol/hwvol selection 2026-08-14 22:39:13 +09:00
pcm_mixer.c pcm_mixer: fix active_channels handling in mixer_handle_sampr_change 2026-07-23 21:17:13 -04:00
pcm_sampr.c chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
pcm_sw_volume.c swvol: Switch to using WANT_SWVOL_32 in pcm_sw_volume.c 2026-08-14 22:45:14 -04:00
powermgmt.c chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
profile.c chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
README
rolo.c ROLO: Get rid of redundant call to audio_hard_stop() 2026-09-23 16:52:01 -04:00
rom.lds h300: add support for ROM image generation 2020-10-26 01:37:42 +00:00
screendump.c chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
scroll_engine.c chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
sdmmc.c chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
sound.c audiohw: remove unused BALANCE_CAP and CLIPPING_CAP 2026-07-20 12:47:12 -04:00
SOURCES YP-CP3: Si4703 FM radio 2026-09-29 09:47:51 +02:00
storage.c chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
system.c firmware: move iriver flash helper functions into target tree 2026-09-23 13:44:45 -04:00
timer.c chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
tuner.c chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
usb.c FS#14011: Handle usb hosts whose first request is SET_ADDRESS (Anthony Fletcher) 2026-09-27 19:36:21 -04:00

See docs/README