summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2026-04-27 21:25:43 +0800
committersakumisu <[email protected]>2026-04-28 16:32:28 +0800
commitc9625ffa773ad10b8824d1b5361bca2ccc1f3d1e (patch)
tree6a9e0183c1364f7852eeba104b1c6916b901435b
parent1a885c76b85d7d40955bc8e88a522a3dd0eb3183 (diff)
docs: release v1.6.1v1.6.1release/v1.6
Signed-off-by: sakumisu <[email protected]>
-rw-r--r--CMakeLists.txt2
-rw-r--r--Kconfig.rttpkg5
-rw-r--r--README.md46
-rw-r--r--README_zh.md42
-rw-r--r--VERSION2
-rw-r--r--class/serial/usbh_serial.c2
-rw-r--r--common/usb_version.h4
-rw-r--r--docs/assets/usbdevice_usage.pngbin0 -> 52297 bytes
-rw-r--r--docs/assets/usbhost_usage.pngbin0 -> 95150 bytes
-rwxr-xr-xdocs/en/conf.py4
-rw-r--r--docs/zh/conf.py4
-rw-r--r--docs/zh/quick_start/demo.rst56
-rw-r--r--docs/zh/version.rst12
-rw-r--r--idf_component.yml2
-rw-r--r--tests/bouffalolab/CMakeLists.txt1
15 files changed, 106 insertions, 76 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 39d1a273..be652aa8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -10,6 +10,7 @@ if(BL_SDK_BASE)
set(CONFIG_CHERRYUSB_DEVICE_MSC 1)
set(CONFIG_CHERRYUSB_DEVICE_AUDIO 1)
set(CONFIG_CHERRYUSB_DEVICE_VIDEO 1)
+ set(CONFIG_CHERRYUSB_DEVICE_DFU 1)
set(CONFIG_CHERRYUSB_DEVICE_GAMEPAD 1)
set(CONFIG_CHERRYUSB_HOST_CDC_ACM 1)
@@ -183,6 +184,7 @@ elseif(HPM_SDK_BASE)
set(CONFIG_CHERRYUSB_DEVICE_MSC 1)
set(CONFIG_CHERRYUSB_DEVICE_AUDIO 1)
set(CONFIG_CHERRYUSB_DEVICE_VIDEO 1)
+ set(CONFIG_CHERRYUSB_DEVICE_DFU 1)
set(CONFIG_CHERRYUSB_DEVICE_GAMEPAD 1)
set(CONFIG_CHERRYUSB_HOST_CDC_ACM 1)
diff --git a/Kconfig.rttpkg b/Kconfig.rttpkg
index 4fa34158..12e3f2e0 100644
--- a/Kconfig.rttpkg
+++ b/Kconfig.rttpkg
@@ -516,12 +516,14 @@ if PKG_USING_CHERRYUSB
choice
prompt "Version"
- default PKG_USING_CHERRYUSB_V010503
+ default PKG_USING_CHERRYUSB_V010601
help
Select the package version
config PKG_USING_CHERRYUSB_LATEST_VERSION
bool "latest"
+ config PKG_USING_CHERRYUSB_V010601
+ bool "v1.6.1"
config PKG_USING_CHERRYUSB_V010600
bool "v1.6.0"
config PKG_USING_CHERRYUSB_V010503
@@ -543,6 +545,7 @@ if PKG_USING_CHERRYUSB
config PKG_CHERRYUSB_VER
string
default "latest" if PKG_USING_CHERRYUSB_LATEST_VERSION
+ default "v1.6.1" if PKG_USING_CHERRYUSB_V010601
default "v1.6.0" if PKG_USING_CHERRYUSB_V010600
default "v1.5.3.99" if PKG_USING_CHERRYUSB_V010503
default "v1.5.2" if PKG_USING_CHERRYUSB_V010502
diff --git a/README.md b/README.md
index 9b9245bb..d0197778 100644
--- a/README.md
+++ b/README.md
@@ -86,16 +86,18 @@ CherryUSB Device Stack resource usage (GCC 10.2 with -O2, disable log):
| file | FLASH (Byte) | No Cache RAM (Byte) | RAM (Byte) | Heap (Byte) |
|:-------------:|:--------------:|:-------------------------:|:-------------:|:----------------:|
-|usbd_core.c | ~4500 | (512(default) + 320) * bus | 0 | 0 |
-|usbd_cdc_acm.c | ~900 | 0 | 0 | 0 |
-|usbd_msc.c | ~5000 | (128 + 512(default)) * bus | 16 * bus | 0 |
-|usbd_hid.c | ~300 | 0 | 0 | 0 |
-|usbd_audio.c | ~4000 | 0 | 0 | 0 |
-|usbd_video.c | ~7000 | 0 | 132 * bus | 0 |
-|usbd_rndis.c | ~2500 | 2 * 1580(default)+156+8 | 80 | 0 |
-|usbd_cdc_ecm.c | ~900 | 2 * 1514(default)+16 | 42 | 0 |
+|usbd_core.c | ~4000 | (512(default) + 320) * bus | 8 | 0 |
+|usbd_cdc_acm.c | ~400 | 0 | 0 | 0 |
+|usbd_msc.c | ~3200 | (128 + 512(default)) * bus | 16 * bus | 0 |
+|usbd_hid.c | ~200 | 0 | 0 | 0 |
+|usbd_audio.c | ~1300 | 0 | 8 * bus | 0 |
+|usbd_video.c | ~2500 | 0 | 124 * bus | 0 |
+|usbd_rndis.c | ~2000 | 2 * 1580(default)+156+8 | 76 | 0 |
+|usbd_cdc_ecm.c | ~1500 | 2 * 1514(default)+16 | 42 | 0 |
|usbd_mtp.c | ~9000 | 2048(default)+128 | sizeof(struct mtp_object) * n| 0 |
-|usbd_dfu.c | ~2200 | 0 | 45 | 0 |
+|usbd_dfu.c | ~800 | 0 | 1 | 0 |
+
+![usbdevice_usage](docs/assets/usbdevice_usage.png)
## Host Stack Overview
@@ -128,19 +130,27 @@ CherryUSB Host Stack resource usage (GCC 10.2 with -O2, disable log):
| file | FLASH (Byte) | No Cache RAM (Byte) | RAM (Byte) | Heap (Byte) |
|:-------------:|:--------------:|:-------------------------------:|:---------------------------:|:------------:|
-|usbh_core.c | ~4500 | (512(default) + 8 * (1+x) *n) * bus | sizeof(struct usbh_hub) * bus | raw_config_desc |
-|usbh_hub.c | ~3500 | (32 + 4 * (1+x)) * bus | 12 + sizeof(struct usbh_hub) * x | 0 |
-|usbh_cdc_acm.c | ~600 | 7 * x | 4 + sizeof(struct usbh_cdc_acm) * x | 0 |
-|usbh_msc.c | ~2000 | 128 * x | 4 + sizeof(struct usbh_msc) * x | 0 |
-|usbh_hid.c | ~800 | 64 * x | 4 + sizeof(struct usbh_hid) * x | 0 |
-|usbh_video.c | ~5000 | 128 * x | 4 + sizeof(struct usbh_video) * x | 0 |
-|usbh_audio.c | ~4000 | 128 * x | 4 + sizeof(struct usbh_audio) * x | 0 |
+|usbh_core.c | ~4000 | (512(default) + 8 * (1+x) *n) * bus | sizeof(struct usbh_hub) * bus | raw_config_desc |
+|usbh_hub.c | ~3000 | (32 + 4 * (1+x)) * bus | 12 + sizeof(struct usbh_hub) * x | 0 |
+|usbh_msc.c | ~1500 | 128 * x | 4 + sizeof(struct usbh_msc) * x | 0 |
+|usbh_hid.c | ~2000 | 64 * x | 4 + sizeof(struct usbh_hid) * x | 0 |
+|usbh_video.c | ~2500 | 128 * x | 4 + sizeof(struct usbh_video) * x | 0 |
+|usbh_audio.c | ~3000 | 128 * x | 4 + sizeof(struct usbh_audio) * x | 0 |
|usbh_rndis.c | ~3000 | 512 + 2 * 2048(default)| sizeof(struct usbh_rndis) * 1 | 0 |
|usbh_cdc_ecm.c | ~1500 | 2 * 1514 + 16 | sizeof(struct usbh_cdc_ecm) * 1 | 0 |
|usbh_cdc_ncm.c | ~2000 | 2 * 2048(default) + 16 + 32 | sizeof(struct usbh_cdc_ncm) * 1| 0 |
|usbh_bluetooth.c | ~1000 | 2 * 2048(default) | sizeof(struct usbh_bluetooth) * 1 | 0 |
-|usbh_asix.c | ~7000 | 2 * 2048(default) + 16 + 32 | sizeof(struct usbh_asix) * 1 | 0 |
-|usbh_rtl8152.c | ~9000 | 16K+ 2K(default) + 2 + 32 | sizeof(struct usbh_rtl8152) * 1 | 0 |
+|usbh_asix.c | ~3500 | 2 * 2048(default) + 16 + 32 | sizeof(struct usbh_asix) * 1 | 0 |
+|usbh_rtl8152.c | ~5500 | 16K+ 2K(default) + 2 + 32 | sizeof(struct usbh_rtl8152) * 1 | 0 |
+|usbh_serial.c | ~3000 | (512 * 2 + 32 * 2) * x | sizeof(struct usbh_serial) * x (2048 default) | 0 |
+|usbh_cdc_acm.c | ~1000 | 0 | 0 | 0 |
+|usbh_ch340.c | ~1200 | 0 | 0 | 0 |
+|usbh_ftdi.c | ~1200 | 0 | 0 | 0 |
+|usbh_cp2102.c | ~2200 | 0 | 0 | 0 |
+|usbh_pl2303.c | ~2500 | 0 | 0 | 0 |
+|usbh_gsm.c | ~300 | 0 | 0 | 0 |
+
+![usbhost_usage](docs/assets/usbhost_usage.png)
Among them, `sizeof(struct usbh_hub)` and `sizeof(struct usbh_hubport)` are affected by the following macros:
diff --git a/README_zh.md b/README_zh.md
index df2276ee..59d11a06 100644
--- a/README_zh.md
+++ b/README_zh.md
@@ -86,16 +86,16 @@ CherryUSB Device 协议栈资源占用说明(GCC 10.2 with -O2):
| file | FLASH (Byte) | No Cache RAM (Byte) | RAM (Byte) | Heap (Byte) |
|:-------------:|:--------------:|:-------------------------:|:-------------:|:----------------:|
-|usbd_core.c | ~4500 | (512(default) + 320) * bus | 0 | 0 |
-|usbd_cdc_acm.c | ~900 | 0 | 0 | 0 |
-|usbd_msc.c | ~5000 | (128 + 512(default)) * bus | 16 * bus | 0 |
-|usbd_hid.c | ~300 | 0 | 0 | 0 |
-|usbd_audio.c | ~4000 | 0 | 0 | 0 |
-|usbd_video.c | ~7000 | 0 | 132 * bus | 0 |
-|usbd_rndis.c | ~2500 | 2 * 1580(default)+156+8 | 80 | 0 |
-|usbd_cdc_ecm.c | ~900 | 2 * 1514(default)+16 | 42 | 0 |
+|usbd_core.c | ~4000 | (512(default) + 320) * bus | 8 | 0 |
+|usbd_cdc_acm.c | ~400 | 0 | 0 | 0 |
+|usbd_msc.c | ~3200 | (128 + 512(default)) * bus | 16 * bus | 0 |
+|usbd_hid.c | ~200 | 0 | 0 | 0 |
+|usbd_audio.c | ~1300 | 0 | 8 * bus | 0 |
+|usbd_video.c | ~2500 | 0 | 124 * bus | 0 |
+|usbd_rndis.c | ~2000 | 2 * 1580(default)+156+8 | 76 | 0 |
+|usbd_cdc_ecm.c | ~1500 | 2 * 1514(default)+16 | 42 | 0 |
|usbd_mtp.c | ~9000 | 2048(default)+128 | sizeof(struct mtp_object) * n| 0 |
-|usbd_dfu.c | ~2200 | 0 | 45 | 0 |
+|usbd_dfu.c | ~800 | 0 | 1 | 0 |
## Host 协议栈简介
@@ -128,19 +128,25 @@ CherryUSB Host 协议栈资源占用说明(GCC 10.2 with -O2,关闭 log)�
| file | FLASH (Byte) | No Cache RAM (Byte) | RAM (Byte) | Heap (Byte) |
|:-------------:|:--------------:|:-------------------------------:|:---------------------------:|:------------:|
-|usbh_core.c | ~4500 | (512(default) + 8 * (1+x) *n) * bus | sizeof(struct usbh_hub) * bus | raw_config_desc |
-|usbh_hub.c | ~3500 | (32 + 4 * (1+x)) * bus | 12 + sizeof(struct usbh_hub) * x | 0 |
-|usbh_cdc_acm.c | ~600 | 7 * x | 4 + sizeof(struct usbh_cdc_acm) * x | 0 |
-|usbh_msc.c | ~2000 | 128 * x | 4 + sizeof(struct usbh_msc) * x | 0 |
-|usbh_hid.c | ~800 | 64 * x | 4 + sizeof(struct usbh_hid) * x | 0 |
-|usbh_video.c | ~5000 | 128 * x | 4 + sizeof(struct usbh_video) * x | 0 |
-|usbh_audio.c | ~4000 | 128 * x | 4 + sizeof(struct usbh_audio) * x | 0 |
+|usbh_core.c | ~4000 | (512(default) + 8 * (1+x) *n) * bus | sizeof(struct usbh_hub) * bus | raw_config_desc |
+|usbh_hub.c | ~3000 | (32 + 4 * (1+x)) * bus | 12 + sizeof(struct usbh_hub) * x | 0 |
+|usbh_msc.c | ~1500 | 128 * x | 4 + sizeof(struct usbh_msc) * x | 0 |
+|usbh_hid.c | ~2000 | 64 * x | 4 + sizeof(struct usbh_hid) * x | 0 |
+|usbh_video.c | ~2500 | 128 * x | 4 + sizeof(struct usbh_video) * x | 0 |
+|usbh_audio.c | ~3000 | 128 * x | 4 + sizeof(struct usbh_audio) * x | 0 |
|usbh_rndis.c | ~3000 | 512 + 2 * 2048(default)| sizeof(struct usbh_rndis) * 1 | 0 |
|usbh_cdc_ecm.c | ~1500 | 2 * 1514 + 16 | sizeof(struct usbh_cdc_ecm) * 1 | 0 |
|usbh_cdc_ncm.c | ~2000 | 2 * 2048(default) + 16 + 32 | sizeof(struct usbh_cdc_ncm) * 1| 0 |
|usbh_bluetooth.c | ~1000 | 2 * 2048(default) | sizeof(struct usbh_bluetooth) * 1 | 0 |
-|usbh_asix.c | ~7000 | 2 * 2048(default) + 16 + 32 | sizeof(struct usbh_asix) * 1 | 0 |
-|usbh_rtl8152.c | ~9000 | 16K+ 2K(default) + 2 + 32 | sizeof(struct usbh_rtl8152) * 1 | 0 |
+|usbh_asix.c | ~3500 | 2 * 2048(default) + 16 + 32 | sizeof(struct usbh_asix) * 1 | 0 |
+|usbh_rtl8152.c | ~5500 | 16K+ 2K(default) + 2 + 32 | sizeof(struct usbh_rtl8152) * 1 | 0 |
+|usbh_serial.c | ~3000 | (512 * 2 + 32 * 2) * x | sizeof(struct usbh_serial) * x (2048 default) | 0 |
+|usbh_cdc_acm.c | ~1000 | 0 | 0 | 0 |
+|usbh_ch340.c | ~1200 | 0 | 0 | 0 |
+|usbh_ftdi.c | ~1200 | 0 | 0 | 0 |
+|usbh_cp2102.c | ~2200 | 0 | 0 | 0 |
+|usbh_pl2303.c | ~2500 | 0 | 0 | 0 |
+|usbh_gsm.c | ~300 | 0 | 0 | 0 |
其中,`sizeof(struct usbh_hub)` 和 `sizeof(struct usbh_hubport)` 受以下宏影响:
diff --git a/VERSION b/VERSION
index bf6627b8..77b8ba14 100644
--- a/VERSION
+++ b/VERSION
@@ -1,5 +1,5 @@
VERSION_MAJOR = 1
VERSION_MINOR = 6
-PATCHLEVEL = 0
+PATCHLEVEL = 1
VERSION_TWEAK = 0
EXTRAVERSION = 0
diff --git a/class/serial/usbh_serial.c b/class/serial/usbh_serial.c
index b0bedc3c..3e17b12f 100644
--- a/class/serial/usbh_serial.c
+++ b/class/serial/usbh_serial.c
@@ -14,8 +14,6 @@
#define DEV_FORMAT_VENDOR "/dev/ttyUSB%d"
#define DEV_FORMAT_CDC_ACM "/dev/ttyACM%d"
-#define CONFIG_USBHOST_MAX_SERIAL_CLASS 4
-
static struct usbh_serial g_serial_class[CONFIG_USBHOST_MAX_SERIAL_CLASS];
static uint32_t g_devinuse = 0;
diff --git a/common/usb_version.h b/common/usb_version.h
index 3e4c2aa3..5c59978f 100644
--- a/common/usb_version.h
+++ b/common/usb_version.h
@@ -15,7 +15,7 @@
#undef CHERRYUSB_VERSION_STR
#endif
-#define CHERRYUSB_VERSION 0x010600
-#define CHERRYUSB_VERSION_STR "v1.6.0"
+#define CHERRYUSB_VERSION 0x010601
+#define CHERRYUSB_VERSION_STR "v1.6.1"
#endif \ No newline at end of file
diff --git a/docs/assets/usbdevice_usage.png b/docs/assets/usbdevice_usage.png
new file mode 100644
index 00000000..30f7c992
--- /dev/null
+++ b/docs/assets/usbdevice_usage.png
Binary files differ
diff --git a/docs/assets/usbhost_usage.png b/docs/assets/usbhost_usage.png
new file mode 100644
index 00000000..cb86a116
--- /dev/null
+++ b/docs/assets/usbhost_usage.png
Binary files differ
diff --git a/docs/en/conf.py b/docs/en/conf.py
index 22427158..096076b0 100755
--- a/docs/en/conf.py
+++ b/docs/en/conf.py
@@ -6,8 +6,8 @@ project = 'CherryUSB'
copyright = '2022 ~ 2026, sakumisu'
author = 'sakumisu'
-release = '1.6.0'
-version = '1.6.0'
+release = '1.6.1'
+version = '1.6.1'
# -- General configuration
diff --git a/docs/zh/conf.py b/docs/zh/conf.py
index 22427158..096076b0 100644
--- a/docs/zh/conf.py
+++ b/docs/zh/conf.py
@@ -6,8 +6,8 @@ project = 'CherryUSB'
copyright = '2022 ~ 2026, sakumisu'
author = 'sakumisu'
-release = '1.6.0'
-version = '1.6.0'
+release = '1.6.1'
+version = '1.6.1'
# -- General configuration
diff --git a/docs/zh/quick_start/demo.rst b/docs/zh/quick_start/demo.rst
index efa12f3f..d56839fb 100644
--- a/docs/zh/quick_start/demo.rst
+++ b/docs/zh/quick_start/demo.rst
@@ -119,8 +119,8 @@ ESP-Registry 可以参考官方文档,推荐使用 vscode + esp-idf 的开发�
- DWC2
- less than latest
-基于 NXP MCX 系列芯片
----------------------------
+基于 SiFli 系列芯片(官方 SDK 支持)
+--------------------------------------------
.. list-table::
:widths: 10 10 10
@@ -129,12 +129,12 @@ ESP-Registry 可以参考官方文档,推荐使用 vscode + esp-idf 的开发�
* - Repo url
- USB IP
- Version
- * - https://github.com/CherryUSB/cherryusb_mcx https://github.com/RT-Thread/rt-thread/tree/master/bsp/nxp/mcx
- - CHIPIDEA/kinetis
+ * - https://github.com/OpenSiFli/SiFli-SDK
+ - MUSB
- less than latest
-基于 SiFli 系列芯片(官方 SDK 支持)
---------------------------------------------
+基于 NXP MCX 系列芯片
+---------------------------
.. list-table::
:widths: 10 10 10
@@ -143,8 +143,8 @@ ESP-Registry 可以参考官方文档,推荐使用 vscode + esp-idf 的开发�
* - Repo url
- USB IP
- Version
- * - https://github.com/OpenSiFli/SiFli-SDK
- - MUSB
+ * - https://github.com/CherryUSB/cherryusb_mcx https://github.com/RT-Thread/rt-thread/tree/master/bsp/nxp/mcx
+ - CHIPIDEA/kinetis
- less than latest
基于 RP2040/RP2035 芯片(官方 SDK 即将支持)
@@ -161,20 +161,6 @@ ESP-Registry 可以参考官方文档,推荐使用 vscode + esp-idf 的开发�
- RP2040
- less than latest
-基于 Bekencorp 系列芯片(官方 SDK 支持)
-------------------------------------------------------
-
-.. list-table::
- :widths: 10 10 10
- :header-rows: 1
-
- * - Repo url
- - USB IP
- - Version
- * - https://github.com/bekencorp/armino
- - MUSB
- - equal to v0.7.0
-
基于 ST 系列芯片
---------------------------
@@ -322,6 +308,16 @@ USB Host 移植要点
.. figure:: img/stm32_18.png
+基于 Actionstech 系列芯片(官方 SDK 支持)
+------------------------------------------------------
+
+Not opensource, 请联系 Actionstech 官方
+
+基于新塘系列芯片(官方 SDK 支持)
+------------------------------------------------------
+
+Not opensource, 请联系 新塘 官方
+
基于 Sophgo 系列芯片(官方 SDK 支持)
------------------------------------------------------
@@ -336,12 +332,16 @@ USB Host 移植要点
- DWC2
- equal to v0.7.0
-基于 Actionstech 系列芯片(官方 SDK 支持)
+基于 Bekencorp 系列芯片(官方 SDK 支持)
------------------------------------------------------
-Not opensource, 请联系 Actionstech 官方
-
-基于新塘系列芯片(官方 SDK 支持)
-------------------------------------------------------
+.. list-table::
+ :widths: 10 10 10
+ :header-rows: 1
-Not opensource, 请联系 新塘 官方
+ * - Repo url
+ - USB IP
+ - Version
+ * - https://github.com/bekencorp/armino
+ - MUSB
+ - equal to v0.7.0
diff --git a/docs/zh/version.rst b/docs/zh/version.rst
index 5c6e23e7..9e008f2f 100644
--- a/docs/zh/version.rst
+++ b/docs/zh/version.rst
@@ -179,4 +179,14 @@ v1.6.0
- 支持 gamepad device
- 增加 ti xmc,infineon edge e8x port 支持
- dwc2 增加 usbd_dwc2_get_system_clock 替换 SystemCoreClock;删除 __UNALIGNED_UINT32_READ 和 __UNALIGNED_UINT32_WRITE 宏;读取 setup 个数设置为 1个;第一次读取 setup 移动到 USB_OTG_GINTSTS_ENUMDNE 中断中
-- dwc2/ehci 增加 roothub 速度设置 \ No newline at end of file
+- dwc2/ehci 增加 roothub 速度设置
+
+v1.6.1
+----------------------
+
+- 新增 USB 副屏驱动
+- 重构 DFU device 驱动
+- 重构主机报告描述符解析驱动
+- cherryrb 和 cherrymp 组件内置
+- 主机 hub 线程释放改成使用 mq 替代互斥锁
+- 部分 bugfix 和安全性代码检查 \ No newline at end of file
diff --git a/idf_component.yml b/idf_component.yml
index bcae2d65..976656cc 100644
--- a/idf_component.yml
+++ b/idf_component.yml
@@ -1,4 +1,4 @@
-version: "1.6.0"
+version: "1.6.1"
description: CherryUSB is a tiny and portable USB Stack (device & host) for embedded system with USB IP
tags:
- usb
diff --git a/tests/bouffalolab/CMakeLists.txt b/tests/bouffalolab/CMakeLists.txt
index 1a35d9b3..31bb9142 100644
--- a/tests/bouffalolab/CMakeLists.txt
+++ b/tests/bouffalolab/CMakeLists.txt
@@ -29,6 +29,7 @@ add_subdirectory(../.. cherryusb)
# sdk_add_link_options(-uusbd_audio_init_intf)
# sdk_add_link_options(-uusbd_cdc_ecm_init_intf)
# sdk_add_link_options(-uusbd_rndis_init_intf)
+# sdk_add_link_options(-uusbd_dfu_init_intf)
# sdk_add_link_options(-uusbd_initialize)
# sdk_add_link_options(-uusbd_desc_register)
# sdk_add_link_options(-uusbd_add_interface)