Index: Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc.h IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc.h (date 1511202099000) +++ Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc.h (revision ) @@ -58,9 +58,10 @@ #define BOT_RESET 0xFF #define USB_MSC_CONFIG_DESC_SIZ 32 - +#ifndef MSC_CUSTOM_EPS #define MSC_EPIN_ADDR 0x81 -#define MSC_EPOUT_ADDR 0x01 +#define MSC_EPOUT_ADDR 0x01 +#endif /** * @} @@ -107,7 +108,7 @@ USBD_MSC_BOT_HandleTypeDef; /* Structure for MSC process */ -extern USBD_ClassTypeDef USBD_MSC; +extern USBD_ClassTypeDef USBD_MSC; #define USBD_MSC_CLASS &USBD_MSC uint8_t USBD_MSC_RegisterStorage (USBD_HandleTypeDef *pdev, @@ -118,8 +119,34 @@ /** * @} - */ + */ +// XXX "static" moved here for use in composite driver + +uint8_t USBD_MSC_Init (USBD_HandleTypeDef *pdev, + uint8_t cfgidx); + +uint8_t USBD_MSC_DeInit (USBD_HandleTypeDef *pdev, + uint8_t cfgidx); + +uint8_t USBD_MSC_Setup (USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req); + +uint8_t USBD_MSC_DataIn (USBD_HandleTypeDef *pdev, + uint8_t epnum); + + +uint8_t USBD_MSC_DataOut (USBD_HandleTypeDef *pdev, + uint8_t epnum); + +uint8_t *USBD_MSC_GetHSCfgDesc (uint16_t *length); + +uint8_t *USBD_MSC_GetFSCfgDesc (uint16_t *length); + +uint8_t *USBD_MSC_GetOtherSpeedCfgDesc (uint16_t *length); + +uint8_t *USBD_MSC_GetDeviceQualifierDescriptor (uint16_t *length); + #ifdef __cplusplus } #endif Index: Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc/usbd_cdc.h IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc/usbd_cdc.h (date 1511202099000) +++ Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc/usbd_cdc.h (revision ) @@ -48,10 +48,12 @@ /** @defgroup usbd_cdc_Exported_Defines * @{ - */ + */ +#ifndef CDC_CUSTOM_EPS #define CDC_IN_EP 0x81 /* EP1 for data IN */ #define CDC_OUT_EP 0x01 /* EP1 for data OUT */ #define CDC_CMD_EP 0x82 /* EP2 for CDC commands */ +#endif /* CDC Endpoints parameters: you can fine tune these values depending on the needed baudrates and performance. */ #define CDC_DATA_HS_MAX_PACKET_SIZE 512 /* Endpoint IN & OUT Packet size */ @@ -159,9 +161,38 @@ uint8_t USBD_CDC_ReceivePacket (USBD_HandleTypeDef *pdev); uint8_t USBD_CDC_TransmitPacket (USBD_HandleTypeDef *pdev); + +void USBD_CDC_TransmitDone (USBD_HandleTypeDef *pdev); /** * @} */ + +// XXX exported "static" for composite driver +uint8_t USBD_CDC_Init (USBD_HandleTypeDef *pdev, + uint8_t cfgidx); + +uint8_t USBD_CDC_DeInit (USBD_HandleTypeDef *pdev, + uint8_t cfgidx); + +uint8_t USBD_CDC_Setup (USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req); + +uint8_t USBD_CDC_DataIn (USBD_HandleTypeDef *pdev, + uint8_t epnum); + +uint8_t USBD_CDC_DataOut (USBD_HandleTypeDef *pdev, + uint8_t epnum); + +uint8_t USBD_CDC_EP0_RxReady (USBD_HandleTypeDef *pdev); + +uint8_t *USBD_CDC_GetFSCfgDesc (uint16_t *length); + +uint8_t *USBD_CDC_GetHSCfgDesc (uint16_t *length); + +uint8_t *USBD_CDC_GetOtherSpeedCfgDesc (uint16_t *length); + +uint8_t *USBD_CDC_GetDeviceQualifierDescriptor (uint16_t *length); + #ifdef __cplusplus } Index: Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h (date 1511202099000) +++ Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h (revision ) @@ -99,6 +99,7 @@ #define USB_DESC_TYPE_ENDPOINT 5 #define USB_DESC_TYPE_DEVICE_QUALIFIER 6 #define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 7 +#define USB_DESC_TYPE_IFACE_ASSOCIATION 11 #define USB_DESC_TYPE_BOS 0x0F #define USB_CONFIG_REMOTE_WAKEUP 2 @@ -147,7 +148,7 @@ typedef struct usb_setup_req { - + uint8_t bmRequest; uint8_t bRequest; uint16_t wValue; @@ -230,7 +231,7 @@ uint32_t dev_config_status; USBD_SpeedTypeDef dev_speed; USBD_EndpointTypeDef ep_in[15]; - USBD_EndpointTypeDef ep_out[15]; + USBD_EndpointTypeDef ep_out[15]; uint32_t ep0_state; uint32_t ep0_data_len; uint8_t dev_state; @@ -242,10 +243,14 @@ USBD_SetupReqTypedef request; USBD_DescriptorsTypeDef *pDesc; - USBD_ClassTypeDef *pClass; - void *pClassData; - void *pUserData; - void *pData; + USBD_ClassTypeDef *pClass; // the composite class + void *pClassData; + void *pUserData; + void *pClassData2; // used for secondary class + void *pUserData2; // used for secondary class + void *pClassData3; // used for tertiary class + void *pUserData3; // used for tertiary class + void *pData; // this is a pointer to the low level registers struct } USBD_HandleTypeDef; /** @@ -262,8 +267,14 @@ #define LOBYTE(x) ((uint8_t)(x & 0x00FF)) #define HIBYTE(x) ((uint8_t)((x & 0xFF00) >>8)) + +#ifndef MIN #define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +#ifndef MAX #define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif #if defined ( __GNUC__ ) Index: Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c (date 1511202099000) +++ Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c (revision ) @@ -59,6 +59,7 @@ */ /* Includes ------------------------------------------------------------------*/ +#include "usbd_msc.h" // for rejecting bad control messages #include "usbd_cdc.h" #include "usbd_desc.h" #include "usbd_ctlreq.h" @@ -103,34 +104,7 @@ * @{ */ - -static uint8_t USBD_CDC_Init (USBD_HandleTypeDef *pdev, - uint8_t cfgidx); - -static uint8_t USBD_CDC_DeInit (USBD_HandleTypeDef *pdev, - uint8_t cfgidx); - -static uint8_t USBD_CDC_Setup (USBD_HandleTypeDef *pdev, - USBD_SetupReqTypedef *req); - -static uint8_t USBD_CDC_DataIn (USBD_HandleTypeDef *pdev, - uint8_t epnum); - -static uint8_t USBD_CDC_DataOut (USBD_HandleTypeDef *pdev, - uint8_t epnum); - -static uint8_t USBD_CDC_EP0_RxReady (USBD_HandleTypeDef *pdev); - -static uint8_t *USBD_CDC_GetFSCfgDesc (uint16_t *length); - -static uint8_t *USBD_CDC_GetHSCfgDesc (uint16_t *length); - -static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc (uint16_t *length); - -static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc (uint16_t *length); - -uint8_t *USBD_CDC_GetDeviceQualifierDescriptor (uint16_t *length); - +#ifndef CDC_COMPOSITE /* USB Standard Device Descriptor */ __ALIGN_BEGIN static uint8_t USBD_CDC_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = { @@ -156,7 +130,7 @@ /* CDC interface class callbacks structure */ -USBD_ClassTypeDef USBD_CDC = +USBD_ClassTypeDef USBD_CDC = { USBD_CDC_Init, USBD_CDC_DeInit, @@ -172,6 +146,7 @@ USBD_CDC_GetFSCfgDesc, USBD_CDC_GetOtherSpeedCfgDesc, USBD_CDC_GetDeviceQualifierDescriptor, + NULL }; /* USB CDC device Configuration Descriptor */ @@ -456,6 +431,7 @@ 0x00, 0x00 /* bInterval */ }; +#endif /** * @} @@ -463,7 +439,7 @@ /** @defgroup USBD_CDC_Private_Functions * @{ - */ + */ /** * @brief USBD_CDC_Init @@ -472,7 +448,7 @@ * @param cfgidx: Configuration index * @retval status */ -static uint8_t USBD_CDC_Init (USBD_HandleTypeDef *pdev, +uint8_t USBD_CDC_Init (USBD_HandleTypeDef *pdev, uint8_t cfgidx) { uint8_t ret = 0; @@ -514,18 +490,18 @@ CDC_CMD_PACKET_SIZE); - pdev->pClassData = USBD_malloc(sizeof (USBD_CDC_HandleTypeDef)); + pdev->pClassData2 = USBD_malloc(sizeof (USBD_CDC_HandleTypeDef)); - if(pdev->pClassData == NULL) + if(pdev->pClassData2 == NULL) { ret = 1; } else { - hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData; + hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; /* Init physical Interface components */ - ((USBD_CDC_ItfTypeDef *)pdev->pUserData)->Init(); + ((USBD_CDC_ItfTypeDef *)pdev->pUserData2)->Init(); /* Init Xfer states */ hcdc->TxState =0; @@ -560,7 +536,7 @@ * @param cfgidx: Configuration index * @retval status */ -static uint8_t USBD_CDC_DeInit (USBD_HandleTypeDef *pdev, +uint8_t USBD_CDC_DeInit (USBD_HandleTypeDef *pdev, uint8_t cfgidx) { uint8_t ret = 0; @@ -579,11 +555,11 @@ /* DeInit physical Interface components */ - if(pdev->pClassData != NULL) + if(pdev->pClassData2 != NULL) { - ((USBD_CDC_ItfTypeDef *)pdev->pUserData)->DeInit(); - USBD_free(pdev->pClassData); - pdev->pClassData = NULL; + ((USBD_CDC_ItfTypeDef *)pdev->pUserData2)->DeInit(); + USBD_free(pdev->pClassData2); + pdev->pClassData2 = NULL; } return ret; @@ -596,20 +572,23 @@ * @param req: usb requests * @retval status */ -static uint8_t USBD_CDC_Setup (USBD_HandleTypeDef *pdev, +uint8_t USBD_CDC_Setup (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData; + USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; static uint8_t ifalt = 0; switch (req->bmRequest & USB_REQ_TYPE_MASK) { case USB_REQ_TYPE_CLASS : + if (req->bRequest == BOT_GET_MAX_LUN) break; // Not ours! + if (req->bRequest == BOT_RESET) break; // Not ours! + if (req->wLength) { if (req->bmRequest & 0x80) { - ((USBD_CDC_ItfTypeDef *)pdev->pUserData)->Control(req->bRequest, + ((USBD_CDC_ItfTypeDef *)pdev->pUserData2)->Control(req->bRequest, (uint8_t *)hcdc->data, req->wLength); USBD_CtlSendData (pdev, @@ -629,7 +608,7 @@ } else { - ((USBD_CDC_ItfTypeDef *)pdev->pUserData)->Control(req->bRequest, + ((USBD_CDC_ItfTypeDef *)pdev->pUserData2)->Control(req->bRequest, (uint8_t*)req, 0); } @@ -661,14 +640,15 @@ * @param epnum: endpoint number * @retval status */ -static uint8_t USBD_CDC_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum) +uint8_t USBD_CDC_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum) { - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData; + USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; - if(pdev->pClassData != NULL) + if(pdev->pClassData2 != NULL) { hcdc->TxState = 0; + USBD_CDC_TransmitDone(pdev); return USBD_OK; } @@ -685,18 +665,18 @@ * @param epnum: endpoint number * @retval status */ -static uint8_t USBD_CDC_DataOut (USBD_HandleTypeDef *pdev, uint8_t epnum) +uint8_t USBD_CDC_DataOut (USBD_HandleTypeDef *pdev, uint8_t epnum) { - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData; + USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; /* Get the received data length */ hcdc->RxLength = USBD_LL_GetRxDataSize (pdev, epnum); /* USB data will be immediately processed, this allow next USB traffic being NAKed till the end of the application Xfer */ - if(pdev->pClassData != NULL) + if(pdev->pClassData2 != NULL) { - ((USBD_CDC_ItfTypeDef *)pdev->pUserData)->Receive(hcdc->RxBuffer, &hcdc->RxLength); + ((USBD_CDC_ItfTypeDef *)pdev->pUserData2)->Receive(hcdc->RxBuffer, &hcdc->RxLength); return USBD_OK; } @@ -715,13 +695,13 @@ * @param epnum: endpoint number * @retval status */ -static uint8_t USBD_CDC_EP0_RxReady (USBD_HandleTypeDef *pdev) +uint8_t USBD_CDC_EP0_RxReady (USBD_HandleTypeDef *pdev) { - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData; + USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; - if((pdev->pUserData != NULL) && (hcdc->CmdOpCode != 0xFF)) + if((pdev->pUserData2 != NULL) && (hcdc->CmdOpCode != 0xFF)) { - ((USBD_CDC_ItfTypeDef *)pdev->pUserData)->Control(hcdc->CmdOpCode, + ((USBD_CDC_ItfTypeDef *)pdev->pUserData2)->Control(hcdc->CmdOpCode, (uint8_t *)hcdc->data, hcdc->CmdLength); hcdc->CmdOpCode = 0xFF; @@ -730,6 +710,7 @@ return USBD_OK; } +#ifndef CDC_COMPOSITE /** * @brief USBD_CDC_GetFSCfgDesc * Return configuration descriptor @@ -737,7 +718,7 @@ * @param length : pointer data length * @retval pointer to descriptor buffer */ -static uint8_t *USBD_CDC_GetFSCfgDesc (uint16_t *length) +uint8_t *USBD_CDC_GetFSCfgDesc (uint16_t *length) { *length = sizeof (USBD_CDC_CfgFSDesc); return USBD_CDC_CfgFSDesc; @@ -750,7 +731,7 @@ * @param length : pointer data length * @retval pointer to descriptor buffer */ -static uint8_t *USBD_CDC_GetHSCfgDesc (uint16_t *length) +uint8_t *USBD_CDC_GetHSCfgDesc (uint16_t *length) { *length = sizeof (USBD_CDC_CfgHSDesc); return USBD_CDC_CfgHSDesc; @@ -763,7 +744,7 @@ * @param length : pointer data length * @retval pointer to descriptor buffer */ -static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc (uint16_t *length) +uint8_t *USBD_CDC_GetOtherSpeedCfgDesc (uint16_t *length) { *length = sizeof (USBD_CDC_OtherSpeedCfgDesc); return USBD_CDC_OtherSpeedCfgDesc; @@ -780,6 +761,7 @@ *length = sizeof (USBD_CDC_DeviceQualifierDesc); return USBD_CDC_DeviceQualifierDesc; } +#endif /** * @brief USBD_CDC_RegisterInterface @@ -794,7 +776,7 @@ if(fops != NULL) { - pdev->pUserData= fops; + pdev->pUserData2= fops; ret = USBD_OK; } @@ -811,7 +793,7 @@ uint8_t *pbuff, uint16_t length) { - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData; + USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; hcdc->TxBuffer = pbuff; hcdc->TxLength = length; @@ -829,7 +811,7 @@ uint8_t USBD_CDC_SetRxBuffer (USBD_HandleTypeDef *pdev, uint8_t *pbuff) { - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData; + USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; hcdc->RxBuffer = pbuff; @@ -845,9 +827,9 @@ */ uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev) { - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData; + USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; - if(pdev->pClassData != NULL) + if(pdev->pClassData2 != NULL) { if(hcdc->TxState == 0) { @@ -882,10 +864,10 @@ */ uint8_t USBD_CDC_ReceivePacket(USBD_HandleTypeDef *pdev) { - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData; + USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData2; /* Suspend or Resume USB Out process */ - if(pdev->pClassData != NULL) + if(pdev->pClassData2 != NULL) { if(pdev->dev_speed == USBD_SPEED_HIGH ) { Index: Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c (date 1511202099000) +++ Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c (revision ) @@ -116,7 +116,7 @@ * @{ */ - +#ifndef MSC_COMPOSITE USBD_ClassTypeDef USBD_MSC = { USBD_MSC_Init, @@ -279,6 +279,7 @@ 0x01, 0x00, }; +#endif /** * @} */ @@ -530,6 +531,7 @@ return 0; } +#ifndef MSC_COMPOSITE /** * @brief USBD_MSC_GetHSCfgDesc * return configuration descriptor @@ -576,6 +578,7 @@ *length = sizeof (USBD_MSC_DeviceQualifierDesc); return USBD_MSC_DeviceQualifierDesc; } +#endif /** * @brief USBD_MSC_RegisterStorage Index: Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c (date 1511202099000) +++ Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c (revision ) @@ -190,14 +190,27 @@ INVALID_CDB); return -1; } - - if(((USBD_StorageTypeDef *)pdev->pUserData)->IsReady(lun) !=0 ) + + // XXX THIS SECTION IS MODIFIED FOR NOTIFY! + // https://www.microchip.com/forums/m401735.aspx + int8_t changeStatus = ((USBD_StorageTypeDef *)pdev->pUserData)->IsReady(lun); + if(changeStatus != 0) { - SCSI_SenseCode(pdev, - lun, - NOT_READY, - MEDIUM_NOT_PRESENT); - + if (changeStatus == -1) + { + SCSI_SenseCode(pdev, + lun, + UNIT_ATTENTION, + MEDIUM_HAVE_CHANGED); + } + else + { + SCSI_SenseCode(pdev, + lun, + NOT_READY, + MEDIUM_NOT_PRESENT); + } + hmsc->bot_state = USBD_BOT_NO_DATA; return -1; }