aboutsummaryrefslogtreecommitdiff
path: root/stmhal/fatfs/src/drivers
diff options
context:
space:
mode:
authorDave Hylands2014-03-11 23:55:41 -0700
committerDave Hylands2014-03-11 23:55:41 -0700
commitdd38d907244bc0e483c3d760f2ba464a394ec229 (patch)
tree05869a4757c5a1b11b8baf206595551c7650f6e7 /stmhal/fatfs/src/drivers
parent8bfec2b53822e2b62c4577b32e0beae398a16297 (diff)
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.
Diffstat (limited to 'stmhal/fatfs/src/drivers')
-rw-r--r--stmhal/fatfs/src/drivers/sd_diskio.c252
-rw-r--r--stmhal/fatfs/src/drivers/sd_diskio.h41
-rw-r--r--stmhal/fatfs/src/drivers/sdram_diskio.c187
-rw-r--r--stmhal/fatfs/src/drivers/sdram_diskio.h41
-rw-r--r--stmhal/fatfs/src/drivers/sram_diskio.c185
-rw-r--r--stmhal/fatfs/src/drivers/sram_diskio.h41
-rw-r--r--stmhal/fatfs/src/drivers/usbh_diskio.c289
-rw-r--r--stmhal/fatfs/src/drivers/usbh_diskio.h41
8 files changed, 1077 insertions, 0 deletions
diff --git a/stmhal/fatfs/src/drivers/sd_diskio.c b/stmhal/fatfs/src/drivers/sd_diskio.c
new file mode 100644
index 000000000..53461fe65
--- /dev/null
+++ b/stmhal/fatfs/src/drivers/sd_diskio.c
@@ -0,0 +1,252 @@
+/**
+ ******************************************************************************
+ * @file sd_diskio.c
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 18-February-2014
+ * @brief SD Disk I/O driver
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; 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 SD_initialize (void);
+DSTATUS SD_status (void);
+DRESULT SD_read (BYTE*, DWORD, BYTE);
+#if _USE_WRITE == 1
+ DRESULT SD_write (const BYTE*, DWORD, BYTE);
+#endif /* _USE_WRITE == 1 */
+#if _USE_IOCTL == 1
+ DRESULT SD_ioctl (BYTE, void*);
+#endif /* _USE_IOCTL == 1 */
+
+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 */
+};
+
+/* Private functions ---------------------------------------------------------*/
+
+/**
+ * @brief Initializes a Drive
+ * @param None
+ * @retval DSTATUS: Operation status
+ */
+DSTATUS SD_initialize(void)
+{
+ Stat = STA_NOINIT;
+
+ /* Configure the uSD device */
+ if(BSP_SD_Init() == MSD_OK)
+ {
+ Stat &= ~STA_NOINIT;
+ }
+
+ return Stat;
+}
+
+/**
+ * @brief Gets Disk Status
+ * @param None
+ * @retval DSTATUS: Operation status
+ */
+DSTATUS SD_status(void)
+{
+ Stat = STA_NOINIT;
+
+ if(BSP_SD_GetStatus() == 0)
+ {
+ 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 SD_read(BYTE *buff, DWORD sector, BYTE count)
+{
+ uint32_t timeout = 100000;
+ DWORD scratch [BLOCK_SIZE / 4]; /* Alignment ensured, need enough stack */
+ uint8_t SD_state = MSD_OK;
+
+ if ((DWORD)buff & 3) /* DMA Alignment issue, do single up to aligned buffer */
+ {
+ while (count--)
+ {
+ SD_state = BSP_SD_ReadBlocks_DMA((uint32_t*)scratch, (uint64_t) ((sector + count) * BLOCK_SIZE), BLOCK_SIZE, 1);
+
+ while(BSP_SD_GetStatus() != SD_TRANSFER_OK)
+ {
+ if (timeout-- == 0)
+ {
+ return RES_ERROR;
+ }
+ }
+ memcpy (&buff[count * BLOCK_SIZE] ,scratch, BLOCK_SIZE);
+ }
+ }
+ else
+ {
+ SD_state = BSP_SD_ReadBlocks_DMA((uint32_t*)buff, (uint64_t) (sector * BLOCK_SIZE), BLOCK_SIZE, count);
+
+ while(BSP_SD_GetStatus() != SD_TRANSFER_OK)
+ {
+ if (timeout-- == 0)
+ {
+ return RES_ERROR;
+ }
+ }
+ }
+ if (SD_state == MSD_OK)
+ {
+ return RES_OK;
+ }
+
+ return RES_ERROR;
+}
+
+/**
+ * @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 SD_write(const BYTE *buff, DWORD sector, BYTE count)
+{
+ uint32_t timeout = 100000;
+ DWORD scratch [BLOCK_SIZE / 4]; /* Alignment ensured, need enough stack */
+ uint8_t SD_state = MSD_OK;
+
+ if ((DWORD)buff & 3) /* DMA Alignment issue, do single up to aligned buffer */
+ {
+ while (count--)
+ {
+ memcpy (scratch, &buff[count * BLOCK_SIZE], BLOCK_SIZE);
+
+ SD_state = BSP_SD_WriteBlocks_DMA((uint32_t*)scratch, (uint64_t)((sector + count) * BLOCK_SIZE), BLOCK_SIZE, 1);
+
+ while(BSP_SD_GetStatus() != SD_TRANSFER_OK)
+ {
+ if (timeout-- == 0)
+ {
+ return RES_ERROR;
+ }
+ }
+ }
+ }
+ else
+ {
+ SD_state = BSP_SD_WriteBlocks_DMA((uint32_t*)buff, (uint64_t)(sector * BLOCK_SIZE), BLOCK_SIZE, count);
+
+ while(BSP_SD_GetStatus() != SD_TRANSFER_OK)
+ {
+ if (timeout-- == 0)
+ {
+ return RES_ERROR;
+ }
+ }
+ }
+ if (SD_state == MSD_OK)
+ {
+ return RES_OK;
+ }
+
+ return RES_ERROR;
+}
+#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 SD_ioctl(BYTE cmd, void *buff)
+{
+ DRESULT res = RES_ERROR;
+ HAL_SD_CardInfoTypedef 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.CardCapacity / 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****/
+
diff --git a/stmhal/fatfs/src/drivers/sd_diskio.h b/stmhal/fatfs/src/drivers/sd_diskio.h
new file mode 100644
index 000000000..43eb451c8
--- /dev/null
+++ b/stmhal/fatfs/src/drivers/sd_diskio.h
@@ -0,0 +1,41 @@
+/**
+ ******************************************************************************
+ * @file sd_diskio.h
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 18-February-2014
+ * @brief Header for sd_diskio.c module
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; 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.
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __SD_DISKIO_H
+#define __SD_DISKIO_H
+
+/* Includes ------------------------------------------------------------------*/
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+extern Diskio_drvTypeDef SD_Driver;
+
+#endif /* __SD_DISKIO_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
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
+ *
+ * <h2><center>&copy; 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****/
+
diff --git a/stmhal/fatfs/src/drivers/sdram_diskio.h b/stmhal/fatfs/src/drivers/sdram_diskio.h
new file mode 100644
index 000000000..213f0621a
--- /dev/null
+++ b/stmhal/fatfs/src/drivers/sdram_diskio.h
@@ -0,0 +1,41 @@
+/**
+ ******************************************************************************
+ * @file sdram_diskio.h
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 18-February-2014
+ * @brief Header for sdram_diskio.c module
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; 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.
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __SDRAM_DISKIO_H
+#define __SDRAM_DISKIO_H
+
+/* Includes ------------------------------------------------------------------*/
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+extern Diskio_drvTypeDef SDRAMDISK_Driver;
+
+#endif /* __SDRAM_DISKIO_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/stmhal/fatfs/src/drivers/sram_diskio.c b/stmhal/fatfs/src/drivers/sram_diskio.c
new file mode 100644
index 000000000..efd39bef0
--- /dev/null
+++ b/stmhal/fatfs/src/drivers/sram_diskio.c
@@ -0,0 +1,185 @@
+/**
+ ******************************************************************************
+ * @file sram_diskio.c
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 18-February-2014
+ * @brief SRAM Disk I/O driver
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; 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 SRAMDISK_initialize (void);
+DSTATUS SRAMDISK_status (void);
+DRESULT SRAMDISK_read (BYTE*, DWORD, BYTE);
+#if _USE_WRITE == 1
+ DRESULT SRAMDISK_write (const BYTE*, DWORD, BYTE);
+#endif /* _USE_WRITE == 1 */
+#if _USE_IOCTL == 1
+ DRESULT SRAMDISK_ioctl (BYTE, void*);
+#endif /* _USE_IOCTL == 1 */
+
+Diskio_drvTypeDef SRAMDISK_Driver =
+{
+ SRAMDISK_initialize,
+ SRAMDISK_status,
+ SRAMDISK_read,
+#if _USE_WRITE == 1
+ SRAMDISK_write,
+#endif /* _USE_WRITE == 1 */
+#if _USE_IOCTL == 1
+ SRAMDISK_ioctl,
+#endif /* _USE_IOCTL == 1 */
+};
+
+/* Private functions ---------------------------------------------------------*/
+
+/**
+ * @brief Initializes a Drive
+ * @param None
+ * @retval DSTATUS: Operation status
+ */
+DSTATUS SRAMDISK_initialize(void)
+{
+ Stat = STA_NOINIT;
+
+ /* Configure the SRAM device */
+ BSP_SRAM_Init();
+
+ Stat &= ~STA_NOINIT;
+ return Stat;
+}
+
+/**
+ * @brief Gets Disk Status
+ * @param None
+ * @retval DSTATUS: Operation status
+ */
+DSTATUS SRAMDISK_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 SRAMDISK_read(BYTE *buff, DWORD sector, BYTE count)
+{
+ uint32_t BufferSize = (BLOCK_SIZE * count);
+ uint8_t *pSramAddress = (uint8_t *) (SRAM_DEVICE_ADDR + (sector * BLOCK_SIZE));
+
+ for(; BufferSize != 0; BufferSize--)
+ {
+ *buff++ = *(__IO uint8_t *)pSramAddress++;
+ }
+
+ 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 SRAMDISK_write(const BYTE *buff, DWORD sector, BYTE count)
+{
+ uint32_t BufferSize = (BLOCK_SIZE * count) + count;
+ uint8_t *pSramAddress = (uint8_t *) (SRAM_DEVICE_ADDR + (sector * BLOCK_SIZE));
+
+ for(; BufferSize != 0; BufferSize--)
+ {
+ *(__IO uint8_t *)pSramAddress++ = *buff++;
+ }
+
+ 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 SRAMDISK_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 = SRAM_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****/
+
diff --git a/stmhal/fatfs/src/drivers/sram_diskio.h b/stmhal/fatfs/src/drivers/sram_diskio.h
new file mode 100644
index 000000000..a31f37c59
--- /dev/null
+++ b/stmhal/fatfs/src/drivers/sram_diskio.h
@@ -0,0 +1,41 @@
+/**
+ ******************************************************************************
+ * @file sram_diskio.h
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 18-February-2014
+ * @brief Header for sram_diskio.c module
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; 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.
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __SRAM_DISKIO_H
+#define __SRAM_DISKIO_H
+
+/* Includes ------------------------------------------------------------------*/
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+extern Diskio_drvTypeDef SRAMDISK_Driver;
+
+#endif /* __SRAM_DISKIO_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/stmhal/fatfs/src/drivers/usbh_diskio.c b/stmhal/fatfs/src/drivers/usbh_diskio.c
new file mode 100644
index 000000000..aef8c2a8d
--- /dev/null
+++ b/stmhal/fatfs/src/drivers/usbh_diskio.c
@@ -0,0 +1,289 @@
+/**
+ ******************************************************************************
+ * @file usbh_diskio.c
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 18-February-2014
+ * @brief USB Key Disk I/O driver.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; 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 ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+extern USBH_HandleTypeDef HOST_HANDLE;
+
+/* Private function prototypes -----------------------------------------------*/
+DSTATUS USBH_initialize (void);
+DSTATUS USBH_status (void);
+DRESULT USBH_read (BYTE*, DWORD, BYTE);
+
+#if _USE_WRITE == 1
+ DRESULT USBH_write (const BYTE*, DWORD, BYTE);
+#endif /* _USE_WRITE == 1 */
+
+#if _USE_IOCTL == 1
+ DRESULT USBH_ioctl (BYTE, void*);
+#endif /* _USE_IOCTL == 1 */
+
+Diskio_drvTypeDef USBH_Driver =
+{
+ USBH_initialize,
+ USBH_status,
+ USBH_read,
+#if _USE_WRITE == 1
+ USBH_write,
+#endif /* _USE_WRITE == 1 */
+#if _USE_IOCTL == 1
+ USBH_ioctl,
+#endif /* _USE_IOCTL == 1 */
+};
+
+/* Private functions ---------------------------------------------------------*/
+
+/**
+ * @brief Initializes a Drive
+ * @param None
+ * @retval DSTATUS: Operation status
+ */
+DSTATUS USBH_initialize(void)
+{
+ return RES_OK;
+}
+
+/**
+ * @brief Gets Disk Status
+ * @param None
+ * @retval DSTATUS: Operation status
+ */
+DSTATUS USBH_status(void)
+{
+ DRESULT res = RES_ERROR;
+
+ if(USBH_MSC_UnitIsReady(&HOST_HANDLE, 0))
+ {
+ res = RES_OK;
+ }
+ else
+ {
+ res = RES_ERROR;
+ }
+
+ return res;
+}
+
+/**
+ * @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 USBH_read(BYTE *buff, DWORD sector, BYTE count)
+{
+ DRESULT res = RES_ERROR;
+ MSC_LUNTypeDef info;
+ USBH_StatusTypeDef status = USBH_OK;
+ DWORD scratch [_MAX_SS / 4];
+
+ if ((DWORD)buff & 3) /* DMA Alignment issue, do single up to aligned buffer */
+ {
+ while ((count--)&&(status == USBH_OK))
+ {
+ status = USBH_MSC_Read(&HOST_HANDLE, 0, sector + count, (uint8_t *)scratch, 1);
+ if(status == USBH_OK)
+ {
+ memcpy (&buff[count * _MAX_SS] ,scratch, _MAX_SS);
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+ else
+ {
+ status = USBH_MSC_Read(&HOST_HANDLE, 0, sector, buff, count);
+ }
+
+ if(status == USBH_OK)
+ {
+ res = RES_OK;
+ }
+ else
+ {
+ USBH_MSC_GetLUNInfo(&HOST_HANDLE, 0, &info);
+
+ switch (info.sense.asc)
+ {
+ case SCSI_ASC_LOGICAL_UNIT_NOT_READY:
+ case SCSI_ASC_MEDIUM_NOT_PRESENT:
+ case SCSI_ASC_NOT_READY_TO_READY_CHANGE:
+ USBH_ErrLog ("USB Disk is not ready!");
+ res = RES_NOTRDY;
+ break;
+
+ default:
+ res = RES_ERROR;
+ break;
+ }
+ }
+
+ return res;
+}
+
+/**
+ * @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 USBH_write(const BYTE *buff, DWORD sector, BYTE count)
+{
+ DRESULT res = RES_ERROR;
+ MSC_LUNTypeDef info;
+ USBH_StatusTypeDef status = USBH_OK;
+ DWORD scratch [_MAX_SS / 4];
+
+ if ((DWORD)buff & 3) /* DMA Alignment issue, do single up to aligned buffer */
+ {
+ while (count--)
+ {
+ memcpy (scratch, &buff[count * _MAX_SS], _MAX_SS);
+
+ status = USBH_MSC_Write(&HOST_HANDLE, 0, sector + count, (BYTE *)scratch, 1) ;
+ if(status == USBH_FAIL)
+ {
+ break;
+ }
+ }
+ }
+ else
+ {
+ status = USBH_MSC_Write(&HOST_HANDLE, 0, sector, (BYTE *)buff, count);
+ }
+
+ if(status == USBH_OK)
+ {
+ res = RES_OK;
+ }
+ else
+ {
+ USBH_MSC_GetLUNInfo(&HOST_HANDLE, 0, &info);
+
+ switch (info.sense.asc)
+ {
+ case SCSI_ASC_WRITE_PROTECTED:
+ USBH_ErrLog("USB Disk is Write protected!");
+ res = RES_WRPRT;
+ break;
+
+ case SCSI_ASC_LOGICAL_UNIT_NOT_READY:
+ case SCSI_ASC_MEDIUM_NOT_PRESENT:
+ case SCSI_ASC_NOT_READY_TO_READY_CHANGE:
+ USBH_ErrLog("USB Disk is not ready!");
+ res = RES_NOTRDY;
+ break;
+
+ default:
+ res = RES_ERROR;
+ break;
+ }
+ }
+
+ return res;
+}
+#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 USBH_ioctl(BYTE cmd, void *buff)
+{
+ DRESULT res = RES_ERROR;
+ MSC_LUNTypeDef info;
+
+ 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 :
+ if(USBH_MSC_GetLUNInfo(&HOST_HANDLE, 0, &info) == USBH_OK)
+ {
+ *(DWORD*)buff = info.capacity.block_nbr;
+ res = RES_OK;
+ }
+ else
+ {
+ res = RES_ERROR;
+ }
+ break;
+
+ /* Get R/W sector size (WORD) */
+ case GET_SECTOR_SIZE :
+ if(USBH_MSC_GetLUNInfo(&HOST_HANDLE, 0, &info) == USBH_OK)
+ {
+ *(DWORD*)buff = info.capacity.block_size;
+ res = RES_OK;
+ }
+ else
+ {
+ res = RES_ERROR;
+ }
+ break;
+
+ /* Get erase block size in unit of sector (DWORD) */
+ case GET_BLOCK_SIZE :
+
+ if(USBH_MSC_GetLUNInfo(&HOST_HANDLE, 0, &info) == USBH_OK)
+ {
+ *(DWORD*)buff = info.capacity.block_size;
+ res = RES_OK;
+ }
+ else
+ {
+ res = RES_ERROR;
+ }
+ break;
+
+ default:
+ res = RES_PARERR;
+ }
+
+ return res;
+}
+#endif /* _USE_IOCTL == 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/stmhal/fatfs/src/drivers/usbh_diskio.h b/stmhal/fatfs/src/drivers/usbh_diskio.h
new file mode 100644
index 000000000..e011a9945
--- /dev/null
+++ b/stmhal/fatfs/src/drivers/usbh_diskio.h
@@ -0,0 +1,41 @@
+/**
+ ******************************************************************************
+ * @file usbh_diskio.h
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 18-February-2014
+ * @brief Header for usbh_diskio.c module
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; 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.
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __USBH_DISKIO_H
+#define __USBH_DISKIO_H
+
+/* Includes ------------------------------------------------------------------*/
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+extern Diskio_drvTypeDef USBH_Driver;
+
+#endif /* __USBH_DISKIO_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+