summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Mussared <jim.mussared@gmail.com>2023-09-01 16:02:29 +1000
committerDamien George <damien@micropython.org>2023-09-29 16:35:48 +1000
commit61f331374da150f0d9f42d694d56b6b0dc9ee498 (patch)
treed09c8baa05196f1d284acd7641ac821916a83ec1
parentd7f63f994f229610c44af9387cb8c9bad34c03fd (diff)
stm32/usbd_msc_interface: Allow configuring the MSC inquiry response.
This was previously hard-coded to "MicroPy" / "pyboard Flash" / "1.00". Now allow it to be overridden by a board. This work was funded through GitHub Sponsors. Signed-off-by: Jim Mussared <jim.mussared@gmail.com>
-rw-r--r--ports/stm32/mpconfigboard_common.h15
-rw-r--r--ports/stm32/usbd_msc_interface.c30
2 files changed, 31 insertions, 14 deletions
diff --git a/ports/stm32/mpconfigboard_common.h b/ports/stm32/mpconfigboard_common.h
index 611a08252..b6cc7f84d 100644
--- a/ports/stm32/mpconfigboard_common.h
+++ b/ports/stm32/mpconfigboard_common.h
@@ -256,6 +256,21 @@
#define MICROPY_HW_USB_INTERFACE_FS_STRING "Pyboard Interface"
#endif
+// Must be 8 bytes.
+#ifndef MICROPY_HW_USB_MSC_INQUIRY_VENDOR_STRING
+#define MICROPY_HW_USB_MSC_INQUIRY_VENDOR_STRING "MicroPy "
+#endif
+
+// Must be 16 bytes.
+#ifndef MICROPY_HW_USB_MSC_INQUIRY_PRODUCT_STRING
+#define MICROPY_HW_USB_MSC_INQUIRY_PRODUCT_STRING "pyboard Flash "
+#endif
+
+// Must be 4 bytes.
+#ifndef MICROPY_HW_USB_MSC_INQUIRY_REVISION_STRING
+#define MICROPY_HW_USB_MSC_INQUIRY_REVISION_STRING "1.00"
+#endif
+
// Amount of incoming buffer space for each CDC instance.
// This must be 2 or greater, and a power of 2.
#ifndef MICROPY_HW_USB_CDC_RX_DATA_SIZE
diff --git a/ports/stm32/usbd_msc_interface.c b/ports/stm32/usbd_msc_interface.c
index cb1de9684..a294a295b 100644
--- a/ports/stm32/usbd_msc_interface.c
+++ b/ports/stm32/usbd_msc_interface.c
@@ -90,20 +90,17 @@ STATIC const uint8_t usbd_msc_vpd83[4] = {
0x00, 0x00, // page length (additional bytes beyond this entry)
};
-STATIC const int8_t usbd_msc_inquiry_data[36] = {
- 0x00, // peripheral qualifier; peripheral device type
- 0x80, // 0x00 for a fixed drive, 0x80 for a removable drive
- 0x02, // version
- 0x02, // response data format
- (STANDARD_INQUIRY_DATA_LEN - 5), // additional length
- 0x00, // various flags
- 0x00, // various flags
- 0x00, // various flags
- 'M', 'i', 'c', 'r', 'o', 'P', 'y', ' ', // Manufacturer : 8 bytes
- 'p', 'y', 'b', 'o', 'a', 'r', 'd', ' ', // Product : 16 Bytes
- 'F', 'l', 'a', 's', 'h', ' ', ' ', ' ',
- '1', '.', '0', '0', // Version : 4 Bytes
-};
+STATIC const int8_t usbd_msc_inquiry_data[STANDARD_INQUIRY_DATA_LEN] = \
+ "\x00" // peripheral qualifier; peripheral device type
+ "\x80" // 0x00 for a fixed drive, 0x80 for a removable drive
+ "\x02" // version
+ "\x02" // response data format
+ "\x1f" // 0x1f = (STANDARD_INQUIRY_DATA_LEN - 5) = 0x24 - 5
+ "\x00\x00\x00" // various flags
+ MICROPY_HW_USB_MSC_INQUIRY_VENDOR_STRING // 8 bytes
+ MICROPY_HW_USB_MSC_INQUIRY_PRODUCT_STRING // 16 bytes
+ MICROPY_HW_USB_MSC_INQUIRY_REVISION_STRING // 4 bytes
+;
// Set the logical units that will be exposed over MSC
void usbd_msc_init_lu(size_t lu_n, const void *lu_data) {
@@ -210,6 +207,11 @@ STATIC int usbd_msc_Inquiry(uint8_t lun, const uint8_t *params, uint8_t *data_ou
return -1;
}
+ // These strings must be padded to the expected length. (+1 here for null terminator).
+ MP_STATIC_ASSERT(sizeof(MICROPY_HW_USB_MSC_INQUIRY_VENDOR_STRING) == 8 + 1);
+ MP_STATIC_ASSERT(sizeof(MICROPY_HW_USB_MSC_INQUIRY_PRODUCT_STRING) == 16 + 1);
+ MP_STATIC_ASSERT(sizeof(MICROPY_HW_USB_MSC_INQUIRY_REVISION_STRING) == 4 + 1);
+
uint8_t alloc_len = params[3] << 8 | params[4];
int len = MIN(sizeof(usbd_msc_inquiry_data), alloc_len);
memcpy(data_out, usbd_msc_inquiry_data, len);