]> localhost Git - SCSI2SD-V6.git/commitdiff
Improve SD hotswap detection
authorMichael McMaster <michael@codesrc.com>
Sun, 6 Feb 2022 04:36:24 +0000 (14:36 +1000)
committerMichael McMaster <michael@codesrc.com>
Sun, 6 Feb 2022 04:36:24 +0000 (14:36 +1000)
src/firmware/disk.c
src/firmware/main.c
src/firmware/sd.c
src/firmware/usb_device/usbd_composite.c

index 6069eeb11d2fc5b92465f7ee2afcb4377ac86d8f..a9d9169391a316f0e42f7f518b6e857d4ced912b 100755 (executable)
@@ -301,7 +301,7 @@ static void doSeek(uint32_t lba)
         }\r
         else\r
         {\r
-            s2s_delay_ms(1);\r
+            s2s_delay_us(10);\r
         }\r
     }\r
 }\r
index f79ebd6eaee9dc1d1a3cf671955d73960ed1df49..4873334bc870757183075b449d3e2c54b75333d8 100755 (executable)
@@ -154,10 +154,9 @@ void mainLoop()
     sdPoll();\r
 #endif\r
 \r
-    // TODO test if USB transfer is in progress\r
     if (unlikely(scsiDev.phase == BUS_FREE) && !usbBusy)\r
     {\r
-        if (unlikely(s2s_elapsedTime_ms(lastSDPoll) > 200))\r
+        if (unlikely(s2s_elapsedTime_ms(lastSDPoll) > 377))\r
         {\r
             lastSDPoll = s2s_getTime_ms();\r
             if (sdInit())\r
@@ -181,7 +180,7 @@ void mainLoop()
                 }\r
             }\r
         }\r
-        else if (lastSDKeepAlive > 10000) // 10 seconds\r
+        else if (s2s_elapsedTime_ms(lastSDKeepAlive) > 10000) // 10 seconds\r
         {\r
             // 2021 boards fail if there's no commands sent in a while\r
             sdKeepAlive();\r
index 7985b3efff150dd8f22bdfbf5c3da48b83eb4578..d717fb254a3eee004a30fb356f751b23f7228713 100755 (executable)
@@ -1,19 +1,19 @@
-//     Copyright (C) 2013 Michael McMaster <michael@codesrc.com>\r
+//    Copyright (C) 2013 Michael McMaster <michael@codesrc.com>\r
 //\r
-//     This file is part of SCSI2SD.\r
+//    This file is part of SCSI2SD.\r
 //\r
-//     SCSI2SD is free software: you can redistribute it and/or modify\r
-//     it under the terms of the GNU General Public License as published by\r
-//     the Free Software Foundation, either version 3 of the License, or\r
-//     (at your option) any later version.\r
+//    SCSI2SD is free software: you can redistribute it and/or modify\r
+//    it under the terms of the GNU General Public License as published by\r
+//    the Free Software Foundation, either version 3 of the License, or\r
+//    (at your option) any later version.\r
 //\r
-//     SCSI2SD is distributed in the hope that it will be useful,\r
-//     but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
-//     GNU General Public License for more details.\r
+//    SCSI2SD is distributed in the hope that it will be useful,\r
+//    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+//    GNU General Public License for more details.\r
 //\r
-//     You should have received a copy of the GNU General Public License\r
-//     along with SCSI2SD.  If not, see <http://www.gnu.org/licenses/>.\r
+//    You should have received a copy of the GNU General Public License\r
+//    along with SCSI2SD.  If not, see <http://www.gnu.org/licenses/>.\r
 \r
 #ifdef STM32F2xx\r
 #include "stm32f2xx.h"\r
@@ -46,243 +46,252 @@ static int sdCmdActive = 0;
 int\r
 sdReadDMAPoll(uint32_t remainingSectors)\r
 {\r
-       // TODO DMA byte counting disabled for now as it's not\r
-       // working.\r
-       // We can ask the SDIO controller how many bytes have been\r
-       // processed (SDIO_GetDataCounter()) but I'm not sure if that\r
-       // means the data has been transfered via dma to memory yet.\r
-//     uint32_t dmaBytesRemaining = __HAL_DMA_GET_COUNTER(hsd.hdmarx) * 4;\r
-\r
-       if (HAL_SD_GetState(&hsd) != HAL_SD_STATE_BUSY)\r
-       {\r
-               // DMA transfer is complete\r
-               sdCmdActive = 0;\r
-               return remainingSectors;\r
-       }\r
-/*     else\r
-       {\r
-               return remainingSectors - ((dmaBytesRemaining + (SD_SECTOR_SIZE - 1)) / SD_SECTOR_SIZE);\r
-       }*/\r
-       return 0;\r
+    // TODO DMA byte counting disabled for now as it's not\r
+    // working.\r
+    // We can ask the SDIO controller how many bytes have been\r
+    // processed (SDIO_GetDataCounter()) but I'm not sure if that\r
+    // means the data has been transfered via dma to memory yet.\r
+//    uint32_t dmaBytesRemaining = __HAL_DMA_GET_COUNTER(hsd.hdmarx) * 4;\r
+\r
+    if (HAL_SD_GetState(&hsd) != HAL_SD_STATE_BUSY)\r
+    {\r
+        // DMA transfer is complete\r
+        sdCmdActive = 0;\r
+        return remainingSectors;\r
+    }\r
+/*    else\r
+    {\r
+        return remainingSectors - ((dmaBytesRemaining + (SD_SECTOR_SIZE - 1)) / SD_SECTOR_SIZE);\r
+    }*/\r
+    return 0;\r
 }\r
 \r
 void sdReadDMA(uint32_t lba, uint32_t sectors, uint8_t* outputBuffer)\r
 {\r
-       if (HAL_SD_ReadBlocks_DMA(&hsd, outputBuffer, lba, sectors) != HAL_OK)\r
-       {\r
-               scsiDiskReset();\r
-\r
-               scsiDev.status = CHECK_CONDITION;\r
-               scsiDev.target->sense.code = HARDWARE_ERROR;\r
-               scsiDev.target->sense.asc = LOGICAL_UNIT_COMMUNICATION_FAILURE;\r
-               scsiDev.phase = STATUS;\r
-       }\r
-       else\r
-       {\r
-               sdCmdActive = 1;\r
-       }\r
+    if (HAL_SD_ReadBlocks_DMA(&hsd, outputBuffer, lba, sectors) != HAL_OK)\r
+    {\r
+        scsiDiskReset();\r
+\r
+        scsiDev.status = CHECK_CONDITION;\r
+        scsiDev.target->sense.code = HARDWARE_ERROR;\r
+        scsiDev.target->sense.asc = LOGICAL_UNIT_COMMUNICATION_FAILURE;\r
+        scsiDev.phase = STATUS;\r
+    }\r
+    else\r
+    {\r
+        sdCmdActive = 1;\r
+    }\r
 }\r
 \r
 void sdReadCmd(uint32_t lba, uint32_t sectors)\r
 {\r
-       uint32_t errorstate;\r
-       hsd.ErrorCode = HAL_SD_ERROR_NONE;\r
-       hsd.State = HAL_SD_STATE_BUSY;\r
+    uint32_t errorstate;\r
+    hsd.ErrorCode = HAL_SD_ERROR_NONE;\r
+    hsd.State = HAL_SD_STATE_BUSY;\r
 \r
-       /* Initialize data control register */\r
-       hsd.Instance->DCTRL = 0U;\r
+    /* Initialize data control register */\r
+    hsd.Instance->DCTRL = 0U;\r
 \r
-       // The IRQ handler clears flags which we need to read the fifo data\r
+    // The IRQ handler clears flags which we need to read the fifo data\r
 #if defined(SDIO_STA_STBITERR)\r
     __HAL_SD_DISABLE_IT(&hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND | SDIO_FLAG_RXFIFOHF | SDIO_IT_STBITERR));\r
 #else\r
     __HAL_SD_DISABLE_IT(&hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND | SDIO_FLAG_RXFIFOHF));\r
 #endif\r
 \r
-       if(hsd.SdCard.CardType != CARD_SDHC_SDXC)\r
-       {\r
-               lba *= 512U;\r
-\r
-               errorstate = SDMMC_CmdBlockLength(hsd.Instance, 512u);\r
-               if(errorstate != HAL_SD_ERROR_NONE)\r
-               {\r
-                       __HAL_SD_CLEAR_FLAG(&hsd, SDIO_STATIC_FLAGS);\r
-                       scsiDiskReset();\r
-\r
-                       scsiDev.status = CHECK_CONDITION;\r
-                       scsiDev.target->sense.code = HARDWARE_ERROR;\r
-                       scsiDev.target->sense.asc = LOGICAL_UNIT_COMMUNICATION_FAILURE;\r
-                       scsiDev.phase = STATUS;\r
-                       return;\r
-               }\r
-       }\r
-\r
-       if(sectors > 1U)\r
-       {\r
-               hsd.Context = SD_CONTEXT_READ_MULTIPLE_BLOCK;\r
-               errorstate = SDMMC_CmdReadMultiBlock(hsd.Instance, lba);\r
-       }\r
-       else\r
-       {\r
-               hsd.Context = SD_CONTEXT_READ_SINGLE_BLOCK;\r
-               errorstate = SDMMC_CmdReadSingleBlock(hsd.Instance, lba);\r
-       }\r
-\r
-       if(errorstate != HAL_SD_ERROR_NONE)\r
-       {\r
-               __HAL_SD_CLEAR_FLAG(&hsd, SDIO_STATIC_FLAGS);\r
-\r
-               scsiDiskReset();\r
-\r
-               scsiDev.status = CHECK_CONDITION;\r
-               scsiDev.target->sense.code = HARDWARE_ERROR;\r
-               scsiDev.target->sense.asc = LOGICAL_UNIT_COMMUNICATION_FAILURE;\r
-               scsiDev.phase = STATUS;\r
-       }\r
-       else\r
-       {\r
-               sdCmdActive = 1;\r
-       }\r
+    if(hsd.SdCard.CardType != CARD_SDHC_SDXC)\r
+    {\r
+        lba *= 512U;\r
+\r
+        errorstate = SDMMC_CmdBlockLength(hsd.Instance, 512u);\r
+        if(errorstate != HAL_SD_ERROR_NONE)\r
+        {\r
+            __HAL_SD_CLEAR_FLAG(&hsd, SDIO_STATIC_FLAGS);\r
+            scsiDiskReset();\r
+\r
+            scsiDev.status = CHECK_CONDITION;\r
+            scsiDev.target->sense.code = HARDWARE_ERROR;\r
+            scsiDev.target->sense.asc = LOGICAL_UNIT_COMMUNICATION_FAILURE;\r
+            scsiDev.phase = STATUS;\r
+            return;\r
+        }\r
+    }\r
+\r
+    if(sectors > 1U)\r
+    {\r
+        hsd.Context = SD_CONTEXT_READ_MULTIPLE_BLOCK;\r
+        errorstate = SDMMC_CmdReadMultiBlock(hsd.Instance, lba);\r
+    }\r
+    else\r
+    {\r
+        hsd.Context = SD_CONTEXT_READ_SINGLE_BLOCK;\r
+        errorstate = SDMMC_CmdReadSingleBlock(hsd.Instance, lba);\r
+    }\r
+\r
+    if(errorstate != HAL_SD_ERROR_NONE)\r
+    {\r
+        __HAL_SD_CLEAR_FLAG(&hsd, SDIO_STATIC_FLAGS);\r
+\r
+        scsiDiskReset();\r
+\r
+        scsiDev.status = CHECK_CONDITION;\r
+        scsiDev.target->sense.code = HARDWARE_ERROR;\r
+        scsiDev.target->sense.asc = LOGICAL_UNIT_COMMUNICATION_FAILURE;\r
+        scsiDev.phase = STATUS;\r
+    }\r
+    else\r
+    {\r
+        sdCmdActive = 1;\r
+    }\r
 }\r
 \r
 void sdReadPIOData(uint32_t sectors)\r
 {\r
-       /* Initialize data control register */\r
-       hsd.Instance->DCTRL = 0U;\r
-\r
-       SDIO_DataInitTypeDef config;\r
-       config.DataTimeOut   = SDMMC_DATATIMEOUT;\r
-       config.DataLength    = sectors * 512u;\r
-       config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;\r
-       config.TransferDir   = SDIO_TRANSFER_DIR_TO_SDIO;\r
-       config.TransferMode  = SDIO_TRANSFER_MODE_BLOCK;\r
-       config.DPSM          = SDIO_DPSM_ENABLE;\r
-       SDIO_ConfigData(hsd.Instance, &config);\r
+    /* Initialize data control register */\r
+    hsd.Instance->DCTRL = 0U;\r
+\r
+    SDIO_DataInitTypeDef config;\r
+    config.DataTimeOut   = SDMMC_DATATIMEOUT;\r
+    config.DataLength    = sectors * 512u;\r
+    config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;\r
+    config.TransferDir   = SDIO_TRANSFER_DIR_TO_SDIO;\r
+    config.TransferMode  = SDIO_TRANSFER_MODE_BLOCK;\r
+    config.DPSM          = SDIO_DPSM_ENABLE;\r
+    SDIO_ConfigData(hsd.Instance, &config);\r
 }\r
 \r
 \r
 void sdCompleteTransfer()\r
 {\r
-       if (sdCmdActive)\r
-       {\r
-               HAL_SD_Abort(&hsd);\r
-               sdCmdActive = 0;\r
-       }\r
+    if (sdCmdActive)\r
+    {\r
+        HAL_SD_Abort(&hsd);\r
+        sdCmdActive = 0;\r
+    }\r
 }\r
 \r
 static void sdClear()\r
 {\r
-       sdDev.version = 0;\r
-       sdDev.capacity = 0;\r
-       memset(sdDev.csd, 0, sizeof(sdDev.csd));\r
-       memset(sdDev.cid, 0, sizeof(sdDev.cid));\r
+    sdDev.version = 0;\r
+    sdDev.capacity = 0;\r
+    memset(sdDev.csd, 0, sizeof(sdDev.csd));\r
+    memset(sdDev.cid, 0, sizeof(sdDev.cid));\r
 }\r
 \r
 static int sdDoInit()\r
 {\r
-       int result = 0;\r
+    int result = 0;\r
 \r
-       sdClear();\r
+    sdClear();\r
 \r
-       int8_t error = BSP_SD_Init();\r
-       if (error == MSD_OK)\r
-       {\r
-               HAL_SD_CardInfoTypeDef cardInfo;\r
-               HAL_SD_GetCardInfo(&hsd, &cardInfo);\r
-               memcpy(sdDev.csd, hsd.CSD, sizeof(sdDev.csd));\r
-               memcpy(sdDev.cid, hsd.CID, sizeof(sdDev.cid));\r
-               sdDev.capacity = cardInfo.LogBlockNbr;\r
-               blockDev.state |= DISK_PRESENT | DISK_INITIALISED;\r
-               result = 1;\r
+    int8_t error = BSP_SD_Init();\r
+    if (error == MSD_OK)\r
+    {\r
+        HAL_SD_CardInfoTypeDef cardInfo;\r
+        HAL_SD_GetCardInfo(&hsd, &cardInfo);\r
+        memcpy(sdDev.csd, hsd.CSD, sizeof(sdDev.csd));\r
+        memcpy(sdDev.cid, hsd.CID, sizeof(sdDev.cid));\r
+        sdDev.capacity = cardInfo.LogBlockNbr;\r
+        blockDev.state |= DISK_PRESENT | DISK_INITIALISED;\r
+        result = 1;\r
 \r
-               goto out;\r
-       }\r
+        goto out;\r
+    }\r
 \r
 //bad:\r
-       blockDev.state &= ~(DISK_PRESENT | DISK_INITIALISED);\r
+    blockDev.state &= ~(DISK_PRESENT | DISK_INITIALISED);\r
 \r
-       sdDev.capacity = 0;\r
+    sdDev.capacity = 0;\r
 \r
 out:\r
-       s2s_ledOff();\r
-       return result;\r
+    s2s_ledOff();\r
+    return result;\r
 }\r
 \r
 int sdInit()\r
 {\r
-       // Check if there's an SD card present.\r
-       int result = 0;\r
-\r
-       static int firstInit = 1;\r
-\r
-       if (firstInit)\r
-       {\r
-               blockDev.state &= ~(DISK_PRESENT | DISK_INITIALISED);\r
-               sdClear();\r
-       }\r
-\r
-       if (firstInit || (scsiDev.phase == BUS_FREE))\r
-       {\r
-               uint8_t cs = HAL_GPIO_ReadPin(nSD_CD_GPIO_Port, nSD_CD_Pin) ? 0 : 1;\r
-               uint8_t wp = HAL_GPIO_ReadPin(nSD_WP_GPIO_Port, nSD_WP_Pin) ? 0 : 1;\r
-\r
-               if (cs && !(blockDev.state & DISK_PRESENT))\r
-               {\r
-                       s2s_ledOn();\r
-\r
-                       // Debounce\r
-                       if (!firstInit)\r
-                       {\r
-                               s2s_delay_ms(250);\r
-                       }\r
-\r
-                       if (sdDoInit())\r
-                       {\r
-                               blockDev.state |= DISK_PRESENT | DISK_INITIALISED;\r
-\r
-                               if (wp)\r
-                               {\r
-                                       blockDev.state |= DISK_WP;\r
-                               }\r
-                               else\r
-                               {\r
-                                       blockDev.state &= ~DISK_WP;\r
-                               }\r
-\r
-                               result = 1;\r
-\r
-                               s2s_ledOff();\r
-                       }\r
-                       else\r
-                       {\r
-                               for (int i = 0; i < 10; ++i)\r
-                               {\r
-                                       // visual indicator of SD error\r
-                                       s2s_ledOff();\r
-                                       s2s_delay_ms(50);\r
-                                       s2s_ledOn();\r
-                                       s2s_delay_ms(50);\r
-                               }\r
-                               s2s_ledOff();\r
-                       }\r
-               }\r
-               else if (!cs && (blockDev.state & DISK_PRESENT))\r
-               {\r
-                       sdDev.capacity = 0;\r
-                       blockDev.state &= ~DISK_PRESENT;\r
-                       blockDev.state &= ~DISK_INITIALISED;\r
-                       int i;\r
-                       for (i = 0; i < S2S_MAX_TARGETS; ++i)\r
-                       {\r
-                               scsiDev.targets[i].unitAttention = PARAMETERS_CHANGED;\r
-                       }\r
-\r
-                       HAL_SD_DeInit(&hsd);\r
-               }\r
-       }\r
-       firstInit = 0;\r
-\r
-       return result;\r
+    // Check if there's an SD card present.\r
+    int result = 0;\r
+\r
+    static int firstInit = 1;\r
+\r
+    if (firstInit)\r
+    {\r
+        blockDev.state &= ~(DISK_PRESENT | DISK_INITIALISED);\r
+        sdClear();\r
+    }\r
+\r
+    if (firstInit || (scsiDev.phase == BUS_FREE))\r
+    {\r
+        uint8_t cs = HAL_GPIO_ReadPin(nSD_CD_GPIO_Port, nSD_CD_Pin) ? 0 : 1;\r
+\r
+        if (cs && !(blockDev.state & DISK_PRESENT))\r
+        {\r
+            s2s_ledOn();\r
+\r
+            // Debounce. Quicker if the card is present at\r
+            // power on\r
+            if (!firstInit)\r
+            {\r
+                for (int i = 0; cs && i < 50; ++i)\r
+                {\r
+                    cs = HAL_GPIO_ReadPin(nSD_CD_GPIO_Port, nSD_CD_Pin) ? 0 : 1;\r
+                    s2s_delay_ms(5);\r
+                }\r
+            }\r
+\r
+            if (cs && sdDoInit())\r
+            {\r
+                blockDev.state |= DISK_PRESENT | DISK_INITIALISED;\r
+\r
+                uint8_t wp = HAL_GPIO_ReadPin(nSD_WP_GPIO_Port, nSD_WP_Pin) ? 0 : 1;\r
+                if (wp)\r
+                {\r
+                    blockDev.state |= DISK_WP;\r
+                }\r
+                else\r
+                {\r
+                    blockDev.state &= ~DISK_WP;\r
+                }\r
+\r
+                result = 1;\r
+\r
+                s2s_ledOff();\r
+            }\r
+            else if (cs)\r
+            {\r
+                for (int i = 0; i < 10; ++i)\r
+                {\r
+                    // visual indicator of SD error\r
+                    s2s_ledOff();\r
+                    s2s_delay_ms(50);\r
+                    s2s_ledOn();\r
+                    s2s_delay_ms(50);\r
+                }\r
+                s2s_ledOff();\r
+            }\r
+            else\r
+            {\r
+                s2s_ledOff();\r
+            }\r
+        }\r
+        else if (!cs && (blockDev.state & DISK_PRESENT))\r
+        {\r
+            sdDev.capacity = 0;\r
+            blockDev.state &= ~DISK_PRESENT;\r
+            blockDev.state &= ~DISK_INITIALISED;\r
+            int i;\r
+            for (i = 0; i < S2S_MAX_TARGETS; ++i)\r
+            {\r
+                scsiDev.targets[i].unitAttention = PARAMETERS_CHANGED;\r
+            }\r
+\r
+            HAL_SD_DeInit(&hsd);\r
+        }\r
+    }\r
+    firstInit = 0;\r
+\r
+    return result;\r
 }\r
 \r
 // Return 1 if the SD card has no buffer space left for writes and/or is\r
@@ -295,5 +304,8 @@ int sdIsBusy()
 \r
 void sdKeepAlive()\r
 {\r
-    /*HAL_SD_CardStateTypeDef cardState = */HAL_SD_GetCardState(&hsd);\r
+    if (blockDev.state & DISK_PRESENT)\r
+    {\r
+        /*HAL_SD_CardStateTypeDef cardState = */HAL_SD_GetCardState(&hsd);\r
+    }\r
 }\r
index a545b8ba96a05361e3bf00c59f3fcc628cbfef11..8d724d96347b86a454e6b8cecdd204f801cf68b0 100755 (executable)
@@ -55,20 +55,20 @@ static uint8_t  USBD_Composite_DataOut (USBD_HandleTypeDef *pdev, uint8_t epnum)
 
 USBD_ClassTypeDef USBD_Composite =
 {
-       USBD_Composite_Init,
-       USBD_Composite_DeInit,
-       USBD_Composite_Setup,
-       NULL, /*EP0_TxSent*/  
-       NULL, /*EP0_RxReady*/
-       USBD_Composite_DataIn, /*DataIn*/
-       USBD_Composite_DataOut, /*DataOut*/
-       NULL, /*SOF */
-       NULL,
-       NULL,      
-       USBD_Composite_GetHSCfgDesc,
-       USBD_Composite_GetFSCfgDesc,
-       USBD_Composite_GetFSCfgDesc, // "Other" speed
-       USBD_Composite_GetDeviceQualifierDesc,
+    USBD_Composite_Init,
+    USBD_Composite_DeInit,
+    USBD_Composite_Setup,
+    NULL, /*EP0_TxSent*/  
+    NULL, /*EP0_RxReady*/
+    USBD_Composite_DataIn, /*DataIn*/
+    USBD_Composite_DataOut, /*DataOut*/
+    NULL, /*SOF */
+    NULL,
+    NULL,      
+    USBD_Composite_GetHSCfgDesc,
+    USBD_Composite_GetFSCfgDesc,
+    USBD_Composite_GetFSCfgDesc, // "Other" speed
+    USBD_Composite_GetDeviceQualifierDesc,
 };
 
 __ALIGN_BEGIN static uint8_t USBD_Composite_CfgHSDesc[USB_COMPOSITE_CONFIG_DESC_SIZ]  __ALIGN_END =
@@ -267,263 +267,263 @@ __ALIGN_BEGIN static uint8_t USBD_Composite_DeviceQualifierDesc[USB_LEN_DEV_QUAL
 
 static uint8_t  USBD_Composite_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx)
 {
-       uint8_t ret = 0;
+    uint8_t ret = 0;
 
-       // HID Endpoints
-       USBD_LL_OpenEP(pdev, HID_EPIN_ADDR, USBD_EP_TYPE_INTR, HID_EPIN_SIZE);
-       USBD_LL_OpenEP(pdev, HID_EPOUT_ADDR, USBD_EP_TYPE_INTR, HID_EPOUT_SIZE);
+    // HID Endpoints
+    USBD_LL_OpenEP(pdev, HID_EPIN_ADDR, USBD_EP_TYPE_INTR, HID_EPIN_SIZE);
+    USBD_LL_OpenEP(pdev, HID_EPOUT_ADDR, USBD_EP_TYPE_INTR, HID_EPOUT_SIZE);
 
-       USBD_CompositeClassData* classData;
+    USBD_CompositeClassData* classData;
 #ifdef S2S_USB_HS
     if(pdev->dev_speed == USBD_SPEED_HIGH)
-       {
-               classData = &hsClassData;
+    {
+        classData = &hsClassData;
 
-           // MSC Endpoints
-       USBD_LL_OpenEP(pdev, MSC_EPOUT_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET);
-       USBD_LL_OpenEP(pdev, MSC_EPIN_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET);
-       }
+        // MSC Endpoints
+        USBD_LL_OpenEP(pdev, MSC_EPOUT_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET);
+        USBD_LL_OpenEP(pdev, MSC_EPIN_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET);
+    }
 #endif
 #ifdef S2S_USB_FS
     if(pdev->dev_speed != USBD_SPEED_HIGH)
-       {
-               classData = &fsClassData;
+    {
+        classData = &fsClassData;
 
-           // MSC Endpoints
-       USBD_LL_OpenEP(pdev, MSC_EPOUT_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET);
-       USBD_LL_OpenEP(pdev, MSC_EPIN_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET);
-       }
+        // MSC Endpoints
+        USBD_LL_OpenEP(pdev, MSC_EPOUT_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET);
+        USBD_LL_OpenEP(pdev, MSC_EPIN_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET);
+    }
 #endif
 
-       classData->hid.state = HID_IDLE;
-       classData->hid.reportReady = 0;
-       classData->DataInReady = 0;
-       classData->DataOutReady = 0;
-       pdev->pClassData = classData;
+    classData->hid.state = HID_IDLE;
+    classData->hid.reportReady = 0;
+    classData->DataInReady = 0;
+    classData->DataOutReady = 0;
+    pdev->pClassData = classData;
 
-       MSC_BOT_Init(pdev);
+    MSC_BOT_Init(pdev);
 
-       // Prepare Out endpoint to receive next HID packet
-       USBD_LL_PrepareReceive(
-               pdev,
-               HID_EPOUT_ADDR,
-               classData->hid.rxBuffer,
-               sizeof(classData->hid.rxBuffer));
+    // Prepare Out endpoint to receive next HID packet
+    USBD_LL_PrepareReceive(
+        pdev,
+        HID_EPOUT_ADDR,
+        classData->hid.rxBuffer,
+        sizeof(classData->hid.rxBuffer));
 
-       return ret;
+    return ret;
 }
 
 static uint8_t USBD_Composite_DeInit (USBD_HandleTypeDef *pdev, uint8_t cfgidx)
 {
-       USBD_LL_CloseEP(pdev, HID_EPIN_ADDR);
-       USBD_LL_CloseEP(pdev, HID_EPOUT_ADDR);
-       USBD_LL_CloseEP(pdev, MSC_EPOUT_ADDR);
-       USBD_LL_CloseEP(pdev, MSC_EPIN_ADDR);
+    USBD_LL_CloseEP(pdev, HID_EPIN_ADDR);
+    USBD_LL_CloseEP(pdev, HID_EPOUT_ADDR);
+    USBD_LL_CloseEP(pdev, MSC_EPOUT_ADDR);
+    USBD_LL_CloseEP(pdev, MSC_EPIN_ADDR);
 
-       MSC_BOT_DeInit(pdev);
+    MSC_BOT_DeInit(pdev);
 
-       pdev->pClassData = NULL;
-       return USBD_OK;
+    pdev->pClassData = NULL;
+    return USBD_OK;
 }
 
 
 static uint8_t USBD_Composite_Setup(
-       USBD_HandleTypeDef *pdev,
-       USBD_SetupReqTypedef *req)
+    USBD_HandleTypeDef *pdev,
+    USBD_SetupReqTypedef *req)
 {
-       uint16_t len = 0;
-       uint8_t  *pbuf = NULL;
-
-       USBD_CompositeClassData *classData = (USBD_CompositeClassData*) pdev->pClassData;
-       USBD_HID_HandleTypeDef *hhid = &(classData->hid);
-       USBD_MSC_BOT_HandleTypeDef *hmsc = &(classData->msc);
-
-       switch (req->bmRequest & USB_REQ_TYPE_MASK)
-       {
-       case USB_REQ_TYPE_CLASS :
-               switch (req->bRequest)
-               {
-                       case HID_REQ_SET_PROTOCOL:
-                               hhid->Protocol = (uint8_t)(req->wValue);
-                               break;
-                       case HID_REQ_GET_PROTOCOL:
-                               USBD_CtlSendData (pdev, (uint8_t *)&hhid->Protocol, 1);
-                               break;
-                       case HID_REQ_SET_IDLE:
-                               hhid->IdleState = (uint8_t)(req->wValue >> 8);
-                               break;
-                       case HID_REQ_GET_IDLE:
-                               USBD_CtlSendData (pdev, (uint8_t *)&hhid->IdleState, 1);
-                               break;
-
-                       case BOT_GET_MAX_LUN :
-                               if((req->wValue  == 0) &&
-                                       (req->wLength == 1) &&
-                                       ((req->bmRequest & 0x80) == 0x80))
-                               {
-                                       hmsc->max_lun = ((USBD_StorageTypeDef *)pdev->pUserData)->GetMaxLun();
-                                       USBD_CtlSendData (pdev, (uint8_t *)&hmsc->max_lun, 1);
-                               }
-                               else
-                               {
-                                       USBD_CtlError(pdev , req);
-                                       return USBD_FAIL;
-                               }
-                               break;
-
-                       case BOT_RESET :
-                               if((req->wValue  == 0) &&
-                                       (req->wLength == 0) &&
-                                       ((req->bmRequest & 0x80) != 0x80))
-                               {
-                                       MSC_BOT_Reset(pdev);
-                               }
-                               else
-                               {
-                                       USBD_CtlError(pdev , req);
-                                       return USBD_FAIL;
-                               }
-                               break;
-
-
-                       default:
-                               USBD_CtlError (pdev, req);
-                               return USBD_FAIL;
-               } break;
-
-
-       case USB_REQ_TYPE_STANDARD:
-               switch (req->bRequest)
-               {
-                       case USB_REQ_GET_DESCRIPTOR:
-                               if( req->wValue >> 8 == HID_REPORT_DESC)
-                               {
-                                       len = MIN(HID_GENERIC_REPORT_DESC_SIZE , req->wLength);
-                                       pbuf = (uint8_t*) USBD_HID_GetReportDesc();
-                               }
-                               else if( req->wValue >> 8 == HID_DESCRIPTOR_TYPE)
-                               {
-                                       pbuf = (uint8_t*) USBD_HID_GetDesc();
-                                       len = MIN(USB_HID_DESC_SIZ , req->wLength);
-                               }
-                               USBD_CtlSendData (pdev, pbuf, len);
-                               break;
-
-                       case USB_REQ_GET_INTERFACE :
-                               if (req->wIndex == 0)
-                               {
-                                       USBD_CtlSendData (pdev, (uint8_t *)&hhid->AltSetting, 1);
-                               }
-                               else
-                               {
-                                       USBD_CtlSendData (pdev, (uint8_t *)&hmsc->interface, 1);
-                               }
-                               break;
-                       case USB_REQ_SET_INTERFACE :
-                               if (req->wIndex == 0)
-                               {
-                                       hhid->AltSetting = (uint8_t)(req->wValue);
-                               }
-                               else
-                               {
-                                       hmsc->interface = (uint8_t)(req->wValue);
-                               }
-                               break;
-
-                       case USB_REQ_CLEAR_FEATURE:
-                               /* Flush the FIFO and Clear the stall status */
-                               USBD_LL_FlushEP(pdev, (uint8_t)req->wIndex);
-
-                               /* Reactivate the EP */
-                               USBD_LL_CloseEP (pdev , (uint8_t)req->wIndex);
-                               switch ((uint8_t)req->wIndex)
-                               {
-                               case MSC_EPIN_ADDR:
-                                       USBD_LL_OpenEP(
+    uint16_t len = 0;
+    uint8_t  *pbuf = NULL;
+
+    USBD_CompositeClassData *classData = (USBD_CompositeClassData*) pdev->pClassData;
+    USBD_HID_HandleTypeDef *hhid = &(classData->hid);
+    USBD_MSC_BOT_HandleTypeDef *hmsc = &(classData->msc);
+
+    switch (req->bmRequest & USB_REQ_TYPE_MASK)
+    {
+    case USB_REQ_TYPE_CLASS :
+        switch (req->bRequest)
+        {
+            case HID_REQ_SET_PROTOCOL:
+                hhid->Protocol = (uint8_t)(req->wValue);
+                break;
+            case HID_REQ_GET_PROTOCOL:
+                USBD_CtlSendData (pdev, (uint8_t *)&hhid->Protocol, 1);
+                break;
+            case HID_REQ_SET_IDLE:
+                hhid->IdleState = (uint8_t)(req->wValue >> 8);
+                break;
+            case HID_REQ_GET_IDLE:
+                USBD_CtlSendData (pdev, (uint8_t *)&hhid->IdleState, 1);
+                break;
+
+            case BOT_GET_MAX_LUN :
+                if((req->wValue  == 0) &&
+                    (req->wLength == 1) &&
+                    ((req->bmRequest & 0x80) == 0x80))
+                {
+                    hmsc->max_lun = ((USBD_StorageTypeDef *)pdev->pUserData)->GetMaxLun();
+                    USBD_CtlSendData (pdev, (uint8_t *)&hmsc->max_lun, 1);
+                }
+                else
+                {
+                    USBD_CtlError(pdev , req);
+                    return USBD_FAIL;
+                }
+                break;
+
+            case BOT_RESET :
+                if((req->wValue  == 0) &&
+                    (req->wLength == 0) &&
+                    ((req->bmRequest & 0x80) != 0x80))
+                {
+                    MSC_BOT_Reset(pdev);
+                }
+                else
+                {
+                    USBD_CtlError(pdev , req);
+                    return USBD_FAIL;
+                }
+                break;
+
+
+            default:
+                USBD_CtlError (pdev, req);
+                return USBD_FAIL;
+        } break;
+
+
+    case USB_REQ_TYPE_STANDARD:
+        switch (req->bRequest)
+        {
+            case USB_REQ_GET_DESCRIPTOR:
+                if( req->wValue >> 8 == HID_REPORT_DESC)
+                {
+                    len = MIN(HID_GENERIC_REPORT_DESC_SIZE , req->wLength);
+                    pbuf = (uint8_t*) USBD_HID_GetReportDesc();
+                }
+                else if( req->wValue >> 8 == HID_DESCRIPTOR_TYPE)
+                {
+                    pbuf = (uint8_t*) USBD_HID_GetDesc();
+                    len = MIN(USB_HID_DESC_SIZ , req->wLength);
+                }
+                USBD_CtlSendData (pdev, pbuf, len);
+                break;
+
+            case USB_REQ_GET_INTERFACE :
+                if (req->wIndex == 0)
+                {
+                    USBD_CtlSendData (pdev, (uint8_t *)&hhid->AltSetting, 1);
+                }
+                else
+                {
+                    USBD_CtlSendData (pdev, (uint8_t *)&hmsc->interface, 1);
+                }
+                break;
+            case USB_REQ_SET_INTERFACE :
+                if (req->wIndex == 0)
+                {
+                    hhid->AltSetting = (uint8_t)(req->wValue);
+                }
+                else
+                {
+                    hmsc->interface = (uint8_t)(req->wValue);
+                }
+                break;
+
+            case USB_REQ_CLEAR_FEATURE:
+                /* Flush the FIFO and Clear the stall status */
+                USBD_LL_FlushEP(pdev, (uint8_t)req->wIndex);
+
+                /* Reactivate the EP */
+                USBD_LL_CloseEP (pdev , (uint8_t)req->wIndex);
+                switch ((uint8_t)req->wIndex)
+                {
+                case MSC_EPIN_ADDR:
+                    USBD_LL_OpenEP(
                         pdev,
                         MSC_EPIN_ADDR,
                         USBD_EP_TYPE_BULK,
                         pdev->dev_speed == USBD_SPEED_HIGH ? MSC_MAX_HS_PACKET : MSC_MAX_FS_PACKET);
-                                       break;
+                    break;
 
-                               case MSC_EPOUT_ADDR:
-                                       USBD_LL_OpenEP(
+                case MSC_EPOUT_ADDR:
+                    USBD_LL_OpenEP(
                         pdev,
                         MSC_EPOUT_ADDR,
                         USBD_EP_TYPE_BULK,
                         pdev->dev_speed == USBD_SPEED_HIGH ? MSC_MAX_HS_PACKET : MSC_MAX_FS_PACKET);
-                                       break;
+                    break;
 
-                               case HID_EPIN_ADDR:
-                                       USBD_LL_OpenEP(pdev, HID_EPIN_ADDR, USBD_EP_TYPE_INTR, HID_EPIN_SIZE);
-                                       break;
+                case HID_EPIN_ADDR:
+                    USBD_LL_OpenEP(pdev, HID_EPIN_ADDR, USBD_EP_TYPE_INTR, HID_EPIN_SIZE);
+                    break;
 
-                               case HID_EPOUT_ADDR:
-                                       USBD_LL_OpenEP(pdev, HID_EPOUT_ADDR, USBD_EP_TYPE_INTR, HID_EPOUT_SIZE);
-                                       break;
-                               }
+                case HID_EPOUT_ADDR:
+                    USBD_LL_OpenEP(pdev, HID_EPOUT_ADDR, USBD_EP_TYPE_INTR, HID_EPOUT_SIZE);
+                    break;
+                }
 
-                               /* Handle BOT error */
-                               MSC_BOT_CplClrFeature(pdev, (uint8_t)req->wIndex);
-                               break;
+                /* Handle BOT error */
+                MSC_BOT_CplClrFeature(pdev, (uint8_t)req->wIndex);
+                break;
 
-               } break;
-       }
+        } break;
+    }
 
-       return USBD_OK;
+    return USBD_OK;
 }
 
 
 static uint8_t USBD_Composite_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum)
 {
-       USBD_CompositeClassData *classData = (USBD_CompositeClassData*) pdev->pClassData;
-       if (epnum == (HID_EPIN_ADDR & 0x7F))
-       {
-               USBD_HID_HandleTypeDef *hhid = &(classData->hid);
-               /* Ensure that the FIFO is empty before a new transfer, this condition could 
-               be caused by  a new transfer before the end of the previous transfer */
-               hhid->state = HID_IDLE;
-       }
-       else if (epnum == (MSC_EPIN_ADDR & 0x7F))
-       {
-               classData->DataInReady = epnum;
-       }
-       return USBD_OK;
+    USBD_CompositeClassData *classData = (USBD_CompositeClassData*) pdev->pClassData;
+    if (epnum == (HID_EPIN_ADDR & 0x7F))
+    {
+        USBD_HID_HandleTypeDef *hhid = &(classData->hid);
+        /* Ensure that the FIFO is empty before a new transfer, this condition could 
+        be caused by  a new transfer before the end of the previous transfer */
+        hhid->state = HID_IDLE;
+    }
+    else if (epnum == (MSC_EPIN_ADDR & 0x7F))
+    {
+        classData->DataInReady = epnum;
+    }
+    return USBD_OK;
 }
 
 static uint8_t USBD_Composite_DataOut(USBD_HandleTypeDef  *pdev, uint8_t epnum)
 {
-       USBD_CompositeClassData *classData = (USBD_CompositeClassData*) pdev->pClassData;
-       if (epnum == (HID_EPOUT_ADDR & 0x7F))
-       {
-               USBD_HID_HandleTypeDef *hhid = &(classData->hid);
-               hhid->reportReady = 1;
-       }
-       else if (epnum == (MSC_EPOUT_ADDR & 0x7F))
-       {
-               classData->DataOutReady = epnum;
-       }
-       return USBD_OK;
+    USBD_CompositeClassData *classData = (USBD_CompositeClassData*) pdev->pClassData;
+    if (epnum == (HID_EPOUT_ADDR & 0x7F))
+    {
+        USBD_HID_HandleTypeDef *hhid = &(classData->hid);
+        hhid->reportReady = 1;
+    }
+    else if (epnum == (MSC_EPOUT_ADDR & 0x7F))
+    {
+        classData->DataOutReady = epnum;
+    }
+    return USBD_OK;
 }
 
 int s2s_usbDevicePoll(USBD_HandleTypeDef  *pdev) {
-       USBD_CompositeClassData *classData = (USBD_CompositeClassData*) pdev->pClassData;
+    USBD_CompositeClassData *classData = (USBD_CompositeClassData*) pdev->pClassData;
 
     int busy = 0;
 
-       if (classData->DataInReady)
-       {
-               classData->DataInReady = 0;
-               MSC_BOT_DataIn(pdev);
+    if (classData->DataInReady)
+    {
+        classData->DataInReady = 0;
+        MSC_BOT_DataIn(pdev);
         busy = busy || 1;
-       }
+    }
 
-       if (classData->DataOutReady)
+    if (classData->DataOutReady)
     {
-               classData->DataOutReady = 0;
-               MSC_BOT_DataOut(pdev);
+        classData->DataOutReady = 0;
+        MSC_BOT_DataOut(pdev);
         busy = busy || 1;
-       }
+    }
 
     return busy;
 }
@@ -531,8 +531,8 @@ int s2s_usbDevicePoll(USBD_HandleTypeDef  *pdev) {
 
 static uint8_t *USBD_Composite_GetDeviceQualifierDesc (uint16_t *length)
 {
-       *length = sizeof (USBD_Composite_DeviceQualifierDesc);
-       return USBD_Composite_DeviceQualifierDesc;
+    *length = sizeof (USBD_Composite_DeviceQualifierDesc);
+    return USBD_Composite_DeviceQualifierDesc;
 }
 
 uint8_t  *USBD_Composite_GetHSCfgDesc (uint16_t *length)