JPA
SDFileSystem.cpp@1:99666dacaae6, 2017-01-09 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Mon Jan 09 05:30:14 2017 +0000
- Revision:
- 1:99666dacaae6
- Parent:
- 0:225138ac03fd
2, "FATFileSystem" is updated.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:225138ac03fd | 1 | //----------------------------------------------------------------------- |
MikamiUitOpen | 1:99666dacaae6 | 2 | // Fixed version not to issue warning message by N.Mikami |
MikamiUitOpen | 1:99666dacaae6 | 3 | // January 09, 2017 |
MikamiUitOpen | 0:225138ac03fd | 4 | //----------------------------------------------------------------------- |
MikamiUitOpen | 0:225138ac03fd | 5 | |
MikamiUitOpen | 0:225138ac03fd | 6 | /* SD/MMC File System Library |
MikamiUitOpen | 0:225138ac03fd | 7 | * Copyright (c) 2016 Neil Thiessen |
MikamiUitOpen | 0:225138ac03fd | 8 | * Modified for the use with STM32F746 Discovery (C) 2016 Dieter Greaf |
MikamiUitOpen | 0:225138ac03fd | 9 | * Licensed under the Apache License, Version 2.0 (the "License"); |
MikamiUitOpen | 0:225138ac03fd | 10 | * you may not use this file except in compliance with the License. |
MikamiUitOpen | 0:225138ac03fd | 11 | * You may obtain a copy of the License at |
MikamiUitOpen | 0:225138ac03fd | 12 | * |
MikamiUitOpen | 0:225138ac03fd | 13 | * http://www.apache.org/licenses/LICENSE-2.0 |
MikamiUitOpen | 0:225138ac03fd | 14 | * |
MikamiUitOpen | 0:225138ac03fd | 15 | * Unless required by applicable law or agreed to in writing, software |
MikamiUitOpen | 0:225138ac03fd | 16 | * distributed under the License is distributed on an "AS IS" BASIS, |
MikamiUitOpen | 0:225138ac03fd | 17 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
MikamiUitOpen | 0:225138ac03fd | 18 | * See the License for the specific language governing permissions and |
MikamiUitOpen | 0:225138ac03fd | 19 | * limitations under the License. |
MikamiUitOpen | 0:225138ac03fd | 20 | */ |
MikamiUitOpen | 0:225138ac03fd | 21 | |
MikamiUitOpen | 0:225138ac03fd | 22 | #include "SDFileSystem.h" |
MikamiUitOpen | 0:225138ac03fd | 23 | #include "diskio.h" |
MikamiUitOpen | 0:225138ac03fd | 24 | #include "SDCRC.h" |
MikamiUitOpen | 0:225138ac03fd | 25 | //for cache flush function |
MikamiUitOpen | 0:225138ac03fd | 26 | #include "SD_Helper.h" |
MikamiUitOpen | 0:225138ac03fd | 27 | |
MikamiUitOpen | 0:225138ac03fd | 28 | SDFileSystem::SDFileSystem( const char* name) |
MikamiUitOpen | 0:225138ac03fd | 29 | : FATFileSystem(name), m_Cd(PC_13) |
MikamiUitOpen | 0:225138ac03fd | 30 | { |
MikamiUitOpen | 0:225138ac03fd | 31 | //Initialize the member variables |
MikamiUitOpen | 0:225138ac03fd | 32 | uint8_t initstat; |
MikamiUitOpen | 0:225138ac03fd | 33 | |
MikamiUitOpen | 0:225138ac03fd | 34 | // Commented out in modified versin |
MikamiUitOpen | 0:225138ac03fd | 35 | // void* h; |
MikamiUitOpen | 0:225138ac03fd | 36 | |
MikamiUitOpen | 0:225138ac03fd | 37 | m_CardType = CARD_NONE; |
MikamiUitOpen | 0:225138ac03fd | 38 | m_Crc = true; |
MikamiUitOpen | 0:225138ac03fd | 39 | m_LargeFrames = false; |
MikamiUitOpen | 0:225138ac03fd | 40 | m_WriteValidation = true; |
MikamiUitOpen | 0:225138ac03fd | 41 | m_Status = STA_NOINIT; |
MikamiUitOpen | 0:225138ac03fd | 42 | m_Cd.mode(PullUp); |
MikamiUitOpen | 0:225138ac03fd | 43 | m_CdAssert = 0; |
MikamiUitOpen | 0:225138ac03fd | 44 | m_Cd.rise(this, &SDFileSystem::onCardRemoval); |
MikamiUitOpen | 0:225138ac03fd | 45 | |
MikamiUitOpen | 0:225138ac03fd | 46 | // Followings are original |
MikamiUitOpen | 0:225138ac03fd | 47 | // h=(void*)&SDFileSystem::DMA2_Stream3_IRQHandler; |
MikamiUitOpen | 0:225138ac03fd | 48 | // NVIC_SetVector(DMA2_Stream3_IRQn,(uint32_t)h); |
MikamiUitOpen | 0:225138ac03fd | 49 | // h=(void*)&SDFileSystem::DMA2_Stream6_IRQHandler; |
MikamiUitOpen | 0:225138ac03fd | 50 | // NVIC_SetVector(DMA2_Stream6_IRQn,(uint32_t)h); |
MikamiUitOpen | 0:225138ac03fd | 51 | // h=(void*)&SDFileSystem::SDMMC1_IRQHandler; |
MikamiUitOpen | 0:225138ac03fd | 52 | // NVIC_SetVector(SDMMC1_IRQn,(uint32_t)h); |
MikamiUitOpen | 0:225138ac03fd | 53 | |
MikamiUitOpen | 0:225138ac03fd | 54 | // Modified |
MikamiUitOpen | 0:225138ac03fd | 55 | NVIC_SetVector(DMA2_Stream3_IRQn, |
MikamiUitOpen | 0:225138ac03fd | 56 | (uint32_t)(&SDFileSystem::DMA2_Stream3_IRQHandler)); |
MikamiUitOpen | 0:225138ac03fd | 57 | NVIC_SetVector(DMA2_Stream6_IRQn, |
MikamiUitOpen | 0:225138ac03fd | 58 | (uint32_t)(&SDFileSystem::DMA2_Stream6_IRQHandler)); |
MikamiUitOpen | 0:225138ac03fd | 59 | NVIC_SetVector(SDMMC1_IRQn, |
MikamiUitOpen | 0:225138ac03fd | 60 | (uint32_t)(&SDFileSystem::SDMMC1_IRQHandler)); |
MikamiUitOpen | 0:225138ac03fd | 61 | |
MikamiUitOpen | 0:225138ac03fd | 62 | BSP_SD_Clear_Busy(); |
MikamiUitOpen | 0:225138ac03fd | 63 | initstat=BSP_SD_Init(); |
MikamiUitOpen | 0:225138ac03fd | 64 | if (initstat!=MSD_OK) |
MikamiUitOpen | 0:225138ac03fd | 65 | { |
MikamiUitOpen | 0:225138ac03fd | 66 | m_Status |= STA_NOINIT; |
MikamiUitOpen | 0:225138ac03fd | 67 | } |
MikamiUitOpen | 0:225138ac03fd | 68 | else |
MikamiUitOpen | 0:225138ac03fd | 69 | { |
MikamiUitOpen | 0:225138ac03fd | 70 | m_Status &= ~STA_NOINIT; |
MikamiUitOpen | 0:225138ac03fd | 71 | } |
MikamiUitOpen | 0:225138ac03fd | 72 | } |
MikamiUitOpen | 0:225138ac03fd | 73 | |
MikamiUitOpen | 0:225138ac03fd | 74 | bool SDFileSystem::card_present() |
MikamiUitOpen | 0:225138ac03fd | 75 | { |
MikamiUitOpen | 0:225138ac03fd | 76 | //Check the card socket |
MikamiUitOpen | 0:225138ac03fd | 77 | checkSocket(); |
MikamiUitOpen | 0:225138ac03fd | 78 | |
MikamiUitOpen | 0:225138ac03fd | 79 | //Return whether or not a card is present |
MikamiUitOpen | 0:225138ac03fd | 80 | return !(m_Status & STA_NODISK); |
MikamiUitOpen | 0:225138ac03fd | 81 | } |
MikamiUitOpen | 0:225138ac03fd | 82 | |
MikamiUitOpen | 0:225138ac03fd | 83 | SDFileSystem::CardType SDFileSystem::card_type() |
MikamiUitOpen | 0:225138ac03fd | 84 | { |
MikamiUitOpen | 0:225138ac03fd | 85 | //Check the card socket |
MikamiUitOpen | 0:225138ac03fd | 86 | checkSocket(); |
MikamiUitOpen | 0:225138ac03fd | 87 | |
MikamiUitOpen | 0:225138ac03fd | 88 | //Return the card type |
MikamiUitOpen | 0:225138ac03fd | 89 | return m_CardType; |
MikamiUitOpen | 0:225138ac03fd | 90 | } |
MikamiUitOpen | 0:225138ac03fd | 91 | |
MikamiUitOpen | 0:225138ac03fd | 92 | bool SDFileSystem::crc() |
MikamiUitOpen | 0:225138ac03fd | 93 | { |
MikamiUitOpen | 0:225138ac03fd | 94 | //Return whether or not CRC is enabled |
MikamiUitOpen | 0:225138ac03fd | 95 | return m_Crc; |
MikamiUitOpen | 0:225138ac03fd | 96 | } |
MikamiUitOpen | 0:225138ac03fd | 97 | |
MikamiUitOpen | 0:225138ac03fd | 98 | void SDFileSystem::crc(bool enabled) |
MikamiUitOpen | 0:225138ac03fd | 99 | { |
MikamiUitOpen | 0:225138ac03fd | 100 | //Check the card socket |
MikamiUitOpen | 0:225138ac03fd | 101 | checkSocket(); |
MikamiUitOpen | 0:225138ac03fd | 102 | |
MikamiUitOpen | 0:225138ac03fd | 103 | //Just update the member variable if the card isn't initialized |
MikamiUitOpen | 0:225138ac03fd | 104 | if (m_Status & STA_NOINIT) { |
MikamiUitOpen | 0:225138ac03fd | 105 | m_Crc = enabled; |
MikamiUitOpen | 0:225138ac03fd | 106 | return; |
MikamiUitOpen | 0:225138ac03fd | 107 | } |
MikamiUitOpen | 0:225138ac03fd | 108 | |
MikamiUitOpen | 0:225138ac03fd | 109 | //Enable or disable CRC |
MikamiUitOpen | 0:225138ac03fd | 110 | if (enabled && !m_Crc) { |
MikamiUitOpen | 0:225138ac03fd | 111 | //Send CMD59(0x00000001) to enable CRC |
MikamiUitOpen | 0:225138ac03fd | 112 | m_Crc = true; |
MikamiUitOpen | 0:225138ac03fd | 113 | BSP_SD_CommandTransaction(CMD59, 0x00000001); |
MikamiUitOpen | 0:225138ac03fd | 114 | } else if (!enabled && m_Crc) { |
MikamiUitOpen | 0:225138ac03fd | 115 | //Send CMD59(0x00000000) to disableAPP/MBED/targets/hal/TARGET_STM/TARGET_STM32F7/TARGET_DISCO_F746NG CRC |
MikamiUitOpen | 0:225138ac03fd | 116 | BSP_SD_CommandTransaction(CMD59, 0x00000000); |
MikamiUitOpen | 0:225138ac03fd | 117 | m_Crc = false; |
MikamiUitOpen | 0:225138ac03fd | 118 | } |
MikamiUitOpen | 0:225138ac03fd | 119 | } |
MikamiUitOpen | 0:225138ac03fd | 120 | |
MikamiUitOpen | 0:225138ac03fd | 121 | bool SDFileSystem::large_frames() |
MikamiUitOpen | 0:225138ac03fd | 122 | { |
MikamiUitOpen | 0:225138ac03fd | 123 | //Return whether or not 16-bit frames are enabled |
MikamiUitOpen | 0:225138ac03fd | 124 | return m_LargeFrames; |
MikamiUitOpen | 0:225138ac03fd | 125 | } |
MikamiUitOpen | 0:225138ac03fd | 126 | |
MikamiUitOpen | 0:225138ac03fd | 127 | void SDFileSystem::large_frames(bool enabled) |
MikamiUitOpen | 0:225138ac03fd | 128 | { |
MikamiUitOpen | 0:225138ac03fd | 129 | //Set whether or not 16-bit frames are enabled |
MikamiUitOpen | 0:225138ac03fd | 130 | m_LargeFrames = enabled; |
MikamiUitOpen | 0:225138ac03fd | 131 | } |
MikamiUitOpen | 0:225138ac03fd | 132 | |
MikamiUitOpen | 0:225138ac03fd | 133 | bool SDFileSystem::write_validation() |
MikamiUitOpen | 0:225138ac03fd | 134 | { |
MikamiUitOpen | 0:225138ac03fd | 135 | //Return whether or not write validation is enabled |
MikamiUitOpen | 0:225138ac03fd | 136 | return m_WriteValidation; |
MikamiUitOpen | 0:225138ac03fd | 137 | } |
MikamiUitOpen | 0:225138ac03fd | 138 | |
MikamiUitOpen | 0:225138ac03fd | 139 | void SDFileSystem::write_validation(bool enabled) |
MikamiUitOpen | 0:225138ac03fd | 140 | { |
MikamiUitOpen | 0:225138ac03fd | 141 | //Set whether or not write validation is enabled |
MikamiUitOpen | 0:225138ac03fd | 142 | m_WriteValidation = enabled; |
MikamiUitOpen | 0:225138ac03fd | 143 | } |
MikamiUitOpen | 0:225138ac03fd | 144 | |
MikamiUitOpen | 0:225138ac03fd | 145 | int SDFileSystem::unmount() |
MikamiUitOpen | 0:225138ac03fd | 146 | { |
MikamiUitOpen | 0:225138ac03fd | 147 | //Unmount the filesystem |
MikamiUitOpen | 0:225138ac03fd | 148 | FATFileSystem::unmount(); |
MikamiUitOpen | 0:225138ac03fd | 149 | |
MikamiUitOpen | 0:225138ac03fd | 150 | //Change the status to not initialized, and the card type to unknown |
MikamiUitOpen | 0:225138ac03fd | 151 | m_Status |= STA_NOINIT; |
MikamiUitOpen | 0:225138ac03fd | 152 | m_CardType = CARD_UNKNOWN; |
MikamiUitOpen | 0:225138ac03fd | 153 | |
MikamiUitOpen | 0:225138ac03fd | 154 | //Always succeeds |
MikamiUitOpen | 0:225138ac03fd | 155 | return 0; |
MikamiUitOpen | 0:225138ac03fd | 156 | } |
MikamiUitOpen | 0:225138ac03fd | 157 | |
MikamiUitOpen | 0:225138ac03fd | 158 | int SDFileSystem::disk_initialize() |
MikamiUitOpen | 0:225138ac03fd | 159 | { |
MikamiUitOpen | 0:225138ac03fd | 160 | |
MikamiUitOpen | 0:225138ac03fd | 161 | //Make sure there's a card in the socket before proceeding |
MikamiUitOpen | 0:225138ac03fd | 162 | checkSocket(); |
MikamiUitOpen | 0:225138ac03fd | 163 | if (m_Status & STA_NODISK) |
MikamiUitOpen | 0:225138ac03fd | 164 | return m_Status; |
MikamiUitOpen | 0:225138ac03fd | 165 | BSP_SD_GetCardInfo(&m_CardInfo); |
MikamiUitOpen | 0:225138ac03fd | 166 | |
MikamiUitOpen | 0:225138ac03fd | 167 | switch(m_CardInfo.CardType) |
MikamiUitOpen | 0:225138ac03fd | 168 | { |
MikamiUitOpen | 0:225138ac03fd | 169 | case STD_CAPACITY_SD_CARD_V1_1: |
MikamiUitOpen | 0:225138ac03fd | 170 | { m_CardType = CARD_SD; |
MikamiUitOpen | 0:225138ac03fd | 171 | break; } |
MikamiUitOpen | 0:225138ac03fd | 172 | case STD_CAPACITY_SD_CARD_V2_0: |
MikamiUitOpen | 0:225138ac03fd | 173 | { m_CardType = CARD_SD; |
MikamiUitOpen | 0:225138ac03fd | 174 | break; } |
MikamiUitOpen | 0:225138ac03fd | 175 | case HIGH_CAPACITY_SD_CARD: |
MikamiUitOpen | 0:225138ac03fd | 176 | { m_CardType = CARD_SDHC; |
MikamiUitOpen | 0:225138ac03fd | 177 | break; } |
MikamiUitOpen | 0:225138ac03fd | 178 | case MULTIMEDIA_CARD: |
MikamiUitOpen | 0:225138ac03fd | 179 | { m_CardType = CARD_MMC; |
MikamiUitOpen | 0:225138ac03fd | 180 | break; } |
MikamiUitOpen | 0:225138ac03fd | 181 | case SECURE_DIGITAL_IO_CARD: |
MikamiUitOpen | 0:225138ac03fd | 182 | { m_CardType = CARD_SD; |
MikamiUitOpen | 0:225138ac03fd | 183 | break; } |
MikamiUitOpen | 0:225138ac03fd | 184 | case HIGH_SPEED_MULTIMEDIA_CARD: |
MikamiUitOpen | 0:225138ac03fd | 185 | { m_CardType = CARD_MMC; |
MikamiUitOpen | 0:225138ac03fd | 186 | break; } |
MikamiUitOpen | 0:225138ac03fd | 187 | case SECURE_DIGITAL_IO_COMBO_CARD: |
MikamiUitOpen | 0:225138ac03fd | 188 | { m_CardType = CARD_SD; |
MikamiUitOpen | 0:225138ac03fd | 189 | break; } |
MikamiUitOpen | 0:225138ac03fd | 190 | case HIGH_CAPACITY_MMC_CARD: |
MikamiUitOpen | 0:225138ac03fd | 191 | { m_CardType = CARD_MMC; |
MikamiUitOpen | 0:225138ac03fd | 192 | break; } |
MikamiUitOpen | 0:225138ac03fd | 193 | default: |
MikamiUitOpen | 0:225138ac03fd | 194 | {m_CardType = CARD_UNKNOWN; |
MikamiUitOpen | 0:225138ac03fd | 195 | return m_Status;} |
MikamiUitOpen | 0:225138ac03fd | 196 | } |
MikamiUitOpen | 0:225138ac03fd | 197 | //The card is now initialized |
MikamiUitOpen | 0:225138ac03fd | 198 | m_Status &= ~STA_NOINIT; |
MikamiUitOpen | 0:225138ac03fd | 199 | |
MikamiUitOpen | 0:225138ac03fd | 200 | //Return the disk status |
MikamiUitOpen | 0:225138ac03fd | 201 | return m_Status; |
MikamiUitOpen | 0:225138ac03fd | 202 | } |
MikamiUitOpen | 0:225138ac03fd | 203 | |
MikamiUitOpen | 0:225138ac03fd | 204 | int SDFileSystem::disk_status() |
MikamiUitOpen | 0:225138ac03fd | 205 | { |
MikamiUitOpen | 0:225138ac03fd | 206 | //Check the card socket |
MikamiUitOpen | 0:225138ac03fd | 207 | checkSocket(); |
MikamiUitOpen | 0:225138ac03fd | 208 | |
MikamiUitOpen | 0:225138ac03fd | 209 | //Return the disk status |
MikamiUitOpen | 0:225138ac03fd | 210 | return m_Status; |
MikamiUitOpen | 0:225138ac03fd | 211 | } |
MikamiUitOpen | 0:225138ac03fd | 212 | |
MikamiUitOpen | 0:225138ac03fd | 213 | int SDFileSystem::disk_read(uint8_t* buffer, uint32_t sector, uint32_t count) |
MikamiUitOpen | 0:225138ac03fd | 214 | { |
MikamiUitOpen | 0:225138ac03fd | 215 | int retval; |
MikamiUitOpen | 0:225138ac03fd | 216 | //Make sure the card is initialized before proceeding |
MikamiUitOpen | 0:225138ac03fd | 217 | if (m_Status & STA_NOINIT) |
MikamiUitOpen | 0:225138ac03fd | 218 | return RES_NOTRDY; |
MikamiUitOpen | 0:225138ac03fd | 219 | __DSB(); |
MikamiUitOpen | 0:225138ac03fd | 220 | __ISB(); |
MikamiUitOpen | 0:225138ac03fd | 221 | while(BSP_SD_Get_Busy()==1){;} |
MikamiUitOpen | 0:225138ac03fd | 222 | BSP_SD_Set_Busy(); |
MikamiUitOpen | 0:225138ac03fd | 223 | //Read a single block, or multiple blocks |
MikamiUitOpen | 0:225138ac03fd | 224 | if (count > 1) { |
MikamiUitOpen | 0:225138ac03fd | 225 | BSP_SD_Set_RX_Busy(); |
MikamiUitOpen | 0:225138ac03fd | 226 | SCB_InvalidateDCache_by_Addr((uint32_t *)buffer,(512*count)); |
MikamiUitOpen | 0:225138ac03fd | 227 | retval=BSP_SD_ReadBlocks_DMA((uint32_t *)buffer, (uint64_t) (sector * 512),512, count); |
MikamiUitOpen | 0:225138ac03fd | 228 | while((BSP_SD_Get_RX_Busy()==1)&&(retval==MSD_OK)){;} |
MikamiUitOpen | 0:225138ac03fd | 229 | CPU_CACHE_Flush((uint32_t *)buffer,(512*count)); |
MikamiUitOpen | 0:225138ac03fd | 230 | BSP_SD_Clear_Busy(); |
MikamiUitOpen | 0:225138ac03fd | 231 | return (retval ? RES_ERROR : RES_OK); |
MikamiUitOpen | 0:225138ac03fd | 232 | } else { |
MikamiUitOpen | 0:225138ac03fd | 233 | BSP_SD_Set_RX_Busy(); |
MikamiUitOpen | 0:225138ac03fd | 234 | SCB_InvalidateDCache_by_Addr((uint32_t *)buffer,(512)); |
MikamiUitOpen | 0:225138ac03fd | 235 | retval= BSP_SD_ReadBlocks_DMA((uint32_t *)buffer, (uint64_t) (sector * 512), 512, 1); |
MikamiUitOpen | 0:225138ac03fd | 236 | while((BSP_SD_Get_RX_Busy()==1)&&(retval==MSD_OK)){;} |
MikamiUitOpen | 0:225138ac03fd | 237 | CPU_CACHE_Flush((uint32_t *)buffer,(512)); |
MikamiUitOpen | 0:225138ac03fd | 238 | BSP_SD_Clear_Busy(); |
MikamiUitOpen | 0:225138ac03fd | 239 | return (retval ? RES_ERROR : RES_OK); |
MikamiUitOpen | 0:225138ac03fd | 240 | } |
MikamiUitOpen | 0:225138ac03fd | 241 | } |
MikamiUitOpen | 0:225138ac03fd | 242 | |
MikamiUitOpen | 0:225138ac03fd | 243 | int SDFileSystem::disk_write(const uint8_t* buffer, uint32_t sector, uint32_t count) |
MikamiUitOpen | 0:225138ac03fd | 244 | { |
MikamiUitOpen | 0:225138ac03fd | 245 | int retval; |
MikamiUitOpen | 0:225138ac03fd | 246 | //Make sure the card is initialized before proceeding |
MikamiUitOpen | 0:225138ac03fd | 247 | if (m_Status & STA_NOINIT) |
MikamiUitOpen | 0:225138ac03fd | 248 | return RES_NOTRDY; |
MikamiUitOpen | 0:225138ac03fd | 249 | __DSB(); |
MikamiUitOpen | 0:225138ac03fd | 250 | __ISB(); |
MikamiUitOpen | 0:225138ac03fd | 251 | while(BSP_SD_Get_Busy()==1){;} |
MikamiUitOpen | 0:225138ac03fd | 252 | BSP_SD_Set_Busy(); |
MikamiUitOpen | 0:225138ac03fd | 253 | //Make sure the card isn't write protected before proceeding |
MikamiUitOpen | 0:225138ac03fd | 254 | if (m_Status & STA_PROTECT) |
MikamiUitOpen | 0:225138ac03fd | 255 | { |
MikamiUitOpen | 0:225138ac03fd | 256 | BSP_SD_Clear_Busy(); |
MikamiUitOpen | 0:225138ac03fd | 257 | return RES_WRPRT; |
MikamiUitOpen | 0:225138ac03fd | 258 | } |
MikamiUitOpen | 0:225138ac03fd | 259 | //Write a single block, or multiple blocks |
MikamiUitOpen | 0:225138ac03fd | 260 | if (count > 1) { |
MikamiUitOpen | 0:225138ac03fd | 261 | CPU_CACHE_Flush((uint32_t *)buffer,(512*count)); |
MikamiUitOpen | 0:225138ac03fd | 262 | BSP_SD_Set_TX_Busy(); |
MikamiUitOpen | 0:225138ac03fd | 263 | retval= BSP_SD_WriteBlocks_DMA((uint32_t *)buffer, (uint64_t) (sector * 512), 512, count); |
MikamiUitOpen | 0:225138ac03fd | 264 | while((BSP_SD_Get_TX_Busy()==1)&&(retval==MSD_OK)){;} |
MikamiUitOpen | 0:225138ac03fd | 265 | BSP_SD_Clear_Busy(); |
MikamiUitOpen | 0:225138ac03fd | 266 | return (retval? RES_ERROR : RES_OK); |
MikamiUitOpen | 0:225138ac03fd | 267 | } else { |
MikamiUitOpen | 0:225138ac03fd | 268 | CPU_CACHE_Flush((uint32_t *)buffer,(512)); |
MikamiUitOpen | 0:225138ac03fd | 269 | BSP_SD_Set_TX_Busy(); |
MikamiUitOpen | 0:225138ac03fd | 270 | retval= BSP_SD_WriteBlocks_DMA((uint32_t *)buffer, (uint64_t) (sector * 512), 512, 1); |
MikamiUitOpen | 0:225138ac03fd | 271 | while((BSP_SD_Get_TX_Busy()==1)&&(retval==MSD_OK)){;} |
MikamiUitOpen | 0:225138ac03fd | 272 | BSP_SD_Clear_Busy(); |
MikamiUitOpen | 0:225138ac03fd | 273 | return (retval? RES_ERROR : RES_OK); |
MikamiUitOpen | 0:225138ac03fd | 274 | |
MikamiUitOpen | 0:225138ac03fd | 275 | } |
MikamiUitOpen | 0:225138ac03fd | 276 | } |
MikamiUitOpen | 0:225138ac03fd | 277 | |
MikamiUitOpen | 0:225138ac03fd | 278 | int SDFileSystem::disk_sync() |
MikamiUitOpen | 0:225138ac03fd | 279 | { |
MikamiUitOpen | 0:225138ac03fd | 280 | //Select the card so we're forced to wait for the end of any internal write processes |
MikamiUitOpen | 0:225138ac03fd | 281 | __DSB(); |
MikamiUitOpen | 0:225138ac03fd | 282 | __ISB(); |
MikamiUitOpen | 0:225138ac03fd | 283 | while(BSP_SD_Get_Busy()==1){;} |
MikamiUitOpen | 0:225138ac03fd | 284 | BSP_SD_Set_Busy(); |
MikamiUitOpen | 0:225138ac03fd | 285 | while(BSP_SD_GetStatus()==SD_TRANSFER_BUSY){;} |
MikamiUitOpen | 0:225138ac03fd | 286 | if(BSP_SD_GetStatus()==SD_TRANSFER_OK) |
MikamiUitOpen | 0:225138ac03fd | 287 | { |
MikamiUitOpen | 0:225138ac03fd | 288 | BSP_SD_Clear_Busy(); |
MikamiUitOpen | 0:225138ac03fd | 289 | return RES_OK; |
MikamiUitOpen | 0:225138ac03fd | 290 | } else { |
MikamiUitOpen | 0:225138ac03fd | 291 | BSP_SD_Clear_Busy(); |
MikamiUitOpen | 0:225138ac03fd | 292 | return RES_ERROR; |
MikamiUitOpen | 0:225138ac03fd | 293 | } |
MikamiUitOpen | 0:225138ac03fd | 294 | } |
MikamiUitOpen | 0:225138ac03fd | 295 | |
MikamiUitOpen | 0:225138ac03fd | 296 | uint32_t SDFileSystem::disk_sectors() |
MikamiUitOpen | 0:225138ac03fd | 297 | { |
MikamiUitOpen | 0:225138ac03fd | 298 | uint32_t sectors=0; |
MikamiUitOpen | 0:225138ac03fd | 299 | //Make sure the card is initialized before proceeding |
MikamiUitOpen | 0:225138ac03fd | 300 | if (m_Status & STA_NOINIT) |
MikamiUitOpen | 0:225138ac03fd | 301 | return 0; |
MikamiUitOpen | 0:225138ac03fd | 302 | __DSB(); |
MikamiUitOpen | 0:225138ac03fd | 303 | __ISB(); |
MikamiUitOpen | 0:225138ac03fd | 304 | while(BSP_SD_Get_Busy()==1){;} |
MikamiUitOpen | 0:225138ac03fd | 305 | BSP_SD_Set_Busy(); |
MikamiUitOpen | 0:225138ac03fd | 306 | BSP_SD_GetCardInfo(&m_CardInfo); |
MikamiUitOpen | 0:225138ac03fd | 307 | sectors=m_CardInfo.CardCapacity>>9; |
MikamiUitOpen | 0:225138ac03fd | 308 | BSP_SD_Clear_Busy(); |
MikamiUitOpen | 0:225138ac03fd | 309 | return sectors; |
MikamiUitOpen | 0:225138ac03fd | 310 | } |
MikamiUitOpen | 0:225138ac03fd | 311 | |
MikamiUitOpen | 0:225138ac03fd | 312 | void SDFileSystem::onCardRemoval() |
MikamiUitOpen | 0:225138ac03fd | 313 | { |
MikamiUitOpen | 0:225138ac03fd | 314 | //Check the card socket |
MikamiUitOpen | 0:225138ac03fd | 315 | checkSocket(); |
MikamiUitOpen | 0:225138ac03fd | 316 | } |
MikamiUitOpen | 0:225138ac03fd | 317 | |
MikamiUitOpen | 0:225138ac03fd | 318 | inline void SDFileSystem::checkSocket() |
MikamiUitOpen | 0:225138ac03fd | 319 | { |
MikamiUitOpen | 0:225138ac03fd | 320 | //Use the card detect switch (if available) to determine if the socket is occupied |
MikamiUitOpen | 0:225138ac03fd | 321 | if (m_CdAssert != -1) { |
MikamiUitOpen | 0:225138ac03fd | 322 | if (m_Status & STA_NODISK) { |
MikamiUitOpen | 0:225138ac03fd | 323 | if (m_Cd == m_CdAssert) { |
MikamiUitOpen | 0:225138ac03fd | 324 | //The socket is now occupied |
MikamiUitOpen | 0:225138ac03fd | 325 | m_Status &= ~STA_NODISK; |
MikamiUitOpen | 0:225138ac03fd | 326 | m_CardType = CARD_UNKNOWN; |
MikamiUitOpen | 0:225138ac03fd | 327 | } |
MikamiUitOpen | 0:225138ac03fd | 328 | } else { |
MikamiUitOpen | 0:225138ac03fd | 329 | if (m_Cd != m_CdAssert) { |
MikamiUitOpen | 0:225138ac03fd | 330 | //The socket is now empty |
MikamiUitOpen | 0:225138ac03fd | 331 | m_Status |= (STA_NODISK | STA_NOINIT); |
MikamiUitOpen | 0:225138ac03fd | 332 | m_CardType = CARD_NONE; |
MikamiUitOpen | 0:225138ac03fd | 333 | } |
MikamiUitOpen | 0:225138ac03fd | 334 | } |
MikamiUitOpen | 0:225138ac03fd | 335 | } |
MikamiUitOpen | 0:225138ac03fd | 336 | } |
MikamiUitOpen | 0:225138ac03fd | 337 | |
MikamiUitOpen | 0:225138ac03fd | 338 | |
MikamiUitOpen | 0:225138ac03fd | 339 | /*interrupthandlers */ |
MikamiUitOpen | 0:225138ac03fd | 340 | /** |
MikamiUitOpen | 0:225138ac03fd | 341 | * @brief This function handles DMA2 Stream 3 interrupt request. |
MikamiUitOpen | 0:225138ac03fd | 342 | * @param None |
MikamiUitOpen | 0:225138ac03fd | 343 | * @retval None |
MikamiUitOpen | 0:225138ac03fd | 344 | */ |
MikamiUitOpen | 0:225138ac03fd | 345 | void SDFileSystem::DMA2_Stream3_IRQHandler(void) |
MikamiUitOpen | 0:225138ac03fd | 346 | { |
MikamiUitOpen | 0:225138ac03fd | 347 | BSP_SD_DMA_Rx_IRQHandler(); |
MikamiUitOpen | 0:225138ac03fd | 348 | BSP_SD_Clear_RX_Busy(); |
MikamiUitOpen | 0:225138ac03fd | 349 | } |
MikamiUitOpen | 0:225138ac03fd | 350 | |
MikamiUitOpen | 0:225138ac03fd | 351 | /** |
MikamiUitOpen | 0:225138ac03fd | 352 | * @brief This function handles DMA2 Stream 6 interrupt request. |
MikamiUitOpen | 0:225138ac03fd | 353 | * @param None |
MikamiUitOpen | 0:225138ac03fd | 354 | * @retval None |
MikamiUitOpen | 0:225138ac03fd | 355 | */ |
MikamiUitOpen | 0:225138ac03fd | 356 | void SDFileSystem::DMA2_Stream6_IRQHandler(void) |
MikamiUitOpen | 0:225138ac03fd | 357 | { |
MikamiUitOpen | 0:225138ac03fd | 358 | BSP_SD_DMA_Tx_IRQHandler(); |
MikamiUitOpen | 0:225138ac03fd | 359 | BSP_SD_Clear_TX_Busy(); |
MikamiUitOpen | 0:225138ac03fd | 360 | } |
MikamiUitOpen | 0:225138ac03fd | 361 | |
MikamiUitOpen | 0:225138ac03fd | 362 | /** |
MikamiUitOpen | 0:225138ac03fd | 363 | * @brief This function handles SDIO interrupt request. |
MikamiUitOpen | 0:225138ac03fd | 364 | * @param None |
MikamiUitOpen | 0:225138ac03fd | 365 | * @retval None |
MikamiUitOpen | 0:225138ac03fd | 366 | */ |
MikamiUitOpen | 0:225138ac03fd | 367 | void SDFileSystem::SDMMC1_IRQHandler(void) |
MikamiUitOpen | 0:225138ac03fd | 368 | { |
MikamiUitOpen | 0:225138ac03fd | 369 | BSP_SD_IRQHandler(); |
MikamiUitOpen | 0:225138ac03fd | 370 | } |
MikamiUitOpen | 0:225138ac03fd | 371 |