1
1
/*
2
- * Copyright (c) 2006-2023, RT-Thread Development Team
2
+ * Copyright (c) 2006-2024 RT-Thread Development Team
3
3
*
4
4
* SPDX-License-Identifier: Apache-2.0
5
5
*
27
27
#endif /* DRV_DEBUG */
28
28
#include <rtdbg.h>
29
29
30
- static struct stm32_sdio_class sdio_obj ;
31
30
static struct rt_mmcsd_host * host1 ;
32
31
static struct rt_mmcsd_host * host2 ;
33
32
@@ -55,6 +54,11 @@ struct rthw_sdio
55
54
rt_align (SDIO_ALIGN_LEN )
56
55
static rt_uint8_t cache_buf [SDIO_BUFF_SIZE ];
57
56
57
+ static rt_uint32_t stm32_sdio_clk_get (void )
58
+ {
59
+ return SDIO_CLOCK_FREQ ;
60
+ }
61
+
58
62
/**
59
63
* @brief This function get order from sdio.
60
64
* @param data
@@ -154,10 +158,6 @@ static void rthw_sdio_wait_completed(struct rthw_sdio *sdio)
154
158
return ;
155
159
}
156
160
157
- if (sdio -> pkg == RT_NULL )
158
- {
159
- return ;
160
- }
161
161
/* Get Card Specific Data */
162
162
cmd -> resp [0 ] = hsd -> RESP1 ;
163
163
if (resp_type (cmd ) == RESP_R2 )
@@ -262,7 +262,7 @@ static void rthw_sdio_send_command(struct rthw_sdio *sdio, struct sdio_pkg *pkg)
262
262
/* data pre configuration */
263
263
if (data != RT_NULL )
264
264
{
265
- SCB_CleanInvalidateDCache ( );
265
+ rt_hw_cpu_dcache_ops ( RT_HW_CACHE_FLUSH , cache_buf , data -> blks * data -> blksize );
266
266
267
267
reg_cmd |= SDMMC_CMD_CMDTRANS ;
268
268
__HAL_SD_DISABLE_IT (& sdio -> sdio_des .hw_sdio , SDMMC_MASK_CMDRENDIE | SDMMC_MASK_CMDSENTIE );
@@ -288,14 +288,21 @@ static void rthw_sdio_send_command(struct rthw_sdio *sdio, struct sdio_pkg *pkg)
288
288
/* Waiting for data to be sent to completion */
289
289
if (data != RT_NULL )
290
290
{
291
- volatile rt_uint32_t count = SDIO_TX_RX_COMPLETE_TIMEOUT_LOOPS ;
291
+ uint32_t timer = rt_tick_get () + rt_tick_from_millisecond ( 10 ) ;
292
292
293
- while (count && ( hsd -> STA & SDMMC_STA_DPSMACT ))
293
+ while (timer > rt_tick_get ( ))
294
294
{
295
- count -- ;
295
+ if (hsd -> STA & SDMMC_STA_DPSMACT )
296
+ {
297
+ continue ;
298
+ }
299
+ else
300
+ {
301
+ break ;
302
+ }
296
303
}
297
304
298
- if (( count == 0 ) || (hsd -> STA & SDIO_ERRORS ))
305
+ if (timer < rt_tick_get ( ) || (hsd -> STA & SDIO_ERRORS ))
299
306
{
300
307
cmd -> err = - RT_ERROR ;
301
308
}
@@ -307,7 +314,7 @@ static void rthw_sdio_send_command(struct rthw_sdio *sdio, struct sdio_pkg *pkg)
307
314
if (data -> flags & DATA_DIR_READ )
308
315
{
309
316
rt_memcpy (data -> buf , cache_buf , data -> blks * data -> blksize );
310
- SCB_CleanInvalidateDCache ( );
317
+ rt_hw_cpu_dcache_ops ( RT_HW_CACHE_INVALIDATE , cache_buf , data -> blks * data -> blksize );
311
318
}
312
319
}
313
320
}
@@ -374,6 +381,33 @@ static void rthw_sdio_iocfg(struct rt_mmcsd_host *host, struct rt_mmcsd_io_cfg *
374
381
SDMMC_InitTypeDef Init = {0 };
375
382
rt_uint32_t sdmmc_clk = sdio -> sdio_des .clk_get ();
376
383
384
+ rt_bool_t stop_flag = RT_TRUE ;
385
+
386
+ switch (io_cfg -> power_mode & 0X03 )
387
+ {
388
+ case MMCSD_POWER_OFF :
389
+ /* Set Power State to OFF */
390
+ (void )SDMMC_PowerState_OFF (hsd -> Instance );
391
+ stop_flag = RT_TRUE ;
392
+ break ;
393
+ case MMCSD_POWER_UP :
394
+ /* In F4 series chips, 0X01 is reserved bit and has no practical effect.
395
+ For F7 series chips, 0X01 is power-on after power-off,The SDMMC disables the function and the card clock stops.
396
+ For H7 series chips, 0X03 is the power-on function.
397
+ */
398
+ stop_flag = RT_TRUE ;
399
+ break ;
400
+ case MMCSD_POWER_ON :
401
+ stop_flag = RT_FALSE ;
402
+ break ;
403
+ default :
404
+ LOG_W ("unknown power mode %d" , io_cfg -> power_mode );
405
+ stop_flag = RT_FALSE ;
406
+ break ;
407
+ }
408
+
409
+ if (stop_flag == RT_TRUE ) return ;
410
+
377
411
if (sdmmc_clk < 400 * 1000 )
378
412
{
379
413
LOG_E ("The clock rate is too low! rata:%d" , sdmmc_clk );
@@ -418,62 +452,37 @@ static void rthw_sdio_iocfg(struct rt_mmcsd_host *host, struct rt_mmcsd_io_cfg *
418
452
Init .BusWide = SDMMC_BUS_WIDE_1B ;
419
453
}
420
454
Init .HardwareFlowControl = hsd -> Init .HardwareFlowControl ;
421
- /* Check if user Clock div < Normal speed 25Mhz, no change in Clockdiv */
422
- if (hsd -> Init .ClockDiv >= (sdmmc_clk / (2U * SD_NORMAL_SPEED_FREQ )))
423
- {
424
- Init .ClockDiv = hsd -> Init .ClockDiv ;
425
- }
426
- //CARD_ULTRA_HIGH_SPEED :UHS-I SD Card <50Mo/s for SDR50, DDR5 Cards and <104Mo/s for SDR104, Spec version 3.01
427
- else if (MMCSD_TIMING_UHS_SDR50 <= io_cfg -> timing && io_cfg -> timing <= MMCSD_TIMING_UHS_DDR50 )
455
+ if (clk != SD_INIT_FREQ )
428
456
{
429
- /* UltraHigh speed SD card,user Clock div */
430
- Init .ClockDiv = hsd -> Init .ClockDiv ;
431
- }
432
- //CARD_HIGH_SPEED: High Speed Card <25Mo/s , Spec version 2.00
433
- else if (io_cfg -> timing == MMCSD_TIMING_SD_HS )
434
- {
435
- /* High speed SD card, Max Frequency = 50Mhz */
436
- if (hsd -> Init .ClockDiv == 0U )
457
+ /* Check if user Clock div < Normal speed 25Mhz, no change in Clockdiv */
458
+ if (hsd -> Init .ClockDiv <= (sdmmc_clk / (2U * SD_NORMAL_SPEED_FREQ )))
437
459
{
438
- if (sdmmc_clk > SD_HIGH_SPEED_FREQ )
439
- {
440
- Init .ClockDiv = sdmmc_clk / (2U * SD_HIGH_SPEED_FREQ );
441
- }
442
- else
443
- {
444
- Init .ClockDiv = hsd -> Init .ClockDiv ;
445
- }
460
+ Init .ClockDiv = hsd -> Init .ClockDiv ;
446
461
}
447
- else
462
+ /*CARD_ULTRA_HIGH_SPEED :UHS-I SD Card <50Mo/s for SDR50, DDR5 Cards and <104Mo/s for SDR104, Spec version 3.01*/
463
+ else if (MMCSD_TIMING_UHS_SDR50 <= io_cfg -> timing && io_cfg -> timing <= MMCSD_TIMING_UHS_DDR50 )
448
464
{
449
- if ((sdmmc_clk /(2U * hsd -> Init .ClockDiv )) > SD_HIGH_SPEED_FREQ )
450
- {
451
- Init .ClockDiv = sdmmc_clk / (2U * SD_HIGH_SPEED_FREQ );
452
- }
453
- else
454
- {
455
- Init .ClockDiv = hsd -> Init .ClockDiv ;
456
- }
465
+ /* UltraHigh speed SD card,user Clock div */
466
+ Init .ClockDiv = hsd -> Init .ClockDiv ;
457
467
}
458
- }
459
- //CARD_NORMAL_SPEED: Normal Speed Card <12.5Mo/s , Spec Version 1.01
460
- else if (io_cfg -> timing == MMCSD_TIMING_LEGACY )
461
- {
462
- /* No High speed SD card, Max Frequency = 25Mhz */
463
- if (hsd -> Init .ClockDiv == 0U )
468
+ /*CARD_HIGH_SPEED: High Speed Card <25Mo/s , Spec version 2.00*/
469
+ else if (io_cfg -> timing == MMCSD_TIMING_SD_HS )
464
470
{
465
- if (sdmmc_clk > SD_NORMAL_SPEED_FREQ )
471
+ /* High speed SD card, Max Frequency = 50Mhz */
472
+ if ((sdmmc_clk /(2U * hsd -> Init .ClockDiv )) < SD_HIGH_SPEED_FREQ )
466
473
{
467
- Init .ClockDiv = sdmmc_clk / (2U * SD_NORMAL_SPEED_FREQ );
474
+ Init .ClockDiv = sdmmc_clk / (2U * SD_HIGH_SPEED_FREQ );
468
475
}
469
476
else
470
477
{
471
478
Init .ClockDiv = hsd -> Init .ClockDiv ;
472
479
}
473
480
}
474
- else
481
+ /*CARD_NORMAL_SPEED: Normal Speed Card <12.5Mo/s , Spec Version 1.01*/
482
+ else if (io_cfg -> timing == MMCSD_TIMING_LEGACY )
475
483
{
476
- if ((sdmmc_clk /(2U * hsd -> Init .ClockDiv )) > SD_NORMAL_SPEED_FREQ )
484
+ /* No High speed SD card, Max Frequency = 25Mhz */
485
+ if ((sdmmc_clk /(2U * hsd -> Init .ClockDiv )) < SD_NORMAL_SPEED_FREQ )
477
486
{
478
487
Init .ClockDiv = sdmmc_clk / (2U * SD_NORMAL_SPEED_FREQ );
479
488
}
@@ -483,26 +492,16 @@ static void rthw_sdio_iocfg(struct rt_mmcsd_host *host, struct rt_mmcsd_io_cfg *
483
492
}
484
493
}
485
494
}
495
+ else
496
+ {
497
+ Init .ClockDiv = hsd -> Init .ClockDiv ;
498
+ }
486
499
(void )SDMMC_Init (hsd -> Instance , Init );
487
500
}
488
- switch ((io_cfg -> power_mode ) & 0X03 )
501
+ if ((io_cfg -> power_mode & 0X03 ) == MMCSD_POWER_ON )
489
502
{
490
- case MMCSD_POWER_OFF :
491
- /* Set Power State to OFF */
492
- (void )SDMMC_PowerState_OFF (hsd -> Instance );
493
- break ;
494
- case MMCSD_POWER_UP :
495
- /* In F4 series chips, 0X01 is reserved bit and has no practical effect.
496
- For F7 series chips, 0X01 is power-on after power-off,The SDMMC disables the function and the card clock stops.
497
- For H7 series chips, 0X03 is the power-on function.
498
- */
499
- case MMCSD_POWER_ON :
500
503
/* Set Power State to ON */
501
504
(void )SDMMC_PowerState_ON (hsd -> Instance );
502
- break ;
503
- default :
504
- LOG_W ("unknown power mode %d" , io_cfg -> power_mode );
505
- break ;
506
505
}
507
506
}
508
507
@@ -574,15 +573,15 @@ struct rt_mmcsd_host *sdio_host_create(struct stm32_sdio_des *sdio_des)
574
573
575
574
if (sdio_des == RT_NULL )
576
575
{
577
- LOG_E ("L:%d F:%s" ,( sdio_des == RT_NULL ? "sdio_des is NULL" : "" ) );
576
+ LOG_E ("sdio_des is NULL" );
578
577
return RT_NULL ;
579
578
}
580
579
581
580
sdio = rt_malloc (sizeof (struct rthw_sdio ));
582
581
583
582
if (sdio == RT_NULL )
584
583
{
585
- LOG_E ("L:%d F:%s malloc rthw_sdio fail" );
584
+ LOG_E ("malloc rthw_sdio fail" );
586
585
return RT_NULL ;
587
586
}
588
587
@@ -592,12 +591,13 @@ struct rt_mmcsd_host *sdio_host_create(struct stm32_sdio_des *sdio_des)
592
591
593
592
if (host == RT_NULL )
594
593
{
595
- LOG_E ("L:%d F:%s mmcsd alloc host fail" );
594
+ LOG_E ("mmcsd alloc host fail" );
596
595
rt_free (sdio );
597
596
return RT_NULL ;
598
597
}
599
598
600
599
rt_memcpy (& sdio -> sdio_des , sdio_des , sizeof (struct stm32_sdio_des ));
600
+ sdio -> sdio_des .clk_get = (sdio_des -> clk_get == RT_NULL ? stm32_sdio_clk_get : sdio_des -> clk_get );
601
601
#ifdef BSP_USING_SDIO1
602
602
if (sdio_des -> hw_sdio .Instance == SDMMC1 )
603
603
{
@@ -626,14 +626,14 @@ struct rt_mmcsd_host *sdio_host_create(struct stm32_sdio_des *sdio_des)
626
626
#endif
627
627
host -> max_seg_size = SDIO_BUFF_SIZE ;
628
628
host -> max_dma_segs = 1 ;
629
- host -> max_blk_size = 512 ;
630
- host -> max_blk_count = 512 ;
629
+ host -> max_blk_size = BLOCKSIZE ;
630
+ host -> max_blk_count = BLOCKSIZE ;
631
631
632
632
/* link up host and sdio */
633
633
sdio -> host = host ;
634
634
host -> private_data = sdio ;
635
635
636
- rthw_sdio_irq_update (host , 1 );
636
+ rthw_sdio_irq_update (host , RT_TRUE );
637
637
638
638
/* ready to change */
639
639
mmcsd_change (host );
0 commit comments