STM32F746NG fatfs library
Dependents: DISCO-F746NG_uSD Active-WolfMan_V2-5-All-Frank-Board-Functions_copy DISCO-F746NG_uSD DISCO-F746NG_uSD
sd_diskio.c@0:3a2f06aeceaf, 2018-02-03 (annotated)
- Committer:
- buyukesmeli
- Date:
- Sat Feb 03 14:38:06 2018 +0000
- Revision:
- 0:3a2f06aeceaf
Initial Commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
buyukesmeli | 0:3a2f06aeceaf | 1 | /** |
buyukesmeli | 0:3a2f06aeceaf | 2 | ****************************************************************************** |
buyukesmeli | 0:3a2f06aeceaf | 3 | * @file sd_diskio.c |
buyukesmeli | 0:3a2f06aeceaf | 4 | * @author MCD Application Team |
buyukesmeli | 0:3a2f06aeceaf | 5 | * @version V1.4.0 |
buyukesmeli | 0:3a2f06aeceaf | 6 | * @date 09-September-2016 |
buyukesmeli | 0:3a2f06aeceaf | 7 | * @brief SD Disk I/O driver |
buyukesmeli | 0:3a2f06aeceaf | 8 | ****************************************************************************** |
buyukesmeli | 0:3a2f06aeceaf | 9 | * @attention |
buyukesmeli | 0:3a2f06aeceaf | 10 | * |
buyukesmeli | 0:3a2f06aeceaf | 11 | * <h2><center>© COPYRIGHT 2016 STMicroelectronics</center></h2> |
buyukesmeli | 0:3a2f06aeceaf | 12 | * |
buyukesmeli | 0:3a2f06aeceaf | 13 | * Redistribution and use in source and binary forms, with or without |
buyukesmeli | 0:3a2f06aeceaf | 14 | * modification, are permitted, provided that the following conditions are met: |
buyukesmeli | 0:3a2f06aeceaf | 15 | * |
buyukesmeli | 0:3a2f06aeceaf | 16 | * 1. Redistribution of source code must retain the above copyright notice, |
buyukesmeli | 0:3a2f06aeceaf | 17 | * this list of conditions and the following disclaimer. |
buyukesmeli | 0:3a2f06aeceaf | 18 | * 2. Redistributions in binary form must reproduce the above copyright notice, |
buyukesmeli | 0:3a2f06aeceaf | 19 | * this list of conditions and the following disclaimer in the documentation |
buyukesmeli | 0:3a2f06aeceaf | 20 | * and/or other materials provided with the distribution. |
buyukesmeli | 0:3a2f06aeceaf | 21 | * 3. Neither the name of STMicroelectronics nor the names of other |
buyukesmeli | 0:3a2f06aeceaf | 22 | * contributors to this software may be used to endorse or promote products |
buyukesmeli | 0:3a2f06aeceaf | 23 | * derived from this software without specific written permission. |
buyukesmeli | 0:3a2f06aeceaf | 24 | * 4. This software, including modifications and/or derivative works of this |
buyukesmeli | 0:3a2f06aeceaf | 25 | * software, must execute solely and exclusively on microcontroller or |
buyukesmeli | 0:3a2f06aeceaf | 26 | * microprocessor devices manufactured by or for STMicroelectronics. |
buyukesmeli | 0:3a2f06aeceaf | 27 | * 5. Redistribution and use of this software other than as permitted under |
buyukesmeli | 0:3a2f06aeceaf | 28 | * this license is void and will automatically terminate your rights under |
buyukesmeli | 0:3a2f06aeceaf | 29 | * this license. |
buyukesmeli | 0:3a2f06aeceaf | 30 | * |
buyukesmeli | 0:3a2f06aeceaf | 31 | * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" |
buyukesmeli | 0:3a2f06aeceaf | 32 | * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT |
buyukesmeli | 0:3a2f06aeceaf | 33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A |
buyukesmeli | 0:3a2f06aeceaf | 34 | * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY |
buyukesmeli | 0:3a2f06aeceaf | 35 | * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT |
buyukesmeli | 0:3a2f06aeceaf | 36 | * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
buyukesmeli | 0:3a2f06aeceaf | 37 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
buyukesmeli | 0:3a2f06aeceaf | 38 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, |
buyukesmeli | 0:3a2f06aeceaf | 39 | * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
buyukesmeli | 0:3a2f06aeceaf | 40 | * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
buyukesmeli | 0:3a2f06aeceaf | 41 | * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, |
buyukesmeli | 0:3a2f06aeceaf | 42 | * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
buyukesmeli | 0:3a2f06aeceaf | 43 | * |
buyukesmeli | 0:3a2f06aeceaf | 44 | ****************************************************************************** |
buyukesmeli | 0:3a2f06aeceaf | 45 | */ |
buyukesmeli | 0:3a2f06aeceaf | 46 | |
buyukesmeli | 0:3a2f06aeceaf | 47 | /* Includes ------------------------------------------------------------------*/ |
buyukesmeli | 0:3a2f06aeceaf | 48 | #include <string.h> |
buyukesmeli | 0:3a2f06aeceaf | 49 | #include "ff_gen_drv.h" |
buyukesmeli | 0:3a2f06aeceaf | 50 | |
buyukesmeli | 0:3a2f06aeceaf | 51 | /* Private typedef -----------------------------------------------------------*/ |
buyukesmeli | 0:3a2f06aeceaf | 52 | /* Private define ------------------------------------------------------------*/ |
buyukesmeli | 0:3a2f06aeceaf | 53 | /* Private variables ---------------------------------------------------------*/ |
buyukesmeli | 0:3a2f06aeceaf | 54 | /* Disk status */ |
buyukesmeli | 0:3a2f06aeceaf | 55 | static volatile DSTATUS Stat = STA_NOINIT; |
buyukesmeli | 0:3a2f06aeceaf | 56 | |
buyukesmeli | 0:3a2f06aeceaf | 57 | /* Private function prototypes -----------------------------------------------*/ |
buyukesmeli | 0:3a2f06aeceaf | 58 | DSTATUS SD_initialize (BYTE); |
buyukesmeli | 0:3a2f06aeceaf | 59 | DSTATUS SD_status (BYTE); |
buyukesmeli | 0:3a2f06aeceaf | 60 | DRESULT SD_read (BYTE, BYTE*, DWORD, UINT); |
buyukesmeli | 0:3a2f06aeceaf | 61 | #if _USE_WRITE == 1 |
buyukesmeli | 0:3a2f06aeceaf | 62 | DRESULT SD_write (BYTE, const BYTE*, DWORD, UINT); |
buyukesmeli | 0:3a2f06aeceaf | 63 | #endif /* _USE_WRITE == 1 */ |
buyukesmeli | 0:3a2f06aeceaf | 64 | #if _USE_IOCTL == 1 |
buyukesmeli | 0:3a2f06aeceaf | 65 | DRESULT SD_ioctl (BYTE, BYTE, void*); |
buyukesmeli | 0:3a2f06aeceaf | 66 | #endif /* _USE_IOCTL == 1 */ |
buyukesmeli | 0:3a2f06aeceaf | 67 | |
buyukesmeli | 0:3a2f06aeceaf | 68 | const Diskio_drvTypeDef SD_Driver = |
buyukesmeli | 0:3a2f06aeceaf | 69 | { |
buyukesmeli | 0:3a2f06aeceaf | 70 | SD_initialize, |
buyukesmeli | 0:3a2f06aeceaf | 71 | SD_status, |
buyukesmeli | 0:3a2f06aeceaf | 72 | SD_read, |
buyukesmeli | 0:3a2f06aeceaf | 73 | #if _USE_WRITE == 1 |
buyukesmeli | 0:3a2f06aeceaf | 74 | SD_write, |
buyukesmeli | 0:3a2f06aeceaf | 75 | #endif /* _USE_WRITE == 1 */ |
buyukesmeli | 0:3a2f06aeceaf | 76 | |
buyukesmeli | 0:3a2f06aeceaf | 77 | #if _USE_IOCTL == 1 |
buyukesmeli | 0:3a2f06aeceaf | 78 | SD_ioctl, |
buyukesmeli | 0:3a2f06aeceaf | 79 | #endif /* _USE_IOCTL == 1 */ |
buyukesmeli | 0:3a2f06aeceaf | 80 | }; |
buyukesmeli | 0:3a2f06aeceaf | 81 | |
buyukesmeli | 0:3a2f06aeceaf | 82 | /* Private functions ---------------------------------------------------------*/ |
buyukesmeli | 0:3a2f06aeceaf | 83 | |
buyukesmeli | 0:3a2f06aeceaf | 84 | /** |
buyukesmeli | 0:3a2f06aeceaf | 85 | * @brief Initializes a Drive |
buyukesmeli | 0:3a2f06aeceaf | 86 | * @param lun : not used |
buyukesmeli | 0:3a2f06aeceaf | 87 | * @retval DSTATUS: Operation status |
buyukesmeli | 0:3a2f06aeceaf | 88 | */ |
buyukesmeli | 0:3a2f06aeceaf | 89 | DSTATUS SD_initialize(BYTE lun) |
buyukesmeli | 0:3a2f06aeceaf | 90 | { |
buyukesmeli | 0:3a2f06aeceaf | 91 | Stat = STA_NOINIT; |
buyukesmeli | 0:3a2f06aeceaf | 92 | |
buyukesmeli | 0:3a2f06aeceaf | 93 | /* Configure the uSD device */ |
buyukesmeli | 0:3a2f06aeceaf | 94 | if(BSP_SD_Init() == MSD_OK) |
buyukesmeli | 0:3a2f06aeceaf | 95 | { |
buyukesmeli | 0:3a2f06aeceaf | 96 | Stat &= ~STA_NOINIT; |
buyukesmeli | 0:3a2f06aeceaf | 97 | } |
buyukesmeli | 0:3a2f06aeceaf | 98 | |
buyukesmeli | 0:3a2f06aeceaf | 99 | return Stat; |
buyukesmeli | 0:3a2f06aeceaf | 100 | } |
buyukesmeli | 0:3a2f06aeceaf | 101 | |
buyukesmeli | 0:3a2f06aeceaf | 102 | /** |
buyukesmeli | 0:3a2f06aeceaf | 103 | * @brief Gets Disk Status |
buyukesmeli | 0:3a2f06aeceaf | 104 | * @param lun : not used |
buyukesmeli | 0:3a2f06aeceaf | 105 | * @retval DSTATUS: Operation status |
buyukesmeli | 0:3a2f06aeceaf | 106 | */ |
buyukesmeli | 0:3a2f06aeceaf | 107 | DSTATUS SD_status(BYTE lun) |
buyukesmeli | 0:3a2f06aeceaf | 108 | { |
buyukesmeli | 0:3a2f06aeceaf | 109 | Stat = STA_NOINIT; |
buyukesmeli | 0:3a2f06aeceaf | 110 | |
buyukesmeli | 0:3a2f06aeceaf | 111 | if(BSP_SD_GetCardState() == MSD_OK) |
buyukesmeli | 0:3a2f06aeceaf | 112 | { |
buyukesmeli | 0:3a2f06aeceaf | 113 | Stat &= ~STA_NOINIT; |
buyukesmeli | 0:3a2f06aeceaf | 114 | } |
buyukesmeli | 0:3a2f06aeceaf | 115 | |
buyukesmeli | 0:3a2f06aeceaf | 116 | return Stat; |
buyukesmeli | 0:3a2f06aeceaf | 117 | } |
buyukesmeli | 0:3a2f06aeceaf | 118 | |
buyukesmeli | 0:3a2f06aeceaf | 119 | /** |
buyukesmeli | 0:3a2f06aeceaf | 120 | * @brief Reads Sector(s) |
buyukesmeli | 0:3a2f06aeceaf | 121 | * @param lun : not used |
buyukesmeli | 0:3a2f06aeceaf | 122 | * @param *buff: Data buffer to store read data |
buyukesmeli | 0:3a2f06aeceaf | 123 | * @param sector: Sector address (LBA) |
buyukesmeli | 0:3a2f06aeceaf | 124 | * @param count: Number of sectors to read (1..128) |
buyukesmeli | 0:3a2f06aeceaf | 125 | * @retval DRESULT: Operation result |
buyukesmeli | 0:3a2f06aeceaf | 126 | */ |
buyukesmeli | 0:3a2f06aeceaf | 127 | DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT count) |
buyukesmeli | 0:3a2f06aeceaf | 128 | { |
buyukesmeli | 0:3a2f06aeceaf | 129 | DRESULT res = RES_ERROR; |
buyukesmeli | 0:3a2f06aeceaf | 130 | uint32_t timeout = 100000; |
buyukesmeli | 0:3a2f06aeceaf | 131 | |
buyukesmeli | 0:3a2f06aeceaf | 132 | if(BSP_SD_ReadBlocks((uint32_t*)buff, |
buyukesmeli | 0:3a2f06aeceaf | 133 | (uint32_t) (sector), |
buyukesmeli | 0:3a2f06aeceaf | 134 | count, SD_DATATIMEOUT) == MSD_OK) |
buyukesmeli | 0:3a2f06aeceaf | 135 | { |
buyukesmeli | 0:3a2f06aeceaf | 136 | while(BSP_SD_GetCardState()!= MSD_OK) |
buyukesmeli | 0:3a2f06aeceaf | 137 | { |
buyukesmeli | 0:3a2f06aeceaf | 138 | if (timeout-- == 0) |
buyukesmeli | 0:3a2f06aeceaf | 139 | { |
buyukesmeli | 0:3a2f06aeceaf | 140 | return RES_ERROR; |
buyukesmeli | 0:3a2f06aeceaf | 141 | } |
buyukesmeli | 0:3a2f06aeceaf | 142 | } |
buyukesmeli | 0:3a2f06aeceaf | 143 | res = RES_OK; |
buyukesmeli | 0:3a2f06aeceaf | 144 | } |
buyukesmeli | 0:3a2f06aeceaf | 145 | |
buyukesmeli | 0:3a2f06aeceaf | 146 | return res; |
buyukesmeli | 0:3a2f06aeceaf | 147 | } |
buyukesmeli | 0:3a2f06aeceaf | 148 | |
buyukesmeli | 0:3a2f06aeceaf | 149 | /** |
buyukesmeli | 0:3a2f06aeceaf | 150 | * @brief Writes Sector(s) |
buyukesmeli | 0:3a2f06aeceaf | 151 | * @param lun : not used |
buyukesmeli | 0:3a2f06aeceaf | 152 | * @param *buff: Data to be written |
buyukesmeli | 0:3a2f06aeceaf | 153 | * @param sector: Sector address (LBA) |
buyukesmeli | 0:3a2f06aeceaf | 154 | * @param count: Number of sectors to write (1..128) |
buyukesmeli | 0:3a2f06aeceaf | 155 | * @retval DRESULT: Operation result |
buyukesmeli | 0:3a2f06aeceaf | 156 | */ |
buyukesmeli | 0:3a2f06aeceaf | 157 | #if _USE_WRITE == 1 |
buyukesmeli | 0:3a2f06aeceaf | 158 | DRESULT SD_write(BYTE lun, const BYTE *buff, DWORD sector, UINT count) |
buyukesmeli | 0:3a2f06aeceaf | 159 | { |
buyukesmeli | 0:3a2f06aeceaf | 160 | DRESULT res = RES_ERROR; |
buyukesmeli | 0:3a2f06aeceaf | 161 | uint32_t timeout = 100000; |
buyukesmeli | 0:3a2f06aeceaf | 162 | |
buyukesmeli | 0:3a2f06aeceaf | 163 | if(BSP_SD_WriteBlocks((uint32_t*)buff, |
buyukesmeli | 0:3a2f06aeceaf | 164 | (uint32_t)(sector), |
buyukesmeli | 0:3a2f06aeceaf | 165 | count, SD_DATATIMEOUT) == MSD_OK) |
buyukesmeli | 0:3a2f06aeceaf | 166 | { |
buyukesmeli | 0:3a2f06aeceaf | 167 | while(BSP_SD_GetCardState()!= MSD_OK) |
buyukesmeli | 0:3a2f06aeceaf | 168 | { |
buyukesmeli | 0:3a2f06aeceaf | 169 | if (timeout-- == 0) |
buyukesmeli | 0:3a2f06aeceaf | 170 | { |
buyukesmeli | 0:3a2f06aeceaf | 171 | return RES_ERROR; |
buyukesmeli | 0:3a2f06aeceaf | 172 | } |
buyukesmeli | 0:3a2f06aeceaf | 173 | } |
buyukesmeli | 0:3a2f06aeceaf | 174 | res = RES_OK; |
buyukesmeli | 0:3a2f06aeceaf | 175 | } |
buyukesmeli | 0:3a2f06aeceaf | 176 | |
buyukesmeli | 0:3a2f06aeceaf | 177 | return res; |
buyukesmeli | 0:3a2f06aeceaf | 178 | } |
buyukesmeli | 0:3a2f06aeceaf | 179 | #endif /* _USE_WRITE == 1 */ |
buyukesmeli | 0:3a2f06aeceaf | 180 | |
buyukesmeli | 0:3a2f06aeceaf | 181 | /** |
buyukesmeli | 0:3a2f06aeceaf | 182 | * @brief I/O control operation |
buyukesmeli | 0:3a2f06aeceaf | 183 | * @param lun : not used |
buyukesmeli | 0:3a2f06aeceaf | 184 | * @param cmd: Control code |
buyukesmeli | 0:3a2f06aeceaf | 185 | * @param *buff: Buffer to send/receive control data |
buyukesmeli | 0:3a2f06aeceaf | 186 | * @retval DRESULT: Operation result |
buyukesmeli | 0:3a2f06aeceaf | 187 | */ |
buyukesmeli | 0:3a2f06aeceaf | 188 | #if _USE_IOCTL == 1 |
buyukesmeli | 0:3a2f06aeceaf | 189 | DRESULT SD_ioctl(BYTE lun, BYTE cmd, void *buff) |
buyukesmeli | 0:3a2f06aeceaf | 190 | { |
buyukesmeli | 0:3a2f06aeceaf | 191 | DRESULT res = RES_ERROR; |
buyukesmeli | 0:3a2f06aeceaf | 192 | BSP_SD_CardInfo CardInfo; |
buyukesmeli | 0:3a2f06aeceaf | 193 | |
buyukesmeli | 0:3a2f06aeceaf | 194 | if (Stat & STA_NOINIT) return RES_NOTRDY; |
buyukesmeli | 0:3a2f06aeceaf | 195 | |
buyukesmeli | 0:3a2f06aeceaf | 196 | switch (cmd) |
buyukesmeli | 0:3a2f06aeceaf | 197 | { |
buyukesmeli | 0:3a2f06aeceaf | 198 | /* Make sure that no pending write process */ |
buyukesmeli | 0:3a2f06aeceaf | 199 | case CTRL_SYNC : |
buyukesmeli | 0:3a2f06aeceaf | 200 | res = RES_OK; |
buyukesmeli | 0:3a2f06aeceaf | 201 | break; |
buyukesmeli | 0:3a2f06aeceaf | 202 | |
buyukesmeli | 0:3a2f06aeceaf | 203 | /* Get number of sectors on the disk (DWORD) */ |
buyukesmeli | 0:3a2f06aeceaf | 204 | case GET_SECTOR_COUNT : |
buyukesmeli | 0:3a2f06aeceaf | 205 | BSP_SD_GetCardInfo(&CardInfo); |
buyukesmeli | 0:3a2f06aeceaf | 206 | *(DWORD*)buff = CardInfo.LogBlockNbr; |
buyukesmeli | 0:3a2f06aeceaf | 207 | res = RES_OK; |
buyukesmeli | 0:3a2f06aeceaf | 208 | break; |
buyukesmeli | 0:3a2f06aeceaf | 209 | |
buyukesmeli | 0:3a2f06aeceaf | 210 | /* Get R/W sector size (WORD) */ |
buyukesmeli | 0:3a2f06aeceaf | 211 | case GET_SECTOR_SIZE : |
buyukesmeli | 0:3a2f06aeceaf | 212 | BSP_SD_GetCardInfo(&CardInfo); |
buyukesmeli | 0:3a2f06aeceaf | 213 | *(WORD*)buff = CardInfo.LogBlockSize; |
buyukesmeli | 0:3a2f06aeceaf | 214 | res = RES_OK; |
buyukesmeli | 0:3a2f06aeceaf | 215 | break; |
buyukesmeli | 0:3a2f06aeceaf | 216 | |
buyukesmeli | 0:3a2f06aeceaf | 217 | /* Get erase block size in unit of sector (DWORD) */ |
buyukesmeli | 0:3a2f06aeceaf | 218 | case GET_BLOCK_SIZE : |
buyukesmeli | 0:3a2f06aeceaf | 219 | BSP_SD_GetCardInfo(&CardInfo); |
buyukesmeli | 0:3a2f06aeceaf | 220 | *(DWORD*)buff = CardInfo.LogBlockSize; |
buyukesmeli | 0:3a2f06aeceaf | 221 | break; |
buyukesmeli | 0:3a2f06aeceaf | 222 | |
buyukesmeli | 0:3a2f06aeceaf | 223 | default: |
buyukesmeli | 0:3a2f06aeceaf | 224 | res = RES_PARERR; |
buyukesmeli | 0:3a2f06aeceaf | 225 | } |
buyukesmeli | 0:3a2f06aeceaf | 226 | |
buyukesmeli | 0:3a2f06aeceaf | 227 | return res; |
buyukesmeli | 0:3a2f06aeceaf | 228 | } |
buyukesmeli | 0:3a2f06aeceaf | 229 | #endif /* _USE_IOCTL == 1 */ |
buyukesmeli | 0:3a2f06aeceaf | 230 | |
buyukesmeli | 0:3a2f06aeceaf | 231 | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
buyukesmeli | 0:3a2f06aeceaf | 232 |