Find a file
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
android chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
apps rk27generic: FM radio screen keys, tuner noted as an RDA5807P 2026-09-30 08:07:47 -04:00
backdrops ap80max: New hosted port 2026-08-13 17:55:06 -07:00
bootloader h1x0/h3x0: Get rid of redundant cut-down bidi_l2v() function 2026-09-29 10:16:26 -04:00
docs firmware: limit system_memory_guard() to coldfire targets 2026-09-23 13:12:48 -04:00
firmware rk27xx: bring the hardware-tested UDC fixes to the current USB core 2026-09-30 15:28:54 +02:00
fonts chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
icons chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
lib flac: decode residuals that use all 32 bits 2026-09-30 08:24:15 -04:00
manual manual: Fix case of "iPod" 2026-09-30 07:58:19 -04:00
packaging 3ds: Port refactor. 2026-09-01 08:39:07 -04:00
tools imx233: re-enable utf8proc and associated functionality. 2026-09-29 22:39:49 -04:00
uisimulator Add "rbfs" prefix to native filesystem functions 2026-09-17 16:22:31 -04:00
utils misc: forums.rockbox.org -> www.rockbox.org/forums 2026-09-27 10:46:01 -04:00
wps ap80max: New hosted port 2026-08-13 17:55:06 -07:00
.gitattributes Add a gitattributes file for the migration. 2011-12-01 14:14:59 +00:00
.gitignore misc: Update gitignore to cover a bunch of utils/* binaries 2026-06-17 13:56:29 -04:00
.gitreview misc: Add a .gitreview file for better gerrit integration 2021-06-24 07:22:19 -04:00

               __________               __   ___.
     Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
     Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
     Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
     Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
                       \/            \/     \/    \/            \/

Build Your Own Rockbox

1. Clone 'rockbox' from git (or extract a downloaded archive).

   $ git clone git://git.rockbox.org/rockbox

     or

   $ tar xJf rockbox.tar.xz

2. Create a build directory, preferably in the same directory as the firmware/
   and apps/ directories. This is where all generated files will be written.

   $ cd rockbox
   $ mkdir build
   $ cd build

3. Make sure you have mips/m68k/arm-elf-gcc and siblings in the PATH. Make sure
   that you have 'perl' in your PATH too. Your gcc cross compiler needs to be
   a particular version depending on what player you are compiling for. These
   can be generated using the rockboxdev.sh script in the /tools/ folder of the
   source.

   $ which arm-elf-eabi-gcc
   $ which perl

4. In your build directory, run the 'tools/configure' script and enter what
   target you want to build for and if you want a debug version or not (and a
   few more questions). It'll prompt you. The debug version is for making a
   gdb version out of it. It is only useful if you run gdb towards your target
   Archos.

   $ ../tools/configure

5. *ploink*. Now you have got a Makefile generated for you.

6. Run 'make' and soon the necessary pieces from the firmware and the apps
   directories have been compiled, linked and scrambled for you.

   $ make
   $ make zip

7. unzip the rockbox.zip on your music player, reboot it and
   *smile*.

If you want to build for more than one target, just create several build
directories and create a setup for each target:

   $ mkdir build-fuzeplus
   $ cd build-fuzeplus
   $ ../tools/configure

   $ mkdir build-xduoox3
   $ cd build-xduoox3
   $ ../tools/configure

Questions anyone? Ask on the mailing list or on IRC. We'll be happy to help you!