STM32F746NG fatfs library

Dependents:   DISCO-F746NG_uSD Active-WolfMan_V2-5-All-Frank-Board-Functions_copy DISCO-F746NG_uSD DISCO-F746NG_uSD

Committer:
buyukesmeli
Date:
Sat Feb 03 14:38:06 2018 +0000
Revision:
0:3a2f06aeceaf
Initial Commit

Who changed what in which revision?

UserRevisionLine numberNew 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>&copy; 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