diff options
Diffstat (limited to 'stmhal/fatfs/src/drivers/sdram_diskio.c')
-rw-r--r-- | stmhal/fatfs/src/drivers/sdram_diskio.c | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/stmhal/fatfs/src/drivers/sdram_diskio.c b/stmhal/fatfs/src/drivers/sdram_diskio.c new file mode 100644 index 0000000000..4ae0c8a64f --- /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
+ *
+ * <h2><center>© COPYRIGHT 2014 STMicroelectronics</center></h2>
+ *
+ * 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 <string.h>
+#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****/
+
|