sd file lib updated
Dependents: grove_stream_jpa_sd2 grove_stream_jpa_sd2 grove_stream_jpa_sd2-2 grove_stream_jpa_sd2-3
SD_Helper.c@6:75d0098c7522, 2021-01-13 (annotated)
- Committer:
- 38domo
- Date:
- Wed Jan 13 19:51:46 2021 +0000
- Revision:
- 6:75d0098c7522
- Parent:
- 0:225138ac03fd
update sd lib
Who changed what in which revision?
User | Revision | Line number | New 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 | } |