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:
Mon Jan 09 05:30:14 2017 +0000
Revision:
1:99666dacaae6
Parent:
0:225138ac03fd
2, "FATFileSystem" is updated.

Who changed what in which revision?

UserRevisionLine numberNew 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