mirror of
https://github.com/Rockbox/rockbox.git
synced 2026-10-09 23:53:28 -04:00
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 |
||
|---|---|---|
| android | ||
| apps | ||
| backdrops | ||
| bootloader | ||
| docs | ||
| firmware | ||
| fonts | ||
| icons | ||
| lib | ||
| manual | ||
| packaging | ||
| tools | ||
| uisimulator | ||
| utils | ||
| wps | ||
| .gitattributes | ||
| .gitignore | ||
| .gitreview | ||
__________ __ ___.
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!