From 5af065de854f4573511e023aa76c3462c60a0a21 Mon Sep 17 00:00:00 2001 From: slimih Date: Tue, 16 Mar 2021 12:39:31 +0100 Subject: [PATCH] Release v2.8.0 --- Class/AUDIO/Src/usbd_audio.c | 33 +- Class/BillBoard/Src/usbd_billboard.c | 8 +- Class/CDC/Inc/usbd_cdc.h | 2 +- Class/CDC/Src/usbd_cdc.c | 100 +-- Class/CDC_ECM/Inc/usbd_cdc_ecm.h | 2 +- Class/CDC_ECM/Src/usbd_cdc_ecm.c | 72 +- Class/CDC_RNDIS/Inc/usbd_cdc_rndis.h | 2 +- Class/CDC_RNDIS/Src/usbd_cdc_rndis.c | 71 +- Class/CustomHID/Src/usbd_customhid.c | 17 +- Class/DFU/Src/usbd_dfu.c | 8 +- Class/HID/Src/usbd_hid.c | 98 ++- Class/MSC/Src/usbd_msc.c | 28 +- Class/Printer/Inc/usbd_printer.h | 164 +++++ Class/Printer/Inc/usbd_printer_if_template.h | 45 ++ Class/Printer/Src/usbd_printer.c | 673 +++++++++++++++++++ Class/Printer/Src/usbd_printer_if_template.c | 218 ++++++ Class/VIDEO/Inc/usbd_video.h | 3 + Class/VIDEO/Src/usbd_video.c | 35 +- Core/Src/usbd_conf_template.c | 4 +- Release_Notes.html | 52 +- 20 files changed, 1374 insertions(+), 261 deletions(-) create mode 100644 Class/Printer/Inc/usbd_printer.h create mode 100644 Class/Printer/Inc/usbd_printer_if_template.h create mode 100644 Class/Printer/Src/usbd_printer.c create mode 100644 Class/Printer/Src/usbd_printer_if_template.c diff --git a/Class/AUDIO/Src/usbd_audio.c b/Class/AUDIO/Src/usbd_audio.c index e8c093f..acaaf05 100644 --- a/Class/AUDIO/Src/usbd_audio.c +++ b/Class/AUDIO/Src/usbd_audio.c @@ -157,7 +157,7 @@ __ALIGN_BEGIN static uint8_t USBD_AUDIO_CfgDesc[USB_AUDIO_CONFIG_DESC_SIZ] __ALI /* Configuration 1 */ 0x09, /* bLength */ USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType */ - LOBYTE(USB_AUDIO_CONFIG_DESC_SIZ), /* wTotalLength 109 bytes*/ + LOBYTE(USB_AUDIO_CONFIG_DESC_SIZ), /* wTotalLength */ HIBYTE(USB_AUDIO_CONFIG_DESC_SIZ), 0x02, /* bNumInterfaces */ 0x01, /* bConfigurationValue */ @@ -167,7 +167,7 @@ __ALIGN_BEGIN static uint8_t USBD_AUDIO_CfgDesc[USB_AUDIO_CONFIG_DESC_SIZ] __ALI #else 0x80, /* bmAttributes: Bus Powered according to user configuration */ #endif - USBD_MAX_POWER, /* bMaxPower = 100 mA */ + USBD_MAX_POWER, /* MaxPower (mA) */ /* 09 byte*/ /* USB Speaker Standard interface descriptor */ @@ -188,7 +188,7 @@ __ALIGN_BEGIN static uint8_t USBD_AUDIO_CfgDesc[USB_AUDIO_CONFIG_DESC_SIZ] __ALI AUDIO_CONTROL_HEADER, /* bDescriptorSubtype */ 0x00, /* 1.00 */ /* bcdADC */ 0x01, - 0x27, /* wTotalLength = 39*/ + 0x27, /* wTotalLength */ 0x00, 0x01, /* bInCollection */ 0x01, /* baInterfaceNr */ @@ -219,22 +219,22 @@ __ALIGN_BEGIN static uint8_t USBD_AUDIO_CfgDesc[USB_AUDIO_CONFIG_DESC_SIZ] __ALI AUDIO_CONTROL_MUTE, /* bmaControls(0) */ 0, /* bmaControls(1) */ 0x00, /* iTerminal */ - /* 09 byte*/ + /* 09 byte */ - /*USB Speaker Output Terminal Descriptor */ + /* USB Speaker Output Terminal Descriptor */ 0x09, /* bLength */ AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ AUDIO_CONTROL_OUTPUT_TERMINAL, /* bDescriptorSubtype */ 0x03, /* bTerminalID */ - 0x01, /* wTerminalType 0x0301*/ + 0x01, /* wTerminalType 0x0301 */ 0x03, 0x00, /* bAssocTerminal */ 0x02, /* bSourceID */ 0x00, /* iTerminal */ - /* 09 byte*/ + /* 09 byte */ /* USB Speaker Standard AS Interface Descriptor - Audio Streaming Zero Bandwidth */ - /* Interface 1, Alternate Setting 0 */ + /* Interface 1, Alternate Setting 0 */ AUDIO_INTERFACE_DESC_SIZE, /* bLength */ USB_DESC_TYPE_INTERFACE, /* bDescriptorType */ 0x01, /* bInterfaceNumber */ @@ -292,7 +292,7 @@ __ALIGN_BEGIN static uint8_t USBD_AUDIO_CfgDesc[USB_AUDIO_CONFIG_DESC_SIZ] __ALI 0x00, /* bSynchAddress */ /* 09 byte*/ - /* Endpoint - Audio Streaming Descriptor*/ + /* Endpoint - Audio Streaming Descriptor */ AUDIO_STREAMING_ENDPOINT_DESC_SIZE, /* bLength */ AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ AUDIO_ENDPOINT_GENERAL, /* bDescriptor */ @@ -339,7 +339,7 @@ static uint8_t USBD_AUDIO_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) USBD_AUDIO_HandleTypeDef *haudio; /* Allocate Audio structure */ - haudio = USBD_malloc(sizeof(USBD_AUDIO_HandleTypeDef)); + haudio = (USBD_AUDIO_HandleTypeDef *)USBD_malloc(sizeof(USBD_AUDIO_HandleTypeDef)); if (haudio == NULL) { @@ -791,10 +791,11 @@ static void AUDIO_REQ_GetCurrent(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef return; } - (void)USBD_memset(haudio->control.data, 0, 64U); + (void)USBD_memset(haudio->control.data, 0, USB_MAX_EP0_SIZE); /* Send the current mute state */ - (void)USBD_CtlSendData(pdev, haudio->control.data, req->wLength); + (void)USBD_CtlSendData(pdev, haudio->control.data, + MIN(req->wLength, USB_MAX_EP0_SIZE)); } /** @@ -816,12 +817,12 @@ static void AUDIO_REQ_SetCurrent(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef if (req->wLength != 0U) { - /* Prepare the reception of the buffer over EP0 */ - (void)USBD_CtlPrepareRx(pdev, haudio->control.data, req->wLength); - haudio->control.cmd = AUDIO_REQ_SET_CUR; /* Set the request value */ - haudio->control.len = (uint8_t)req->wLength; /* Set the request data length */ + haudio->control.len = (uint8_t)MIN(req->wLength, USB_MAX_EP0_SIZE); /* Set the request data length */ haudio->control.unit = HIBYTE(req->wIndex); /* Set the request target unit */ + + /* Prepare the reception of the buffer over EP0 */ + (void)USBD_CtlPrepareRx(pdev, haudio->control.data, haudio->control.len); } } diff --git a/Class/BillBoard/Src/usbd_billboard.c b/Class/BillBoard/Src/usbd_billboard.c index b14a469..e0bacaa 100644 --- a/Class/BillBoard/Src/usbd_billboard.c +++ b/Class/BillBoard/Src/usbd_billboard.c @@ -155,7 +155,7 @@ __ALIGN_BEGIN static uint8_t USBD_BB_CfgDesc[USB_BB_CONFIG_DESC_SIZ] __ALIGN_EN #else 0x80, /* bmAttributes: Bus Powered according to user configuration */ #endif - USBD_MAX_POWER, /* MaxPower 100 mA: this current is used for detecting Vbus */ + USBD_MAX_POWER, /* MaxPower (mA) */ /* 09 */ /************** Descriptor of BillBoard interface ****************/ @@ -179,14 +179,14 @@ __ALIGN_BEGIN static uint8_t USBD_BB_OtherSpeedCfgDesc[USB_BB_CONFIG_DESC_SIZ] USB_BB_CONFIG_DESC_SIZ, 0x00, 0x01, /* bNumInterfaces: 1 interface */ - 0x01, /* bConfigurationValue: */ - USBD_IDX_CONFIG_STR, /* iConfiguration: */ + 0x01, /* bConfigurationValue */ + USBD_IDX_CONFIG_STR, /* iConfiguration */ #if (USBD_SELF_POWERED == 1U) 0xC0, /* bmAttributes: Bus Powered according to user configuration */ #else 0x80, /* bmAttributes: Bus Powered according to user configuration */ #endif - USBD_MAX_POWER, /* MaxPower 100 mA */ + USBD_MAX_POWER, /* MaxPower (mA) */ /************** Descriptor of BillBoard interface ****************/ /* 09 */ diff --git a/Class/CDC/Inc/usbd_cdc.h b/Class/CDC/Inc/usbd_cdc.h index 89e4d05..cb5c6d8 100644 --- a/Class/CDC/Inc/usbd_cdc.h +++ b/Class/CDC/Inc/usbd_cdc.h @@ -111,7 +111,7 @@ typedef struct _USBD_CDC_Itf typedef struct { - uint32_t data[CDC_DATA_HS_MAX_PACKET_SIZE / 4U]; /* Force 32bits alignment */ + uint32_t data[CDC_DATA_HS_MAX_PACKET_SIZE / 4U]; /* Force 32-bit alignment */ uint8_t CmdOpCode; uint8_t CmdLength; uint8_t *RxBuffer; diff --git a/Class/CDC/Src/usbd_cdc.c b/Class/CDC/Src/usbd_cdc.c index 631520b..d6ed6ce 100644 --- a/Class/CDC/Src/usbd_cdc.c +++ b/Class/CDC/Src/usbd_cdc.c @@ -142,7 +142,7 @@ USBD_ClassTypeDef USBD_CDC = USBD_CDC_Init, USBD_CDC_DeInit, USBD_CDC_Setup, - NULL, /* EP0_TxSent, */ + NULL, /* EP0_TxSent */ USBD_CDC_EP0_RxReady, USBD_CDC_DataIn, USBD_CDC_DataOut, @@ -163,7 +163,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_CfgHSDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ USB_CDC_CONFIG_DESC_SIZ, /* wTotalLength:no of returned bytes */ 0x00, - 0x02, /* bNumInterfaces: 2 interface */ + 0x02, /* bNumInterfaces: 2 interfaces */ 0x01, /* bConfigurationValue: Configuration value */ 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ #if (USBD_SELF_POWERED == 1U) @@ -171,7 +171,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_CfgHSDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN #else 0x80, /* bmAttributes: Bus Powered according to user configuration */ #endif - USBD_MAX_POWER, /* MaxPower 100 mA */ + USBD_MAX_POWER, /* MaxPower (mA) */ /*---------------------------------------------------------------------------*/ @@ -184,7 +184,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_CfgHSDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN 0x02, /* bInterfaceClass: Communication Interface Class */ 0x02, /* bInterfaceSubClass: Abstract Control Model */ 0x01, /* bInterfaceProtocol: Common AT commands */ - 0x00, /* iInterface: */ + 0x00, /* iInterface */ /* Header Functional Descriptor */ 0x05, /* bLength: Endpoint Descriptor size */ @@ -218,9 +218,9 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_CfgHSDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_CMD_EP, /* bEndpointAddress */ 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize */ HIBYTE(CDC_CMD_PACKET_SIZE), - CDC_HS_BINTERVAL, /* bInterval: */ + CDC_HS_BINTERVAL, /* bInterval */ /*---------------------------------------------------------------------------*/ /* Data class interface descriptor */ @@ -230,27 +230,27 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_CfgHSDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN 0x00, /* bAlternateSetting: Alternate setting */ 0x02, /* bNumEndpoints: Two endpoints used */ 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ + 0x00, /* bInterfaceSubClass */ + 0x00, /* bInterfaceProtocol */ + 0x00, /* iInterface */ /* Endpoint OUT Descriptor */ 0x07, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_OUT_EP, /* bEndpointAddress */ 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize */ HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ + 0x00, /* bInterval */ /* Endpoint IN Descriptor */ 0x07, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_IN_EP, /* bEndpointAddress */ 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize */ HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), - 0x00 /* bInterval: ignore for Bulk transfer */ + 0x00 /* bInterval */ }; @@ -260,9 +260,9 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_CfgFSDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN /* Configuration Descriptor */ 0x09, /* bLength: Configuration Descriptor size */ USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ - USB_CDC_CONFIG_DESC_SIZ, /* wTotalLength:no of returned bytes */ + USB_CDC_CONFIG_DESC_SIZ, /* wTotalLength */ 0x00, - 0x02, /* bNumInterfaces: 2 interface */ + 0x02, /* bNumInterfaces: 2 interfaces */ 0x01, /* bConfigurationValue: Configuration value */ 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ #if (USBD_SELF_POWERED == 1U) @@ -270,7 +270,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_CfgFSDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN #else 0x80, /* bmAttributes: Bus Powered according to user configuration */ #endif - USBD_MAX_POWER, /* MaxPower 100 mA */ + USBD_MAX_POWER, /* MaxPower (mA) */ /*---------------------------------------------------------------------------*/ @@ -280,11 +280,11 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_CfgFSDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN /* Interface descriptor type */ 0x00, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoints used */ + 0x01, /* bNumEndpoints: One endpoint used */ 0x02, /* bInterfaceClass: Communication Interface Class */ 0x02, /* bInterfaceSubClass: Abstract Control Model */ 0x01, /* bInterfaceProtocol: Common AT commands */ - 0x00, /* iInterface: */ + 0x00, /* iInterface */ /* Header Functional Descriptor */ 0x05, /* bLength: Endpoint Descriptor size */ @@ -298,7 +298,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_CfgFSDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN 0x24, /* bDescriptorType: CS_INTERFACE */ 0x01, /* bDescriptorSubtype: Call Management Func Desc */ 0x00, /* bmCapabilities: D0+D1 */ - 0x01, /* bDataInterface: 1 */ + 0x01, /* bDataInterface */ /* ACM Functional Descriptor */ 0x04, /* bFunctionLength */ @@ -318,9 +318,9 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_CfgFSDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_CMD_EP, /* bEndpointAddress */ 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize */ HIBYTE(CDC_CMD_PACKET_SIZE), - CDC_FS_BINTERVAL, /* bInterval: */ + CDC_FS_BINTERVAL, /* bInterval */ /*---------------------------------------------------------------------------*/ /* Data class interface descriptor */ @@ -330,27 +330,27 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_CfgFSDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN 0x00, /* bAlternateSetting: Alternate setting */ 0x02, /* bNumEndpoints: Two endpoints used */ 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ + 0x00, /* bInterfaceSubClass */ + 0x00, /* bInterfaceProtocol */ + 0x00, /* iInterface */ /* Endpoint OUT Descriptor */ 0x07, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_OUT_EP, /* bEndpointAddress */ 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize */ HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ + 0x00, /* bInterval */ /* Endpoint IN Descriptor */ 0x07, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_IN_EP, /* bEndpointAddress */ 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize */ HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), - 0x00 /* bInterval: ignore for Bulk transfer */ + 0x00 /* bInterval */ }; __ALIGN_BEGIN static uint8_t USBD_CDC_OtherSpeedCfgDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END = @@ -360,16 +360,16 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_OtherSpeedCfgDesc[USB_CDC_CONFIG_DESC_SIZ] USB_CDC_CONFIG_DESC_SIZ, 0x00, 0x02, /* bNumInterfaces: 2 interfaces */ - 0x01, /* bConfigurationValue: */ - 0x04, /* iConfiguration: */ + 0x01, /* bConfigurationValue */ + 0x04, /* iConfiguration */ #if (USBD_SELF_POWERED == 1U) 0xC0, /* bmAttributes: Bus Powered according to user configuration */ #else 0x80, /* bmAttributes: Bus Powered according to user configuration */ #endif - USBD_MAX_POWER, /* MaxPower 100 mA */ + USBD_MAX_POWER, /* MaxPower (mA) */ - /*Interface Descriptor */ + /* Interface Descriptor */ 0x09, /* bLength: Interface Descriptor size */ USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ /* Interface descriptor type */ @@ -379,7 +379,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_OtherSpeedCfgDesc[USB_CDC_CONFIG_DESC_SIZ] 0x02, /* bInterfaceClass: Communication Interface Class */ 0x02, /* bInterfaceSubClass: Abstract Control Model */ 0x01, /* bInterfaceProtocol: Common AT commands */ - 0x00, /* iInterface: */ + 0x00, /* iInterface */ /* Header Functional Descriptor */ 0x05, /* bLength: Endpoint Descriptor size */ @@ -388,34 +388,34 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_OtherSpeedCfgDesc[USB_CDC_CONFIG_DESC_SIZ] 0x10, /* bcdCDC: spec release number */ 0x01, - /*Call Management Functional Descriptor*/ + /* Call Management Functional Descriptor */ 0x05, /* bFunctionLength */ 0x24, /* bDescriptorType: CS_INTERFACE */ 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - 0x01, /* bDataInterface: 1 */ + 0x00, /* bmCapabilities */ + 0x01, /* bDataInterface */ - /*ACM Functional Descriptor*/ + /* ACM Functional Descriptor */ 0x04, /* bFunctionLength */ 0x24, /* bDescriptorType: CS_INTERFACE */ 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ 0x02, /* bmCapabilities */ - /*Union Functional Descriptor*/ + /* Union Functional Descriptor */ 0x05, /* bFunctionLength */ 0x24, /* bDescriptorType: CS_INTERFACE */ 0x06, /* bDescriptorSubtype: Union func desc */ 0x00, /* bMasterInterface: Communication class interface */ 0x01, /* bSlaveInterface0: Data Class Interface */ - /*Endpoint 2 Descriptor*/ + /* Endpoint 2 Descriptor */ 0x07, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_CMD_EP, /* bEndpointAddress */ 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize */ HIBYTE(CDC_CMD_PACKET_SIZE), - CDC_FS_BINTERVAL, /* bInterval: */ + CDC_FS_BINTERVAL, /* bInterval */ /*---------------------------------------------------------------------------*/ @@ -426,25 +426,25 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_OtherSpeedCfgDesc[USB_CDC_CONFIG_DESC_SIZ] 0x00, /* bAlternateSetting: Alternate setting */ 0x02, /* bNumEndpoints: Two endpoints used */ 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ + 0x00, /* bInterfaceSubClass */ + 0x00, /* bInterfaceProtocol */ + 0x00, /* iInterface */ /*Endpoint OUT Descriptor*/ 0x07, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_OUT_EP, /* bEndpointAddress */ 0x02, /* bmAttributes: Bulk */ - 0x40, /* wMaxPacketSize: */ + 0x40, /* wMaxPacketSize */ 0x00, - 0x00, /* bInterval: ignore for Bulk transfer */ + 0x00, /* bInterval */ /*Endpoint IN Descriptor*/ 0x07, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_IN_EP, /* bEndpointAddress */ 0x02, /* bmAttributes: Bulk */ - 0x40, /* wMaxPacketSize: */ + 0x40, /* wMaxPacketSize */ 0x00, 0x00 /* bInterval */ }; @@ -469,7 +469,7 @@ static uint8_t USBD_CDC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) UNUSED(cfgidx); USBD_CDC_HandleTypeDef *hcdc; - hcdc = USBD_malloc(sizeof(USBD_CDC_HandleTypeDef)); + hcdc = (USBD_CDC_HandleTypeDef *)USBD_malloc(sizeof(USBD_CDC_HandleTypeDef)); if (hcdc == NULL) { @@ -614,9 +614,9 @@ static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev, else { hcdc->CmdOpCode = req->bRequest; - hcdc->CmdLength = (uint8_t)req->wLength; + hcdc->CmdLength = (uint8_t)MIN(req->wLength, USB_MAX_EP0_SIZE); - (void)USBD_CtlPrepareRx(pdev, (uint8_t *)hcdc->data, req->wLength); + (void)USBD_CtlPrepareRx(pdev, (uint8_t *)hcdc->data, hcdc->CmdLength); } } else diff --git a/Class/CDC_ECM/Inc/usbd_cdc_ecm.h b/Class/CDC_ECM/Inc/usbd_cdc_ecm.h index cdc2d6c..1cd71fa 100644 --- a/Class/CDC_ECM/Inc/usbd_cdc_ecm.h +++ b/Class/CDC_ECM/Inc/usbd_cdc_ecm.h @@ -175,7 +175,7 @@ typedef struct typedef struct { - uint32_t data[CDC_ECM_DATA_BUFFER_SIZE / 4]; /* Force 32bits alignment */ + uint32_t data[CDC_ECM_DATA_BUFFER_SIZE / 4U]; /* Force 32-bit alignment */ uint8_t CmdOpCode; uint8_t CmdLength; uint8_t Reserved1; /* Reserved Byte to force 4 bytes alignment of following fields */ diff --git a/Class/CDC_ECM/Src/usbd_cdc_ecm.c b/Class/CDC_ECM/Src/usbd_cdc_ecm.c index a0f4856..4b34d7c 100644 --- a/Class/CDC_ECM/Src/usbd_cdc_ecm.c +++ b/Class/CDC_ECM/Src/usbd_cdc_ecm.c @@ -155,7 +155,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_ECM_CfgHSDesc[] __ALIGN_END = USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ LOBYTE(CDC_ECM_CONFIG_DESC_SIZ), /* wTotalLength:no of returned bytes */ HIBYTE(CDC_ECM_CONFIG_DESC_SIZ), - 0x02, /* bNumInterfaces: 2 interface */ + 0x02, /* bNumInterfaces: 2 interfaces */ 0x01, /* bConfigurationValue: Configuration value */ 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ #if (USBD_SELF_POWERED == 1U) @@ -163,7 +163,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_ECM_CfgHSDesc[] __ALIGN_END = #else 0x80, /* bmAttributes: Bus Powered according to user configuration */ #endif - USBD_MAX_POWER, /* MaxPower 100 mA */ + USBD_MAX_POWER, /* MaxPower (mA) */ /*---------------------------------------------------------------------------*/ @@ -186,7 +186,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_ECM_CfgHSDesc[] __ALIGN_END = 0x02, /* bInterfaceClass: Communication Interface Class */ 0x06, /* bInterfaceSubClass: Ethernet Control Model */ 0x00, /* bInterfaceProtocol: No specific protocol required */ - 0x00, /* iInterface: */ + 0x00, /* iInterface */ /* Header Functional Descriptor */ 0x05, /* bLength: Endpoint Descriptor size */ @@ -222,7 +222,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_ECM_CfgHSDesc[] __ALIGN_END = USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_ECM_CMD_EP, /* bEndpointAddress */ 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_ECM_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + LOBYTE(CDC_ECM_CMD_PACKET_SIZE), /* wMaxPacketSize */ HIBYTE(CDC_ECM_CMD_PACKET_SIZE), CDC_ECM_HS_BINTERVAL, /* bInterval */ @@ -235,27 +235,27 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_ECM_CfgHSDesc[] __ALIGN_END = 0x00, /* bAlternateSetting: Alternate setting */ 0x02, /* bNumEndpoints: Two endpoints used */ 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ + 0x00, /* bInterfaceSubClass */ + 0x00, /* bInterfaceProtocol */ + 0x00, /* iInterface */ /* Endpoint OUT Descriptor */ 0x07, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_ECM_OUT_EP, /* bEndpointAddress */ 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_ECM_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + LOBYTE(CDC_ECM_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize */ HIBYTE(CDC_ECM_DATA_HS_MAX_PACKET_SIZE), - 0xFF, /* bInterval: ignore for Bulk transfer */ + 0x00, /* bInterval */ /* Endpoint IN Descriptor */ 0x07, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_ECM_IN_EP, /* bEndpointAddress */ 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_ECM_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + LOBYTE(CDC_ECM_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize */ HIBYTE(CDC_ECM_DATA_HS_MAX_PACKET_SIZE), - 0xFF /* bInterval: ignore for Bulk transfer */ + 0x00 /* bInterval */ }; @@ -267,7 +267,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_ECM_CfgFSDesc[] __ALIGN_END = USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ LOBYTE(CDC_ECM_CONFIG_DESC_SIZ), /* wTotalLength: Total size of the Config descriptor */ HIBYTE(CDC_ECM_CONFIG_DESC_SIZ), - 0x02, /* bNumInterfaces: 2 interface */ + 0x02, /* bNumInterfaces: 2 interfaces */ 0x01, /* bConfigurationValue: Configuration value */ 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ #if (USBD_SELF_POWERED == 1U) @@ -275,7 +275,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_ECM_CfgFSDesc[] __ALIGN_END = #else 0x80, /* bmAttributes: Bus Powered according to user configuration */ #endif - USBD_MAX_POWER, /* MaxPower 100 mA */ + USBD_MAX_POWER, /* MaxPower (mA) */ /*---------------------------------------------------------------------------*/ /* IAD descriptor */ @@ -297,7 +297,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_ECM_CfgFSDesc[] __ALIGN_END = 0x02, /* bInterfaceClass: Communication Interface Class */ 0x06, /* bInterfaceSubClass: Ethernet Control Model */ 0x00, /* bInterfaceProtocol: No specific protocol required */ - 0x00, /* iInterface: */ + 0x00, /* iInterface */ /* Header Functional Descriptor */ 0x05, /* bLength: Endpoint Descriptor size */ @@ -334,7 +334,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_ECM_CfgFSDesc[] __ALIGN_END = USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_ECM_CMD_EP, /* bEndpointAddress */ 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_ECM_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + LOBYTE(CDC_ECM_CMD_PACKET_SIZE), /* wMaxPacketSize */ HIBYTE(CDC_ECM_CMD_PACKET_SIZE), CDC_ECM_FS_BINTERVAL, /* bInterval */ @@ -347,27 +347,27 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_ECM_CfgFSDesc[] __ALIGN_END = 0x00, /* bAlternateSetting: Alternate setting */ 0x02, /* bNumEndpoints: Two endpoints used */ 0x0A, /* bInterfaceClass: CDC_ECM */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ + 0x00, /* bInterfaceSubClass */ + 0x00, /* bInterfaceProtocol */ + 0x00, /* iInterface */ /* Endpoint OUT Descriptor */ 0x07, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_ECM_OUT_EP, /* bEndpointAddress */ 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_ECM_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + LOBYTE(CDC_ECM_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize */ HIBYTE(CDC_ECM_DATA_FS_MAX_PACKET_SIZE), - 0xFF, /* bInterval: ignore for Bulk transfer */ + 0x00, /* bInterval */ /* Endpoint IN Descriptor */ 0x07, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_ECM_IN_EP, /* bEndpointAddress */ 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_ECM_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + LOBYTE(CDC_ECM_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize */ HIBYTE(CDC_ECM_DATA_FS_MAX_PACKET_SIZE), - 0xFF /* bInterval: ignore for Bulk transfer */ + 0x00 /* bInterval */ } ; __ALIGN_BEGIN static uint8_t USBD_CDC_ECM_OtherSpeedCfgDesc[] __ALIGN_END = @@ -375,9 +375,9 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_ECM_OtherSpeedCfgDesc[] __ALIGN_END = /* Configuration Descriptor */ 0x09, /* bLength: Configuration Descriptor size */ USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ - LOBYTE(CDC_ECM_CONFIG_DESC_SIZ), /* wTotalLength:no of returned bytes */ + LOBYTE(CDC_ECM_CONFIG_DESC_SIZ), /* wTotalLength */ HIBYTE(CDC_ECM_CONFIG_DESC_SIZ), - 0x02, /* bNumInterfaces: 2 interface */ + 0x02, /* bNumInterfaces: 2 interfaces */ 0x01, /* bConfigurationValue: Configuration value */ 0x04, /* iConfiguration: Index of string descriptor describing the configuration */ #if (USBD_SELF_POWERED == 1U) @@ -385,7 +385,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_ECM_OtherSpeedCfgDesc[] __ALIGN_END = #else 0x80, /* bmAttributes: Bus Powered according to user configuration */ #endif - USBD_MAX_POWER, /* MaxPower 100 mA */ + USBD_MAX_POWER, /* MaxPower (mA) */ /*--------------------------------------- ------------------------------------*/ /* IAD descriptor */ @@ -443,7 +443,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_ECM_OtherSpeedCfgDesc[] __ALIGN_END = USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_ECM_CMD_EP, /* bEndpointAddress */ 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_ECM_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + LOBYTE(CDC_ECM_CMD_PACKET_SIZE), /* wMaxPacketSize */ HIBYTE(CDC_ECM_CMD_PACKET_SIZE), CDC_ECM_FS_BINTERVAL, /* bInterval */ @@ -451,13 +451,13 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_ECM_OtherSpeedCfgDesc[] __ALIGN_END = /* Data class interface descriptor */ 0x09, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: interface */ 0x01, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x02, /* bNumEndpoints: Two endpoints used */ 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ + 0x00, /* bInterfaceSubClass */ + 0x00, /* bInterfaceProtocol */ 0x00, /* iInterface: */ /* Endpoint OUT Descriptor */ @@ -465,18 +465,18 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_ECM_OtherSpeedCfgDesc[] __ALIGN_END = USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_ECM_OUT_EP, /* bEndpointAddress */ 0x02, /* bmAttributes: Bulk */ - 0x40, /* wMaxPacketSize: */ + 0x40, /* wMaxPacketSize */ 0x00, - 0xFF, /* bInterval: ignore for Bulk transfer */ + 0x00, /* bInterval */ /* Endpoint IN Descriptor */ 0x07, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_ECM_IN_EP, /* bEndpointAddress */ 0x02, /* bmAttributes: Bulk */ - 0x40, /* wMaxPacketSize: */ + 0x40, /* wMaxPacketSize */ 0x00, - 0xFF /* bInterval: ignore for Bulk transfer */ + 0x00 /* bInterval */ }; /** @@ -500,7 +500,7 @@ static uint8_t USBD_CDC_ECM_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) USBD_CDC_ECM_HandleTypeDef *hcdc; - hcdc = USBD_malloc(sizeof(USBD_CDC_ECM_HandleTypeDef)); + hcdc = (USBD_CDC_ECM_HandleTypeDef *)USBD_malloc(sizeof(USBD_CDC_ECM_HandleTypeDef)); if (hcdc == NULL) { @@ -640,9 +640,9 @@ static uint8_t USBD_CDC_ECM_Setup(USBD_HandleTypeDef *pdev, else { hcdc->CmdOpCode = req->bRequest; - hcdc->CmdLength = (uint8_t)req->wLength; + hcdc->CmdLength = (uint8_t)MIN(req->wLength, USB_MAX_EP0_SIZE); - (void)USBD_CtlPrepareRx(pdev, (uint8_t *)hcdc->data, req->wLength); + (void)USBD_CtlPrepareRx(pdev, (uint8_t *)hcdc->data, hcdc->CmdLength); } } else diff --git a/Class/CDC_RNDIS/Inc/usbd_cdc_rndis.h b/Class/CDC_RNDIS/Inc/usbd_cdc_rndis.h index ef76894..a2fb432 100644 --- a/Class/CDC_RNDIS/Inc/usbd_cdc_rndis.h +++ b/Class/CDC_RNDIS/Inc/usbd_cdc_rndis.h @@ -243,7 +243,7 @@ typedef struct typedef struct { - uint32_t data[2000 / 4]; /* Force 32bits alignment */ + uint32_t data[CDC_RNDIS_MAX_DATA_SZE / 4U]; /* Force 32-bit alignment */ uint8_t CmdOpCode; uint8_t CmdLength; uint8_t ResponseRdy; /* Indicates if the Device Response to an CDC_RNDIS msg is ready */ diff --git a/Class/CDC_RNDIS/Src/usbd_cdc_rndis.c b/Class/CDC_RNDIS/Src/usbd_cdc_rndis.c index 4a08d35..a7c2cbc 100644 --- a/Class/CDC_RNDIS/Src/usbd_cdc_rndis.c +++ b/Class/CDC_RNDIS/Src/usbd_cdc_rndis.c @@ -192,7 +192,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_RNDIS_CfgHSDesc[] __ALIGN_END = USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ LOBYTE(CDC_RNDIS_CONFIG_DESC_SIZ), /* wTotalLength: Total size of the Config descriptor */ HIBYTE(CDC_RNDIS_CONFIG_DESC_SIZ), - 0x02, /* bNumInterfaces: 2 interface */ + 0x02, /* bNumInterfaces: 2 interfaces */ 0x01, /* bConfigurationValue: Configuration value */ 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ #if (USBD_SELF_POWERED == 1U) @@ -200,7 +200,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_RNDIS_CfgHSDesc[] __ALIGN_END = #else 0x80, /* bmAttributes: Bus Powered according to user configuration */ #endif - USBD_MAX_POWER, /* MaxPower 100 mA */ + USBD_MAX_POWER, /* MaxPower (mA) */ /*---------------------------------------------------------------------------*/ /* IAD descriptor */ @@ -223,7 +223,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_RNDIS_CfgHSDesc[] __ALIGN_END = 0x02, /* bInterfaceClass: Communication Interface Class */ 0x02, /* bInterfaceSubClass:Abstract Control Model */ 0xFF, /* bInterfaceProtocol: Common AT commands */ - 0x00, /* iInterface: */ + 0x00, /* iInterface */ /* Header Functional Descriptor */ 0x05, /* bLength: Endpoint Descriptor size */ @@ -257,7 +257,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_RNDIS_CfgHSDesc[] __ALIGN_END = USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_RNDIS_CMD_EP, /* bEndpointAddress */ 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_RNDIS_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + LOBYTE(CDC_RNDIS_CMD_PACKET_SIZE), /* wMaxPacketSize */ HIBYTE(CDC_RNDIS_CMD_PACKET_SIZE), CDC_RNDIS_HS_BINTERVAL, /* bInterval */ @@ -269,18 +269,18 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_RNDIS_CfgHSDesc[] __ALIGN_END = 0x00, /* bAlternateSetting: Alternate setting */ 0x02, /* bNumEndpoints: Two endpoints used */ 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ + 0x00, /* bInterfaceSubClass */ + 0x00, /* bInterfaceProtocol */ + 0x00, /* iInterface */ /* Endpoint OUT Descriptor */ 0x07, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_RNDIS_OUT_EP, /* bEndpointAddress */ 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_RNDIS_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + LOBYTE(CDC_RNDIS_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize */ HIBYTE(CDC_RNDIS_DATA_HS_MAX_PACKET_SIZE), - 0xFF, /* bInterval: ignore for Bulk transfer */ + 0x00, /* bInterval */ /* Endpoint IN Descriptor */ 0x07, /* bLength: Endpoint Descriptor size */ @@ -289,7 +289,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_RNDIS_CfgHSDesc[] __ALIGN_END = 0x02, /* bmAttributes: Bulk */ LOBYTE(CDC_RNDIS_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ HIBYTE(CDC_RNDIS_DATA_HS_MAX_PACKET_SIZE), - 0xFF /* bInterval: ignore for Bulk transfer */ + 0x00 /* bInterval */ }; @@ -301,7 +301,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_RNDIS_CfgFSDesc[] __ALIGN_END = USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ LOBYTE(CDC_RNDIS_CONFIG_DESC_SIZ), /* wTotalLength: Total size of the Config descriptor */ HIBYTE(CDC_RNDIS_CONFIG_DESC_SIZ), - 0x02, /* bNumInterfaces: 2 interface */ + 0x02, /* bNumInterfaces: 2 interfaces */ 0x01, /* bConfigurationValue: Configuration value */ 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ #if (USBD_SELF_POWERED == 1U) @@ -309,7 +309,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_RNDIS_CfgFSDesc[] __ALIGN_END = #else 0x80, /* bmAttributes: Bus Powered according to user configuration */ #endif - USBD_MAX_POWER, /* MaxPower 100 mA */ + USBD_MAX_POWER, /* MaxPower (mA) */ /*---------------------------------------------------------------------------*/ /* IAD descriptor */ @@ -332,7 +332,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_RNDIS_CfgFSDesc[] __ALIGN_END = 0x02, /* bInterfaceClass: Communication Interface Class */ 0x02, /* bInterfaceSubClass:Abstract Control Model */ 0xFF, /* bInterfaceProtocol: Common AT commands */ - 0x00, /* iInterface: */ + 0x00, /* iInterface */ /* Header Functional Descriptor */ 0x05, /* bLength: Endpoint Descriptor size */ @@ -366,7 +366,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_RNDIS_CfgFSDesc[] __ALIGN_END = USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_RNDIS_CMD_EP, /* bEndpointAddress */ 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_RNDIS_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + LOBYTE(CDC_RNDIS_CMD_PACKET_SIZE), /* wMaxPacketSize */ HIBYTE(CDC_RNDIS_CMD_PACKET_SIZE), CDC_RNDIS_FS_BINTERVAL, /* bInterval */ @@ -378,9 +378,9 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_RNDIS_CfgFSDesc[] __ALIGN_END = 0x00, /* bAlternateSetting: Alternate setting */ 0x02, /* bNumEndpoints: Two endpoints used */ 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ + 0x00, /* bInterfaceSubClass */ + 0x00, /* bInterfaceProtocol */ + 0x00, /* iInterface */ /* Endpoint OUT Descriptor */ 0x07, /* bLength: Endpoint Descriptor size */ @@ -389,16 +389,16 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_RNDIS_CfgFSDesc[] __ALIGN_END = 0x02, /* bmAttributes: Bulk */ LOBYTE(CDC_RNDIS_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ HIBYTE(CDC_RNDIS_DATA_FS_MAX_PACKET_SIZE), - 0xFF, /* bInterval: ignore for Bulk transfer */ + 0x00, /* bInterval */ /* Endpoint IN Descriptor */ 0x07, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_RNDIS_IN_EP, /* bEndpointAddress */ 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_RNDIS_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + LOBYTE(CDC_RNDIS_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize */ HIBYTE(CDC_RNDIS_DATA_FS_MAX_PACKET_SIZE), - 0xFF /* bInterval: ignore for Bulk transfer */ + 0x00 /* bInterval */ } ; __ALIGN_BEGIN static uint8_t USBD_CDC_RNDIS_OtherSpeedCfgDesc[] __ALIGN_END = @@ -408,7 +408,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_RNDIS_OtherSpeedCfgDesc[] __ALIGN_END = USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ LOBYTE(CDC_RNDIS_CONFIG_DESC_SIZ), /* wTotalLength:no of returned bytes */ HIBYTE(CDC_RNDIS_CONFIG_DESC_SIZ), - 0x02, /* bNumInterfaces: 2 interface */ + 0x02, /* bNumInterfaces: 2 interfaces */ 0x01, /* bConfigurationValue: Configuration value */ 0x04, /* iConfiguration: Index of string descriptor describing the configuration */ #if (USBD_SELF_POWERED == 1U) @@ -416,7 +416,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_RNDIS_OtherSpeedCfgDesc[] __ALIGN_END = #else 0x80, /* bmAttributes: Bus Powered according to user configuration */ #endif - USBD_MAX_POWER, /* MaxPower 100 mA */ + USBD_MAX_POWER, /* MaxPower (mA) */ /*---------------------------------------------------------------------------*/ /* IAD descriptor */ @@ -439,7 +439,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_RNDIS_OtherSpeedCfgDesc[] __ALIGN_END = 0x02, /* bInterfaceClass: Communication Interface Class */ 0x02, /* bInterfaceSubClass:Abstract Control Model */ 0xFF, /* bInterfaceProtocol: Common AT commands */ - 0x00, /* iInterface: */ + 0x00, /* iInterface */ /* Header Functional Descriptor */ 0x05, /* bLength: Endpoint Descriptor size */ @@ -473,7 +473,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_RNDIS_OtherSpeedCfgDesc[] __ALIGN_END = USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_RNDIS_CMD_EP, /* bEndpointAddress */ 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_RNDIS_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + LOBYTE(CDC_RNDIS_CMD_PACKET_SIZE), /* wMaxPacketSize */ HIBYTE(CDC_RNDIS_CMD_PACKET_SIZE), CDC_RNDIS_FS_BINTERVAL, /* bInterval */ @@ -485,27 +485,27 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_RNDIS_OtherSpeedCfgDesc[] __ALIGN_END = 0x00, /* bAlternateSetting: Alternate setting */ 0x02, /* bNumEndpoints: Two endpoints used */ 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ + 0x00, /* bInterfaceSubClass */ + 0x00, /* bInterfaceProtocol */ + 0x00, /* iInterface */ /* Endpoint OUT Descriptor */ 0x07, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_RNDIS_OUT_EP, /* bEndpointAddress */ 0x02, /* bmAttributes: Bulk */ - 0x40, /* wMaxPacketSize: */ + 0x40, /* wMaxPacketSize */ 0x00, - 0xFF, /* bInterval: ignore for Bulk transfer */ + 0x00, /* bInterval */ /* Endpoint IN Descriptor */ 0x07, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_RNDIS_IN_EP, /* bEndpointAddress */ 0x02, /* bmAttributes: Bulk */ - 0x40, /* wMaxPacketSize: */ + 0x40, /* wMaxPacketSize */ 0x00, - 0xFF /* bInterval: ignore for Bulk transfer */ + 0x00 /* bInterval */ }; @@ -554,7 +554,7 @@ static uint8_t USBD_CDC_RNDIS_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) UNUSED(cfgidx); USBD_CDC_RNDIS_HandleTypeDef *hcdc; - hcdc = USBD_malloc(sizeof(USBD_CDC_RNDIS_HandleTypeDef)); + hcdc = (USBD_CDC_RNDIS_HandleTypeDef *)USBD_malloc(sizeof(USBD_CDC_RNDIS_HandleTypeDef)); if (hcdc == NULL) { @@ -713,7 +713,8 @@ static uint8_t USBD_CDC_RNDIS_Setup(USBD_HandleTypeDef *pdev, hcdc->ResponseRdy = 0U; /* Send data on control endpoint */ - (void)USBD_CtlSendData(pdev, (uint8_t *)hcdc->data, Msg->MsgLength); + (void)USBD_CtlSendData(pdev, (uint8_t *)hcdc->data, + MIN(CDC_RNDIS_MAX_DATA_SZE, Msg->MsgLength)); } else { @@ -728,9 +729,9 @@ static uint8_t USBD_CDC_RNDIS_Setup(USBD_HandleTypeDef *pdev, else { hcdc->CmdOpCode = req->bRequest; - hcdc->CmdLength = (uint8_t)req->wLength; + hcdc->CmdLength = (uint8_t)MIN(CDC_RNDIS_CMD_PACKET_SIZE, req->wLength); - (void)USBD_CtlPrepareRx(pdev, (uint8_t *)hcdc->data, req->wLength); + (void)USBD_CtlPrepareRx(pdev, (uint8_t *)hcdc->data, hcdc->CmdLength); } } /* No Data control request: there is no such request for CDC_RNDIS protocol, diff --git a/Class/CustomHID/Src/usbd_customhid.c b/Class/CustomHID/Src/usbd_customhid.c index 504ff4a..2fbc057 100644 --- a/Class/CustomHID/Src/usbd_customhid.c +++ b/Class/CustomHID/Src/usbd_customhid.c @@ -138,7 +138,7 @@ __ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_CfgFSDesc[USB_CUSTOM_HID_CONFIG_DES #else 0x80, /* bmAttributes: Bus Powered according to user configuration */ #endif - USBD_MAX_POWER, /* MaxPower 100 mA: this current is used for detecting Vbus */ + USBD_MAX_POWER, /* MaxPower (mA) */ /************** Descriptor of CUSTOM HID interface ****************/ /* 09 */ @@ -169,7 +169,7 @@ __ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_CfgFSDesc[USB_CUSTOM_HID_CONFIG_DES CUSTOM_HID_EPIN_ADDR, /* bEndpointAddress: Endpoint Address (IN) */ 0x03, /* bmAttributes: Interrupt endpoint */ - CUSTOM_HID_EPIN_SIZE, /* wMaxPacketSize: 2 Byte max */ + CUSTOM_HID_EPIN_SIZE, /* wMaxPacketSize: 2 Bytes max */ 0x00, CUSTOM_HID_FS_BINTERVAL, /* bInterval: Polling Interval */ /* 34 */ @@ -199,7 +199,7 @@ __ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_CfgHSDesc[USB_CUSTOM_HID_CONFIG_DES #else 0x80, /* bmAttributes: Bus Powered according to user configuration */ #endif - USBD_MAX_POWER, /* MaxPower 100 mA: this current is used for detecting Vbus */ + USBD_MAX_POWER, /* MaxPower (mA) */ /************** Descriptor of CUSTOM HID interface ****************/ /* 09 */ @@ -226,11 +226,11 @@ __ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_CfgHSDesc[USB_CUSTOM_HID_CONFIG_DES /******************** Descriptor of Custom HID endpoints ********************/ /* 27 */ 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType */ CUSTOM_HID_EPIN_ADDR, /* bEndpointAddress: Endpoint Address (IN) */ 0x03, /* bmAttributes: Interrupt endpoint */ - CUSTOM_HID_EPIN_SIZE, /* wMaxPacketSize: 2 Byte max */ + CUSTOM_HID_EPIN_SIZE, /* wMaxPacketSize: 2 Bytes max */ 0x00, CUSTOM_HID_HS_BINTERVAL, /* bInterval: Polling Interval */ /* 34 */ @@ -260,7 +260,7 @@ __ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_OtherSpeedCfgDesc[USB_CUSTOM_HID_CO #else 0x80, /* bmAttributes: Bus Powered according to user configuration */ #endif - USBD_MAX_POWER, /* MaxPower 100 mA: this current is used for detecting Vbus */ + USBD_MAX_POWER, /* MaxPower (mA) */ /************** Descriptor of CUSTOM HID interface ****************/ /* 09 */ @@ -356,7 +356,7 @@ static uint8_t USBD_CUSTOM_HID_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) UNUSED(cfgidx); USBD_CUSTOM_HID_HandleTypeDef *hhid; - hhid = USBD_malloc(sizeof(USBD_CUSTOM_HID_HandleTypeDef)); + hhid = (USBD_CUSTOM_HID_HandleTypeDef *)USBD_malloc(sizeof(USBD_CUSTOM_HID_HandleTypeDef)); if (hhid == NULL) { @@ -476,7 +476,8 @@ static uint8_t USBD_CUSTOM_HID_Setup(USBD_HandleTypeDef *pdev, case CUSTOM_HID_REQ_SET_REPORT: hhid->IsReportAvailable = 1U; - (void)USBD_CtlPrepareRx(pdev, hhid->Report_buf, req->wLength); + (void)USBD_CtlPrepareRx(pdev, hhid->Report_buf, + MIN(req->wLength, USBD_CUSTOMHID_OUTREPORT_BUF_SIZE)); break; default: diff --git a/Class/DFU/Src/usbd_dfu.c b/Class/DFU/Src/usbd_dfu.c index c3f1b7a..fc942a7 100644 --- a/Class/DFU/Src/usbd_dfu.c +++ b/Class/DFU/Src/usbd_dfu.c @@ -165,7 +165,7 @@ __ALIGN_BEGIN static uint8_t USBD_DFU_CfgDesc[USB_DFU_CONFIG_DESC_SIZ] __ALIGN_E #else 0x80, /* bmAttributes: Bus Powered according to user configuration */ #endif - USBD_MAX_POWER, /* MaxPower 100 mA: this current is used for detecting Vbus */ + USBD_MAX_POWER, /* MaxPower (mA) */ /* 09 */ /********** Descriptor of DFU interface 0 Alternate setting 0 **************/ @@ -258,7 +258,7 @@ static uint8_t USBD_DFU_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) USBD_DFU_HandleTypeDef *hdfu; /* Allocate Audio structure */ - hdfu = USBD_malloc(sizeof(USBD_DFU_HandleTypeDef)); + hdfu = (USBD_DFU_HandleTypeDef *)USBD_malloc(sizeof(USBD_DFU_HandleTypeDef)); if (hdfu == NULL) { @@ -744,7 +744,7 @@ static void DFU_Download(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { /* Update the global length and block number */ hdfu->wblock_num = req->wValue; - hdfu->wlength = req->wLength; + hdfu->wlength = MIN(req->wLength, USBD_DFU_XFER_SIZE); /* Update the state machine */ hdfu->dev_state = DFU_STATE_DNLOAD_SYNC; @@ -807,7 +807,7 @@ static void DFU_Upload(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { /* Update the global length and block number */ hdfu->wblock_num = req->wValue; - hdfu->wlength = req->wLength; + hdfu->wlength = MIN(req->wLength, USBD_DFU_XFER_SIZE); /* DFU Get Command */ if (hdfu->wblock_num == 0U) diff --git a/Class/HID/Src/usbd_hid.c b/Class/HID/Src/usbd_hid.c index 9301625..75256d2 100644 --- a/Class/HID/Src/usbd_hid.c +++ b/Class/HID/Src/usbd_hid.c @@ -138,7 +138,7 @@ __ALIGN_BEGIN static uint8_t USBD_HID_CfgFSDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN #else 0xA0, /* bmAttributes: Bus Powered according to user configuration */ #endif - USBD_MAX_POWER, /* MaxPower 100 mA: this current is used for detecting Vbus */ + USBD_MAX_POWER, /* MaxPower (mA) */ /************** Descriptor of Joystick Mouse interface ****************/ /* 09 */ @@ -169,7 +169,7 @@ __ALIGN_BEGIN static uint8_t USBD_HID_CfgFSDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN HID_EPIN_ADDR, /* bEndpointAddress: Endpoint Address (IN) */ 0x03, /* bmAttributes: Interrupt endpoint */ - HID_EPIN_SIZE, /* wMaxPacketSize: 4 Byte max */ + HID_EPIN_SIZE, /* wMaxPacketSize: 4 Bytes max */ 0x00, HID_FS_BINTERVAL, /* bInterval: Polling Interval */ /* 34 */ @@ -190,7 +190,7 @@ __ALIGN_BEGIN static uint8_t USBD_HID_CfgHSDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN #else 0xA0, /* bmAttributes: Bus Powered according to user configuration */ #endif - USBD_MAX_POWER, /* MaxPower 100 mA: this current is used for detecting Vbus */ + USBD_MAX_POWER, /* MaxPower (mA) */ /************** Descriptor of Joystick Mouse interface ****************/ /* 09 */ @@ -221,7 +221,7 @@ __ALIGN_BEGIN static uint8_t USBD_HID_CfgHSDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN HID_EPIN_ADDR, /* bEndpointAddress: Endpoint Address (IN) */ 0x03, /* bmAttributes: Interrupt endpoint */ - HID_EPIN_SIZE, /* wMaxPacketSize: 4 Byte max */ + HID_EPIN_SIZE, /* wMaxPacketSize: 4 Bytes max */ 0x00, HID_HS_BINTERVAL, /* bInterval: Polling Interval */ /* 34 */ @@ -242,7 +242,7 @@ __ALIGN_BEGIN static uint8_t USBD_HID_OtherSpeedCfgDesc[USB_HID_CONFIG_DESC_SIZ] #else 0xA0, /* bmAttributes: Bus Powered according to user configuration */ #endif - USBD_MAX_POWER, /* MaxPower 100 mA: this current is used for detecting Vbus */ + USBD_MAX_POWER, /* MaxPower (mA) */ /************** Descriptor of Joystick Mouse interface ****************/ /* 09 */ @@ -273,7 +273,7 @@ __ALIGN_BEGIN static uint8_t USBD_HID_OtherSpeedCfgDesc[USB_HID_CONFIG_DESC_SIZ] HID_EPIN_ADDR, /* bEndpointAddress: Endpoint Address (IN) */ 0x03, /* bmAttributes: Interrupt endpoint */ - HID_EPIN_SIZE, /* wMaxPacketSize: 4 Byte max */ + HID_EPIN_SIZE, /* wMaxPacketSize: 4 Bytes max */ 0x00, HID_FS_BINTERVAL, /* bInterval: Polling Interval */ /* 34 */ @@ -312,52 +312,44 @@ __ALIGN_BEGIN static uint8_t USBD_HID_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_ __ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END = { - 0x05, 0x01, - 0x09, 0x02, - 0xA1, 0x01, - 0x09, 0x01, - - 0xA1, 0x00, - 0x05, 0x09, - 0x19, 0x01, - 0x29, 0x03, - - 0x15, 0x00, - 0x25, 0x01, - 0x95, 0x03, - 0x75, 0x01, - - 0x81, 0x02, - 0x95, 0x01, - 0x75, 0x05, - 0x81, 0x01, - - 0x05, 0x01, - 0x09, 0x30, - 0x09, 0x31, - 0x09, 0x38, - - 0x15, 0x81, - 0x25, 0x7F, - 0x75, 0x08, - 0x95, 0x03, - - 0x81, 0x06, - 0xC0, 0x09, - 0x3c, 0x05, - 0xff, 0x09, - - 0x01, 0x15, - 0x00, 0x25, - 0x01, 0x75, - 0x01, 0x95, - - 0x02, 0xb1, - 0x22, 0x75, - 0x06, 0x95, - 0x01, 0xb1, - - 0x01, 0xc0 + 0x05, 0x01, /* Usage Page (Generic Desktop Ctrls) */ + 0x09, 0x02, /* Usage (Mouse) */ + 0xA1, 0x01, /* Collection (Application) */ + 0x09, 0x01, /* Usage (Pointer) */ + 0xA1, 0x00, /* Collection (Physical) */ + 0x05, 0x09, /* Usage Page (Button) */ + 0x19, 0x01, /* Usage Minimum (0x01) */ + 0x29, 0x03, /* Usage Maximum (0x03) */ + 0x15, 0x00, /* Logical Minimum (0) */ + 0x25, 0x01, /* Logical Maximum (1) */ + 0x95, 0x03, /* Report Count (3) */ + 0x75, 0x01, /* Report Size (1) */ + 0x81, 0x02, /* Input (Data,Var,Abs) */ + 0x95, 0x01, /* Report Count (1) */ + 0x75, 0x05, /* Report Size (5) */ + 0x81, 0x01, /* Input (Const,Array,Abs) */ + 0x05, 0x01, /* Usage Page (Generic Desktop Ctrls) */ + 0x09, 0x30, /* Usage (X) */ + 0x09, 0x31, /* Usage (Y) */ + 0x09, 0x38, /* Usage (Wheel) */ + 0x15, 0x81, /* Logical Minimum (-127) */ + 0x25, 0x7F, /* Logical Maximum (127) */ + 0x75, 0x08, /* Report Size (8) */ + 0x95, 0x03, /* Report Count (3) */ + 0x81, 0x06, /* Input (Data,Var,Rel) */ + 0xC0, /* End Collection */ + 0x09, 0x3C, /* Usage (Motion Wakeup) */ + 0x05, 0xFF, /* Usage Page (Reserved 0xFF) */ + 0x09, 0x01, /* Usage (0x01) */ + 0x15, 0x00, /* Logical Minimum (0) */ + 0x25, 0x01, /* Logical Maximum (1) */ + 0x75, 0x01, /* Report Size (1) */ + 0x95, 0x02, /* Report Count (2) */ + 0xB1, 0x22, /* Feature (Data,Var,Abs,NoWrp) */ + 0x75, 0x06, /* Report Size (6) */ + 0x95, 0x01, /* Report Count (1) */ + 0xB1, 0x01, /* Feature (Const,Array,Abs,NoWrp) */ + 0xC0 /* End Collection */ }; /** @@ -381,7 +373,7 @@ static uint8_t USBD_HID_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) USBD_HID_HandleTypeDef *hhid; - hhid = USBD_malloc(sizeof(USBD_HID_HandleTypeDef)); + hhid = (USBD_HID_HandleTypeDef *)USBD_malloc(sizeof(USBD_HID_HandleTypeDef)); if (hhid == NULL) { diff --git a/Class/MSC/Src/usbd_msc.c b/Class/MSC/Src/usbd_msc.c index 4b96dbd..09a61a6 100644 --- a/Class/MSC/Src/usbd_msc.c +++ b/Class/MSC/Src/usbd_msc.c @@ -129,14 +129,14 @@ __ALIGN_BEGIN static uint8_t USBD_MSC_CfgHSDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIG 0x00, 0x01, /* bNumInterfaces: 1 interface */ - 0x01, /* bConfigurationValue: */ - 0x04, /* iConfiguration: */ + 0x01, /* bConfigurationValue */ + 0x04, /* iConfiguration */ #if (USBD_SELF_POWERED == 1U) 0xC0, /* bmAttributes: Bus Powered according to user configuration */ #else 0x80, /* bmAttributes: Bus Powered according to user configuration */ #endif - USBD_MAX_POWER, /* MaxPower 100 mA */ + USBD_MAX_POWER, /* MaxPower (mA) */ /******************** Mass Storage interface ********************/ 0x09, /* bLength: Interface Descriptor size */ @@ -147,7 +147,7 @@ __ALIGN_BEGIN static uint8_t USBD_MSC_CfgHSDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIG 0x08, /* bInterfaceClass: MSC Class */ 0x06, /* bInterfaceSubClass : SCSI transparent */ 0x50, /* nInterfaceProtocol */ - 0x05, /* iInterface: */ + 0x05, /* iInterface */ /******************** Mass Storage Endpoints ********************/ 0x07, /* Endpoint descriptor length = 7 */ 0x05, /* Endpoint descriptor type */ @@ -176,21 +176,21 @@ __ALIGN_BEGIN static uint8_t USBD_MSC_CfgFSDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIG 0x00, 0x01, /* bNumInterfaces: 1 interface */ - 0x01, /* bConfigurationValue: */ - 0x04, /* iConfiguration: */ + 0x01, /* bConfigurationValue */ + 0x04, /* iConfiguration */ #if (USBD_SELF_POWERED == 1U) 0xC0, /* bmAttributes: Bus Powered according to user configuration */ #else 0x80, /* bmAttributes: Bus Powered according to user configuration */ #endif - USBD_MAX_POWER, /* MaxPower 100 mA */ + USBD_MAX_POWER, /* MaxPower (mA) */ /******************** Mass Storage interface ********************/ 0x09, /* bLength: Interface Descriptor size */ 0x04, /* bDescriptorType: */ 0x00, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints*/ + 0x02, /* bNumEndpoints */ 0x08, /* bInterfaceClass: MSC Class */ 0x06, /* bInterfaceSubClass : SCSI transparent*/ 0x50, /* nInterfaceProtocol */ @@ -221,25 +221,25 @@ __ALIGN_BEGIN static uint8_t USBD_MSC_OtherSpeedCfgDesc[USB_MSC_CONFIG_DESC_SIZ] 0x00, 0x01, /* bNumInterfaces: 1 interface */ - 0x01, /* bConfigurationValue: */ - 0x04, /* iConfiguration: */ + 0x01, /* bConfigurationValue */ + 0x04, /* iConfiguration */ #if (USBD_SELF_POWERED == 1U) 0xC0, /* bmAttributes: Bus Powered according to user configuration */ #else 0x80, /* bmAttributes: Bus Powered according to user configuration */ #endif - USBD_MAX_POWER, /* MaxPower 100 mA */ + USBD_MAX_POWER, /* MaxPower (mA) */ /******************** Mass Storage interface ********************/ 0x09, /* bLength: Interface Descriptor size */ - 0x04, /* bDescriptorType: */ + 0x04, /* bDescriptorType */ 0x00, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x02, /* bNumEndpoints */ 0x08, /* bInterfaceClass: MSC Class */ 0x06, /* bInterfaceSubClass : SCSI transparent command set */ 0x50, /* nInterfaceProtocol */ - 0x05, /* iInterface: */ + 0x05, /* iInterface */ /******************** Mass Storage Endpoints ********************/ 0x07, /* Endpoint descriptor length = 7 */ 0x05, /* Endpoint descriptor type */ @@ -293,7 +293,7 @@ uint8_t USBD_MSC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) UNUSED(cfgidx); USBD_MSC_BOT_HandleTypeDef *hmsc; - hmsc = USBD_malloc(sizeof(USBD_MSC_BOT_HandleTypeDef)); + hmsc = (USBD_MSC_BOT_HandleTypeDef *)USBD_malloc(sizeof(USBD_MSC_BOT_HandleTypeDef)); if (hmsc == NULL) { diff --git a/Class/Printer/Inc/usbd_printer.h b/Class/Printer/Inc/usbd_printer.h new file mode 100644 index 0000000..ec73edc --- /dev/null +++ b/Class/Printer/Inc/usbd_printer.h @@ -0,0 +1,164 @@ +/** + ****************************************************************************** + * @file usbd_printer.h + * @author MCD Application Team + * @brief header file for the usbd_printer.c file. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2021 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_PRNT_H +#define __USB_PRNT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_ioreq.h" + +/** @addtogroup STM32_USB_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup usbd_PRNT + * @brief This file is the Header file for usbd_PRNT.c + * @{ + */ + + +/** @defgroup usbd_PRNT_Exported_Defines + * @{ + */ +#ifndef PRNT_IN_EP +#define PRNT_IN_EP 0x81U /* Default: EP1 for data IN */ +#endif /* PRNT_IN_EP */ + +#ifndef PRNT_OUT_EP +#define PRNT_OUT_EP 0x01U /* Default: EP1 for data OUT */ +#endif /* PRNT_OUT_EP */ + +#ifndef PRNT_DATA_HS_MAX_PACKET_SIZE +#define PRNT_DATA_HS_MAX_PACKET_SIZE 512U /* Endpoint IN & OUT Packet size */ +#endif /* PRNT_DATA_HS_MAX_PACKET_SIZE */ + +#ifndef PRNT_DATA_FS_MAX_PACKET_SIZE +#define PRNT_DATA_FS_MAX_PACKET_SIZE 64U /* Endpoint IN & OUT Packet size */ +#endif /* PRNT_DATA_FS_MAX_PACKET_SIZE */ + +#define USB_PRNT_CONFIG_DESC_SIZ 32U +#define PRNT_DATA_HS_IN_PACKET_SIZE PRNT_DATA_HS_MAX_PACKET_SIZE +#define PRNT_DATA_HS_OUT_PACKET_SIZE PRNT_DATA_HS_MAX_PACKET_SIZE + +#define PRNT_DATA_FS_IN_PACKET_SIZE PRNT_DATA_FS_MAX_PACKET_SIZE +#define PRNT_DATA_FS_OUT_PACKET_SIZE PRNT_DATA_FS_MAX_PACKET_SIZE + +/*---------------------------------------------------------------------*/ +/* PRNT definitions */ +/*---------------------------------------------------------------------*/ +#define PRNT_STATUS_PAPER_EMPTY 0x10U +#define PRNT_STATUS_SELECTED 0x08U +#define PRNT_STATUS_NO_ERROR 0x00U + +#define USB_PRNT_SUBCLASS 0x01U + +#define USB_PRNT_UNIDIRECTIONAL 0x01U +#define USB_PRNT_BIDIRECTIONAL 0x02U + +/* USB PRNT Request types */ +#define PRNT_GET_DEVICE_ID 0x00U +#define PRNT_GET_PORT_STATUS 0x01U +#define PRNT_SOFT_RESET 0x02U +/** + * @} + */ + + +/** @defgroup USBD_CORE_Exported_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +typedef struct _USBD_PRNT_Itf +{ + int8_t (* Init)(void); + int8_t (* DeInit)(void); + int8_t (* Control_req)(uint8_t req, uint8_t *pbuf, uint16_t *length); + int8_t (* Receive)(uint8_t *Buf, uint32_t *Len); + +} USBD_PRNT_ItfTypeDef; + +typedef struct +{ + uint32_t data[PRNT_DATA_HS_MAX_PACKET_SIZE / 4U]; /* Force 32-bit alignment */ + uint8_t CmdOpCode; + uint8_t CmdLength; + uint8_t *RxBuffer; + uint8_t *TxBuffer; + uint32_t RxLength; + uint32_t TxLength; + + __IO uint32_t TxState; + __IO uint32_t RxState; +} +USBD_PRNT_HandleTypeDef; + + + +/** @defgroup USBD_CORE_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_CORE_Exported_Variables + * @{ + */ + +extern USBD_ClassTypeDef USBD_PRNT; +#define USBD_PRNT_CLASS &USBD_PRNT +/** + * @} + */ + +/** @defgroup USB_CORE_Exported_Functions + * @{ + */ +uint8_t USBD_PRNT_RegisterInterface(USBD_HandleTypeDef *pdev, USBD_PRNT_ItfTypeDef *fops); +uint8_t USBD_PRNT_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff); +uint8_t USBD_PRNT_ReceivePacket(USBD_HandleTypeDef *pdev); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USB_PRNT_H */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Class/Printer/Inc/usbd_printer_if_template.h b/Class/Printer/Inc/usbd_printer_if_template.h new file mode 100644 index 0000000..7037afa --- /dev/null +++ b/Class/Printer/Inc/usbd_printer_if_template.h @@ -0,0 +1,45 @@ +/** + ****************************************************************************** + * @file usbd_printer_if_template.h + * @author MCD Application Team + * @brief Header for usbd_PRNT_if_template.c file. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2021 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, 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/SLA0044 + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_PRNT_IF_TEMPLATE_H +#define __USBD_PRNT_IF_TEMPLATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_printer.h" + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +extern USBD_PRNT_ItfTypeDef USBD_PRNT_Template_fops; + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USBD_PRNT_IF_TEMPLATE_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Class/Printer/Src/usbd_printer.c b/Class/Printer/Src/usbd_printer.c new file mode 100644 index 0000000..246674f --- /dev/null +++ b/Class/Printer/Src/usbd_printer.c @@ -0,0 +1,673 @@ +/** + ****************************************************************************** + * @file usbd_printer.c + * @author MCD Application Team + * @brief This file provides the high layer firmware functions to manage the + * following functionalities of the USB printer Class: + * - Initialization and Configuration of high and low layer + * - Enumeration as printer Device (and enumeration for each implemented memory interface) + * - OUT data transfer + * - Command OUT transfer (class requests management) + * - Error management + * + * @verbatim + * + * =================================================================== + * PRINTER Class Driver Description + * =================================================================== + * This driver manages the "Universal Serial Bus Class Definitions for Communications Devices + * Revision 1.2 November 16, 2007" and the sub-protocol specification of "Universal Serial Bus + * printer Class Subclass Specification for PSTN Devices Revision 1.2 February 9, 2007" + * This driver implements the following aspects of the specification: + * - Device descriptor management + * - Configuration descriptor management + * - Enumeration as printer device with 2 data endpoints (IN and OUT) + * - Control Requests management (PRNT_GET_DEVICE_ID,PRNT_GET_PORT_STATUS,PRNT_SOFT_RESET) + * - protocol USB_PRNT_BIDIRECTIONAL + * + * + * + * These aspects may be enriched or modified for a specific user application. + * + * This driver doesn't implement the following aspects of the specification + * (but it is possible to manage these features with some modifications on this driver): + * - Any class-specific aspect relative to communication classes should be managed by user application. + * - All communication classes other than PSTN are not managed + * + * @endverbatim + * + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2021 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ + +/* BSPDependencies +- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c" +- "stm32xxxxx_{eval}{discovery}_io.c" +EndBSPDependencies */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_printer.h" +#include "usbd_ctlreq.h" + + +/** @addtogroup STM32_USB_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup USBD_PRNT + * @brief usbd core module + * @{ + */ + +/** @defgroup USBD_PRNT_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ +static uint32_t usbd_PRNT_altset = 0U; + +/** @defgroup USBD_PRNT_Private_Defines + * @{ + */ +/** + * @} + */ + +/** @defgroup USBD_PRNT_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_PRNT_Private_FunctionPrototypes + * @{ + */ +static uint8_t USBD_PRNT_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx); +static uint8_t USBD_PRNT_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx); +static uint8_t USBD_PRNT_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static uint8_t USBD_PRNT_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum); +static uint8_t USBD_PRNT_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum); + +static uint8_t *USBD_PRNT_GetFSCfgDesc(uint16_t *length); +static uint8_t *USBD_PRNT_GetHSCfgDesc(uint16_t *length); +static uint8_t *USBD_PRNT_GetOtherSpeedCfgDesc(uint16_t *length); +static uint8_t *USBD_PRNT_GetOtherSpeedCfgDesc(uint16_t *length); +uint8_t *USBD_PRNT_GetDeviceQualifierDescriptor(uint16_t *length); + +/* USB Standard Device Descriptor */ +__ALIGN_BEGIN static uint8_t USBD_PRNT_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = +{ + USB_LEN_DEV_QUALIFIER_DESC, + USB_DESC_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x01, + 0x00, +}; + +/** + * @} + */ + +/** @defgroup USBD_PRNT_Private_Variables + * @{ + */ + +/* PRNT interface class callbacks structure */ +USBD_ClassTypeDef USBD_PRNT = +{ + USBD_PRNT_Init, + USBD_PRNT_DeInit, + USBD_PRNT_Setup, + NULL, + NULL, + USBD_PRNT_DataIn, + USBD_PRNT_DataOut, + NULL, + NULL, + NULL, + USBD_PRNT_GetHSCfgDesc, + USBD_PRNT_GetFSCfgDesc, + USBD_PRNT_GetOtherSpeedCfgDesc, + USBD_PRNT_GetDeviceQualifierDescriptor, +}; + +/* USB PRNT device Configuration Descriptor */ +__ALIGN_BEGIN static uint8_t USBD_PRNT_CfgHSDesc[] __ALIGN_END = +{ + /*Configuration Descriptor*/ + 0x09, /* bLength: Configuration Descriptor size */ + USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ + USB_PRNT_CONFIG_DESC_SIZ, /* wTotalLength:no of returned bytes */ + 0x00, + 0x01, /* bNumInterfaces: 1 interface */ + 0x01, /* bConfigurationValue: Configuration value */ + 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ +#if (USBD_SELF_POWERED == 1U) + 0xC0, /* bmAttributes: Self Powered according to user configuration */ +#else + 0x80, /* bmAttributes: Bus Powered according to user configuration */ +#endif + USBD_MAX_POWER, /* MaxPower in mA */ + + /* Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: 2 endpoints used */ + 0x07, /* bInterfaceClass: Communication Interface Class */ + 0x01, /* bInterfaceSubClass: Abstract Control Model */ + USB_PRNT_BIDIRECTIONAL, /* bDeviceProtocol */ + 0x00, /* iInterface */ + + /* Endpoint IN Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + PRNT_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(PRNT_DATA_HS_IN_PACKET_SIZE), /* wMaxPacketSize */ + HIBYTE(PRNT_DATA_HS_IN_PACKET_SIZE), + 0x00, /* bInterval */ + + /* Endpoint OUT Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + PRNT_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(PRNT_DATA_HS_OUT_PACKET_SIZE),/* wMaxPacketSize */ + HIBYTE(PRNT_DATA_HS_OUT_PACKET_SIZE), + 0x00 /* bInterval */ +}; + + +/* USB PRNT device Configuration Descriptor */ +__ALIGN_BEGIN static uint8_t USBD_PRNT_CfgFSDesc[] __ALIGN_END = +{ + /*Configuration Descriptor*/ + 0x09, /* bLength: Configuration Descriptor size */ + USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ + USB_PRNT_CONFIG_DESC_SIZ, /* wTotalLength:no of returned bytes */ + 0x00, + 0x01, /* bNumInterfaces: 1 interface */ + 0x01, /* bConfigurationValue: Configuration value */ + 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ +#if (USBD_SELF_POWERED == 1U) + 0xC0, /* bmAttributes: Self Powered according to user configuration */ +#else + 0x80, /* bmAttributes: Bus Powered according to user configuration */ +#endif + USBD_MAX_POWER, /* MaxPower in mA */ + + /*Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: 2 endpoints used */ + 0x07, /* bInterfaceClass: Communication Interface Class */ + 0x01, /* bInterfaceSubClass: Abstract Control Model */ + USB_PRNT_BIDIRECTIONAL, /* bDeviceProtocol */ + 0x00, /* iInterface */ + + /*Endpoint IN Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + PRNT_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(PRNT_DATA_FS_IN_PACKET_SIZE), /* wMaxPacketSize */ + HIBYTE(PRNT_DATA_FS_IN_PACKET_SIZE), + 0x00, /* bInterval */ + + /*Endpoint OUT Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + PRNT_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(PRNT_DATA_FS_OUT_PACKET_SIZE),/* wMaxPacketSize */ + HIBYTE(PRNT_DATA_FS_OUT_PACKET_SIZE), + 0x00 /* bInterval */ +}; + +__ALIGN_BEGIN static uint8_t USBD_PRNT_OtherSpeedCfgDesc[] __ALIGN_END = +{ + /*Configuration Descriptor*/ + 0x09, /* bLength: Configuration Descriptor size */ + USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ + USB_PRNT_CONFIG_DESC_SIZ, /* wTotalLength:no of returned bytes */ + 0x00, + 0x01, /* bNumInterfaces: 1 interface */ + 0x01, /* bConfigurationValue: Configuration value */ + 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ +#if (USBD_SELF_POWERED == 1U) + 0xC0, /* bmAttributes: Self Powered according to user configuration */ +#else + 0x80, /* bmAttributes: Bus Powered according to user configuration */ +#endif + USBD_MAX_POWER, /* MaxPower in mA */ + + /*Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: 2 endpoints used */ + 0x07, /* bInterfaceClass: Communication Interface Class */ + 0x01, /* bInterfaceSubClass: Abstract Control Model */ + USB_PRNT_BIDIRECTIONAL, /* bDeviceProtocol */ + 0x00, /* iInterface */ + + /*Endpoint IN Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + PRNT_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(PRNT_DATA_FS_IN_PACKET_SIZE), /* wMaxPacketSize */ + HIBYTE(PRNT_DATA_FS_IN_PACKET_SIZE), + 0x00, /* bInterval */ + + /*Endpoint OUT Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + PRNT_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(PRNT_DATA_FS_OUT_PACKET_SIZE),/* wMaxPacketSize */ + HIBYTE(PRNT_DATA_FS_OUT_PACKET_SIZE), + 0x00 /* bInterval */ +}; + +/** + * @} + */ + +/** @defgroup USBD_PRNT_Private_Functions + * @{ + */ + +/** + * @brief USBD_PRNT_Init + * Initialize the PRNT interface + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t USBD_PRNT_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) +{ + UNUSED(cfgidx); + + USBD_PRNT_HandleTypeDef *hPRNT; + uint16_t mps; + hPRNT = (USBD_PRNT_HandleTypeDef *)USBD_malloc(sizeof(USBD_PRNT_HandleTypeDef)); + + if (hPRNT == NULL) + { + pdev->pClassData = NULL; + return (uint8_t)USBD_EMEM; + } + + /* Setup the pClassData pointer */ + pdev->pClassData = (void *)hPRNT; + + /* Setup the max packet size according to selected speed */ + if (pdev->dev_speed == USBD_SPEED_HIGH) + { + mps = PRNT_DATA_HS_IN_PACKET_SIZE; + } + else + { + mps = PRNT_DATA_FS_IN_PACKET_SIZE; + } + + /* Open EP IN */ + (void)USBD_LL_OpenEP(pdev, PRNT_IN_EP, USBD_EP_TYPE_BULK, mps); + + /* Set endpoint as used */ + pdev->ep_in[PRNT_IN_EP & 0xFU].is_used = 1U; + + /* Open EP OUT */ + (void)USBD_LL_OpenEP(pdev, PRNT_OUT_EP, USBD_EP_TYPE_BULK, mps); + + /* Set endpoint as used */ + pdev->ep_out[PRNT_OUT_EP & 0xFU].is_used = 1U; + + /* Init physical Interface components */ + ((USBD_PRNT_ItfTypeDef *)pdev->pUserData)->Init(); + + /* Prepare Out endpoint to receive next packet */ + (void)USBD_LL_PrepareReceive(pdev, PRNT_OUT_EP, hPRNT->RxBuffer, mps); + + /* End of initialization phase */ + return (uint8_t)USBD_OK; +} + +/** + * @brief USBD_PRNT_DeInit + * DeInitialize the PRNT layer + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t USBD_PRNT_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) +{ + UNUSED(cfgidx); + + /* Close EP IN */ + (void)USBD_LL_CloseEP(pdev, PRNT_IN_EP); + pdev->ep_in[PRNT_IN_EP & 0xFU].is_used = 0U; + + /* Close EP OUT */ + (void)USBD_LL_CloseEP(pdev, PRNT_OUT_EP); + pdev->ep_out[PRNT_OUT_EP & 0xFU].is_used = 0U; + + /* DeInit physical Interface components */ + if (pdev->pClassData != NULL) + { + ((USBD_PRNT_ItfTypeDef *)pdev->pUserData)->DeInit(); + (void)USBD_free(pdev->pClassData); + pdev->pClassData = NULL; + } + + return 0U; +} + +/** + * @brief USBD_PRNT_Setup + * Handle the PRNT specific requests + * @param pdev: instance + * @param req: usb requests + * @retval status + */ +static uint8_t USBD_PRNT_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) +{ + USBD_PRNT_HandleTypeDef *hPRNT = (USBD_PRNT_HandleTypeDef *)pdev->pClassData; + USBD_PRNT_ItfTypeDef *hPRNTitf = (USBD_PRNT_ItfTypeDef *)pdev->pUserData; + + USBD_StatusTypeDef ret = USBD_OK; + uint16_t status_info = 0U; + uint16_t data_length; + + switch (req->bmRequest & USB_REQ_TYPE_MASK) + { + case USB_REQ_TYPE_CLASS : + if (req->wLength != 0U) + { + data_length = MIN(req->wLength, PRNT_DATA_HS_MAX_PACKET_SIZE); + + if ((req->bmRequest & 0x80U) != 0U) + { + /* Call the User class interface function to process the command */ + hPRNTitf->Control_req(req->bRequest, (uint8_t *)hPRNT->data, &data_length); + + /* Return the answer to host */ + (void) USBD_CtlSendData(pdev, (uint8_t *)hPRNT->data, data_length); + } + else + { + /* Prepare for control data reception */ + (void) USBD_CtlPrepareRx(pdev, (uint8_t *)hPRNT->data, data_length); + } + } + else + { + data_length = 0U; + hPRNTitf->Control_req(req->bRequest, (uint8_t *)req, &data_length); + } + break; + + case USB_REQ_TYPE_STANDARD: + switch (req->bRequest) + { + case USB_REQ_GET_STATUS: + if (pdev->dev_state == USBD_STATE_CONFIGURED) + { + (void)USBD_CtlSendData(pdev, (uint8_t *)&status_info, 2U); + } + else + { + USBD_CtlError(pdev, req); + ret = USBD_FAIL; + } + break; + + case USB_REQ_GET_INTERFACE: + if (pdev->dev_state == USBD_STATE_CONFIGURED) + { + (void)USBD_CtlSendData(pdev, (uint8_t *)&usbd_PRNT_altset, 1U); + } + else + { + USBD_CtlError(pdev, req); + ret = USBD_FAIL; + } + break; + + case USB_REQ_SET_INTERFACE: + if (pdev->dev_state != USBD_STATE_CONFIGURED) + { + USBD_CtlError(pdev, req); + ret = USBD_FAIL; + } + break; + + case USB_REQ_CLEAR_FEATURE: + break; + + default: + USBD_CtlError(pdev, req); + ret = USBD_FAIL; + break; + } + break; + + default: + USBD_CtlError(pdev, req); + ret = USBD_FAIL; + break; + } + + return (uint8_t)ret; +} + +/** + * @brief USBD_PRNT_DataIn + * Data sent on non-control IN endpoint + * @param pdev: device instance + * @param epnum: endpoint number + * @retval status + */ +static uint8_t USBD_PRNT_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) +{ + USBD_PRNT_HandleTypeDef *hPRNT = (USBD_PRNT_HandleTypeDef *)pdev->pClassData; + PCD_HandleTypeDef *hpcd = pdev->pData; + + if (hPRNT == NULL) + { + return (uint8_t)USBD_FAIL; + } + + if ((pdev->ep_in[epnum].total_length > 0U) && + ((pdev->ep_in[epnum].total_length % hpcd->IN_ep[epnum].maxpacket) == 0U)) + { + /* Update the packet total length */ + pdev->ep_in[epnum].total_length = 0U; + + /* Send ZLP */ + (void) USBD_LL_Transmit(pdev, epnum, NULL, 0U); + } + else + { + hPRNT->TxState = 0U; + } + + return (uint8_t)USBD_OK; +} +/** + * @brief USBD_PRNT_DataOut + * Data received on non-control Out endpoint + * @param pdev: device instance + * @param epnum: endpoint number + * @retval status + */ +static uint8_t USBD_PRNT_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) +{ + USBD_PRNT_HandleTypeDef *hPRNT = (USBD_PRNT_HandleTypeDef *)pdev->pClassData; + + if (hPRNT == NULL) + { + return (uint8_t)USBD_FAIL; + } + + /* Get the received data length */ + hPRNT->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 */ + ((USBD_PRNT_ItfTypeDef *)pdev->pUserData)->Receive(hPRNT->RxBuffer, &hPRNT->RxLength); + + return (uint8_t)USBD_OK; +} + +/** + * @brief USBD_PRNT_GetFSCfgDesc + * Return configuration descriptor + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +static uint8_t *USBD_PRNT_GetFSCfgDesc(uint16_t *length) +{ + *length = (uint16_t) sizeof(USBD_PRNT_CfgFSDesc); + return USBD_PRNT_CfgFSDesc; +} + +/** + * @brief USBD_PRNT_GetHSCfgDesc + * Return configuration descriptor + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +static uint8_t *USBD_PRNT_GetHSCfgDesc(uint16_t *length) +{ + *length = (uint16_t) sizeof(USBD_PRNT_CfgHSDesc); + return USBD_PRNT_CfgHSDesc; +} + +/** + * @brief USBD_PRNT_GetOtherSpeedCfgDesc + * Return configuration descriptor + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +static uint8_t *USBD_PRNT_GetOtherSpeedCfgDesc(uint16_t *length) +{ + *length = (uint16_t) sizeof(USBD_PRNT_OtherSpeedCfgDesc); + return USBD_PRNT_OtherSpeedCfgDesc; +} + +/** + * @brief USBD_PRNT_GetDeviceQualifierDescriptor + * return Device Qualifier descriptor + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +uint8_t *USBD_PRNT_GetDeviceQualifierDescriptor(uint16_t *length) +{ + *length = (uint16_t)sizeof(USBD_PRNT_DeviceQualifierDesc); + return USBD_PRNT_DeviceQualifierDesc; +} + +/** + * @brief USBD_PRNT_RegisterInterface + * @param pdev: device instance + * @param fops: Interface callbacks + * @retval status + */ +uint8_t USBD_PRNT_RegisterInterface(USBD_HandleTypeDef *pdev, USBD_PRNT_ItfTypeDef *fops) +{ + /* Check if the fops pointer is valid */ + if (fops == NULL) + { + return (uint8_t)USBD_FAIL; + } + + /* Setup the fops pointer */ + pdev->pUserData = fops; + + return (uint8_t)USBD_OK; +} + +/** + * @brief USBD_PRNT_SetRxBuffer + * @param pdev: device instance + * @param pbuff: Rx Buffer + * @retval status + */ +uint8_t USBD_PRNT_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff) +{ + USBD_PRNT_HandleTypeDef *hPRNT = (USBD_PRNT_HandleTypeDef *) pdev->pClassData; + + hPRNT->RxBuffer = pbuff; + + return (uint8_t)USBD_OK; +} + +/** + * @brief USBD_PRNT_ReceivePacket + * prepare OUT Endpoint for reception + * @param pdev: device instance + * @retval status + */ +uint8_t USBD_PRNT_ReceivePacket(USBD_HandleTypeDef *pdev) +{ + USBD_PRNT_HandleTypeDef *hPRNT = (USBD_PRNT_HandleTypeDef *)pdev->pClassData; + + if (hPRNT == NULL) + { + return (uint8_t)USBD_FAIL; + } + + if (pdev->dev_speed == USBD_SPEED_HIGH) + { + /* Prepare Out endpoint to receive next packet */ + (void)USBD_LL_PrepareReceive(pdev, PRNT_OUT_EP, hPRNT->RxBuffer, + PRNT_DATA_HS_OUT_PACKET_SIZE); + } + else + { + /* Prepare Out endpoint to receive next packet */ + (void)USBD_LL_PrepareReceive(pdev, PRNT_OUT_EP, hPRNT->RxBuffer, + PRNT_DATA_FS_OUT_PACKET_SIZE); + } + + return (uint8_t)USBD_OK; +} +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Class/Printer/Src/usbd_printer_if_template.c b/Class/Printer/Src/usbd_printer_if_template.c new file mode 100644 index 0000000..064c41e --- /dev/null +++ b/Class/Printer/Src/usbd_printer_if_template.c @@ -0,0 +1,218 @@ +/** + ****************************************************************************** + * @file usbd_printer_if_template.c + * @author MCD Application Team + * @brief Generic media access Layer. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2021 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, 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/SLA0044 + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_printer_if_template.h" + +/** @addtogroup STM32_USB_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup USBD_PRNT + * @brief usbd core module + * @{ + */ + +/** @defgroup USBD_PRNT_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_PRNT_Private_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_PRNT_Private_Macros + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_PRNT_Private_FunctionPrototypes + * @{ + */ + +static int8_t TEMPLATE_Init(void); +static int8_t TEMPLATE_DeInit(void); +static int8_t TEMPLATE_Control_req(uint8_t req, uint8_t *pbuf, uint16_t *length); +static int8_t TEMPLATE_Receive(uint8_t *pbuf, uint32_t *Len); + +/*printer Private function prototypes*/ +void TEMPLATE_PRNT_PageEndManager(uint8_t *Buf, uint32_t Len); + +USBD_PRNT_ItfTypeDef USBD_PRNT_Template_fops = +{ + TEMPLATE_Init, + TEMPLATE_DeInit, + TEMPLATE_Control_req + TEMPLATE_Receive +}; + +static uint8_t PRNT_DEVICE_ID[DEVICE_ID_LEN] = +{ + 0x00, 0x6D, + 'M', 'A', 'N', 'U', 'F', 'A', 'C', 'T', 'U', 'R', 'E', 'R', ':', + 'S', 'T', 'M', 'i', 'c', 'r', 'o', 'e', 'l', 'e', 'c', 't', 'r', 'o', 'n', 'i', 'c', 's', ';', + 'C', 'O', 'M', 'M', 'A', 'N', 'D', ' ', 'S', 'E', 'T', ':', + 'P', 'D', 'L', ',', 'P', 'C', 'P', ';', + 'M', 'O', 'D', 'E', 'L', ':', + 'U', 'S', 'B', 'P', 'r', 'i', 'n', 't', 'e', 'r', ';', + 'C', 'O', 'M', 'M', 'E', 'N', 'T', ':', + 'G', 'o', 'o', 'd', ' ', '!', ';', + 'A', 'C', 'T', 'I', 'V', 'E', ' ', 'C', 'O', 'M', 'M', 'A', 'N', 'D', ' ', 'S', 'E', 'T', ':', + 'P', 'C', 'P', ';' +}; + +/* Private functions ---------------------------------------------------------*/ + +/** + * @brief TEMPLATE_Init + * Initializes the PRNT media low layer + * @param None + * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL + */ +static int8_t TEMPLATE_Init(void) +{ + /* + Add your initialization code here + */ + return (0); +} + +/** + * @brief TEMPLATE_DeInit + * DeInitializes the PRNT media low layer + * @param None + * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL + */ +static int8_t TEMPLATE_DeInit(void) +{ + /* + Add your deinitialization code here + */ + return (0); +} + + +/** + * @brief TEMPLATE_Receive + * Data received over USB OUT endpoint are sent over PRNT interface + * through this function. + * + * @note + * This function will issue a NAK packet on any OUT packet received on + * USB endpoint untill exiting this function. If you exit this function + * before transfer is complete on PRNT interface (ie. using DMA controller) + * it will result in receiving more data while previous ones are still + * not sent. + * + * @param Buf: Buffer of data to be received + * @param Len: Number of data received (in bytes) + * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL + */ +static int8_t TEMPLATE_Receive(uint8_t *Buf, uint32_t *Len) +{ + UNUSED(Buf); + UNUSED(Len); + + return (0); +} + + +/** + * @brief TEMPLATE_PRNT_Itf_Control_req + * Manage the PRNT class requests + * @param req: Command code + * @param pbuf: Buffer containing command data (request parameters) + * @param length: Number of data to be sent (in bytes) + * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL + */ +static int8_t TEMPLATE_PRNT_Itf_Control_req(uint8_t req, uint8_t *pbuf, uint16_t *length) +{ + uint32_t i = 0; + + /* Check on the setup request value */ + switch (req) + { + /* Get Printer Device ID request */ + case PRNT_GET_DEVICE_ID: + /* Not using for loop here due to MISRA-C2012-Rule-16.1 */ + while (i < sizeof(PRNT_DEVICE_ID)) + { + pbuf[i] = PRNT_DEVICE_ID[i]; + i++; + } + *length = i; + break; + + /* Get Printer current status */ + case PRNT_GET_PORT_STATUS: + pbuf[0] = PRNT_STATUS_PAPER_EMPTY | + PRNT_STATUS_SELECTED | + PRNT_STATUS_NO_ERROR; + + *length = 1U; + break; + + /* Printer SOFT RESET request: cleanup pending tasks */ + case PRNT_SOFT_RESET: + (void)f_close(&hSD.MyFile); + break; + + default: + /* Unkown commands are not managed */ + break; +} + +/** +* @brief TEMPLATE_PRNT_PageEndManager, defined by user +* Call this function frequently to check if data is received. +* @param Buf: Buffer of data to be received +* @param Len: Number of data received (in bytes) +*/ +void TEMPLATE_PRNT_PageEndManager(uint8_t *Buf, uint32_t Len) +{ + UNUSED(Buf); + UNUSED(Len); +} +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Class/VIDEO/Inc/usbd_video.h b/Class/VIDEO/Inc/usbd_video.h index 719f210..c92ff76 100644 --- a/Class/VIDEO/Inc/usbd_video.h +++ b/Class/VIDEO/Inc/usbd_video.h @@ -453,5 +453,8 @@ uint8_t USBD_VIDEO_RegisterInterface(USBD_HandleTypeDef *pdev, USBD_VIDEO_ItfTyp * @} */ +#ifdef __cplusplus +} +#endif #endif /* _USBD_VIDEO_H_ */ diff --git a/Class/VIDEO/Src/usbd_video.c b/Class/VIDEO/Src/usbd_video.c index 93e59ed..a414ed6 100644 --- a/Class/VIDEO/Src/usbd_video.c +++ b/Class/VIDEO/Src/usbd_video.c @@ -138,7 +138,7 @@ __ALIGN_BEGIN static uint8_t USBD_VIDEO_CfgDesc[] __ALIGN_END = USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ LOBYTE(UVC_CONFIG_DESC_SIZ), /* wTotalLength: no of returned bytes */ HIBYTE(UVC_CONFIG_DESC_SIZ), - 0x02, /* bNumInterfaces: 2 interface */ + 0x02, /* bNumInterfaces: 2 interfaces */ 0x01, /* bConfigurationValue: Configuration value */ 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ #if (USBD_SELF_POWERED == 1U) @@ -260,7 +260,11 @@ __ALIGN_BEGIN static uint8_t USBD_VIDEO_CfgDesc[] __ALIGN_END = CS_INTERFACE, /* bDescriptorType */ VS_FRAME_SUBTYPE, /* bDescriptorSubType */ 0x01, /* bFrameIndex */ +#ifdef USBD_UVC_FORMAT_UNCOMPRESSED + 0x00, /* bmCapabilities: no till image capture */ +#else 0x02, /* bmCapabilities: fixed frame rate supported */ +#endif WBVAL(UVC_WIDTH), /* wWidth: Image Frame Width */ WBVAL(UVC_HEIGHT), /* wHeight: Image Frame Height */ DBVAL(UVC_MIN_BIT_RATE(UVC_CAM_FPS_FS)), /* dwMinBitRate: Minimum supported bit rate in bits/s */ @@ -378,7 +382,7 @@ static uint8_t USBD_VIDEO_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) USBD_VIDEO_HandleTypeDef *hVIDEO; /* Allocate memory for the video control structure */ - hVIDEO = USBD_malloc(sizeof(USBD_VIDEO_HandleTypeDef)); + hVIDEO = (USBD_VIDEO_HandleTypeDef *)USBD_malloc(sizeof(USBD_VIDEO_HandleTypeDef)); /* Check if allocated point is NULL, then exit with error code */ if (hVIDEO == NULL) @@ -518,7 +522,7 @@ static uint8_t USBD_VIDEO_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef case USB_REQ_GET_INTERFACE : if (pdev->dev_state == USBD_STATE_CONFIGURED) { - (void) USBD_CtlSendData(pdev, (uint8_t *)&hVIDEO->interface, 1); + (void)USBD_CtlSendData(pdev, (uint8_t *)&hVIDEO->interface, 1U); } else { @@ -752,7 +756,8 @@ static void VIDEO_REQ_GetCurrent(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef } /* Probe Request */ - (void) USBD_CtlSendData(pdev, (uint8_t *)&video_Probe_Control, req->wLength); + (void)USBD_CtlSendData(pdev, (uint8_t *)&video_Probe_Control, + MIN(req->wLength, sizeof(USBD_VideoControlTypeDef))); } else if (LOBYTE(req->wValue) == (uint8_t)VS_COMMIT_CONTROL) { @@ -768,12 +773,14 @@ static void VIDEO_REQ_GetCurrent(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef } /* Commit Request */ - (void) USBD_CtlSendData(pdev, (uint8_t *)&video_Commit_Control, req->wLength); + (void)USBD_CtlSendData(pdev, (uint8_t *)&video_Commit_Control, + MIN(req->wLength, sizeof(USBD_VideoControlTypeDef))); } else { - /* Send the current mute state */ - (void) USBD_CtlSendData(pdev, hVIDEO->control.data, req->wLength); + /* Send the current state */ + (void) USBD_CtlSendData(pdev, hVIDEO->control.data, + MIN(req->wLength, USB_MAX_EP0_SIZE)); } } } @@ -796,17 +803,20 @@ static void VIDEO_REQ_SetCurrent(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef if (LOBYTE(req->wValue) == (uint8_t)VS_PROBE_CONTROL) { /* Probe Request */ - (void) USBD_CtlPrepareRx(pdev, (uint8_t *)&video_Probe_Control, req->wLength); + (void) USBD_CtlPrepareRx(pdev, (uint8_t *)&video_Probe_Control, + MIN(req->wLength, sizeof(USBD_VideoControlTypeDef))); } else if (LOBYTE(req->wValue) == (uint8_t)VS_COMMIT_CONTROL) { /* Commit Request */ - (void) USBD_CtlPrepareRx(pdev, (uint8_t *)&video_Commit_Control, req->wLength); + (void) USBD_CtlPrepareRx(pdev, (uint8_t *)&video_Commit_Control, + MIN(req->wLength, sizeof(USBD_VideoControlTypeDef))); } else { /* Prepare the reception of the buffer over EP0 */ - (void) USBD_CtlPrepareRx(pdev, hVIDEO->control.data, req->wLength); + (void) USBD_CtlPrepareRx(pdev, hVIDEO->control.data, + MIN(req->wLength, USB_MAX_EP0_SIZE)); } } } @@ -946,8 +956,9 @@ static void *USBD_VIDEO_GetVSFrameDesc(uint8_t *pConfDesc) { pdesc = USBD_VIDEO_GetNextDesc((uint8_t *)pdesc, &ptr); - if ((pdesc->bDescriptorSubType == VS_FRAME_MJPEG) || - (pdesc->bDescriptorSubType == VS_FRAME_UNCOMPRESSED)) + if (((pdesc->bDescriptorSubType == VS_FRAME_MJPEG) || + (pdesc->bDescriptorSubType == VS_FRAME_UNCOMPRESSED)) && + (pdesc->bLength == VS_FRAME_DESC_SIZE)) { pVSFrameDesc = (USBD_VIDEO_VSFrameDescTypeDef *)(void *)pdesc; break; diff --git a/Core/Src/usbd_conf_template.c b/Core/Src/usbd_conf_template.c index 830b039..381988b 100644 --- a/Core/Src/usbd_conf_template.c +++ b/Core/Src/usbd_conf_template.c @@ -169,14 +169,14 @@ uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) /** * @brief Assigns a USB address to the device. * @param pdev: Device handle - * @param ep_addr: Endpoint Number + * @param dev_addr: Endpoint Number * @retval USBD Status */ USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_addr) { UNUSED(pdev); - UNUSED(ep_addr); + UNUSED(dev_addr); return USBD_OK; } diff --git a/Release_Notes.html b/Release_Notes.html index 13005ad..cf3544b 100644 --- a/Release_Notes.html +++ b/Release_Notes.html @@ -893,7 +893,8 @@ ul + +
@@ -923,12 +924,15 @@ ul -
-

Update History

+

Update History

-

V2.7.1 / 18-August-2020

- Main -Changes
-
+

V2.8.0 / 10-Mars-2021

Main +Changes

  • Integration of  new USB device Class driver:
    • USB Printer Class driver based on Universal Serial Bus +Device Class Definition +for +Printing Devices Version 1.1
  • USB All Classes:
    • Fix USB buffer overflow vulnerability for CDC, CDC-ECM, CDC-RNDIS, DFU, AUDIO, CustomHID, and Video Classes
    • fix compilation warning with C++ due to missing casting during class handler allocation
    • Enhance comments of USB configuration descriptors fields
  • USB Video Class:
    • fix missing closing bracket for extern "C" in usbd_video.h
    • fix USBCV test with Uncompressed video format support

V2.7.1 / 18-August-2020

+

Main +Changes

  • USB All Class:
    • @@ -937,7 +941,7 @@ Changes
-

V2.7.0 / 12-August-2020

+

V2.7.0 / 12-August-2020

Main Changes

  • Integration of  new USB device Class driver:
    • USB video Class driver based on USB-IF video class definition version 1.1
@@ -966,7 +970,7 @@ Changes

  • Integra
    • USB Core:
      • Enhance NULL pointer check in Core APIs
      • Allow supporting both USER and USER Class string desc
      • Add support of USB controller which handles packet-size splitting by hardware
      • Avoid compilation warning due macro redefinition
      • change added to USBD_HandleTypeDef structure: dev_state, old_dev_state and ep0_state declaration become volatile to disable compiler optimization
      • Word spelling correction and file indentation improved
      • usbd_conf.h/c Template file updated to suggest using by default a static memory allocation for Class handler
    • USB All Classes
      • Word spelling correction and file indentation improved
      • Allow updating device config descriptor Max power from user code usbd_conf.h using USBD_MAX_POWER define
      • Fix device config descriptor bmAttributes value which depends on user code define USBD_SELF_POWERED
    • USB CDC Class:
      • Class specific request, add protection to limit the maximum data length to be sent by the CDC device
    • USB CustomHID Class:
      • Allow changing CustomHID data EP size from user code
    -

    V2.6.1 / 05-June-2020

    +

    V2.6.1 / 05-June-2020

    @@ -1015,7 +1019,7 @@ compatibility with device library version below v2.6.0
    • Fix minor misra-c 2012 violations
    -

    V2.6.0 / 27-December-2019

    +

    V2.6.0 / 27-December-2019

    Main Changes

    @@ -1039,7 +1043,7 @@ Changes
  • Integration of three new USB device Class drivers:
    • USB CDC ECM Class driver
    • USB CDC RNDIS Microsoft Class driver
    • USB Billboard Class driver
  • Fix mandatory misra-c 2012 violations
  • update user core and class template files
  • USB Core:
    • Fix unexpected EP0 stall during enumeration phase 
    • Improve APIs error management and prevent accessing NULL pointers
  • USB MSC Class:
    • Fix USBCV specific class tests
    • Fix multiple error with SCSI commands handling
    • Protect medium access when host ask for medium ejection
  • USB CDC Class:
    • Add new function to inform user that current IN transfer is completed
    • update transmit and receive APIs to transfer up to 64KB
  • USB AUDIO Class:
    • Fix audio sync start buffer size
    • update user callback periodicTC args by adding pointer to user buffer and size
  • USB CustomHID Class:
    • Rework the OUT transfer complete and prevent automatically re-enabling the OUT EP 
    • Add new user API to restart the OUT transfer: USBD_CUSTOM_HID_ReceivePacket()

V2.5.3 / 30-April-2019

Main +

  • Integration of three new USB device Class drivers:
    • USB CDC ECM Class driver
    • USB CDC RNDIS Microsoft Class driver
    • USB Billboard Class driver
  • Fix mandatory misra-c 2012 violations
  • update user core and class template files
  • USB Core:
    • Fix unexpected EP0 stall during enumeration phase 
    • Improve APIs error management and prevent accessing NULL pointers
  • USB MSC Class:
    • Fix USBCV specific class tests
    • Fix multiple error with SCSI commands handling
    • Protect medium access when host ask for medium ejection
  • USB CDC Class:
    • Add new function to inform user that current IN transfer is completed
    • update transmit and receive APIs to transfer up to 64KB
  • USB AUDIO Class:
    • Fix audio sync start buffer size
    • update user callback periodicTC args by adding pointer to user buffer and size
  • USB CustomHID Class:
    • Rework the OUT transfer complete and prevent automatically re-enabling the OUT EP 
    • Add new user API to restart the OUT transfer: USBD_CUSTOM_HID_ReceivePacket()

V2.5.3 / 30-April-2019

Main Changes

@@ -1062,7 +1066,7 @@ Changes
  • Fix misra-c 2012 high severity violations
  • Core driver:
    • protect shared macros __ALIGN_BEGIN, __ALIGN_END with C directive #ifndef
    • update Core driver and DFU Class driver to use USBD_SUPPORT_USER_STRING_DESC instead of  USBD_SUPPORT_USER_STRING
    •  prevent accessing to NULL pointer if the get descriptor functions are not defined
    • Update on USBD_LL_Resume(),  restore the device state only if the current state is USBD_STATE_SUSPENDED

    V2.5.2 / 27-Mars-2019

    Main +

    • Fix misra-c 2012 high severity violations
    • Core driver:
      • protect shared macros __ALIGN_BEGIN, __ALIGN_END with C directive #ifndef
      • update Core driver and DFU Class driver to use USBD_SUPPORT_USER_STRING_DESC instead of  USBD_SUPPORT_USER_STRING
      •  prevent accessing to NULL pointer if the get descriptor functions are not defined
      • Update on USBD_LL_Resume(),  restore the device state only if the current state is USBD_STATE_SUSPENDED

    V2.5.2 / 27-Mars-2019

    Main Changes

    @@ -1086,7 +1090,7 @@ Changes
  • DFU Class:
    • fix compilation warning due to unreachable - instruction code introduced with CMSIS V5.4.0 NVIC_SystemReset() prototype change

    V2.5.1 / 03-August-2018
    +
    instruction code introduced with CMSIS V5.4.0 NVIC_SystemReset() prototype change

    V2.5.1 / 03-August-2018

    @@ -1128,7 +1132,7 @@ Changes
  • Update license section by adding path to get copy of ST Ultimate Liberty license
  • Core: Fix unexpected stall during status OUT phase
  • DFU Class:
    • rework hdfu struct to prevent unaligned addresses
  • MSC Class:
    • fix lba address overflow during large file transfers > 4Go
  • Template Class:
    • add missing Switch case Break on USBD_Template_Setup API

    V2.5.0 / 15-December-2017
    +
    • Update license section by adding path to get copy of ST Ultimate Liberty license
    • Core: Fix unexpected stall during status OUT phase
    • DFU Class:
      • rework hdfu struct to prevent unaligned addresses
    • MSC Class:
      • fix lba address overflow during large file transfers > 4Go
    • Template Class:
      • add missing Switch case Break on USBD_Template_Setup API

    V2.5.0 / 15-December-2017

    @@ -1170,7 +1174,7 @@ Changes
  • Update license section
  • Update some functions to be MISRAC 2004 compliant
  • Add HS and OtherSpeed configuration descriptor for HID and CustomHID classes
  • Correct error handling in all class setup function
  • Add usbd_desc_template.c/ usbd_desc_template.h templates files
  • Add support of class and vendor request
  • CDC Class: fix zero-length packet issue in bulk IN transfer
  • Fix compilation warning with unused arguments for some functions
  • Improve USB Core enumeration state machine
  • V2.4.2 / 11-December-2015
    +
    • Update license section
    • Update some functions to be MISRAC 2004 compliant
    • Add HS and OtherSpeed configuration descriptor for HID and CustomHID classes
    • Correct error handling in all class setup function
    • Add usbd_desc_template.c/ usbd_desc_template.h templates files
    • Add support of class and vendor request
    • CDC Class: fix zero-length packet issue in bulk IN transfer
    • Fix compilation warning with unused arguments for some functions
    • Improve USB Core enumeration state machine

    V2.4.2 / 11-December-2015

    @@ -1217,7 +1221,7 @@ Changes
    V2.4.1 / 19-June-2015
    +

    V2.4.1 / 19-June-2015

    @@ -1276,7 +1280,7 @@ Changes
    V2.4.0 / 28-February-2015
    +

    V2.4.0 / 28-February-2015

    @@ -1326,7 +1330,7 @@ USBD_CDC_Setup() function to allow correct user implementation of CDC_SET_CONTROL_LINE_STATE and similar no-data setup requests.
    -

    V2.3.0 / 04-November-2014
    +

    V2.3.0 / 04-November-2014

    @@ -1369,7 +1373,7 @@ Changes
    Miscellaneous source code comments update -

    V2.2.0 / 13-June-2014

    +

    V2.2.0 / 13-June-2014

    @@ -1415,7 +1419,7 @@ Changes
    ex. for the HID, the USBD_HID_CLASS macro is defined this way #define USBD_HID_CLASS  &USBD_HID
      and the application code can use the previous definition: &USBD_HID ex. USBD_RegisterClass(&USBD_Device, &USBD_HID) or the new USBD_HID_CLASS ex. USBD_RegisterClass(&USBD_Device, USBD_HID_CLASS) -

    V2.1.0 / 22-April-2014

    +

    V2.1.0 / 22-April-2014

    @@ -1453,7 +1457,7 @@ Changes
    V2.0.0 / 18-February-2014

    +

    V2.0.0 / 18-February-2014

    @@ -1478,14 +1482,14 @@ modified vs. V1.1.0, and thus the 2 versions are not compatible.
    -

    V1.1.0 / 19-March-2012

    +

    V1.1.0 / 19-March-2012

    Main Changes

    -
    • Official support of STM32F4xx devices
    • All source files: license disclaimer text update and add link to the License file on ST Internet.
    • Handle test mode in the set feature request
    • Handle dynamically the USB SELF POWERED feature
    • Handle correctly the USBD_CtlError process to take into account error during Control OUT stage
    • Miscellaneous bug fix

    V1.0.0 / 22-July-2011

    Main +

    • Official support of STM32F4xx devices
    • All source files: license disclaimer text update and add link to the License file on ST Internet.
    • Handle test mode in the set feature request
    • Handle dynamically the USB SELF POWERED feature
    • Handle correctly the USBD_CtlError process to take into account error during Control OUT stage
    • Miscellaneous bug fix

    V1.0.0 / 22-July-2011

    Main Changes

    • First official version for STM32F105/7xx and STM32F2xx devices

    -

    License

    This +

    License

    This software component is licensed by ST under Ultimate Liberty license SLA0044, the "License"; You may not use this component except in compliance with the License. You may obtain a copy of the License at:

    http://www.st.com/SLA0044

    @@ -1498,7 +1502,7 @@ compliance with the License. You may obtain a copy of the License at:

    www.st.com/STM32

    +