Merge branch 'tmaster' into future
[fw/stlink] / example / stm32f4 / STM32_USB_HOST_Library / Class / MSC / src / usbh_msc_fatfs.c
diff --git a/example/stm32f4/STM32_USB_HOST_Library/Class/MSC/src/usbh_msc_fatfs.c b/example/stm32f4/STM32_USB_HOST_Library/Class/MSC/src/usbh_msc_fatfs.c
new file mode 100644 (file)
index 0000000..57a3c9c
--- /dev/null
@@ -0,0 +1,186 @@
+
+#include "usb_conf.h"
+#include "diskio.h"
+#include "usbh_msc_core.h"
+/*--------------------------------------------------------------------------
+
+Module Private Functions and Variables
+
+---------------------------------------------------------------------------*/
+
+static volatile DSTATUS Stat = STA_NOINIT;     /* Disk status */
+
+extern USB_OTG_CORE_HANDLE          USB_OTG_Core;
+extern USBH_HOST                     USB_Host;
+
+/*-----------------------------------------------------------------------*/
+/* Initialize Disk Drive                                                 */
+/*-----------------------------------------------------------------------*/
+
+DSTATUS disk_initialize (
+                         BYTE drv              /* Physical drive number (0) */
+                           )
+{
+  
+  if(HCD_IsDeviceConnected(&USB_OTG_Core))
+  {  
+    Stat &= ~STA_NOINIT;
+  }
+  
+  return Stat;
+  
+  
+}
+
+
+
+/*-----------------------------------------------------------------------*/
+/* Get Disk Status                                                       */
+/*-----------------------------------------------------------------------*/
+
+DSTATUS disk_status (
+                     BYTE drv          /* Physical drive number (0) */
+                       )
+{
+  if (drv) return STA_NOINIT;          /* Supports only single drive */
+  return Stat;
+}
+
+
+
+/*-----------------------------------------------------------------------*/
+/* Read Sector(s)                                                        */
+/*-----------------------------------------------------------------------*/
+
+DRESULT disk_read (
+                   BYTE drv,                   /* Physical drive number (0) */
+                   BYTE *buff,                 /* Pointer to the data buffer to store read data */
+                   DWORD sector,               /* Start sector number (LBA) */
+                   BYTE count                  /* Sector count (1..255) */
+                     )
+{
+  BYTE status = USBH_MSC_OK;
+  
+  if (drv || !count) return RES_PARERR;
+  if (Stat & STA_NOINIT) return RES_NOTRDY;
+  
+  
+  if(HCD_IsDeviceConnected(&USB_OTG_Core))
+  {  
+    
+    do
+    {
+      status = USBH_MSC_Read10(&USB_OTG_Core, buff,sector,512);
+      USBH_MSC_HandleBOTXfer(&USB_OTG_Core ,&USB_Host);
+      
+      if(!HCD_IsDeviceConnected(&USB_OTG_Core))
+      { 
+        return RES_ERROR;
+      }      
+    }
+    while(status == USBH_MSC_BUSY );
+  }
+  
+  if(status == USBH_MSC_OK)
+    return RES_OK;
+  return RES_ERROR;
+  
+}
+
+
+
+/*-----------------------------------------------------------------------*/
+/* Write Sector(s)                                                       */
+/*-----------------------------------------------------------------------*/
+
+#if _READONLY == 0
+DRESULT disk_write (
+                    BYTE drv,                  /* Physical drive number (0) */
+                    const BYTE *buff,  /* Pointer to the data to be written */
+                    DWORD sector,              /* Start sector number (LBA) */
+                    BYTE count                 /* Sector count (1..255) */
+                      )
+{
+  BYTE status = USBH_MSC_OK;
+  if (drv || !count) return RES_PARERR;
+  if (Stat & STA_NOINIT) return RES_NOTRDY;
+  if (Stat & STA_PROTECT) return RES_WRPRT;
+  
+  
+  if(HCD_IsDeviceConnected(&USB_OTG_Core))
+  {  
+    do
+    {
+      status = USBH_MSC_Write10(&USB_OTG_Core,(BYTE*)buff,sector,512);
+      USBH_MSC_HandleBOTXfer(&USB_OTG_Core, &USB_Host);
+      
+      if(!HCD_IsDeviceConnected(&USB_OTG_Core))
+      { 
+        return RES_ERROR;
+      }
+    }
+    
+    while(status == USBH_MSC_BUSY );
+    
+  }
+  
+  if(status == USBH_MSC_OK)
+    return RES_OK;
+  return RES_ERROR;
+}
+#endif /* _READONLY == 0 */
+
+
+
+/*-----------------------------------------------------------------------*/
+/* Miscellaneous Functions                                               */
+/*-----------------------------------------------------------------------*/
+
+#if _USE_IOCTL != 0
+DRESULT disk_ioctl (
+                    BYTE drv,          /* Physical drive number (0) */
+                    BYTE ctrl,         /* Control code */
+                    void *buff         /* Buffer to send/receive control data */
+                      )
+{
+  DRESULT res = RES_OK;
+  
+  if (drv) return RES_PARERR;
+  
+  res = RES_ERROR;
+  
+  if (Stat & STA_NOINIT) return RES_NOTRDY;
+  
+  switch (ctrl) {
+  case CTRL_SYNC :             /* Make sure that no pending write process */
+    
+    res = RES_OK;
+    break;
+    
+  case GET_SECTOR_COUNT :      /* Get number of sectors on the disk (DWORD) */
+    
+    *(DWORD*)buff = (DWORD) USBH_MSC_Param.MSCapacity;
+    res = RES_OK;
+    break;
+    
+  case GET_SECTOR_SIZE :       /* Get R/W sector size (WORD) */
+    *(WORD*)buff = 512;
+    res = RES_OK;
+    break;
+    
+  case GET_BLOCK_SIZE :        /* Get erase block size in unit of sector (DWORD) */
+    
+    *(DWORD*)buff = 512;
+    
+    break;
+    
+    
+  default:
+    res = RES_PARERR;
+  }
+  
+  
+  
+  return res;
+}
+#endif /* _USE_IOCTL != 0 */