From 518b728f1d527a7ffa98e41a3c1974d0547a2119 Mon Sep 17 00:00:00 2001 From: Robert Fisk Date: Tue, 3 May 2016 22:58:39 +1200 Subject: [PATCH] Implement multi-PID support so that Windows will recognise each device class as a separate device. --- Upstream/Inc/usbd_descriptors.h | 4 ++++ .../Class/HID/Src/usbd_hid.c | 4 ++++ .../Class/MSC/Src/usbd_msc.c | 6 ++++++ .../STM32_USB_Device_Library/Core/Inc/usbd_def.h | 3 +++ .../STM32_USB_Device_Library/Core/Src/usbd_core.c | 4 ++++ Upstream/Src/usbd_config.c | 14 +++++++------- Upstream/Src/usbd_descriptors.c | 8 ++++---- 7 files changed, 32 insertions(+), 11 deletions(-) diff --git a/Upstream/Inc/usbd_descriptors.h b/Upstream/Inc/usbd_descriptors.h index edd4188..88c20f6 100755 --- a/Upstream/Inc/usbd_descriptors.h +++ b/Upstream/Inc/usbd_descriptors.h @@ -52,6 +52,9 @@ * @{ */ +#define USBD_PID_LOBYTE_OFFSET 0x0A +#define USBD_PID_HIBYTE_OFFSET 0x0B + /** * @} */ @@ -74,6 +77,7 @@ * @{ */ extern USBD_DescriptorsTypeDef FS_Desc; +extern uint8_t USBD_FS_DeviceDesc[]; extern const int8_t STORAGE_Inquirydata_FS[]; /** * @} diff --git a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/HID/Src/usbd_hid.c b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/HID/Src/usbd_hid.c index c60c011..968d258 100644 --- a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/HID/Src/usbd_hid.c +++ b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/HID/Src/usbd_hid.c @@ -75,6 +75,9 @@ static uint8_t USBD_HID_SendReport (uint8_t *report, +#define USBD_PID_HID 0x0002 + + USBD_ClassTypeDef USBD_HID = { USBD_HID_Init, @@ -92,6 +95,7 @@ USBD_ClassTypeDef USBD_HID = USBD_HID_GetCfgDesc, USBD_HID_GetCfgDesc, USBD_HID_GetDeviceQualifierDesc, + USBD_PID_HID }; diff --git a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c index 5651bc7..09efdb9 100755 --- a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c +++ b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c @@ -69,6 +69,7 @@ * @{ */ + /** * @} */ @@ -122,6 +123,10 @@ uint8_t USBD_MSC_BufferFreed(USBD_HandleTypeDef *pdev); */ +#define USBD_PID_MSC 0x0001 + + + USBD_ClassTypeDef USBD_MSC = { USBD_MSC_Init, @@ -139,6 +144,7 @@ USBD_ClassTypeDef USBD_MSC = USBD_MSC_GetFSCfgDesc, USBD_MSC_GetOtherSpeedCfgDesc, USBD_MSC_GetDeviceQualifierDescriptor, + USBD_PID_MSC }; /* USB Mass storage device Configuration Descriptor */ diff --git a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h index 7218556..24db6eb 100755 --- a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h +++ b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h @@ -177,6 +177,9 @@ typedef struct _Device_cb uint8_t *(*GetFSConfigDescriptor)(uint16_t *length); uint8_t *(*GetOtherSpeedConfigDescriptor)(uint16_t *length); uint8_t *(*GetDeviceQualifierDescriptor)(uint16_t *length); + + uint16_t USBDevPid; + #if (USBD_SUPPORT_USER_STRING == 1) uint8_t *(*GetUsrStrDescriptor)(struct _USBD_HandleTypeDef *pdev ,uint8_t index, uint16_t *length); #endif diff --git a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c index 8353a12..2b3791c 100755 --- a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c +++ b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c @@ -27,6 +27,8 @@ /* Includes ------------------------------------------------------------------*/ #include "usbd_core.h" +#include "usbd_descriptors.h" + /** @addtogroup STM32_USBD_DEVICE_LIBRARY * @{ @@ -159,6 +161,8 @@ USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeD { /* link the class to the USB Device handle */ pdev->pClass = pclass; + USBD_FS_DeviceDesc[USBD_PID_LOBYTE_OFFSET] = LOBYTE(pclass->USBDevPid); + USBD_FS_DeviceDesc[USBD_PID_HIBYTE_OFFSET] = HIBYTE(pclass->USBDevPid); status = USBD_OK; } else diff --git a/Upstream/Src/usbd_config.c b/Upstream/Src/usbd_config.c index dfb9851..9f17249 100755 --- a/Upstream/Src/usbd_config.c +++ b/Upstream/Src/usbd_config.c @@ -169,13 +169,13 @@ void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd) case PCD_SPEED_HIGH: speed = USBD_SPEED_HIGH; break; - case PCD_SPEED_FULL: - speed = USBD_SPEED_FULL; - break; - - default: - speed = USBD_SPEED_FULL; - break; +// case PCD_SPEED_FULL: +// speed = USBD_SPEED_FULL; +// break; +// +// default: +// speed = USBD_SPEED_FULL; +// break; } USBD_SetSpeed(hpcd->pData, speed); diff --git a/Upstream/Src/usbd_descriptors.c b/Upstream/Src/usbd_descriptors.c index 5a06500..c919fe1 100755 --- a/Upstream/Src/usbd_descriptors.c +++ b/Upstream/Src/usbd_descriptors.c @@ -59,15 +59,15 @@ /** @defgroup USBD_DESC_Private_Defines * @{ */ -#define USBD_VID 1155 +#define USBD_VID 0xF000 //TODO: get a real VID :) We also need a separate PID for each supported device class. #define USBD_LANGID_STRING 1033 #define USBD_MANUFACTURER_STRING "The USG is Good, not Bad" -#define USBD_PID_FS 22314 #define USBD_PRODUCT_STRING_FS "USG v1.0" #define USBD_SERIALNUMBER_STRING_FS "00000000001A" #define USBD_CONFIGURATION_STRING_FS "USG multipurpose configuration" #define USBD_INTERFACE_STRING_FS "USG multipurpose interface" + /** * @} */ @@ -121,8 +121,8 @@ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = USB_MAX_EP0_SIZE, /*bMaxPacketSize*/ LOBYTE(USBD_VID), /*idVendor*/ HIBYTE(USBD_VID), /*idVendor*/ - LOBYTE(USBD_PID_FS), /*idVendor*/ - HIBYTE(USBD_PID_FS), /*idVendor*/ + 0x00, //LOBYTE(USBD_PID_FS), /*idVendor*/ + 0x00, //HIBYTE(USBD_PID_FS), /*idVendor*/ 0x00, /*bcdDevice rel. 2.00*/ 0x02, USBD_IDX_MFC_STR, /*Index of manufacturer string*/