Fixed version not to issue warning messages. Original: Revision 26:8f15aa3b052b by Dieter Graef. https://developer.mbed.org/users/DieterGraef/code/SDFileSystem/

Dependencies:   FATFileSystem

Dependents:   F746_AudioPlayerSD F746_SD_WavPlayer F746_SD_GraphicEqualizer_ren0620 F746_SD_TextFile_RW ... more

Committer:
MikamiUitOpen
Date:
Sat Apr 16 03:56:15 2016 +0000
Revision:
0:225138ac03fd
1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:225138ac03fd 1 #include "SD_Helper.h"
MikamiUitOpen 0:225138ac03fd 2 #include "stm32746g_discovery_sd.h"
MikamiUitOpen 0:225138ac03fd 3
MikamiUitOpen 0:225138ac03fd 4 #define _CCSIDR_LSSHIFT(x) (((x) & SCB_CCSIDR_LINESIZE_Msk) >> SCB_CCSIDR_LINESIZE_Pos)
MikamiUitOpen 0:225138ac03fd 5
MikamiUitOpen 0:225138ac03fd 6 static SD_HandleTypeDef uSdHandle;
MikamiUitOpen 0:225138ac03fd 7 static int RX_Busy;
MikamiUitOpen 0:225138ac03fd 8 static int TX_Busy;
MikamiUitOpen 0:225138ac03fd 9 static int SD_Busy;
MikamiUitOpen 0:225138ac03fd 10
MikamiUitOpen 0:225138ac03fd 11
MikamiUitOpen 0:225138ac03fd 12
MikamiUitOpen 0:225138ac03fd 13 /* cache flush */
MikamiUitOpen 0:225138ac03fd 14 void CPU_CACHE_Flush(uint32_t * buffer, uint32_t length)
MikamiUitOpen 0:225138ac03fd 15 {
MikamiUitOpen 0:225138ac03fd 16 // SCB_InvalidateDCache_by_Addr(buffer,length);
MikamiUitOpen 0:225138ac03fd 17 uint32_t ccsidr;
MikamiUitOpen 0:225138ac03fd 18 uint32_t smask;
MikamiUitOpen 0:225138ac03fd 19 uint32_t sshift;
MikamiUitOpen 0:225138ac03fd 20 uint32_t ways;
MikamiUitOpen 0:225138ac03fd 21 uint32_t wshift;
MikamiUitOpen 0:225138ac03fd 22 uint32_t ssize;
MikamiUitOpen 0:225138ac03fd 23 uint32_t sets;
MikamiUitOpen 0:225138ac03fd 24 uint32_t sw;
MikamiUitOpen 0:225138ac03fd 25 uint32_t start;
MikamiUitOpen 0:225138ac03fd 26 uint32_t ende;
MikamiUitOpen 0:225138ac03fd 27
MikamiUitOpen 0:225138ac03fd 28 start=(uint32_t)buffer;
MikamiUitOpen 0:225138ac03fd 29 ende=start+length;
MikamiUitOpen 0:225138ac03fd 30 /* Get the characteristics of the D-Cache */
MikamiUitOpen 0:225138ac03fd 31
MikamiUitOpen 0:225138ac03fd 32 ccsidr = SCB->CCSIDR;
MikamiUitOpen 0:225138ac03fd 33 smask = CCSIDR_SETS(ccsidr); /* (Number of sets) - 1 */
MikamiUitOpen 0:225138ac03fd 34 sshift = _CCSIDR_LSSHIFT(ccsidr) + 4; /* log2(cache-line-size-in-bytes) */
MikamiUitOpen 0:225138ac03fd 35 ways = CCSIDR_WAYS(ccsidr); /* (Number of ways) - 1 */
MikamiUitOpen 0:225138ac03fd 36
MikamiUitOpen 0:225138ac03fd 37 /* Calculate the bit offset for the way field in the DCCISW register by
MikamiUitOpen 0:225138ac03fd 38 * counting the number of leading zeroes. For example:
MikamiUitOpen 0:225138ac03fd 39 *
MikamiUitOpen 0:225138ac03fd 40 * Number of Value of ways Field
MikamiUitOpen 0:225138ac03fd 41 * Ways 'ways' Offset
MikamiUitOpen 0:225138ac03fd 42 * 2 1 31
MikamiUitOpen 0:225138ac03fd 43 * 4 3 30
MikamiUitOpen 0:225138ac03fd 44 * 8 7 29
MikamiUitOpen 0:225138ac03fd 45 * ...
MikamiUitOpen 0:225138ac03fd 46 */
MikamiUitOpen 0:225138ac03fd 47
MikamiUitOpen 0:225138ac03fd 48 wshift = __CLZ(ways) & 0x1f;
MikamiUitOpen 0:225138ac03fd 49
MikamiUitOpen 0:225138ac03fd 50 /* Clean and invalidate the D-Cache over the range of addresses */
MikamiUitOpen 0:225138ac03fd 51
MikamiUitOpen 0:225138ac03fd 52 ssize = (1 << sshift);
MikamiUitOpen 0:225138ac03fd 53 start &= ~(ssize - 1);
MikamiUitOpen 0:225138ac03fd 54 __DSB();
MikamiUitOpen 0:225138ac03fd 55
MikamiUitOpen 0:225138ac03fd 56 do
MikamiUitOpen 0:225138ac03fd 57 {
MikamiUitOpen 0:225138ac03fd 58 int32_t tmpways = ways;
MikamiUitOpen 0:225138ac03fd 59
MikamiUitOpen 0:225138ac03fd 60 /* Isolate the cache line associated with this address. For example
MikamiUitOpen 0:225138ac03fd 61 * if the cache line size is 32 bytes and the cache size is 16KB, then
MikamiUitOpen 0:225138ac03fd 62 *
MikamiUitOpen 0:225138ac03fd 63 * sshift = 5 : Offset to the beginning of the set field
MikamiUitOpen 0:225138ac03fd 64 * smask = 0x007f : Mask of the set field
MikamiUitOpen 0:225138ac03fd 65 */
MikamiUitOpen 0:225138ac03fd 66
MikamiUitOpen 0:225138ac03fd 67 sets = ((uint32_t)start >> sshift) & smask;
MikamiUitOpen 0:225138ac03fd 68
MikamiUitOpen 0:225138ac03fd 69 /* Clean and invalidate each way for this cacheline */
MikamiUitOpen 0:225138ac03fd 70
MikamiUitOpen 0:225138ac03fd 71 do
MikamiUitOpen 0:225138ac03fd 72 {
MikamiUitOpen 0:225138ac03fd 73 sw = ((tmpways << wshift) | (sets << sshift));
MikamiUitOpen 0:225138ac03fd 74 SCB->DCCISW=sw;
MikamiUitOpen 0:225138ac03fd 75
MikamiUitOpen 0:225138ac03fd 76 }
MikamiUitOpen 0:225138ac03fd 77 while (tmpways--);
MikamiUitOpen 0:225138ac03fd 78
MikamiUitOpen 0:225138ac03fd 79 /* Increment the address by the size of one cache line. */
MikamiUitOpen 0:225138ac03fd 80
MikamiUitOpen 0:225138ac03fd 81 start += ssize;
MikamiUitOpen 0:225138ac03fd 82 }
MikamiUitOpen 0:225138ac03fd 83 while (start < ende);
MikamiUitOpen 0:225138ac03fd 84
MikamiUitOpen 0:225138ac03fd 85 __DSB();
MikamiUitOpen 0:225138ac03fd 86 __ISB();
MikamiUitOpen 0:225138ac03fd 87 }
MikamiUitOpen 0:225138ac03fd 88
MikamiUitOpen 0:225138ac03fd 89 void BSP_SD_CommandTransaction(char cmd, unsigned int arg)
MikamiUitOpen 0:225138ac03fd 90 {
MikamiUitOpen 0:225138ac03fd 91 SDMMC_CmdInitTypeDef sdmmc_cmdinitstructure;
MikamiUitOpen 0:225138ac03fd 92 uSdHandle.Instance = SDMMC1;
MikamiUitOpen 0:225138ac03fd 93 sdmmc_cmdinitstructure.Argument = (uint32_t)arg;
MikamiUitOpen 0:225138ac03fd 94 sdmmc_cmdinitstructure.CmdIndex = cmd;
MikamiUitOpen 0:225138ac03fd 95 sdmmc_cmdinitstructure.Response = SDMMC_RESPONSE_SHORT;
MikamiUitOpen 0:225138ac03fd 96 sdmmc_cmdinitstructure.WaitForInterrupt = SDMMC_WAIT_NO;
MikamiUitOpen 0:225138ac03fd 97 sdmmc_cmdinitstructure.CPSM = SDMMC_CPSM_ENABLE;
MikamiUitOpen 0:225138ac03fd 98 SDMMC_SendCommand(uSdHandle.Instance, &sdmmc_cmdinitstructure);
MikamiUitOpen 0:225138ac03fd 99 }
MikamiUitOpen 0:225138ac03fd 100
MikamiUitOpen 0:225138ac03fd 101 void BSP_SD_Set_Busy(void)
MikamiUitOpen 0:225138ac03fd 102 {
MikamiUitOpen 0:225138ac03fd 103 SD_Busy=1;
MikamiUitOpen 0:225138ac03fd 104 }
MikamiUitOpen 0:225138ac03fd 105 void BSP_SD_Clear_Busy(void)
MikamiUitOpen 0:225138ac03fd 106 {
MikamiUitOpen 0:225138ac03fd 107 SD_Busy=0;
MikamiUitOpen 0:225138ac03fd 108 }
MikamiUitOpen 0:225138ac03fd 109 int BSP_SD_Get_Busy(void)
MikamiUitOpen 0:225138ac03fd 110 {
MikamiUitOpen 0:225138ac03fd 111 return SD_Busy;
MikamiUitOpen 0:225138ac03fd 112 }
MikamiUitOpen 0:225138ac03fd 113
MikamiUitOpen 0:225138ac03fd 114 void BSP_SD_Set_RX_Busy(void)
MikamiUitOpen 0:225138ac03fd 115 {
MikamiUitOpen 0:225138ac03fd 116 RX_Busy=1;
MikamiUitOpen 0:225138ac03fd 117 }
MikamiUitOpen 0:225138ac03fd 118 void BSP_SD_Clear_RX_Busy(void)
MikamiUitOpen 0:225138ac03fd 119 {
MikamiUitOpen 0:225138ac03fd 120 RX_Busy=0;
MikamiUitOpen 0:225138ac03fd 121 }
MikamiUitOpen 0:225138ac03fd 122 int BSP_SD_Get_RX_Busy(void)
MikamiUitOpen 0:225138ac03fd 123 {
MikamiUitOpen 0:225138ac03fd 124 return RX_Busy;
MikamiUitOpen 0:225138ac03fd 125 }
MikamiUitOpen 0:225138ac03fd 126
MikamiUitOpen 0:225138ac03fd 127 void BSP_SD_Set_TX_Busy(void)
MikamiUitOpen 0:225138ac03fd 128 {
MikamiUitOpen 0:225138ac03fd 129 TX_Busy=1;
MikamiUitOpen 0:225138ac03fd 130 }
MikamiUitOpen 0:225138ac03fd 131 void BSP_SD_Clear_TX_Busy(void)
MikamiUitOpen 0:225138ac03fd 132 {
MikamiUitOpen 0:225138ac03fd 133 TX_Busy=0;
MikamiUitOpen 0:225138ac03fd 134 }
MikamiUitOpen 0:225138ac03fd 135 int BSP_SD_Get_TX_Busy(void)
MikamiUitOpen 0:225138ac03fd 136 {
MikamiUitOpen 0:225138ac03fd 137 return TX_Busy;
MikamiUitOpen 0:225138ac03fd 138 }