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