mirror of
https://github.com/Rockbox/rockbox.git
synced 2026-10-10 08:03:04 -04:00
rk27xx: don't switch SD cards to high-speed mode
Every SD write failed. The card took the write command and went to receive-data state, but never saw the block: CMD12 still found it there, and the controller reported a missing CRC status after each block, 20 retries over. Reads worked. Stress-tested over USB mass storage on a generic rk2705, with a SDHC card, in the normal firmware and in the bootloader alike. sd_init_card() switched the card to high-speed mode with CMD6. This host is an SD 1.01 controller with a card clock of at most 25 MHz, per the rk27xx datasheet; high speed and CMD6 came with SD 1.10, and a card switched to it evidently does not take the data this host drives. The original firmware never switches: after selecting the card it sets the block length and a 1-bit bus and stays at default speed. A slower card clock did not help; dropping the switch alone did. Leave the card at default speed. Tested on a generic rk2705: ums_stress.py over a 32 MiB window of the card - fill, verify, edge sizes, a mixed read/write soak - passes at 2.3 MB/s writing and reading, about 75% of what a 1-bit bus at 25 MHz carries. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Change-Id: Icfafab0bb460c8c0fda3dea455df9a36622bf764
This commit is contained in:
parent
5c74d20bce
commit
2ce1cdcd8e
1 changed files with 5 additions and 4 deletions
|
|
@ -323,10 +323,11 @@ static int sd_init_card(void)
|
|||
if (!sd_wait_card_busy())
|
||||
return -21;
|
||||
|
||||
/* CMD6 */
|
||||
if(!send_cmd(SD_SWITCH_FUNC, 0x80fffff1, RES_R1, &response))
|
||||
return -8;
|
||||
sleep(HZ/10);
|
||||
/* No CMD6 switch to high-speed mode: this is an SD 1.01 host, with a
|
||||
* card clock of at most 25 MHz, and a card switched to high speed does
|
||||
* not take the data it drives - every write failed, the card waiting in
|
||||
* receive-data state for a block it never saw, while reads worked. The
|
||||
* original firmware leaves the card at default speed too. */
|
||||
|
||||
/* Card back to full speed 25MHz*/
|
||||
SD_CTRL = (SD_CTRL & ~0x7FF);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue