-// 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
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
\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
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 =
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;
}
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)