summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBlake Felt <blake.w.felt@gmail.com>2022-09-17 20:34:09 -0600
committerDamien George <damien@micropython.org>2022-11-11 16:33:30 +1100
commiteed4eb2645aa3975ef822f4b34110730811690b7 (patch)
tree176a4ad6645b2190cb5d1d3698e256c0909d2406
parenta513558e3a72b47880faa847de64949e7fc746f6 (diff)
shared/tinyusb: Create common TinyUSB code for reuse by ports.
This code originates from the rp2 port, and the rp2 port has been updated to use this common code.
-rw-r--r--ports/rp2/CMakeLists.txt9
-rw-r--r--ports/rp2/main.c5
-rw-r--r--ports/rp2/mpconfigport.h7
-rw-r--r--ports/rp2/usbd.c39
-rw-r--r--shared/tinyusb/tusb_config.h (renamed from ports/rp2/tusb_config.h)8
-rw-r--r--shared/tinyusb/usbd.c32
-rw-r--r--shared/tinyusb/usbd.h41
-rw-r--r--shared/tinyusb/usbd_descriptor.c (renamed from ports/rp2/tusb_port.c)40
8 files changed, 160 insertions, 21 deletions
diff --git a/ports/rp2/CMakeLists.txt b/ports/rp2/CMakeLists.txt
index 37ac78b73..6037eafbe 100644
--- a/ports/rp2/CMakeLists.txt
+++ b/ports/rp2/CMakeLists.txt
@@ -96,6 +96,8 @@ set(MICROPY_SOURCE_LIB
${MICROPY_DIR}/shared/runtime/sys_stdio_mphal.c
${MICROPY_DIR}/shared/runtime/tinyusb_helpers.c
${MICROPY_DIR}/shared/timeutils/timeutils.c
+ ${MICROPY_DIR}/shared/tinyusb/usbd.c
+ ${MICROPY_DIR}/shared/tinyusb/usbd_descriptor.c
)
set(MICROPY_SOURCE_DRIVERS
@@ -125,8 +127,8 @@ set(MICROPY_SOURCE_PORT
pendsv.c
rp2_flash.c
rp2_pio.c
- tusb_port.c
uart.c
+ usbd.c
msc_disk.c
mbedtls/mbedtls_port.c
)
@@ -233,6 +235,11 @@ if(MICROPY_BLUETOOTH_NIMBLE)
list(APPEND MICROPY_INC_CORE ${NIMBLE_INCLUDE})
endif()
+# tinyusb helper
+target_include_directories(${MICROPY_TARGET} PRIVATE
+ ${MICROPY_DIR}/shared/tinyusb/
+)
+
if (MICROPY_PY_NETWORK_CYW43)
string(CONCAT GIT_SUBMODULES "${GIT_SUBMODULES} " lib/cyw43-driver)
if((NOT (${ECHO_SUBMODULES})) AND NOT EXISTS ${MICROPY_DIR}/lib/cyw43-driver/src/cyw43.h)
diff --git a/ports/rp2/main.c b/ports/rp2/main.c
index 1062236a3..572e9e42c 100644
--- a/ports/rp2/main.c
+++ b/ports/rp2/main.c
@@ -43,6 +43,7 @@
#include "modrp2.h"
#include "mpbthciport.h"
#include "genhdr/mpversion.h"
+#include "usbd.h"
#include "pico/stdlib.h"
#include "pico/binary_info.h"
@@ -87,6 +88,7 @@ int main(int argc, char **argv) {
#if MICROPY_HW_ENABLE_USBDEV
bi_decl(bi_program_feature("USB REPL"))
tusb_init();
+ usbd_reset_all(); // run now just in case usb initialization occurs early
#endif
#if MICROPY_PY_THREAD
@@ -159,6 +161,9 @@ int main(int argc, char **argv) {
machine_pin_init();
rp2_pio_init();
machine_i2s_init0();
+ #if MICROPY_HW_ENABLE_USBDEV
+ usbd_reset_all();
+ #endif
#if MICROPY_PY_BLUETOOTH
mp_bluetooth_hci_init();
diff --git a/ports/rp2/mpconfigport.h b/ports/rp2/mpconfigport.h
index a3725789f..2518a275b 100644
--- a/ports/rp2/mpconfigport.h
+++ b/ports/rp2/mpconfigport.h
@@ -198,6 +198,13 @@ extern const struct _mod_network_nic_type_t mod_network_nic_type_wiznet5k;
// Miscellaneous settings
+#ifndef MICROPY_HW_USB_VID
+#define MICROPY_HW_USB_VID (0x2E8A) // Raspberry Pi
+#endif
+#ifndef MICROPY_HW_USB_PID
+#define MICROPY_HW_USB_PID (0x0005) // RP2 MicroPython
+#endif
+
// Entering a critical section.
extern uint32_t mp_thread_begin_atomic_section(void);
extern void mp_thread_end_atomic_section(uint32_t);
diff --git a/ports/rp2/usbd.c b/ports/rp2/usbd.c
new file mode 100644
index 000000000..38c6dcdd4
--- /dev/null
+++ b/ports/rp2/usbd.c
@@ -0,0 +1,39 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2022 Blake W. Felt
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "usbd.h"
+#include "string.h"
+#include "pico/unique_id.h"
+
+int usbd_serialnumber(uint8_t *buf) {
+ pico_unique_board_id_t id;
+ const int len = 8;
+
+ pico_get_unique_board_id(&id);
+ memcpy(buf, id.id, len);
+
+ return len;
+}
diff --git a/ports/rp2/tusb_config.h b/shared/tinyusb/tusb_config.h
index ce321616a..b50c70260 100644
--- a/ports/rp2/tusb_config.h
+++ b/shared/tinyusb/tusb_config.h
@@ -22,9 +22,11 @@
* THE SOFTWARE.
*
*/
-#ifndef MICROPY_INCLUDED_RP2_TUSB_CONFIG_H
-#define MICROPY_INCLUDED_RP2_TUSB_CONFIG_H
+#ifndef MICROPY_INCLUDED_SHARED_TINYUSB_TUSB_CONFIG_H
+#define MICROPY_INCLUDED_SHARED_TINYUSB_TUSB_CONFIG_H
+
+#include <py/mpconfig.h>
#include "mpconfigport.h"
#define CFG_TUSB_RHPORT0_MODE (OPT_MODE_DEVICE)
@@ -41,4 +43,4 @@
#define CFG_TUD_MSC_BUFSIZE (MICROPY_FATFS_MAX_SS)
#endif
-#endif // MICROPY_INCLUDED_RP2_TUSB_CONFIG_H
+#endif // MICROPY_INCLUDED_SHARED_TINYUSB_TUSB_CONFIG_H
diff --git a/shared/tinyusb/usbd.c b/shared/tinyusb/usbd.c
new file mode 100644
index 000000000..01e04b946
--- /dev/null
+++ b/shared/tinyusb/usbd.c
@@ -0,0 +1,32 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2022 Blake W. Felt
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "py/runtime.h"
+#include "usbd.h"
+
+void usbd_reset_all(void) {
+ usbd_reset_descriptor();
+}
diff --git a/shared/tinyusb/usbd.h b/shared/tinyusb/usbd.h
new file mode 100644
index 000000000..9c450fb55
--- /dev/null
+++ b/shared/tinyusb/usbd.h
@@ -0,0 +1,41 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2022 Blake W. Felt
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef MICROPY_INCLUDED_SHARED_TINYUSB_USBD_H
+#define MICROPY_INCLUDED_SHARED_TINYUSB_USBD_H
+
+#include "py/obj.h"
+
+// defined externally (needed per port)
+
+int usbd_serialnumber(uint8_t *buf);
+
+// external use
+
+void usbd_reset_all(void);
+void usbd_reset_descriptor(void);
+
+#endif // MICROPY_INCLUDED_SHARED_TINYUSB_USBD_H
diff --git a/ports/rp2/tusb_port.c b/shared/tinyusb/usbd_descriptor.c
index 4aac08791..d3c65aee8 100644
--- a/ports/rp2/tusb_port.c
+++ b/shared/tinyusb/usbd_descriptor.c
@@ -4,6 +4,7 @@
* The MIT License (MIT)
*
* Copyright (c) 2019 Damien P. George
+ * Copyright (c) 2022 Blake W. Felt
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -24,15 +25,9 @@
* THE SOFTWARE.
*/
+#include "mpconfigport.h"
#include "tusb.h"
-#include "pico/unique_id.h"
-
-#ifndef MICROPY_HW_USB_VID
-#define MICROPY_HW_USB_VID (0x2E8A) // Raspberry Pi
-#endif
-#ifndef MICROPY_HW_USB_PID
-#define MICROPY_HW_USB_PID (0x0005) // RP2 MicroPython
-#endif
+#include "usbd.h"
#if CFG_TUD_MSC
#define USBD_DESC_LEN (TUD_CONFIG_DESC_LEN + TUD_CDC_DESC_LEN + TUD_MSC_DESC_LEN)
@@ -65,6 +60,9 @@
#define USBD_STR_CDC (0x04)
#define USBD_STR_MSC (0x05)
+#define USBD_DESC_STR_MAX (20)
+#define USBD_DESC_SERIAL_MAX (32)
+
// Note: descriptors returned from callbacks must exist long enough for transfer to complete
static const tusb_desc_device_t usbd_desc_device = {
@@ -115,8 +113,7 @@ const uint8_t *tud_descriptor_configuration_cb(uint8_t index) {
}
const uint16_t *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {
- #define DESC_STR_MAX (20)
- static uint16_t desc_str[DESC_STR_MAX];
+ static uint16_t desc_str[USBD_DESC_STR_MAX];
uint8_t len;
if (index == 0) {
@@ -128,17 +125,22 @@ const uint16_t *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {
}
// check, if serial is requested
if (index == USBD_STR_SERIAL) {
- pico_unique_board_id_t id;
- pico_get_unique_board_id(&id);
+ uint8_t buffer[USBD_DESC_SERIAL_MAX] = {0};
+ int buflen;
+ const char *hexdig = "0123456789abcdef";
+
+ buflen = usbd_serialnumber(buffer);
// byte by byte conversion
- for (len = 0; len < 16; len += 2) {
- const char *hexdig = "0123456789abcdef";
- desc_str[1 + len] = hexdig[id.id[len >> 1] >> 4];
- desc_str[1 + len + 1] = hexdig[id.id[len >> 1] & 0x0f];
+ len = 0;
+ for (int i=0; i<buflen; i++) {
+ uint8_t val = buffer[i];
+ desc_str[1 + len] = hexdig[val >> 4];
+ desc_str[2 + len] = hexdig[val & 0x0F];
+ len += 2;
}
} else {
const char *str = usbd_desc_str[index];
- for (len = 0; len < DESC_STR_MAX - 1 && str[len]; ++len) {
+ for (len = 0; len < USBD_DESC_STR_MAX - 1 && str[len]; ++len) {
desc_str[1 + len] = str[len];
}
}
@@ -149,3 +151,7 @@ const uint16_t *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {
return desc_str;
}
+
+void usbd_reset_descriptor(void) {
+ // not used yet
+}