From dd38d907244bc0e483c3d760f2ba464a394ec229 Mon Sep 17 00:00:00 2001 From: Dave Hylands Date: Tue, 11 Mar 2014 23:55:41 -0700 Subject: Initial checkin with STM HAL This compiles and links, but hasn't been tested on a board yet and even if it was run, it doesn't currently do anything. --- stmhal/fatfs/src/drivers/sdram_diskio.c | 187 ++++++++++++++++++++++++++++++++ 1 file changed, 187 insertions(+) create mode 100644 stmhal/fatfs/src/drivers/sdram_diskio.c (limited to 'stmhal/fatfs/src/drivers/sdram_diskio.c') diff --git a/stmhal/fatfs/src/drivers/sdram_diskio.c b/stmhal/fatfs/src/drivers/sdram_diskio.c new file mode 100644 index 000000000..4ae0c8a64 --- /dev/null +++ b/stmhal/fatfs/src/drivers/sdram_diskio.c @@ -0,0 +1,187 @@ +/** + ****************************************************************************** + * @file sdram_diskio.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief SDRAM Disk I/O driver + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include +#include "ff_gen_drv.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Block Size in Bytes */ +#define BLOCK_SIZE 512 + +/* Private variables ---------------------------------------------------------*/ +/* Disk status */ +static volatile DSTATUS Stat = STA_NOINIT; + +/* Private function prototypes -----------------------------------------------*/ +DSTATUS SDRAMDISK_initialize (void); +DSTATUS SDRAMDISK_status (void); +DRESULT SDRAMDISK_read (BYTE*, DWORD, BYTE); +#if _USE_WRITE == 1 + DRESULT SDRAMDISK_write (const BYTE*, DWORD, BYTE); +#endif /* _USE_WRITE == 1 */ +#if _USE_IOCTL == 1 + DRESULT SDRAMDISK_ioctl (BYTE, void*); +#endif /* _USE_IOCTL == 1 */ + +Diskio_drvTypeDef SDRAMDISK_Driver = +{ + SDRAMDISK_initialize, + SDRAMDISK_status, + SDRAMDISK_read, +#if _USE_WRITE + SDRAMDISK_write, +#endif /* _USE_WRITE == 1 */ +#if _USE_IOCTL == 1 + SDRAMDISK_ioctl, +#endif /* _USE_IOCTL == 1 */ +}; + +/* Private functions ---------------------------------------------------------*/ + +/** + * @brief Initializes a Drive + * @param None + * @retval DSTATUS: Operation status + */ +DSTATUS SDRAMDISK_initialize(void) +{ + Stat = STA_NOINIT; + + /* Configure the SDRAM device */ + BSP_SDRAM_Init(); + + Stat &= ~STA_NOINIT; + return Stat; +} + +/** + * @brief Gets Disk Status + * @param None + * @retval DSTATUS: Operation status + */ +DSTATUS SDRAMDISK_status(void) +{ + Stat = STA_NOINIT; + + Stat &= ~STA_NOINIT; + + return Stat; +} + +/** + * @brief Reads Sector(s) + * @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 SDRAMDISK_read(BYTE *buff, DWORD sector, BYTE count) +{ + uint32_t *pSrcBuffer = (uint32_t *)buff; + uint32_t BufferSize = (BLOCK_SIZE * count)/4; + uint32_t *pSdramAddress = (uint32_t *) (SDRAM_DEVICE_ADDR + (sector * BLOCK_SIZE)); + + for(; BufferSize != 0; BufferSize--) + { + *pSrcBuffer++ = *(__IO uint32_t *)pSdramAddress++; + } + + return RES_OK; +} + +/** + * @brief Writes Sector(s) + * @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 SDRAMDISK_write(const BYTE *buff, DWORD sector, BYTE count) +{ + uint32_t *pDstBuffer = (uint32_t *)buff; + uint32_t BufferSize = (BLOCK_SIZE * count)/4 + count; + uint32_t *pSramAddress = (uint32_t *) (SDRAM_DEVICE_ADDR + (sector * BLOCK_SIZE)); + + for(; BufferSize != 0; BufferSize--) + { + *(__IO uint32_t *)pSramAddress++ = *pDstBuffer++; + } + + return RES_OK; +} +#endif /* _USE_WRITE == 1 */ + +/** + * @brief I/O control operation + * @param cmd: Control code + * @param *buff: Buffer to send/receive control data + * @retval DRESULT: Operation result + */ +#if _USE_IOCTL == 1 +DRESULT SDRAMDISK_ioctl(BYTE cmd, void *buff) +{ + DRESULT res = RES_ERROR; + + 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 : + *(DWORD*)buff = SDRAM_DEVICE_SIZE / BLOCK_SIZE; + res = RES_OK; + break; + + /* Get R/W sector size (WORD) */ + case GET_SECTOR_SIZE : + *(WORD*)buff = BLOCK_SIZE; + res = RES_OK; + break; + + /* Get erase block size in unit of sector (DWORD) */ + case GET_BLOCK_SIZE : + *(DWORD*)buff = BLOCK_SIZE; + break; + + default: + res = RES_PARERR; + } + + return res; +} +#endif /* _USE_IOCTL == 1 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + -- cgit v1.2.3