diff --git a/ports/rp2/CMakeLists.txt b/ports/rp2/CMakeLists.txt index 37ac78b733..6037eafbe8 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 1062236a39..572e9e42c1 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 a3725789f0..2518a275b0 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 0000000000..38c6dcdd42 --- /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 similarity index 89% rename from ports/rp2/tusb_config.h rename to shared/tinyusb/tusb_config.h index ce321616a6..b50c702606 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 #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 0000000000..01e04b9462 --- /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 0000000000..9c450fb552 --- /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 similarity index 85% rename from ports/rp2/tusb_port.c rename to shared/tinyusb/usbd_descriptor.c index 4aac08791e..d3c65aee8a 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> 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 +}