123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 |
- /**
- ******************************************************************************
- * @file sd_diskio.c (based on sd_diskio_template.c v2.0.2 as "Use dma template" is disabled)
- * @brief SD Disk I/O driver
- ******************************************************************************
- * This notice applies to any and all portions of this file
- * that are not between comment pairs USER CODE BEGIN and
- * USER CODE END. Other portions of this file, whether
- * inserted by the user or by software development tools
- * are owned by their respective copyright owners.
- *
- * Copyright (c) 2018 STMicroelectronics International N.V.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted, provided that the following conditions are met:
- *
- * 1. Redistribution of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. Neither the name of STMicroelectronics nor the names of other
- * contributors to this software may be used to endorse or promote products
- * derived from this software without specific written permission.
- * 4. This software, including modifications and/or derivative works of this
- * software, must execute solely and exclusively on microcontroller or
- * microprocessor devices manufactured by or for STMicroelectronics.
- * 5. Redistribution and use of this software other than as permitted under
- * this license is void and will automatically terminate your rights under
- * this license.
- *
- * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
- * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
- * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
- * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- ******************************************************************************
- */
- /* USER CODE BEGIN firstSection */
- /* can be used to modify / undefine following code or add new definitions */
- /* USER CODE END firstSection*/
- /* Includes ------------------------------------------------------------------*/
- #include "ff_gen_drv.h"
- #include "sd_diskio.h"
- /* Private typedef -----------------------------------------------------------*/
- /* Private define ------------------------------------------------------------*/
- /* use the default SD timout as defined in the platform BSP driver*/
- #if defined(SDMMC_DATATIMEOUT)
- #define SD_TIMEOUT SDMMC_DATATIMEOUT
- #elif defined(SD_DATATIMEOUT)
- #define SD_TIMEOUT SD_DATATIMEOUT
- #else
- #define SD_TIMEOUT 30 * 1000
- #endif
- #define SD_DEFAULT_BLOCK_SIZE 512
- /*
- * Depending on the use case, the SD card initialization could be done at the
- * application level: if it is the case define the flag below to disable
- * the BSP_SD_Init() call in the SD_Initialize() and add a call to
- * BSP_SD_Init() elsewhere in the application.
- */
- /* USER CODE BEGIN disableSDInit */
- /* #define DISABLE_SD_INIT */
- /* USER CODE END disableSDInit */
- /* Private variables ---------------------------------------------------------*/
- /* Disk status */
- static volatile DSTATUS Stat = STA_NOINIT;
- /* Private function prototypes -----------------------------------------------*/
- static DSTATUS SD_CheckStatus(BYTE lun);
- DSTATUS SD_initialize (BYTE);
- DSTATUS SD_status (BYTE);
- DRESULT SD_read (BYTE, BYTE*, DWORD, UINT);
- #if _USE_WRITE == 1
- DRESULT SD_write (BYTE, const BYTE*, DWORD, UINT);
- #endif /* _USE_WRITE == 1 */
- #if _USE_IOCTL == 1
- DRESULT SD_ioctl (BYTE, BYTE, void*);
- #endif /* _USE_IOCTL == 1 */
- const Diskio_drvTypeDef SD_Driver =
- {
- SD_initialize,
- SD_status,
- SD_read,
- #if _USE_WRITE == 1
- SD_write,
- #endif /* _USE_WRITE == 1 */
- #if _USE_IOCTL == 1
- SD_ioctl,
- #endif /* _USE_IOCTL == 1 */
- };
- /* USER CODE BEGIN beforeFunctionSection */
- /* can be used to modify / undefine following code or add new code */
- /* USER CODE END beforeFunctionSection */
- /* Private functions ---------------------------------------------------------*/
- static DSTATUS SD_CheckStatus(BYTE lun)
- {
- Stat = STA_NOINIT;
- if(BSP_SD_GetCardState() == MSD_OK)
- {
- Stat &= ~STA_NOINIT;
- }
- return Stat;
- }
- /**
- * @brief Initializes a Drive
- * @param lun : not used
- * @retval DSTATUS: Operation status
- */
- DSTATUS SD_initialize(BYTE lun)
- {
- Stat = STA_NOINIT;
- #if !defined(DISABLE_SD_INIT)
- if(BSP_SD_Init() == MSD_OK)
- {
- Stat = SD_CheckStatus(lun);
- }
- #else
- Stat = SD_CheckStatus(lun);
- #endif
- return Stat;
- }
- /**
- * @brief Gets Disk Status
- * @param lun : not used
- * @retval DSTATUS: Operation status
- */
- DSTATUS SD_status(BYTE lun)
- {
- return SD_CheckStatus(lun);
- }
- /* USER CODE BEGIN beforeReadSection */
- /* can be used to modify previous code / undefine following code / add new code */
- /* USER CODE END beforeReadSection */
- /**
- * @brief Reads Sector(s)
- * @param lun : not used
- * @param *buff: Data buffer to store read data
- * @param sector: Sector address (LBA)
- * @param count: Number of sectors to read (1..128)
- * @retval DRESULT: Operation result
- */
- DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT count)
- {
- DRESULT res = RES_ERROR;
- if(BSP_SD_ReadBlocks((uint32_t*)buff,
- (uint32_t) (sector),
- count, SD_TIMEOUT) == MSD_OK)
- {
- /* wait until the read operation is finished */
- while(BSP_SD_GetCardState()!= MSD_OK)
- {
- }
- res = RES_OK;
- }
- return res;
- }
- /* USER CODE BEGIN beforeWriteSection */
- /* can be used to modify previous code / undefine following code / add new code */
- /* USER CODE END beforeWriteSection */
- /**
- * @brief Writes Sector(s)
- * @param lun : not used
- * @param *buff: Data to be written
- * @param sector: Sector address (LBA)
- * @param count: Number of sectors to write (1..128)
- * @retval DRESULT: Operation result
- */
- #if _USE_WRITE == 1
- DRESULT SD_write(BYTE lun, const BYTE *buff, DWORD sector, UINT count)
- {
- DRESULT res = RES_ERROR;
- if(BSP_SD_WriteBlocks((uint32_t*)buff,
- (uint32_t)(sector),
- count, SD_TIMEOUT) == MSD_OK)
- {
- /* wait until the Write operation is finished */
- while(BSP_SD_GetCardState() != MSD_OK)
- {
- }
- res = RES_OK;
- }
- return res;
- }
- #endif /* _USE_WRITE == 1 */
- /* USER CODE BEGIN beforeIoctlSection */
- /* can be used to modify previous code / undefine following code / add new code */
- /* USER CODE END beforeIoctlSection */
- /**
- * @brief I/O control operation
- * @param lun : not used
- * @param cmd: Control code
- * @param *buff: Buffer to send/receive control data
- * @retval DRESULT: Operation result
- */
- #if _USE_IOCTL == 1
- DRESULT SD_ioctl(BYTE lun, BYTE cmd, void *buff)
- {
- DRESULT res = RES_ERROR;
- BSP_SD_CardInfo CardInfo;
- if (Stat & STA_NOINIT) return RES_NOTRDY;
- switch (cmd)
- {
- /* Make sure that no pending write process */
- case CTRL_SYNC :
- res = RES_OK;
- break;
- /* Get number of sectors on the disk (DWORD) */
- case GET_SECTOR_COUNT :
- BSP_SD_GetCardInfo(&CardInfo);
- *(DWORD*)buff = CardInfo.LogBlockNbr;
- res = RES_OK;
- break;
- /* Get R/W sector size (WORD) */
- case GET_SECTOR_SIZE :
- BSP_SD_GetCardInfo(&CardInfo);
- *(WORD*)buff = CardInfo.LogBlockSize;
- res = RES_OK;
- break;
- /* Get erase block size in unit of sector (DWORD) */
- case GET_BLOCK_SIZE :
- BSP_SD_GetCardInfo(&CardInfo);
- *(DWORD*)buff = CardInfo.LogBlockSize / SD_DEFAULT_BLOCK_SIZE;
- res = RES_OK;
- break;
- default:
- res = RES_PARERR;
- }
- return res;
- }
- #endif /* _USE_IOCTL == 1 */
- /* USER CODE BEGIN afterIoctlSection */
- /* can be used to modify previous code / undefine following code / add new code */
- /* USER CODE END afterIoctlSection */
- /* USER CODE BEGIN lastSection */
- /* can be used to modify / undefine previous code or add new code */
- /* USER CODE END lastSection */
- /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|