liblitesdcard/sdcard: adjust card-ready timeout
Testing on nexys4ddr and rocket, approximately 12 iterations of the timeout loop (using `busy_wait(1)`) are needed to receive a "ready" response from the SDcard, assuming a "warm" reset where the card has already been previously initialized. If the SDcard is ejected and re-inserted, or if the board is "cold-reset" (e.g., reprogrammed via openocd vs. a simple push of the reset button), it takes approximately 450 iterations before the SDCard responds with a "ready" message. In either case, a timeout of 10 is insufficient. This patch increases the busy-wait to 10, and the timeout loop counter to 128, which should cover most cases. Additionally, make a few minor cosmetic improvements. Signed-off-by: Gabriel Somlo <gsomlo@gmail.com>
This commit is contained in:
parent
e473c6f29e
commit
6fdb36b84a
|
@ -448,7 +448,7 @@ void sdcard_decode_csd(void) {
|
||||||
|
|
||||||
int sdcard_init(void) {
|
int sdcard_init(void) {
|
||||||
unsigned short rca;
|
unsigned short rca;
|
||||||
uint16_t timeout;
|
uint16_t timeout;
|
||||||
|
|
||||||
/* initialize freq */
|
/* initialize freq */
|
||||||
sdcard_set_clk_freq(16000000);
|
sdcard_set_clk_freq(16000000);
|
||||||
|
@ -462,15 +462,13 @@ int sdcard_init(void) {
|
||||||
busy_wait(1);
|
busy_wait(1);
|
||||||
sdcard_send_ext_csd();
|
sdcard_send_ext_csd();
|
||||||
/* wait for card to be ready */
|
/* wait for card to be ready */
|
||||||
timeout = 10;
|
for (timeout = 128; timeout > 0; timeout--) {
|
||||||
while (timeout) {
|
|
||||||
sdcard_app_cmd(0);
|
sdcard_app_cmd(0);
|
||||||
sdcard_app_send_op_cond(1, 0);
|
sdcard_app_send_op_cond(1, 0);
|
||||||
if (sdcard_response[3] & 0x80000000) {
|
if (sdcard_response[3] & 0x80000000) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
busy_wait(1);
|
busy_wait(10);
|
||||||
timeout--;
|
|
||||||
}
|
}
|
||||||
if (timeout == 0)
|
if (timeout == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue