Skip to content

Commit c19712c

Browse files
author
李乔中
committed
Sd msg drv add 250519
1 parent e883e68 commit c19712c

File tree

11 files changed

+1339
-108
lines changed

11 files changed

+1339
-108
lines changed

bsp/phytium/board/board.kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ choice
4343
config BOARD_NAME
4444
string
4545
default "firefly"
46-
source "$SDK_DIR/board/firefly/firefly.kconfig"
46+
source "$SDK_DIR/board/phytiumpi_firefly/firefly.kconfig"
4747
endif
4848

4949
config PD2408_TEST_A_BOARD

bsp/phytium/libraries/SConscript

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ if GetDepend(['BSP_USING_SDCARD_FATFS']):
7373

7474
if GetDepend(['FIREFLY_DEMO_BOARD']):
7575
src += Glob(cwd + '/port/fboard_port/firefly/mnt_sdcard.c')
76+
77+
if GetDepend(['PD2408_TEST_A_BOARD']):
78+
src += Glob(cwd + '/port/fboard_port/pd2408_test_a/mnt_sdcard.c')
7679
else:
7780
src += Glob(cwd + '/port/fboard_port/mnt_ramdisk.c')
7881

@@ -123,6 +126,11 @@ if GetDepend(['BSP_USING_SDIF']):
123126
src += Glob(PHYTIUM_SDK_DIR+'/drivers/mmc/fsdif/*.c') + Glob(PORT_DRV_DIR+'/drv_sdif.c')
124127
path += [PHYTIUM_SDK_DIR + '/drivers/mmc/fsdif/']
125128

129+
## sdif_msg
130+
if GetDepend(['BSP_USING_SDIF_MSG']):
131+
src += Glob(PHYTIUM_SDK_DIR+'/drivers/mmc/fsdif_v2_0/*.c') + Glob(PORT_DRV_DIR+'/drv_sdif_msg.c')
132+
path += [PHYTIUM_SDK_DIR + '/drivers/mmc/fsdif_v2_0/'] + [PHYTIUM_SDK_DIR + '/drivers/msg/']
133+
126134
## gpio
127135
if GetDepend(['BSP_USING_GPIO']):
128136
src += Glob(PHYTIUM_SDK_DIR+'/drivers/pin/fgpio/*.c') + Glob(PORT_DRV_DIR+'/drv_gpio.c')
@@ -185,14 +193,14 @@ if GetDepend(['E2000D_DEMO_BOARD']):
185193
src += Glob(PHYTIUM_SDK_DIR+'/board/e2000d_demo/fio_mux.c')
186194
path += [PHYTIUM_SDK_DIR + '/board/e2000d_demo/']
187195

188-
if GetDepend(['BSP_USING_SDIF']):
196+
if GetDepend(['BSP_USING_SDIF_LAYER']):
189197
src += Glob(PHYTIUM_SDK_DIR+'/board/e2000d_demo/fsdif_timing.c')
190198

191199
if GetDepend(['E2000Q_DEMO_BOARD']):
192200
src += Glob(PHYTIUM_SDK_DIR+'/board/e2000q_demo/fio_mux.c')
193201
path += [PHYTIUM_SDK_DIR + '/board/e2000q_demo/']
194202

195-
if GetDepend(['BSP_USING_SDIF']):
203+
if GetDepend(['BSP_USING_SDIF_LAYER']):
196204
src += Glob(PHYTIUM_SDK_DIR+'/board/e2000q_demo/fsdif_timing.c')
197205

198206
if GetDepend(['PD2408_TEST_A_BOARD']):
@@ -214,21 +222,21 @@ if GetDepend(['FIREFLY_DEMO_BOARD']):
214222
src += Glob(PHYTIUM_SDK_DIR+'/board/firefly/fio_mux.c')
215223
path += [PHYTIUM_SDK_DIR + '/board/firefly/']
216224

217-
if GetDepend(['BSP_USING_SDIF']):
225+
if GetDepend(['BSP_USING_SDIF_LAYER']):
218226
src += Glob(PHYTIUM_SDK_DIR+'/board/firefly/fsdif_timing.c')
219227

220228
if GetDepend(['PD2408_TEST_A_BOARD']):
221229
src += Glob(PHYTIUM_SDK_DIR+'/board/pd2408_test_a/fio_mux.c')
222230
path += [PHYTIUM_SDK_DIR + '/board/pd2408_test_a/']
223231

224-
if GetDepend(['BSP_USING_SDIF']):
232+
if GetDepend(['BSP_USING_SDIF_LAYER']):
225233
src += Glob(PHYTIUM_SDK_DIR+'/board/pd2408_test_a/fsdif_timing.c')
226234

227235
if GetDepend(['PD2408_TEST_B_BOARD']):
228236
src += Glob(PHYTIUM_SDK_DIR+'/board/pd2408_test_b/fio_mux.c')
229237
path += [PHYTIUM_SDK_DIR + '/board/pd2408_test_b/']
230238

231-
if GetDepend(['BSP_USING_SDIF']):
239+
if GetDepend(['BSP_USING_SDIF_LAYER']):
232240
src += Glob(PHYTIUM_SDK_DIR+'/board/pd2408_test_b/fsdif_timing.c')
233241

234242

bsp/phytium/libraries/drivers/Kconfig

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ menu "On-chip Peripheral Drivers"
6060
endif
6161
endif
6262

63+
menuconfig BSP_USING_SPI_LAYER
6364
menuconfig BSP_USING_SPI_LAYER
6465
bool "Enable SPI Layer"
6566
default n
@@ -305,48 +306,62 @@ menu "On-chip Peripheral Drivers"
305306
default n
306307
endif
307308

308-
menuconfig BSP_USING_SDIF
309-
bool "Enable SDIF"
309+
menuconfig BSP_USING_SDIF_LAYER
310+
bool "Enable SDIF Layer"
310311
default n
311312
select RT_USING_SDIO
312-
313-
if BSP_USING_SDIF
314-
config BSP_USING_SDCARD_FATFS
315-
bool "Enable SDCARD (FATFS)"
316-
select RT_USING_DFS_ELMFAT
317-
default n
318-
313+
314+
if BSP_USING_SDIF_LAYER
315+
config BSP_USING_SDCARD_FATFS
316+
bool "Enable SDCARD (FATFS)"
317+
select RT_USING_DFS_ELMFAT
318+
default n
319+
320+
choice
321+
prompt "Select SD Mode"
322+
default BSP_USING_SDIF
323+
config BSP_USING_SDIF
324+
bool "Standard SD"
325+
help
326+
Use standard SD protocol
327+
config BSP_USING_SDIF_MSG
328+
bool "Message-based SD"
329+
help
330+
Use message-based SD communication
331+
endchoice
332+
333+
if (BSP_USING_SDIF || BSP_USING_SDIF_MSG)
319334
config USING_SDIF0
320335
bool "Use SDIF0"
336+
default n
321337

322338
if USING_SDIF0
323339
choice
324-
prompt "Select SD0 Usage"
325-
default USE_SDIF0_TF
340+
prompt "Select SD0 Usage"
341+
default USE_SDIF0_TF
326342
config USE_SDIF0_TF
327343
bool "SD0(TF)"
328-
329344
config USE_SDIF0_EMMC
330345
bool "SD0(eMMC)"
331-
332346
endchoice
333347
endif
334-
348+
endif
349+
if (BSP_USING_SDIF)
335350
config USING_SDIF1
336351
bool "Use SDIF1"
352+
default n
337353

338354
if USING_SDIF1
339355
choice
340-
prompt "Select SD1 Usage"
341-
default USE_SDIF1_TF
356+
prompt "Select SD1 Usage"
357+
default USE_SDIF1_TF
342358
config USE_SDIF1_TF
343359
bool "SD1(TF)"
344-
345360
config USE_SDIF1_EMMC
346361
bool "SD1(eMMC)"
347362
endchoice
348363
endif
349-
364+
endif
350365
endif
351366

352367
menuconfig BSP_USING_DC

bsp/phytium/libraries/drivers/drv_sdif.c

Lines changed: 62 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414

1515
/***************************** Include Files *********************************/
1616
#include "rtconfig.h"
17+
#if defined(BSP_USING_SDIF_LAYER)
1718

18-
#ifdef BSP_USING_SDIF
1919
#include <rthw.h>
2020
#include <rtdef.h>
2121
#include <rtthread.h>
@@ -240,50 +240,54 @@ static void sdif_convert_command_info(struct rt_mmcsd_host *host, struct rt_mmcs
240240
FSdifData *out_data = out_req->data_p;
241241
sdif_info_t *host_info = (sdif_info_t *)host->private_data;
242242

243-
out_cmd->flag = 0U;
243+
uint32_t opcode = in_cmd->cmd_code;
244+
out_cmd->rawcmd = FSDIF_CMD_INDX_SET(opcode);
244245

245246
if (in_cmd->cmd_code == GO_IDLE_STATE)
246247
{
247-
out_cmd->flag |= FSDIF_CMD_FLAG_NEED_INIT;
248+
out_cmd->rawcmd |= FSDIF_CMD_INIT;
248249
}
249250

250251
if (in_cmd->cmd_code == GO_INACTIVE_STATE)
251252
{
252-
out_cmd->flag |= FSDIF_CMD_FLAG_NEED_AUTO_STOP | FSDIF_CMD_FLAG_ABORT;
253+
out_cmd->rawcmd |= FSDIF_CMD_STOP_ABORT;
253254
}
254255

255-
if (resp_type(in_cmd) != RESP_NONE)
256+
if (in_cmd->cmd_code == VOLTAGE_SWITCH)
256257
{
257-
out_cmd->flag |= FSDIF_CMD_FLAG_EXP_RESP;
258+
out_cmd->rawcmd |= FSDIF_CMD_VOLT_SWITCH;
259+
}
258260

261+
if (resp_type(in_cmd) != RESP_NONE)
262+
{
263+
out_cmd->rawcmd |= FSDIF_CMD_RESP_EXP;
259264
if (resp_type(in_cmd) == RESP_R2)
260265
{
261266
/* need 136 bits long response */
262-
out_cmd->flag |= FSDIF_CMD_FLAG_EXP_LONG_RESP;
267+
out_cmd->rawcmd |= FSDIF_CMD_RESP_LONG;
263268
}
264269

265270
if ((resp_type(in_cmd) != RESP_R3) &&
266271
(resp_type(in_cmd) != RESP_R4))
267272
{
268273
/* most cmds need CRC */
269-
out_cmd->flag |= FSDIF_CMD_FLAG_NEED_RESP_CRC;
274+
out_cmd->rawcmd |= FSDIF_CMD_RESP_CRC;
270275
}
271276
}
272277

273278
if (in_data)
274279
{
275280
RT_ASSERT(out_data);
276-
out_cmd->flag |= FSDIF_CMD_FLAG_EXP_DATA;
281+
out_cmd->rawcmd |= FSDIF_CMD_DAT_EXP;
277282

278283
if (in_data->flags & DATA_DIR_READ)
279284
{
280-
out_cmd->flag |= FSDIF_CMD_FLAG_READ_DATA;
281285
out_data->buf = (void *)in_data->buf;
282286
out_data->buf_dma = (uintptr_t)in_data->buf + PV_OFFSET;
283287
}
284288
else if (in_data->flags & DATA_DIR_WRITE)
285289
{
286-
out_cmd->flag |= FSDIF_CMD_FLAG_WRITE_DATA;
290+
out_cmd->rawcmd |= FSDIF_CMD_DAT_WRITE;
287291
out_data->buf = (void *)in_data->buf;
288292
out_data->buf_dma = (uintptr_t)in_data->buf + PV_OFFSET;
289293
}
@@ -339,10 +343,20 @@ static rt_err_t sdif_do_transfer(struct rt_mmcsd_host *host, FSdifCmdData *req_c
339343
wait_event = SDIF_EVENT_COMMAND_DONE | SDIF_EVENT_DATA_DONE;
340344
}
341345

346+
if (req_cmd->data_p)
347+
{
348+
ret = FSdifSetupDMADescriptor(&host_info->sdif, req_cmd->data_p);
349+
if (ret != FT_SUCCESS)
350+
{
351+
LOG_E("FSdifSetupDMADescriptor fail.");
352+
return -RT_ERROR;
353+
}
354+
}
355+
342356
ret = FSdifDMATransfer(&host_info->sdif, req_cmd);
343357
if (ret != FT_SUCCESS)
344358
{
345-
LOG_E("FSdifDMATransfer() fail.");
359+
LOG_E("FSdifDMATransfer() fail. ret = 0x%x", ret);
346360
return -RT_ERROR;
347361
}
348362

@@ -445,18 +459,49 @@ static void sdif_send_request(struct rt_mmcsd_host *host, struct rt_mmcsd_req *r
445459

446460
static void sdif_set_iocfg(struct rt_mmcsd_host *host, struct rt_mmcsd_io_cfg *io_cfg)
447461
{
448-
FError ret = FT_SUCCESS;
449462
sdif_info_t *host_info = (sdif_info_t *)host->private_data;
450463
FSdif *sdif = &host_info->sdif;
451464
uintptr base_addr = sdif->config.base_addr;
452465

453466
if (0 != io_cfg->clock)
454467
{
455-
ret = FSdifSetClkFreq(sdif, io_cfg->clock);
456-
if (ret != FT_SUCCESS)
468+
boolean is_ddr = FALSE;
469+
if (host->card->type == CARD_TYPE_MMC)
470+
{
471+
if (io_cfg->timing == MMCSD_TIMING_MMC_HS400 ||
472+
io_cfg->timing == MMCSD_TIMING_MMC_HS400_ENH_DS)
473+
{
474+
is_ddr = TRUE;
475+
}
476+
}
477+
else if (host->card->type == CARD_TYPE_SD)
457478
{
458-
LOG_E("FSdifSetClkFreq fail.");
479+
if (io_cfg->timing == MMCSD_TIMING_UHS_DDR50)
480+
{
481+
is_ddr = TRUE;
482+
}
459483
}
484+
485+
if (FSDIF_SUCCESS != FSdifSetClkFreqByCalc(&dev->hc, is_ddr, io_cfg->clock))
486+
{
487+
LOG_E("FSdifSetClkFreqByCalc fail.")
488+
}
489+
490+
// FSdifTiming timing;
491+
// boolean is_ddr = FALSE;
492+
// memset(&timing, 0U, sizeof(timing));
493+
// /* Get the timing setting based on the clock frequency and device removability */
494+
// ret = FSdifGetTimingSetting(io_cfg->clock, sdif->config.non_removable, &timing);
495+
// if (ret != FT_SUCCESS)
496+
// {
497+
// LOG_E("Failed to find timing for clock-%d", io_cfg->clock);
498+
// }
499+
// /* Set the clock frequency using the obtained timing setting */
500+
// ret = FSdifSetClkFreqByDict(sdif, FALSE, &timing, io_cfg->clock);
501+
// if (ret != FT_SUCCESS)
502+
// {
503+
// LOG_E("FSdifSetClkFreq fail.");
504+
// }
460505
}
461506

462507
switch (io_cfg->bus_width)
@@ -618,8 +663,6 @@ static rt_err_t sdif_host_init(rt_uint32_t id, rt_uint32_t type)
618663
sdif_config.non_removable = TRUE; /* eMMC is unremovable on board */
619664
}
620665

621-
sdif_config.get_tuning = FSdifGetTimingSetting;
622-
623666
if (FSDIF_SUCCESS != FSdifCfgInitialize(&host_info->sdif, &sdif_config))
624667
{
625668
LOG_E("SDIF controller init failed.");
@@ -714,4 +757,4 @@ int rt_hw_sdif_init(void)
714757
return status;
715758
}
716759
INIT_DEVICE_EXPORT(rt_hw_sdif_init);
717-
#endif // #ifdef BSP_USING_SDIF
760+
#endif /* BSP_USING_SDIF_LAYER */

0 commit comments

Comments
 (0)