Skip to content

Commit 4c0b81f

Browse files
[USB] Clean up USB id and string assignment
Previously, there were a few problems: - USB manufacturer string was only configurable when an unknown VID was used. - USB product string would always include CDC/HID and HS/FS indication, it was not possible to specify the full string. - USB PID was always hardcoded, depending on the CDC/HID mode. These hardcoded PIDs are really only valid within the ST PID, so it made now sense that the vid *could* be specified. This commit cleans this up: - Boards must now either specify both the VID and PID, or neither. - When boards specify no VID and PID, they use the ST VID with a pid based on the CDC or HID mode like before. - All boards used to specify the ST vid explicitly in boards.txt, now they do not and rely on the default in the code. - When no USB_MANUFACTURER_STRING is defined (can be in boards.txt or variant.h now), a default is selected based on the VID, or "Unknown" is used if the VID is unknown. - When no USB_PRODUCT_STRING is defined (can be in boards.txt or variant.h now), a default is based on the BOARD_NAME, CDC/HID and FS/HS mode. All included boards should work as before. Third-party board definitions that use this core should be updated: - If build.vid is 0x0483, it should be removed. Otherwise, both vid and pid should be specified. - If build.usb_manufacturer is specified, it should be replaced by adding '-DUSB_MANUFACTURER_STRING="My Company"' to build.extra-flags.
1 parent cc05df9 commit 4c0b81f

File tree

3 files changed

+71
-45
lines changed

3 files changed

+71
-45
lines changed

boards.txt

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ menu.upload_method=Upload method
1515

1616
Nucleo_144.name=Nucleo-144
1717

18-
Nucleo_144.build.vid=0x0483
1918
Nucleo_144.build.core=arduino
2019
Nucleo_144.build.board=Nucleo_144
2120
Nucleo_144.build.extra_flags=-D{build.product_line} {build.enable_usb} {build.xSerial}
@@ -162,7 +161,6 @@ Nucleo_144.menu.upload_method.dfuMethod.upload.tool=stm32CubeProg
162161

163162
Nucleo_64.name=Nucleo-64
164163

165-
Nucleo_64.build.vid=0x0483
166164
Nucleo_64.build.core=arduino
167165
Nucleo_64.build.board=Nucleo_64
168166
Nucleo_64.build.extra_flags=-D{build.product_line} {build.enable_usb} {build.xSerial}
@@ -423,7 +421,6 @@ Nucleo_64.menu.upload_method.dfuMethod.upload.tool=stm32CubeProg
423421

424422
Nucleo_32.name=Nucleo-32
425423

426-
Nucleo_32.build.vid=0x0483
427424
Nucleo_32.build.core=arduino
428425
Nucleo_32.build.board=Nucleo_32
429426
Nucleo_32.build.extra_flags=-D{build.product_line} {build.enable_usb} {build.xSerial}
@@ -517,7 +514,6 @@ Nucleo_32.menu.upload_method.dfuMethod.upload.tool=stm32CubeProg
517514

518515
Disco.name=Discovery
519516

520-
Disco.build.vid=0x0483
521517
Disco.build.core=arduino
522518
Disco.build.board=Disco
523519
Disco.build.extra_flags=-D{build.product_line} {build.enable_usb} {build.xSerial}
@@ -635,7 +631,6 @@ Disco.menu.upload_method.dfuMethod.upload.tool=stm32CubeProg
635631

636632
Eval.name=Eval
637633

638-
Eval.build.vid=0x0483
639634
Eval.build.core=arduino
640635
Eval.build.board=Eval
641636
Eval.build.extra_flags=-D{build.product_line} {build.enable_usb} {build.xSerial}
@@ -668,7 +663,6 @@ Eval.menu.upload_method.dfuMethod.upload.tool=stm32CubeProg
668663

669664
STM32MP1.name=STM32MP1 series coprocessor
670665

671-
STM32MP1.build.vid=0x0483
672666
STM32MP1.build.core=arduino
673667
STM32MP1.build.board=STM32MP1
674668
STM32MP1.build.mcu=cortex-m4
@@ -756,7 +750,6 @@ GenF0.menu.upload_method.dfuMethod.upload.tool=stm32CubeProg
756750
# Generic F1
757751
GenF1.name=Generic STM32F1 series
758752

759-
GenF1.build.vid=0x0483
760753
GenF1.build.core=arduino
761754
GenF1.build.board=GenF1
762755
GenF1.build.mcu=cortex-m3
@@ -894,7 +887,6 @@ GenF1.menu.upload_method.dfuoMethod.build.bootloader_flags=-DBL_LEGACY_LEAF -DVE
894887

895888
GenF3.name=Generic STM32F3 series
896889

897-
GenF3.build.vid=0x0483
898890
GenF3.build.core=arduino
899891
GenF3.build.board=GenF3
900892
GenF3.build.extra_flags=-D{build.product_line} {build.enable_usb} {build.xSerial} {build.bootloader_flags}
@@ -936,7 +928,6 @@ GenF3.menu.upload_method.bmpMethod.upload.tool=bmp_upload
936928

937929
GenF4.name=Generic STM32F4 series
938930

939-
GenF4.build.vid=0x0483
940931
GenF4.build.core=arduino
941932
GenF4.build.board=GenF4
942933
GenF4.build.extra_flags=-D{build.product_line} {build.enable_usb} {build.xSerial} {build.bootloader_flags}
@@ -1123,7 +1114,6 @@ GenF4.menu.upload_method.hidMethod.build.bootloader_flags=-DBL_HID -DVECT_TAB_OF
11231114
# Generic L0
11241115
GenL0.name=Generic STM32L0 series
11251116

1126-
GenL0.build.vid=0x0483
11271117
GenL0.build.core=arduino
11281118
GenL0.build.board=GenL0
11291119
GenL0.build.extra_flags=-D{build.product_line} {build.enable_usb} {build.xSerial} -D__CORTEX_SC=0
@@ -1172,7 +1162,6 @@ GenL0.menu.upload_method.bmpMethod.upload.tool=bmp_upload
11721162

11731163
ESC_board.name=Electronic speed controllers
11741164

1175-
ESC_board.build.vid=0x0483
11761165
ESC_board.build.core=arduino
11771166
ESC_board.build.board=FCE_board
11781167
ESC_board.build.extra_flags=-D{build.product_line} {build.enable_usb} {build.xSerial}
@@ -1209,7 +1198,6 @@ ESC_board.menu.upload_method.dfuMethod.upload.tool=stm32CubeProg
12091198

12101199
LoRa.name=LoRa boards
12111200

1212-
LoRa.build.vid=0x0483
12131201
LoRa.build.core=arduino
12141202
LoRa.build.board=LoRa
12151203
LoRa.build.extra_flags=-D{build.product_line} {build.enable_usb} {build.xSerial}
@@ -1280,7 +1268,6 @@ LoRa.menu.upload_method.dfuMethod.upload.tool=stm32CubeProg
12801268

12811269
3dprinter.name=3D printer boards
12821270

1283-
3dprinter.build.vid=0x0483
12841271
3dprinter.build.core=arduino
12851272
3dprinter.build.board=3dprinter
12861273
3dprinter.build.extra_flags=-D{build.product_line} {build.enable_usb} {build.xSerial}
@@ -1296,8 +1283,6 @@ LoRa.menu.upload_method.dfuMethod.upload.tool=stm32CubeProg
12961283
3dprinter.menu.pnum.ARMED_V1.build.product_line=STM32F407xx
12971284
3dprinter.menu.pnum.ARMED_V1.build.variant=ARMED_V1
12981285
3dprinter.menu.pnum.ARMED_V1.build.cmsis_lib_gcc=arm_cortexM4lf_math
1299-
3dprinter.menu.pnum.ARMED_V1.build.vid=0x0483
1300-
3dprinter.menu.pnum.ARMED_V1.build.pid=0x5740
13011286

13021287
# REMRAM_V1 board
13031288
3dprinter.menu.pnum.REMRAM_V1=RemRam v1
@@ -1446,7 +1431,6 @@ LoRa.menu.upload_method.dfuMethod.upload.tool=stm32CubeProg
14461431

14471432
Genericflight.name=Generic flight controllers
14481433

1449-
Genericflight.build.vid=0x0483
14501434
Genericflight.build.core=arduino
14511435
Genericflight.build.board=Genericflight
14521436
Genericflight.build.extra_flags=-D{build.product_line} {build.enable_usb} {build.xSerial} {build.bootloader_flags}
@@ -1531,7 +1515,6 @@ Genericflight.menu.upload_method.dfuoMethod.build.bootloader_flags=-DBL_LEGACY_L
15311515

15321516
Midatronics.name=Midatronics boards
15331517

1534-
Midatronics.build.vid=0x0483
15351518
Midatronics.build.core=arduino
15361519
Midatronics.build.board=Midatronics
15371520
Midatronics.build.extra_flags=-D{build.product_line} {build.enable_usb} {build.xSerial}

cores/arduino/stm32/usb/usbd_desc.c

Lines changed: 57 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -21,41 +21,75 @@
2121
#include "usbd_core.h"
2222
#include "usbd_desc.h"
2323
#include "utils.h"
24+
#include <variant.h>
2425

2526
/* Private typedef -----------------------------------------------------------*/
2627
/* Private define ------------------------------------------------------------*/
27-
#if USBD_VID == 0x2341
28+
29+
/* USB VID and PID: Either both or neither must be specified. If not
30+
* specified, default to the ST VID, with a PID assigned to HID or a PID
31+
* assigned to CDC devices. */
32+
#if !USBD_PID && !USBD_VID
33+
// Undef the default zero values
34+
#undef USBD_PID
35+
#undef USBD_VID
36+
// Define default values, based on the USB class used
37+
#define USBD_VID 0x0483
38+
#if defined(USBD_USE_HID_COMPOSITE)
39+
#define USBD_PID 0x5711
40+
#elif defined(USBD_USE_CDC)
41+
#define USBD_PID 0x5740
42+
#endif
43+
#endif /* !USBD_PID && !USBD_VID */
44+
45+
#if !USBD_VID || !USBD_PID
46+
#error "USB VID or PID not specified"
47+
#endif
48+
49+
/* Manufacturer string: Use the specified string if specified, guess
50+
based on VID otherwise */
51+
#if defined(USB_MANUFACTURER_STRING)
52+
#define USBD_MANUFACTURER_STRING USB_MANUFACTURER_STRING
53+
#elif USBD_VID == 0x2341
2854
#define USBD_MANUFACTURER_STRING "Arduino LLC"
2955
#elif USBD_VID == 0x2A03
3056
#define USBD_MANUFACTURER_STRING "Arduino srl"
3157
#elif USBD_VID == 0x0483
3258
#define USBD_MANUFACTURER_STRING "STMicroelectronics"
33-
#elif !defined(USB_MANUFACTURER)
34-
// Fall through to unknown if no manufacturer name was provided in a macro
35-
#define USBD_MANUFACTURER_STRING "Unknown"
3659
#else
37-
#define USBD_MANUFACTURER_STRING USB_MANUFACTURER
60+
#define USBD_MANUFACTURER_STRING "Unknown"
3861
#endif
62+
3963
#define USBD_LANGID_STRING 0x409 /* 1033 US.S English */
4064

65+
/* Product string: Use the specified string if specified, construct
66+
based on BOARD_NAME and class otherwise. */
67+
#if defined(USB_PRODUCT_STRING)
68+
#define USBD_CLASS_PRODUCT_HS_STRING USB_PRODUCT_STRING
69+
#define USBD_CLASS_PRODUCT_FS_STRING USB_PRODUCT_STRING
70+
#elif defined(USBD_USE_HID_COMPOSITE)
71+
#define USBD_CLASS_PRODUCT_HS_STRING CONCATS(BOARD_NAME, "HID in HS Mode")
72+
#define USBD_CLASS_PRODUCT_FS_STRING CONCATS(BOARD_NAME, "HID in FS Mode")
73+
#elif defined(USBD_USE_CDC)
74+
#define USBD_CLASS_PRODUCT_HS_STRING CONCATS(BOARD_NAME, "CDC in HS Mode")
75+
#define USBD_CLASS_PRODUCT_FS_STRING CONCATS(BOARD_NAME, "CDC in FS Mode")
76+
#else
77+
#define USBD_CLASS_PRODUCT_HS_STRING CONCATS(BOARD_NAME, "in HS Mode")
78+
#define USBD_CLASS_PRODUCT_FS_STRING CONCATS(BOARD_NAME, "in FS Mode")
79+
#endif
80+
4181
#ifdef USBD_USE_HID_COMPOSITE
42-
#define USBD_CLASS_PID 0x5711
43-
#define USBD_CLASS_PRODUCT_HS_STRING CONCATS(USB_PRODUCT, "HID in HS Mode")
44-
#define USBD_CLASS_PRODUCT_FS_STRING CONCATS(USB_PRODUCT, "HID in FS Mode")
45-
#define USBD_CLASS_CONFIGURATION_HS_STRING CONCATS(USB_PRODUCT, "HID Config")
46-
#define USBD_CLASS_INTERFACE_HS_STRING CONCATS(USB_PRODUCT, "HID Interface")
47-
#define USBD_CLASS_CONFIGURATION_FS_STRING CONCATS(USB_PRODUCT, "HID Config")
48-
#define USBD_CLASS_INTERFACE_FS_STRING CONCATS(USB_PRODUCT, "HID Interface")
82+
#define USBD_CLASS_CONFIGURATION_HS_STRING CONCATS(BOARD_NAME, "HID Config")
83+
#define USBD_CLASS_INTERFACE_HS_STRING CONCATS(BOARD_NAME, "HID Interface")
84+
#define USBD_CLASS_CONFIGURATION_FS_STRING CONCATS(BOARD_NAME, "HID Config")
85+
#define USBD_CLASS_INTERFACE_FS_STRING CONCATS(BOARD_NAME, "HID Interface")
4986
#endif /* USBD_USE_HID_COMPOSITE */
5087

5188
#ifdef USBD_USE_CDC
52-
#define USBD_CLASS_PID 0x5740
53-
#define USBD_CLASS_PRODUCT_HS_STRING CONCATS(USB_PRODUCT, "CDC in HS Mode")
54-
#define USBD_CLASS_PRODUCT_FS_STRING CONCATS(USB_PRODUCT, "CDC in FS Mode")
55-
#define USBD_CLASS_CONFIGURATION_HS_STRING CONCATS(USB_PRODUCT, "CDC Config")
56-
#define USBD_CLASS_INTERFACE_HS_STRING CONCATS(USB_PRODUCT, "CDC Interface")
57-
#define USBD_CLASS_CONFIGURATION_FS_STRING CONCATS(USB_PRODUCT, "CDC Config")
58-
#define USBD_CLASS_INTERFACE_FS_STRING CONCATS(USB_PRODUCT, "CDC Interface")
89+
#define USBD_CLASS_CONFIGURATION_HS_STRING CONCATS(BOARD_NAME, "CDC Config")
90+
#define USBD_CLASS_INTERFACE_HS_STRING CONCATS(BOARD_NAME, "CDC Interface")
91+
#define USBD_CLASS_CONFIGURATION_FS_STRING CONCATS(BOARD_NAME, "CDC Config")
92+
#define USBD_CLASS_INTERFACE_FS_STRING CONCATS(BOARD_NAME, "CDC Interface")
5993
#endif /* USBD_USE_CDC */
6094

6195
/* Private macro -------------------------------------------------------------*/
@@ -99,8 +133,8 @@ __ALIGN_BEGIN uint8_t USBD_Class_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = {
99133
USB_MAX_EP0_SIZE, /* bMaxPacketSize */
100134
LOBYTE(USBD_VID), /* idVendor */
101135
HIBYTE(USBD_VID), /* idVendor */
102-
LOBYTE(USBD_CLASS_PID), /* idVendor */
103-
HIBYTE(USBD_CLASS_PID), /* idVendor */
136+
LOBYTE(USBD_PID), /* idProduct */
137+
HIBYTE(USBD_PID), /* idProduct */
104138
0x00, /* bcdDevice rel. 2.00 */
105139
0x02,
106140
USBD_IDX_MFC_STR, /* Index of manufacturer string */
@@ -123,8 +157,8 @@ __ALIGN_BEGIN uint8_t USBD_Class_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = {
123157
USB_MAX_EP0_SIZE, /* bMaxPacketSize */
124158
LOBYTE(USBD_VID), /* idVendor */
125159
HIBYTE(USBD_VID), /* idVendor */
126-
LOBYTE(USBD_CLASS_PID), /* idVendor */
127-
HIBYTE(USBD_CLASS_PID), /* idVendor */
160+
LOBYTE(USBD_PID), /* idProduct */
161+
HIBYTE(USBD_PID), /* idProduct */
128162
0x00, /* bcdDevice rel. 2.00 */
129163
0x02,
130164
USBD_IDX_MFC_STR, /* Index of manufacturer string */

platform.txt

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,20 @@ compiler.arm.cmsis.ldflags="-L{runtime.tools.CMSIS-5.5.1.path}/CMSIS/DSP/Lib/GCC
6969

7070
# USB Flags
7171
# ---------
72-
build.usb_flags=-DUSBCON {build.usb_speed} -DUSBD_VID={build.vid} '-DUSB_MANUFACTURER={build.usb_manufacturer}' '-DUSB_PRODUCT="{build.board}"' -DHAL_PCD_MODULE_ENABLED
73-
74-
# Default usb manufacturer will be replaced at compile time using
75-
# numeric vendor ID if available or by board's specific value.
76-
build.usb_manufacturer="Unknown"
72+
build.usb_flags=-DUSBCON {build.usb_speed} -DUSBD_VID={build.vid} -DUSBD_PID={build.pid} -DHAL_PCD_MODULE_ENABLED
73+
74+
# Specify defaults for vid/pid, since an empty value is impossible to
75+
# detect in the preprocessor, but a 0 can be checked for.
76+
# Boards should specify either both, or neither of these.
77+
build.vid=0
78+
build.pid=0
79+
80+
# To customize the USB manufacturer or product string, must add defines
81+
# for them, e.g.:
82+
# some_board.build.extra_flags='-DUSB_MANUFACTURER_STRING="My Company"' '-DUSB_PRODUCT_STRING="My Product"'
83+
# This cannot be done using build variables and specifying the -D
84+
# options here, since then the default would be a defined, but empty macro
85+
# that the preprocessor cannot detect.
7786

7887
# Build information's
7988
build.info.flags=-D{build.series} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} -DBOARD_NAME="{build.board}"

0 commit comments

Comments
 (0)