Skip to content

Commit d2ee5a3

Browse files
committed
[sdio][dm] Support DM mode
1. Support features read by DM. 2. Support regulator API in drivers. 3. Support send tuning option CMD. 4. Replace `switch_uhs_voltage` by `signal_voltage_switch`. Signed-off-by: GuEe-GUI <[email protected]>
1 parent c01b44f commit d2ee5a3

File tree

9 files changed

+826
-60
lines changed

9 files changed

+826
-60
lines changed

bsp/hpmicro/libraries/drivers/drv_sdio.c

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ static hpm_stat_t hpm_sdmmc_transfer_polling(struct hpm_mmcsd *mmcsd, sdxc_adma_
9797
static hpm_stat_t hpm_sdmmc_transfer_interrupt_driven(struct hpm_mmcsd *mmcsd, sdxc_adma_config_t *dma_config, sdxc_xfer_t *xfer);
9898
static hpm_stat_t hpm_sdmmc_transfer(struct hpm_mmcsd *mmcsd, sdxc_adma_config_t *dma_config, sdxc_xfer_t *xfer);
9999
static rt_int32_t hpm_sdmmc_execute_tuning(struct rt_mmcsd_host *host, rt_int32_t opcode);
100-
static rt_int32_t hpm_sdmmc_switch_uhs_voltage(struct rt_mmcsd_host *host);
100+
static rt_err_t hpm_sdmmc_signal_voltage_switch(struct rt_mmcsd_host *host, struct rt_mmcsd_io_cfg *io_cfg);
101101

102102
static void hpm_sdmmc_power_on_via_pin(struct hpm_mmcsd *mmcsd);
103103
static void hpm_sdmmc_power_off_via_pin(struct hpm_mmcsd *mmcsd);
@@ -153,6 +153,11 @@ static void hpm_sdmmc_switch_to_1v8_via_pin(struct hpm_mmcsd *mmcsd)
153153

154154

155155
static rt_int32_t hpm_sdmmc_switch_uhs_voltage(struct rt_mmcsd_host *host)
156+
{
157+
158+
}
159+
160+
static rt_err_t hpm_sdmmc_signal_voltage_switch(struct rt_mmcsd_host *host, struct rt_mmcsd_io_cfg *io_cfg)
156161
{
157162
struct hpm_mmcsd *mmcsd = (struct hpm_mmcsd *) host->private_data;
158163
SDXC_Type *base = mmcsd->sdxc_base;
@@ -174,9 +179,17 @@ static rt_int32_t hpm_sdmmc_switch_uhs_voltage(struct rt_mmcsd_host *host)
174179
return -RT_ETIMEOUT;
175180
}
176181

177-
/* 3. Switch to 1.8V */
178-
hpm_sdmmc_switch_to_1v8_via_pin(mmcsd);
179-
sdxc_select_voltage(mmcsd->sdxc_base, sdxc_bus_voltage_sd_1v8);
182+
/* 3. Switch to 1.8V/3.3V */
183+
if (ios->signal_voltage == MMCSD_SIGNAL_VOLTAGE_330)
184+
{
185+
hpm_sdmmc_switch_to_3v3_via_pin(mmcsd);
186+
sdxc_select_voltage(mmcsd->sdxc_base, sdxc_bus_voltage_sd_3v3);
187+
}
188+
else
189+
{
190+
hpm_sdmmc_switch_to_1v8_via_pin(mmcsd);
191+
sdxc_select_voltage(mmcsd->sdxc_base, sdxc_bus_voltage_sd_1v8);
192+
}
180193

181194
/* 4. spec:host delay 5ms, host: give more delay time here */
182195
rt_thread_mdelay(10);
@@ -203,17 +216,14 @@ static rt_int32_t hpm_sdmmc_switch_uhs_voltage(struct rt_mmcsd_host *host)
203216
return RT_EOK;
204217
}
205218

206-
207-
208-
209219
static const struct rt_mmcsd_host_ops hpm_mmcsd_host_ops =
210220
{
211221
.request = hpm_sdmmc_request,
212222
.set_iocfg = hpm_sdmmc_set_iocfg,
213223
.get_card_status = NULL,
214224
.enable_sdio_irq = hpm_sdmmc_enable_sdio_irq,
215225
.execute_tuning = hpm_sdmmc_execute_tuning,
216-
.switch_uhs_voltage = hpm_sdmmc_switch_uhs_voltage,
226+
.signal_voltage_switch = hpm_sdmmc_signal_voltage_switch,
217227
};
218228

219229
void hpm_sdmmc_isr(struct hpm_mmcsd *mmcsd)

components/drivers/include/drivers/dev_mmcsd_core.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,12 @@ void mmcsd_set_bus_width(struct rt_mmcsd_host *host, rt_uint32_t width);
242242
void mmcsd_set_timing(struct rt_mmcsd_host *host, rt_uint32_t timing);
243243
void mmcsd_set_data_timeout(struct rt_mmcsd_data *data, const struct rt_mmcsd_card *card);
244244
rt_uint32_t mmcsd_select_voltage(struct rt_mmcsd_host *host, rt_uint32_t ocr);
245+
rt_err_t mmcsd_set_signal_voltage(struct rt_mmcsd_host *host, unsigned char signal_voltage);
246+
void mmcsd_set_initial_signal_voltage(struct rt_mmcsd_host *host);
247+
rt_err_t mmcsd_host_set_uhs_voltage(struct rt_mmcsd_host *host);
248+
rt_err_t mmcsd_set_uhs_voltage(struct rt_mmcsd_host *host, rt_uint32_t ocr);
249+
rt_err_t mmcsd_send_tuning(struct rt_mmcsd_host *host, rt_uint32_t opcode, rt_err_t *cmd_error);
250+
rt_err_t mmcsd_send_abort_tuning(struct rt_mmcsd_host *host, rt_uint32_t opcode);
245251
void mmcsd_change(struct rt_mmcsd_host *host);
246252
void mmcsd_detect(void *param);
247253
void mmcsd_host_init(struct rt_mmcsd_host *host);

components/drivers/include/drivers/mmcsd_host.h

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ struct rt_mmcsd_io_cfg
7676
#define MMCSD_SIGNAL_VOLTAGE_330 0
7777
#define MMCSD_SIGNAL_VOLTAGE_180 1
7878
#define MMCSD_SIGNAL_VOLTAGE_120 2
79+
80+
rt_bool_t enhanced_strobe;
7981
};
8082

8183
struct rt_mmcsd_host;
@@ -88,9 +90,23 @@ struct rt_mmcsd_host_ops
8890
rt_int32_t (*get_card_status)(struct rt_mmcsd_host *host);
8991
void (*enable_sdio_irq)(struct rt_mmcsd_host *host, rt_int32_t en);
9092
rt_int32_t (*execute_tuning)(struct rt_mmcsd_host *host, rt_int32_t opcode);
91-
rt_int32_t (*switch_uhs_voltage)(struct rt_mmcsd_host *host);
93+
rt_bool_t (*card_busy)(struct rt_mmcsd_host *host);
94+
rt_err_t (*signal_voltage_switch)(struct rt_mmcsd_host *host, struct rt_mmcsd_io_cfg *io_cfg);
9295
};
9396

97+
#ifdef RT_USING_REGULATOR
98+
struct rt_regulator;
99+
100+
struct rt_mmcsd_supply
101+
{
102+
rt_bool_t vqmmc_enabled;
103+
rt_bool_t regulator_enabled;
104+
105+
struct rt_regulator *vmmc; /* Card power supply */
106+
struct rt_regulator *vqmmc; /* Optional Vccq supply */
107+
};
108+
#endif /* RT_USING_REGULATOR */
109+
94110
struct rt_mmcsd_host
95111
{
96112
char name[RT_NAME_MAX];
@@ -158,6 +174,13 @@ struct rt_mmcsd_host
158174
struct rt_semaphore *sdio_irq_sem;
159175
struct rt_thread *sdio_irq_thread;
160176

177+
#ifdef RT_USING_REGULATOR
178+
struct rt_mmcsd_supply supply;
179+
#endif
180+
#ifdef RT_USING_OFW
181+
void *ofw_node;
182+
#endif
183+
161184
void *private_data;
162185
};
163186
#ifdef __cplusplus

components/drivers/sdio/SConscript

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,32 @@
1-
Import('RTT_ROOT')
21
from building import *
32

3+
group = []
4+
objs = []
5+
6+
if not GetDepend(['RT_USING_SDIO']):
7+
Return('group')
8+
49
cwd = GetCurrentDir()
5-
src = Split("""
6-
dev_block.c
7-
dev_mmcsd_core.c
8-
dev_sd.c
9-
dev_sdio.c
10-
dev_mmc.c
11-
""")
10+
list = os.listdir(cwd)
11+
CPPPATH = [cwd + '/../include']
12+
13+
src = ['dev_block.c', 'dev_mmcsd_core.c', 'dev_sd.c', 'dev_sdio.c', 'dev_mmc.c']
14+
15+
if GetDepend(['RT_USING_DM']):
16+
src += ['dev_sdio_dm.c']
17+
18+
if GetDepend('RT_USING_SDHCI'):
19+
src += ['dev_sdhci.c', 'dev_sdhci_dm.c', 'dev_sdhci_host.c']
1220

13-
# The set of source files associated with this SConscript file.
14-
path = [cwd + '/../include' , cwd + '/sdhci/include']
21+
if GetDepend(['RT_USING_REGULATOR']):
22+
src += ['dev_regulator.c']
1523

16-
if GetDepend('RT_USING_SDHCI'):
17-
src += [os.path.join('sdhci', 'sdhci.c')]
18-
src += [os.path.join('sdhci', 'fit-mmc.c')]
19-
src += [os.path.join('sdhci', 'sdhci-platform.c')]
24+
group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH)
2025

21-
group = DefineGroup('DeviceDrivers', src, depend = ['RT_USING_SDIO'], CPPPATH = path)
26+
for d in list:
27+
path = os.path.join(cwd, d)
28+
if os.path.isfile(os.path.join(path, 'SConscript')):
29+
objs = objs + SConscript(os.path.join(d, 'SConscript'))
30+
objs = objs + group
2231

23-
Return('group')
32+
Return('objs')

0 commit comments

Comments
 (0)