firmware: Add descriptors for B2xx mini variants

The current firmware missed descriptors for B200-mini and
B205-mini. Added the missing descriptors.

Also this commit ammends the firmware howto. It specifies
the SDK version we are using as well as some additional
command applied to the SDK files to make the patch successful.

Co-authored-by: Lars Amsel <lars.amsel@emerson.com>
This commit is contained in:
Martin Anderseck 2026-09-17 14:54:53 +02:00 committed by Frank Dietze
parent 155dfbf352
commit 1907032f7b
4 changed files with 210 additions and 122 deletions

View File

@ -9,43 +9,46 @@
#define EEPROM_REV_UNRECOGNIZED -1 #define EEPROM_REV_UNRECOGNIZED -1
#define EEPROM_SIGNATURE_ADDR 0x0000 #define EEPROM_SIGNATURE_ADDR 0x0000
#define EEPROM_SIGNATURE_LENGTH 4 #define EEPROM_SIGNATURE_LENGTH 4
#define EEPROM_REV0_SIGNATURE 0xB2145943 #define EEPROM_REV0_SIGNATURE 0xB2145943
#define EEPROM_REV1_OR_GREATER_SIGNATURE 0xB01A5943 #define EEPROM_REV1_OR_GREATER_SIGNATURE 0xB01A5943
#define EEPROM_REV0_VID_ADDR 0x0006 #define EEPROM_REV0_VID_ADDR 0x0006
#define EEPROM_REV1_VID_ADDR 0x7F06 #define EEPROM_REV1_VID_ADDR 0x7F06
#define EEPROM_VID_LENGTH 2 #define EEPROM_VID_LENGTH 2
#define VID_ETTUS_RESEARCH 0x2500 #define VID_ETTUS_RESEARCH 0x2500
#define VID_NATIONAL_INSTRUMENTS 0x3923 #define VID_NATIONAL_INSTRUMENTS 0x3923
#define VID_CYPRESS 0x04B4 #define VID_CYPRESS 0x04B4
#define EEPROM_REV0_PID_ADDR 0x0004 #define EEPROM_REV0_PID_ADDR 0x0004
#define EEPROM_REV1_PID_ADDR 0x7F08 #define EEPROM_REV1_PID_ADDR 0x7F08
#define EEPROM_PID_LENGTH 2 #define EEPROM_PID_LENGTH 2
#define PID_ETTUS_B200_B210 0x0020 #define PID_ETTUS_B200_B210 0x0020
#define PID_NI_USRP_2900 0x7813 #define PID_ETTUS_B200_MINI 0x0021
#define PID_NI_USRP_2901 0x7814 #define PID_ETTUS_B205_MINI 0x0022
#define PID_ETTUS_B206_MINI 0x0023
#define PID_NI_USRP_2900 0x7813
#define PID_NI_USRP_2901 0x7814
#define PID_CYPRESS_DEFAULT 0x00F0 #define PID_CYPRESS_DEFAULT 0x00F0
#define EEPROM_REV0_SERIAL_ADDR 0x04F7 #define EEPROM_REV0_SERIAL_ADDR 0x04F7
#define EEPROM_REV1_SERIAL_ADDR 0x7F25 #define EEPROM_REV1_SERIAL_ADDR 0x7F25
#define EEPROM_SERIAL_LENGTH 9 #define EEPROM_SERIAL_LENGTH 9
#define EEPROM_REV1_MAGIC_ADDR 0x7F00 #define EEPROM_REV1_MAGIC_ADDR 0x7F00
#define EEPROM_MAGIC_LENGTH 2 #define EEPROM_MAGIC_LENGTH 2
#define EEPROM_EXPECTED_MAGIC 0xB200 #define EEPROM_EXPECTED_MAGIC 0xB200
#define EEPROM_REV1_REV_ADDR 0x7F02 #define EEPROM_REV1_REV_ADDR 0x7F02
#define EEPROM_REV_LENGTH 2 #define EEPROM_REV_LENGTH 2
#define EEPROM_EXPECTED_REV 1 #define EEPROM_EXPECTED_REV 1
#define EEPROM_REV1_COMPAT_ADDR 0x7F04 #define EEPROM_REV1_COMPAT_ADDR 0x7F04
#define EEPROM_COMPAT_LENGTH 2 #define EEPROM_COMPAT_LENGTH 2
#define EEPROM_EXPECTED_COMPAT 1 #define EEPROM_EXPECTED_COMPAT 1
#endif /* _COMMON_CONST_H */ #endif /* _COMMON_CONST_H */

View File

@ -9,96 +9,107 @@
information read from the EEPROM. */ information read from the EEPROM. */
/* Standard Device Descriptor for USB 2.0 */ /* Standard Device Descriptor for USB 2.0 */
unsigned char common_usb2_dev_desc[] = unsigned char common_usb2_dev_desc[] = {
{ 0x12, /* Descriptor size */
0x12, /* Descriptor size */ 0x01, /* CY_U3P_USB_DEVICE_DESCR Device descriptor type */
0x01,/* CY_U3P_USB_DEVICE_DESCR Device descriptor type */ 0x10,
0x10,0x02, /* USB 2.10 */ 0x02, /* USB 2.10 */
0xFF, /* Device class */ 0xFF, /* Device class */
0x00, /* Device sub-class */ 0x00, /* Device sub-class */
0x00, /* Device protocol */ 0x00, /* Device protocol */
0x40, /* Maxpacket size for EP0 : 64 bytes */ 0x40, /* Maxpacket size for EP0 : 64 bytes */
0xB4,0x04, /* Vendor ID */ 0xB4,
0xF0,0x00, /* Product ID */ 0x04, /* Vendor ID */
0x00,0x00, /* Device release number */ 0xF0,
0x01, /* Manufacture string index */ 0x00, /* Product ID */
0x02, /* Product string index */ 0x00,
0x03, /* Serial number string index */ 0x00, /* Device release number */
0x01 /* Number of configurations */ 0x01, /* Manufacture string index */
0x02, /* Product string index */
0x03, /* Serial number string index */
0x01 /* Number of configurations */
}; };
/* Standard Device Descriptor for USB 3.0 */ /* Standard Device Descriptor for USB 3.0 */
unsigned char common_usb3_dev_desc[] = unsigned char common_usb3_dev_desc[] = {
{ 0x12, /* Descriptor size */
0x12, /* Descriptor size */ 0x01, /* CY_U3P_USB_DEVICE_DESCR Device descriptor type */
0x01,/* CY_U3P_USB_DEVICE_DESCR Device descriptor type */ 0x00,
0x00,0x03, /* USB 3.0 */ 0x03, /* USB 3.0 */
0xFF, /* Device class */ 0xFF, /* Device class */
0x00, /* Device sub-class */ 0x00, /* Device sub-class */
0x00, /* Device protocol */ 0x00, /* Device protocol */
0x09, /* Maxpacket size for EP0 : 2^9 */ 0x09, /* Maxpacket size for EP0 : 2^9 */
0xB4,0x04, /* Vendor ID */ 0xB4,
0xF0,0x00, /* Product ID */ 0x04, /* Vendor ID */
0x00,0x00, /* Device release number */ 0xF0,
0x01, /* Manufacture string index */ 0x00, /* Product ID */
0x02, /* Product string index */ 0x00,
0x03, /* Serial number string index */ 0x00, /* Device release number */
0x01 /* Number of configurations */ 0x01, /* Manufacture string index */
0x02, /* Product string index */
0x03, /* Serial number string index */
0x01 /* Number of configurations */
}; };
/* Standard Device Qualifier Descriptor */ /* Standard Device Qualifier Descriptor */
const unsigned char common_dev_qual_desc[] = const unsigned char common_dev_qual_desc[] = {
{ 0x0A, /* Descriptor size */
0x0A, /* Descriptor size */ 0x06, /* CY_U3P_USB_DEVQUAL_DESCR Device qualifier descriptor type */
0x06,/* CY_U3P_USB_DEVQUAL_DESCR Device qualifier descriptor type */ 0x00,
0x00,0x02, /* USB 2.0 */ 0x02, /* USB 2.0 */
0xFF, /* Device class */ 0xFF, /* Device class */
0x00, /* Device sub-class */ 0x00, /* Device sub-class */
0x00, /* Device protocol */ 0x00, /* Device protocol */
0x40, /* Maxpacket size for EP0 : 64 bytes */ 0x40, /* Maxpacket size for EP0 : 64 bytes */
0x01, /* Number of configurations */ 0x01, /* Number of configurations */
0x00 /* Reserved */ 0x00 /* Reserved */
}; };
/* Standard Binary Device Object Store Descriptor */ /* Standard Binary Device Object Store Descriptor */
const unsigned char common_usb_bos_desc[] = const unsigned char common_usb_bos_desc[] = {
{ 0x05, /* Descriptor size */
0x05, /* Descriptor size */ 0x0F, /* CY_U3P_BOS_DESCR Device descriptor type */
0x0F,/* CY_U3P_BOS_DESCR Device descriptor type */ 0x16,
0x16,0x00, /* Length of this descriptor and all sub descriptors */ 0x00, /* Length of this descriptor and all sub descriptors */
0x02, /* Number of device capability descriptors */ 0x02, /* Number of device capability descriptors */
/* USB 2.0 extension */ /* USB 2.0 extension */
0x07, /* Descriptor size */ 0x07, /* Descriptor size */
0x10,/* CY_U3P_DEVICE_CAPB_DESCR Device capability type descriptor */ 0x10, /* CY_U3P_DEVICE_CAPB_DESCR Device capability type descriptor */
0x02,/* CY_U3P_USB2_EXTN_CAPB_TYPE USB 2.0 extension capability type */ 0x02, /* CY_U3P_USB2_EXTN_CAPB_TYPE USB 2.0 extension capability type */
0x02,0x00,0x00,0x00, /* Supported device level features: LPM support */ 0x02,
0x00,
0x00,
0x00, /* Supported device level features: LPM support */
/* SuperSpeed device capability */ /* SuperSpeed device capability */
0x0A, /* Descriptor size */ 0x0A, /* Descriptor size */
0x10,/* CY_U3P_DEVICE_CAPB_DESCR Device capability type descriptor */ 0x10, /* CY_U3P_DEVICE_CAPB_DESCR Device capability type descriptor */
0x03,/* CY_U3P_SS_USB_CAPB_TYPE SuperSpeed device capability type */ 0x03, /* CY_U3P_SS_USB_CAPB_TYPE SuperSpeed device capability type */
0x00, /* Supported device level features */ 0x00, /* Supported device level features */
0x0E,0x00, /* Speeds supported by the device : SS, HS and FS */ 0x0E,
0x03, /* Functionality support */ 0x00, /* Speeds supported by the device : SS, HS and FS */
0x00, /* U1 Device Exit latency */ 0x03, /* Functionality support */
0x00,0x00 /* U2 Device Exit latency */ 0x00, /* U1 Device Exit latency */
0x00,
0x00 /* U2 Device Exit latency */
}; };
/* Standard Language ID String Descriptor */ /* Standard Language ID String Descriptor */
const unsigned char common_string_lang_id_desc[] = const unsigned char common_string_lang_id_desc[] = {
{ 0x04, /* Descriptor Size */
0x04, /* Descriptor Size */ 0x03, /* CY_U3P_USB_STRING_DESCR Device Descriptor Type */
0x03,/* CY_U3P_USB_STRING_DESCR Device Descriptor Type */ 0x09,
0x09,0x04 /* Language ID supported */ 0x04 /* Language ID supported */
}; };
// clang-format off
/* Ettus Manufacturer String Descriptor */ /* Ettus Manufacturer String Descriptor */
const unsigned char common_ettus_manufacturer_desc[] = const unsigned char common_ettus_manufacturer_desc[] =
{ {
0x26, /* Descriptor Size */ 0x26, /* Descriptor Size */
0x03,/* CY_U3P_USB_STRING_DESCR Device Descriptor Type */ 0x03, /* CY_U3P_USB_STRING_DESCR Device Descriptor Type */
'E',0x00, 'E',0x00,
't',0x00, 't',0x00,
't',0x00, 't',0x00,
@ -120,10 +131,10 @@ const unsigned char common_ettus_manufacturer_desc[] =
}; };
/* NI Manufacturer String Descriptor */ /* NI Manufacturer String Descriptor */
const unsigned char common_ni_manufacturer_desc[] = const unsigned char common_ni_manufacturer_desc[] =
{ {
0x36, /* Descriptor Size */ 0x36, /* Descriptor Size */
0x03,/* CY_U3P_USB_STRING_DESCR Device Descriptor Type */ 0x03, /* CY_U3P_USB_STRING_DESCR Device Descriptor Type */
'N',0x00, 'N',0x00,
'a',0x00, 'a',0x00,
't',0x00, 't',0x00,
@ -154,10 +165,25 @@ const unsigned char common_ni_manufacturer_desc[] =
/* Ettus Product String Descriptor */ /* Ettus Product String Descriptor */
const unsigned char common_b200_product_desc[] = const unsigned char common_b200_product_desc[] =
{ {
0x14, /* Descriptor Size */ 0x14, /* Descriptor Size */
0x03,/* CY_U3P_USB_STRING_DESCR Device Descriptor Type */ 0x03, /* CY_U3P_USB_STRING_DESCR Device Descriptor Type */
'U',0x00,
'S',0x00,
'R',0x00,
'P',0x00,
' ',0x00,
'B',0x00,
'2',0x00,
'x',0x00,
'0',0x00
};
const unsigned char common_b200_mini_product_desc[] =
{
0x1E, /* Descriptor Size */
0x03, /* CY_U3P_USB_STRING_DESCR Device Descriptor Type */
'U',0x00, 'U',0x00,
'S',0x00, 'S',0x00,
'R',0x00, 'R',0x00,
@ -166,14 +192,59 @@ const unsigned char common_b200_product_desc[] =
'B',0x00, 'B',0x00,
'2',0x00, '2',0x00,
'0',0x00, '0',0x00,
'0',0x00 '0',0x00,
' ',0x00,
'm',0x00,
'i',0x00,
'n',0x00,
'i',0x00
};
const unsigned char common_b205_mini_product_desc[] =
{
0x1E, /* Descriptor Size */
0x03, /* CY_U3P_USB_STRING_DESCR Device Descriptor Type */
'U',0x00,
'S',0x00,
'R',0x00,
'P',0x00,
' ',0x00,
'B',0x00,
'2',0x00,
'0',0x00,
'5',0x00,
' ',0x00,
'm',0x00,
'i',0x00,
'n',0x00,
'i',0x00
};
const unsigned char common_b206_mini_product_desc[] =
{
0x1E, /* Descriptor Size */
0x03, /* CY_U3P_USB_STRING_DESCR Device Descriptor Type */
'U',0x00,
'S',0x00,
'R',0x00,
'P',0x00,
' ',0x00,
'B',0x00,
'2',0x00,
'0',0x00,
'6',0x00,
' ',0x00,
'm',0x00,
'i',0x00,
'n',0x00,
'i',0x00
}; };
/* NI-USRP 2900 Product String Descriptor */ /* NI-USRP 2900 Product String Descriptor */
const unsigned char common_niusrp_2900_product_desc[] = const unsigned char common_niusrp_2900_product_desc[] =
{ {
0x1A, /* Descriptor Size */ 0x1A, /* Descriptor Size */
0x03,/* CY_U3P_USB_STRING_DESCR Device Descriptor Type */ 0x03, /* CY_U3P_USB_STRING_DESCR Device Descriptor Type */
'N',0x00, 'N',0x00,
'I',0x00, 'I',0x00,
' ',0x00, ' ',0x00,
@ -189,10 +260,10 @@ const unsigned char common_niusrp_2900_product_desc[] =
}; };
/* NI-USRP 2901 Product String Descriptor */ /* NI-USRP 2901 Product String Descriptor */
const unsigned char common_niusrp_2901_product_desc[] = const unsigned char common_niusrp_2901_product_desc[] =
{ {
0x1A, /* Descriptor Size */ 0x1A, /* Descriptor Size */
0x03,/* CY_U3P_USB_STRING_DESCR Device Descriptor Type */ 0x03, /* CY_U3P_USB_STRING_DESCR Device Descriptor Type */
'N',0x00, 'N',0x00,
'I',0x00, 'I',0x00,
' ',0x00, ' ',0x00,
@ -208,10 +279,10 @@ const unsigned char common_niusrp_2901_product_desc[] =
}; };
/* Unknown Product String Descriptor */ /* Unknown Product String Descriptor */
const unsigned char common_unknown_desc[] = const unsigned char common_unknown_desc[] =
{ {
0x10, /* Descriptor Size */ 0x10, /* Descriptor Size */
0x03,/* CY_U3P_USB_STRING_DESCR Device Descriptor Type */ 0x03, /* CY_U3P_USB_STRING_DESCR Device Descriptor Type */
'U',0x00, 'U',0x00,
'n',0x00, 'n',0x00,
'k',0x00, 'k',0x00,
@ -221,17 +292,18 @@ const unsigned char common_unknown_desc[] =
'n',0x00 'n',0x00
}; };
unsigned char common_dev_serial_desc[] = unsigned char common_dev_serial_desc[] =
{ {
0x14, /* Descriptor Size */ 0x14, /* Descriptor Size */
0x03,/* CY_U3P_USB_STRING_DESCR Device Descriptor Type */ 0x03, /* CY_U3P_USB_STRING_DESCR Device Descriptor Type */
'0', 0x00, '0',0x00,
'0', 0x00, '0',0x00,
'0', 0x00, '0',0x00,
'0', 0x00, '0',0x00,
'0', 0x00, '0',0x00,
'0', 0x00, '0',0x00,
'0', 0x00, '0',0x00,
'0', 0x00, '0',0x00,
'0', 0x00 '0',0x00
}; };
//clang-format on

View File

@ -32,9 +32,18 @@ extern const unsigned char common_ettus_manufacturer_desc[];
/* NI Manufacturer String Descriptor */ /* NI Manufacturer String Descriptor */
extern const unsigned char common_ni_manufacturer_desc[]; extern const unsigned char common_ni_manufacturer_desc[];
/* Ettus Product String Descriptor */ /* Ettus B200/B210 Product String Descriptor */
extern const unsigned char common_b200_product_desc[]; extern const unsigned char common_b200_product_desc[];
/* Ettus B200 mini Product String Descriptor */
extern const unsigned char common_b200_mini_product_desc[];
/* Ettus B205 mini Product String Descriptor */
extern const unsigned char common_b205_mini_product_desc[];
/* Ettus B206 mini Product String Descriptor */
extern const unsigned char common_b206_mini_product_desc[];
/* NI-USRP 2900 Product String Descriptor */ /* NI-USRP 2900 Product String Descriptor */
extern const unsigned char common_niusrp_2900_product_desc[]; extern const unsigned char common_niusrp_2900_product_desc[];

View File

@ -12,7 +12,8 @@
/* Check the rev, magic value, and eeprom compatibility field to determine if /* Check the rev, magic value, and eeprom compatibility field to determine if
our eeprom map is up-to-date with what is written on the device */ our eeprom map is up-to-date with what is written on the device */
int eeprom_is_readable(eeprom_read_t read_fn) { int eeprom_is_readable(eeprom_read_t read_fn)
{
/* Only check this once, then store that info */ /* Only check this once, then store that info */
static int is_readable = UNREAD; static int is_readable = UNREAD;
@ -22,16 +23,14 @@ int eeprom_is_readable(eeprom_read_t read_fn) {
int rev = get_rev(read_fn); int rev = get_rev(read_fn);
if (rev == EEPROM_REV_UNRECOGNIZED) if (rev == EEPROM_REV_UNRECOGNIZED) {
{
is_readable = 0; is_readable = 0;
return is_readable; return is_readable;
} }
/* If rev is 0, there's no further checks available */ /* If rev is 0, there's no further checks available */
if (rev == 0) if (rev == 0) {
{
is_readable = 1; is_readable = 1;
return is_readable; return is_readable;
} }
@ -91,7 +90,6 @@ int get_rev(eeprom_read_t read_fn)
} }
/* Read the vendor ID from EEPROM using the function specified*/ /* Read the vendor ID from EEPROM using the function specified*/
uint16_t get_vid(eeprom_read_t read_fn) uint16_t get_vid(eeprom_read_t read_fn)
{ {
@ -189,6 +187,12 @@ const uint8_t* get_product_string_descriptor(uint16_t pid)
{ {
if (pid == PID_ETTUS_B200_B210) { if (pid == PID_ETTUS_B200_B210) {
return common_b200_product_desc; return common_b200_product_desc;
} else if (pid == PID_ETTUS_B200_MINI) {
return common_b200_mini_product_desc;
} else if (pid == PID_ETTUS_B205_MINI) {
return common_b205_mini_product_desc;
} else if (pid == PID_ETTUS_B206_MINI) {
return common_b206_mini_product_desc;
} else if (pid == PID_NI_USRP_2900) { } else if (pid == PID_NI_USRP_2900) {
return common_niusrp_2900_product_desc; return common_niusrp_2900_product_desc;
} else if (pid == PID_NI_USRP_2901) { } else if (pid == PID_NI_USRP_2901) {
@ -196,4 +200,4 @@ const uint8_t* get_product_string_descriptor(uint16_t pid)
} else { } else {
return common_unknown_desc; return common_unknown_desc;
} }
} }