mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-02-07 01:44:41 +08:00
fix:[components][drivers][sdio] fix the sequence of switching to emmc high-speed ddr mode #11037
Some checks failed
RT-Thread BSP Static Build Check / 🔍 Summary of Git Diff Changes (push) Has been cancelled
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (push) Has been cancelled
RT-Thread BSP Static Build Check / collect-artifacts (push) Has been cancelled
pkgs_test / change (push) Has been cancelled
utest_auto_run / A9 :components/dfs.cfg (push) Has been cancelled
utest_auto_run / A9 :components/lwip.cfg (push) Has been cancelled
utest_auto_run / A9 :components/netdev.cfg (push) Has been cancelled
utest_auto_run / A9 :components/sal.cfg (push) Has been cancelled
utest_auto_run / A9 :cpp11/cpp11.cfg (push) Has been cancelled
utest_auto_run / AARCH64-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / A9-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / RISCV-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / XUANTIE-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / AARCH64 :default.cfg (push) Has been cancelled
utest_auto_run / AARCH64-smp :default.cfg (push) Has been cancelled
utest_auto_run / A9 :default.cfg (push) Has been cancelled
utest_auto_run / A9-smp :default.cfg (push) Has been cancelled
utest_auto_run / RISCV :default.cfg (push) Has been cancelled
utest_auto_run / RISCV-smp :default.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/atomic_c11.cfg (push) Has been cancelled
utest_auto_run / RISCV :kernel/atomic_c11.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/ipc.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/kernel_basic.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/mem.cfg (push) Has been cancelled
Weekly CI Scheduler / Trigger and Monitor CIs (push) Has been cancelled
Weekly CI Scheduler / Create Discussion Report (push) Has been cancelled
Some checks failed
RT-Thread BSP Static Build Check / 🔍 Summary of Git Diff Changes (push) Has been cancelled
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (push) Has been cancelled
RT-Thread BSP Static Build Check / collect-artifacts (push) Has been cancelled
pkgs_test / change (push) Has been cancelled
utest_auto_run / A9 :components/dfs.cfg (push) Has been cancelled
utest_auto_run / A9 :components/lwip.cfg (push) Has been cancelled
utest_auto_run / A9 :components/netdev.cfg (push) Has been cancelled
utest_auto_run / A9 :components/sal.cfg (push) Has been cancelled
utest_auto_run / A9 :cpp11/cpp11.cfg (push) Has been cancelled
utest_auto_run / AARCH64-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / A9-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / RISCV-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / XUANTIE-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / AARCH64 :default.cfg (push) Has been cancelled
utest_auto_run / AARCH64-smp :default.cfg (push) Has been cancelled
utest_auto_run / A9 :default.cfg (push) Has been cancelled
utest_auto_run / A9-smp :default.cfg (push) Has been cancelled
utest_auto_run / RISCV :default.cfg (push) Has been cancelled
utest_auto_run / RISCV-smp :default.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/atomic_c11.cfg (push) Has been cancelled
utest_auto_run / RISCV :kernel/atomic_c11.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/ipc.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/kernel_basic.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/mem.cfg (push) Has been cancelled
Weekly CI Scheduler / Trigger and Monitor CIs (push) Has been cancelled
Weekly CI Scheduler / Create Discussion Report (push) Has been cancelled
This commit is contained in:
@@ -7,45 +7,77 @@
|
||||
* Date Author Notes
|
||||
* 2015-06-15 hichard first version
|
||||
* 2024-05-25 HPMicro add HS400 support
|
||||
* 2025-12-11 HPMicro correct the sequence of switching to high-speed ddr mode
|
||||
*/
|
||||
|
||||
#include <drivers/dev_mmcsd_core.h>
|
||||
#include <drivers/dev_mmc.h>
|
||||
|
||||
#define DBG_TAG "SDIO"
|
||||
#define DBG_TAG "SDIO"
|
||||
#ifdef RT_SDIO_DEBUG
|
||||
#define DBG_LVL DBG_LOG
|
||||
#define DBG_LVL DBG_LOG
|
||||
#else
|
||||
#define DBG_LVL DBG_INFO
|
||||
#define DBG_LVL DBG_INFO
|
||||
#endif /* RT_SDIO_DEBUG */
|
||||
#include <rtdbg.h>
|
||||
|
||||
static const rt_uint32_t tran_unit[] =
|
||||
{
|
||||
static const rt_uint32_t tran_unit[] = {
|
||||
10000, 100000, 1000000, 10000000,
|
||||
0, 0, 0, 0
|
||||
0, 0, 0, 0
|
||||
};
|
||||
|
||||
static const rt_uint8_t tran_value[] =
|
||||
{
|
||||
0, 10, 12, 13, 15, 20, 25, 30,
|
||||
35, 40, 45, 50, 55, 60, 70, 80,
|
||||
static const rt_uint8_t tran_value[] = {
|
||||
0,
|
||||
10,
|
||||
12,
|
||||
13,
|
||||
15,
|
||||
20,
|
||||
25,
|
||||
30,
|
||||
35,
|
||||
40,
|
||||
45,
|
||||
50,
|
||||
55,
|
||||
60,
|
||||
70,
|
||||
80,
|
||||
};
|
||||
|
||||
static const rt_uint32_t tacc_uint[] =
|
||||
{
|
||||
1, 10, 100, 1000, 10000, 100000, 1000000, 10000000,
|
||||
static const rt_uint32_t tacc_uint[] = {
|
||||
1,
|
||||
10,
|
||||
100,
|
||||
1000,
|
||||
10000,
|
||||
100000,
|
||||
1000000,
|
||||
10000000,
|
||||
};
|
||||
|
||||
static const rt_uint8_t tacc_value[] =
|
||||
{
|
||||
0, 10, 12, 13, 15, 20, 25, 30,
|
||||
35, 40, 45, 50, 55, 60, 70, 80,
|
||||
static const rt_uint8_t tacc_value[] = {
|
||||
0,
|
||||
10,
|
||||
12,
|
||||
13,
|
||||
15,
|
||||
20,
|
||||
25,
|
||||
30,
|
||||
35,
|
||||
40,
|
||||
45,
|
||||
50,
|
||||
55,
|
||||
60,
|
||||
70,
|
||||
80,
|
||||
};
|
||||
|
||||
rt_inline rt_uint32_t GET_BITS(rt_uint32_t *resp,
|
||||
rt_uint32_t start,
|
||||
rt_uint32_t size)
|
||||
rt_uint32_t start,
|
||||
rt_uint32_t size)
|
||||
{
|
||||
const rt_int32_t __size = size;
|
||||
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)
|
||||
uint8_t device_type = ext_csd[EXT_CSD_CARD_TYPE];
|
||||
if ((host->flags & MMCSD_SUP_HS400) && (device_type & EXT_CSD_CARD_TYPE_HS400))
|
||||
{
|
||||
card->flags |= CARD_FLAG_HS400;
|
||||
card->flags |= CARD_FLAG_HS400;
|
||||
card->max_data_rate = 200000000;
|
||||
}
|
||||
else if ((host->flags & MMCSD_SUP_HS200) && (device_type & EXT_CSD_CARD_TYPE_HS200))
|
||||
{
|
||||
card->flags |= CARD_FLAG_HS200;
|
||||
card->flags |= CARD_FLAG_HS200;
|
||||
card->max_data_rate = 200000000;
|
||||
}
|
||||
else if ((host->flags & MMCSD_SUP_HIGHSPEED_DDR) && (device_type & EXT_CSD_CARD_TYPE_DDR_52))
|
||||
{
|
||||
card->flags |= CARD_FLAG_HIGHSPEED_DDR;
|
||||
card->flags |= CARD_FLAG_HIGHSPEED_DDR;
|
||||
card->hs_max_data_rate = 52000000;
|
||||
}
|
||||
else
|
||||
{
|
||||
card->flags |= CARD_FLAG_HIGHSPEED;
|
||||
card->flags |= CARD_FLAG_HIGHSPEED;
|
||||
card->hs_max_data_rate = 52000000;
|
||||
}
|
||||
|
||||
@@ -252,7 +284,7 @@ static int mmc_switch(struct rt_mmcsd_card *card, rt_uint8_t set,
|
||||
{
|
||||
int err;
|
||||
struct rt_mmcsd_host *host = card->host;
|
||||
struct rt_mmcsd_cmd cmd = {0};
|
||||
struct rt_mmcsd_cmd cmd = { 0 };
|
||||
|
||||
cmd.cmd_code = SWITCH;
|
||||
cmd.arg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
|
||||
@@ -326,14 +358,12 @@ out:
|
||||
*/
|
||||
static int mmc_select_bus_width(struct rt_mmcsd_card *card, rt_uint8_t *ext_csd)
|
||||
{
|
||||
rt_uint32_t ext_csd_bits[][2] =
|
||||
{
|
||||
{EXT_CSD_BUS_WIDTH_8, EXT_CSD_DDR_BUS_WIDTH_8},
|
||||
{EXT_CSD_BUS_WIDTH_4, EXT_CSD_DDR_BUS_WIDTH_4},
|
||||
{EXT_CSD_BUS_WIDTH_1, EXT_CSD_BUS_WIDTH_1},
|
||||
rt_uint32_t ext_csd_bits[][2] = {
|
||||
{ EXT_CSD_BUS_WIDTH_8, EXT_CSD_DDR_BUS_WIDTH_8 },
|
||||
{ EXT_CSD_BUS_WIDTH_4, EXT_CSD_DDR_BUS_WIDTH_4 },
|
||||
{ EXT_CSD_BUS_WIDTH_1, EXT_CSD_BUS_WIDTH_1 },
|
||||
};
|
||||
rt_uint32_t bus_widths[] =
|
||||
{
|
||||
rt_uint32_t bus_widths[] = {
|
||||
MMCSD_BUS_WIDTH_8,
|
||||
MMCSD_BUS_WIDTH_4,
|
||||
MMCSD_BUS_WIDTH_1
|
||||
@@ -403,6 +433,16 @@ static int mmc_select_bus_width(struct rt_mmcsd_card *card, rt_uint8_t *ext_csd)
|
||||
}
|
||||
}
|
||||
|
||||
if (!err)
|
||||
{
|
||||
if (card->flags & (CARD_FLAG_HIGHSPEED | CARD_FLAG_HIGHSPEED_DDR))
|
||||
{
|
||||
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
|
||||
EXT_CSD_HS_TIMING,
|
||||
1);
|
||||
}
|
||||
}
|
||||
|
||||
if (!err && ddr)
|
||||
{
|
||||
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
|
||||
@@ -410,17 +450,6 @@ static int mmc_select_bus_width(struct rt_mmcsd_card *card, rt_uint8_t *ext_csd)
|
||||
ext_csd_bits[idx][1]);
|
||||
}
|
||||
|
||||
if (!err)
|
||||
{
|
||||
if (card->flags & (CARD_FLAG_HIGHSPEED | CARD_FLAG_HIGHSPEED_DDR))
|
||||
{
|
||||
|
||||
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
|
||||
EXT_CSD_HS_TIMING,
|
||||
1);
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -514,7 +543,7 @@ static int mmc_switch_to_hs400(struct rt_mmcsd_card *card)
|
||||
|
||||
/* Switch to HS_TIMING to 0x01 (High Speed) */
|
||||
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
|
||||
EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS);
|
||||
EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS);
|
||||
if (err != RT_EOK)
|
||||
{
|
||||
return err;
|
||||
@@ -530,9 +559,7 @@ static int mmc_switch_to_hs400(struct rt_mmcsd_card *card)
|
||||
* 0x86 if enhanced data strobe is supported, or
|
||||
* 0x06 if enhanced data strobe is not supported
|
||||
*/
|
||||
ext_csd_bus_width = support_enhanced_ds ?
|
||||
EXT_CSD_DDR_BUS_WIDTH_8_EH_DS :
|
||||
EXT_CSD_DDR_BUS_WIDTH_8;
|
||||
ext_csd_bus_width = support_enhanced_ds ? EXT_CSD_DDR_BUS_WIDTH_8_EH_DS : EXT_CSD_DDR_BUS_WIDTH_8;
|
||||
|
||||
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
|
||||
EXT_CSD_BUS_WIDTH,
|
||||
@@ -553,9 +580,7 @@ static int mmc_switch_to_hs400(struct rt_mmcsd_card *card)
|
||||
}
|
||||
|
||||
/* Change the Host timing accordingly */
|
||||
hs_timing = support_enhanced_ds ?
|
||||
MMCSD_TIMING_MMC_HS400_ENH_DS :
|
||||
MMCSD_TIMING_MMC_HS400;
|
||||
hs_timing = support_enhanced_ds ? MMCSD_TIMING_MMC_HS400_ENH_DS : MMCSD_TIMING_MMC_HS400;
|
||||
mmcsd_set_timing(host, hs_timing);
|
||||
|
||||
/* Host may changes frequency to <= 200MHz */
|
||||
@@ -611,7 +636,7 @@ static int mmc_select_timing(struct rt_mmcsd_card *card)
|
||||
}
|
||||
|
||||
static rt_int32_t mmcsd_mmc_init_card(struct rt_mmcsd_host *host,
|
||||
rt_uint32_t ocr)
|
||||
rt_uint32_t ocr)
|
||||
{
|
||||
rt_int32_t err;
|
||||
rt_uint32_t resp[4];
|
||||
@@ -741,7 +766,7 @@ err:
|
||||
rt_int32_t init_mmc(struct rt_mmcsd_host *host, rt_uint32_t ocr)
|
||||
{
|
||||
rt_int32_t err;
|
||||
rt_uint32_t current_ocr;
|
||||
rt_uint32_t current_ocr;
|
||||
/*
|
||||
* We need to get OCR a different way for SPI.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user