Make USB descriptor less generic

iManufacturer=libreboot.org
iProduct=pico-serprog
iInterface=serprog
iSerial=64-bit ID, unique to each board (actually flash chip)

Since VID and PID are unchanged, functionality stays the same. This makes
it easier to identify the programmer, whether manually or in udev rules.

lsusb output:
Bus 002 Device 025: ID cafe:4001 libreboot.org pico-serprog

dmesg output:
usb 2-1.2: new full-speed USB device number 25 using ehci-pci
usb 2-1.2: New USB device found, idVendor=cafe, idProduct=4001, bcdDevice= 1.00
usb 2-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 2-1.2: Product: pico-serprog
usb 2-1.2: Manufacturer: libreboot.org
usb 2-1.2: SerialNumber: E661A4D417788C29
cdc_acm 2-1.2:1.0: ttyACM0: USB ACM device

Signed-off-by: Riku Viitanen <riku.viitanen@protonmail.com>
This commit is contained in:
Riku Viitanen 2023-09-04 20:12:50 +03:00
parent c8c16e9c11
commit 030bfdfa94
2 changed files with 11 additions and 6 deletions

View File

@ -7,5 +7,5 @@ pico_sdk_init()
add_executable(pico_serprog)
target_sources(pico_serprog PRIVATE main.c usb_descriptors.c)
target_link_libraries(pico_serprog PRIVATE pico_stdlib hardware_spi tinyusb_device)
target_link_libraries(pico_serprog PRIVATE pico_stdlib pico_unique_id hardware_spi tinyusb_device)
pico_add_extra_outputs(pico_serprog)

View File

@ -24,6 +24,7 @@
*/
#include "tusb.h"
#include "pico/unique_id.h"
/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.
* Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.
@ -152,14 +153,16 @@ uint8_t const * tud_descriptor_configuration_cb(uint8_t index)
// String Descriptors
//--------------------------------------------------------------------+
char board_serial[2 * PICO_UNIQUE_BOARD_ID_SIZE_BYTES + 1];
// array of pointer to string descriptors
char const* string_desc_arr [] =
const char* const string_desc_arr [] =
{
(const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)
"TinyUSB", // 1: Manufacturer
"TinyUSB Device", // 2: Product
"123456", // 3: Serials, should use chip ID
"TinyUSB CDC", // 4: CDC Interface
"libreboot.org", // 1: Manufacturer
"pico-serprog", // 2: Product
board_serial, // 3: Serial, should use chip ID
"serprog", // 4: CDC Interface
};
static uint16_t _desc_str[32];
@ -172,6 +175,8 @@ uint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid)
uint8_t chr_count;
pico_get_unique_board_id_string(board_serial, sizeof(board_serial));
if ( index == 0)
{
memcpy(&_desc_str[1], string_desc_arr[0], 2);