Skip to content

Commit d6b173b

Browse files
fix:[components][drivers][sdio] fix the sequence of switching to emmc high-speed ddr mode #11037
1 parent 7330df6 commit d6b173b

File tree

1 file changed

+73
-48
lines changed

1 file changed

+73
-48
lines changed

components/drivers/sdio/dev_mmc.c

Lines changed: 73 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -7,45 +7,77 @@
77
* Date Author Notes
88
* 2015-06-15 hichard first version
99
* 2024-05-25 HPMicro add HS400 support
10+
* 2025-12-11 HPMicro correct the sequence of switching to high-speed ddr mode
1011
*/
1112

1213
#include <drivers/dev_mmcsd_core.h>
1314
#include <drivers/dev_mmc.h>
1415

15-
#define DBG_TAG "SDIO"
16+
#define DBG_TAG "SDIO"
1617
#ifdef RT_SDIO_DEBUG
17-
#define DBG_LVL DBG_LOG
18+
#define DBG_LVL DBG_LOG
1819
#else
19-
#define DBG_LVL DBG_INFO
20+
#define DBG_LVL DBG_INFO
2021
#endif /* RT_SDIO_DEBUG */
2122
#include <rtdbg.h>
2223

23-
static const rt_uint32_t tran_unit[] =
24-
{
24+
static const rt_uint32_t tran_unit[] = {
2525
10000, 100000, 1000000, 10000000,
26-
0, 0, 0, 0
26+
0, 0, 0, 0
2727
};
2828

29-
static const rt_uint8_t tran_value[] =
30-
{
31-
0, 10, 12, 13, 15, 20, 25, 30,
32-
35, 40, 45, 50, 55, 60, 70, 80,
29+
static const rt_uint8_t tran_value[] = {
30+
0,
31+
10,
32+
12,
33+
13,
34+
15,
35+
20,
36+
25,
37+
30,
38+
35,
39+
40,
40+
45,
41+
50,
42+
55,
43+
60,
44+
70,
45+
80,
3346
};
3447

35-
static const rt_uint32_t tacc_uint[] =
36-
{
37-
1, 10, 100, 1000, 10000, 100000, 1000000, 10000000,
48+
static const rt_uint32_t tacc_uint[] = {
49+
1,
50+
10,
51+
100,
52+
1000,
53+
10000,
54+
100000,
55+
1000000,
56+
10000000,
3857
};
3958

40-
static const rt_uint8_t tacc_value[] =
41-
{
42-
0, 10, 12, 13, 15, 20, 25, 30,
43-
35, 40, 45, 50, 55, 60, 70, 80,
59+
static const rt_uint8_t tacc_value[] = {
60+
0,
61+
10,
62+
12,
63+
13,
64+
15,
65+
20,
66+
25,
67+
30,
68+
35,
69+
40,
70+
45,
71+
50,
72+
55,
73+
60,
74+
70,
75+
80,
4476
};
4577

4678
rt_inline rt_uint32_t GET_BITS(rt_uint32_t *resp,
47-
rt_uint32_t start,
48-
rt_uint32_t size)
79+
rt_uint32_t start,
80+
rt_uint32_t size)
4981
{
5082
const rt_int32_t __size = size;
5183
const rt_uint32_t __mask = (__size < 32 ? 1 << __size : 0) - 1;
@@ -198,22 +230,22 @@ static int mmc_parse_ext_csd(struct rt_mmcsd_card *card, rt_uint8_t *ext_csd)
198230
uint8_t device_type = ext_csd[EXT_CSD_CARD_TYPE];
199231
if ((host->flags & MMCSD_SUP_HS400) && (device_type & EXT_CSD_CARD_TYPE_HS400))
200232
{
201-
card->flags |= CARD_FLAG_HS400;
233+
card->flags |= CARD_FLAG_HS400;
202234
card->max_data_rate = 200000000;
203235
}
204236
else if ((host->flags & MMCSD_SUP_HS200) && (device_type & EXT_CSD_CARD_TYPE_HS200))
205237
{
206-
card->flags |= CARD_FLAG_HS200;
238+
card->flags |= CARD_FLAG_HS200;
207239
card->max_data_rate = 200000000;
208240
}
209241
else if ((host->flags & MMCSD_SUP_HIGHSPEED_DDR) && (device_type & EXT_CSD_CARD_TYPE_DDR_52))
210242
{
211-
card->flags |= CARD_FLAG_HIGHSPEED_DDR;
243+
card->flags |= CARD_FLAG_HIGHSPEED_DDR;
212244
card->hs_max_data_rate = 52000000;
213245
}
214246
else
215247
{
216-
card->flags |= CARD_FLAG_HIGHSPEED;
248+
card->flags |= CARD_FLAG_HIGHSPEED;
217249
card->hs_max_data_rate = 52000000;
218250
}
219251

@@ -252,7 +284,7 @@ static int mmc_switch(struct rt_mmcsd_card *card, rt_uint8_t set,
252284
{
253285
int err;
254286
struct rt_mmcsd_host *host = card->host;
255-
struct rt_mmcsd_cmd cmd = {0};
287+
struct rt_mmcsd_cmd cmd = { 0 };
256288

257289
cmd.cmd_code = SWITCH;
258290
cmd.arg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
@@ -326,14 +358,12 @@ static int mmc_compare_ext_csds(struct rt_mmcsd_card *card,
326358
*/
327359
static int mmc_select_bus_width(struct rt_mmcsd_card *card, rt_uint8_t *ext_csd)
328360
{
329-
rt_uint32_t ext_csd_bits[][2] =
330-
{
331-
{EXT_CSD_BUS_WIDTH_8, EXT_CSD_DDR_BUS_WIDTH_8},
332-
{EXT_CSD_BUS_WIDTH_4, EXT_CSD_DDR_BUS_WIDTH_4},
333-
{EXT_CSD_BUS_WIDTH_1, EXT_CSD_BUS_WIDTH_1},
361+
rt_uint32_t ext_csd_bits[][2] = {
362+
{ EXT_CSD_BUS_WIDTH_8, EXT_CSD_DDR_BUS_WIDTH_8 },
363+
{ EXT_CSD_BUS_WIDTH_4, EXT_CSD_DDR_BUS_WIDTH_4 },
364+
{ EXT_CSD_BUS_WIDTH_1, EXT_CSD_BUS_WIDTH_1 },
334365
};
335-
rt_uint32_t bus_widths[] =
336-
{
366+
rt_uint32_t bus_widths[] = {
337367
MMCSD_BUS_WIDTH_8,
338368
MMCSD_BUS_WIDTH_4,
339369
MMCSD_BUS_WIDTH_1
@@ -403,24 +433,23 @@ static int mmc_select_bus_width(struct rt_mmcsd_card *card, rt_uint8_t *ext_csd)
403433
}
404434
}
405435

406-
if (!err && ddr)
407-
{
408-
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
409-
EXT_CSD_BUS_WIDTH,
410-
ext_csd_bits[idx][1]);
411-
}
412-
413436
if (!err)
414437
{
415438
if (card->flags & (CARD_FLAG_HIGHSPEED | CARD_FLAG_HIGHSPEED_DDR))
416439
{
417-
418440
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
419441
EXT_CSD_HS_TIMING,
420442
1);
421443
}
422444
}
423445

446+
if (!err && ddr)
447+
{
448+
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
449+
EXT_CSD_BUS_WIDTH,
450+
ext_csd_bits[idx][1]);
451+
}
452+
424453
return err;
425454
}
426455

@@ -514,7 +543,7 @@ static int mmc_switch_to_hs400(struct rt_mmcsd_card *card)
514543

515544
/* Switch to HS_TIMING to 0x01 (High Speed) */
516545
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
517-
EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS);
546+
EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS);
518547
if (err != RT_EOK)
519548
{
520549
return err;
@@ -530,9 +559,7 @@ static int mmc_switch_to_hs400(struct rt_mmcsd_card *card)
530559
* 0x86 if enhanced data strobe is supported, or
531560
* 0x06 if enhanced data strobe is not supported
532561
*/
533-
ext_csd_bus_width = support_enhanced_ds ?
534-
EXT_CSD_DDR_BUS_WIDTH_8_EH_DS :
535-
EXT_CSD_DDR_BUS_WIDTH_8;
562+
ext_csd_bus_width = support_enhanced_ds ? EXT_CSD_DDR_BUS_WIDTH_8_EH_DS : EXT_CSD_DDR_BUS_WIDTH_8;
536563

537564
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
538565
EXT_CSD_BUS_WIDTH,
@@ -553,9 +580,7 @@ static int mmc_switch_to_hs400(struct rt_mmcsd_card *card)
553580
}
554581

555582
/* Change the Host timing accordingly */
556-
hs_timing = support_enhanced_ds ?
557-
MMCSD_TIMING_MMC_HS400_ENH_DS :
558-
MMCSD_TIMING_MMC_HS400;
583+
hs_timing = support_enhanced_ds ? MMCSD_TIMING_MMC_HS400_ENH_DS : MMCSD_TIMING_MMC_HS400;
559584
mmcsd_set_timing(host, hs_timing);
560585

561586
/* Host may changes frequency to <= 200MHz */
@@ -611,7 +636,7 @@ static int mmc_select_timing(struct rt_mmcsd_card *card)
611636
}
612637

613638
static rt_int32_t mmcsd_mmc_init_card(struct rt_mmcsd_host *host,
614-
rt_uint32_t ocr)
639+
rt_uint32_t ocr)
615640
{
616641
rt_int32_t err;
617642
rt_uint32_t resp[4];
@@ -741,7 +766,7 @@ static rt_int32_t mmcsd_mmc_init_card(struct rt_mmcsd_host *host,
741766
rt_int32_t init_mmc(struct rt_mmcsd_host *host, rt_uint32_t ocr)
742767
{
743768
rt_int32_t err;
744-
rt_uint32_t current_ocr;
769+
rt_uint32_t current_ocr;
745770
/*
746771
* We need to get OCR a different way for SPI.
747772
*/

0 commit comments

Comments
 (0)