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
4678rt_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 */
327359static 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
613638static 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,
741766rt_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