summaryrefslogtreecommitdiff
path: root/components/drivers
diff options
context:
space:
mode:
authorJianjia Ma <[email protected]>2021-04-13 18:04:59 +0100
committerGitHub <[email protected]>2021-04-13 18:04:59 +0100
commit4e74279d272c3dea6f702258456462cba717d763 (patch)
treeeeb1dfbc130f11ba0e8bd51098fadc81bbec4ef5 /components/drivers
parentc44e5165bef5b7b069eb99a4f027454f417a726b (diff)
Add more trys when switching data width
Try a few times before switching to other data widths. The original strategy (simply wait for 20ms ) failed on STM32H743 with an MTFC4GACAJCN-4M (4GB EMMC) when switching data width. (unless the debugging info is enabled, which add more delays) With this EMMC, the fixed delay was set to 50ms for it to be able to work. Instead of a fixed delay, I think we better change to trying a few more times with smaller delays.
Diffstat (limited to 'components/drivers')
-rw-r--r--components/drivers/sdio/mmc.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/components/drivers/sdio/mmc.c b/components/drivers/sdio/mmc.c
index 5aba3dba7a..e48a7ebcfb 100644
--- a/components/drivers/sdio/mmc.c
+++ b/components/drivers/sdio/mmc.c
@@ -300,7 +300,7 @@ static int mmc_select_bus_width(struct rt_mmcsd_card *card, rt_uint8_t *ext_csd)
MMCSD_BUS_WIDTH_1
};
struct rt_mmcsd_host *host = card->host;
- unsigned idx, bus_width = 0;
+ unsigned idx, trys, bus_width = 0;
int err = 0;
if (GET_BITS(card->resp_cid, 122, 4) < 4)
@@ -335,10 +335,13 @@ static int mmc_select_bus_width(struct rt_mmcsd_card *card, rt_uint8_t *ext_csd)
if (err)
continue;
- bus_width = bus_widths[idx];
- mmcsd_set_bus_width(host, bus_width);
- mmcsd_delay_ms(20); //delay 10ms
- err = mmc_compare_ext_csds(card, ext_csd, bus_width);
+ for(trys = 0; trys < 5; trys++){
+ mmcsd_set_bus_width(host, bus_width);
+ mmcsd_delay_ms(10);
+ err = mmc_compare_ext_csds(card, ext_csd, bus_width);
+ if(!err)
+ break;
+ }
if (!err) {
err = bus_width;
break;