From 66e3ffb90d4cdb81db63b86d123cdeef758fabfb Mon Sep 17 00:00:00 2001 From: sakumisu <1203593632@qq.com> Date: Sat, 15 Jun 2024 21:12:03 +0800 Subject: [PATCH] update readme --- README.md | 31 ++++++++++++++++--------------- README_zh.md | 31 ++++++++++++++++--------------- docs/assets/bekencorp.jpg | Bin 0 -> 10944 bytes 3 files changed, 32 insertions(+), 30 deletions(-) create mode 100644 docs/assets/bekencorp.jpg diff --git a/README.md b/README.md index 209d9ce2..b9425dc6 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,7 @@ CherryUSB Host Stack resource usage (GCC 10.2 with -O2): |usbh_hid.c | ~1000 | 128 | 4 + sizeof(struct usbh_hid) * x | 0 | |usbh_video.c | ~3700 | 128 | 4 + sizeof(struct usbh_video) * x | 0 | |usbh_audio.c | ~3100 | 128 | 4 + sizeof(struct usbh_audio) * x | 0 | -|usbh_rndis.c | ~3900 | 4096 + 2 * 2048 | sizeof(struct usbh_rndis) * 1 | 0 | +|usbh_rndis.c | ~3900 | 4096 + 2 * 2048(default)| sizeof(struct usbh_rndis) * 1 | 0 | |usbh_cdc_ecm.c | ~2500 | 2 * 1514 | sizeof(struct usbh_cdc_ecm) * 1 | 0 | |usbh_bluetooth.c | ~2300 | 2 * 2048(default) | sizeof(struct usbh_bluetooth) * 1 | 0 | @@ -148,7 +148,7 @@ Only standard and commercial USB IP are listed. | OHCI(intel) | none | OHCI | × | | EHCI(intel) | none | EHCI | √ | | XHCI(intel) | none | XHCI | √ | -| UHCI(intel) | none | UHCI | × | +| UHCI(intel) | none | UHCI | × | | DWC2(synopsys) | DWC2 | DWC2 | √ | | MUSB(mentor) | MUSB | MUSB | √ | | FOTG210(faraday)| FOTG210 | EHCI | √ | @@ -173,21 +173,22 @@ USB basic concepts and how the CherryUSB Device stack is implemented, see [Cherr | Manufacturer | CHIP or Series | USB IP| Repo Url | Support version | Support status | |:--------------------:|:------------------:|:-----:|:--------:|:------------------:|:-------------:| |Bouffalolab | BL702/BL616/BL808 | bouffalolab/ehci|[bouffalo_sdk](https://github.com/CherryUSB/bouffalo_sdk)|<= latest | Long-term | -|ST | STM32F1x | fsdev |[stm32_repo](https://github.com/CherryUSB/cherryusb_stm32)|<= latest | Long-term | -|ST | STM32F4/STM32H7 | dwc2 |[stm32_repo](https://github.com/CherryUSB/cherryusb_stm32)|<= latest | Long-term | -|HPMicro | HPM6750 | hpm/ehci |[hpm_sdk](https://github.com/CherryUSB/hpm_sdk)|<= latest | Long-term | -|Essemi | ES32F36xx | musb |[es32f369_repo](https://github.com/CherryUSB/cherryusb_es32)|<= latest | Long-term | -|Phytium | e2000 | pusb2/xhci |[phytium_repo](https://gitee.com/phytium_embedded/phytium-free-rtos-sdk)|v0.10.2 | Long-term | -|artinchip | d12x/d13x/d21x | aic/ehci/ohci |[luban-lite](https://gitee.com/artinchip/luban-lite)|<= latest | Long-term | -|Espressif | esp32s2/esp32s3 | dwc2 |[esp32_repo](https://github.com/CherryUSB/cherryusb_esp32)|<= latest | the same with ST | -|AllwinnerTech | F1C100S/F1C200S | musb |[cherryusb_rtt_f1c100s](https://github.com/CherryUSB/cherryusb_rtt_f1c100s)|<= latest | the same with Essemi | -|WCH | CH32V307/ch58x | ch32_usbfs/ch32_usbhs/ch58x |[wch_repo](https://github.com/CherryUSB/cherryusb_wch)|<= v0.10.2 | TBD | -|Nordicsemi | Nrf52840 | nrf5x |[nrf5x_repo](https://github.com/CherryUSB/cherryusb_nrf5x)|<= v0.10.2 | No more updated | -|Raspberry pi | rp2040 | rp2040 |[pico-examples](https://github.com/CherryUSB/pico-examples)|<= v0.10.2 | No more updated | +|ST | STM32F1x | fsdev |[stm32_repo](https://github.com/CherryUSB/cherryusb_stm32)|<= latest | Long-term | +|ST | STM32F4/STM32H7 | dwc2 |[stm32_repo](https://github.com/CherryUSB/cherryusb_stm32)|<= latest | Long-term | +|HPMicro | HPM6750 | hpm/ehci |[hpm_sdk](https://github.com/CherryUSB/hpm_sdk)|<= latest | Long-term | +|Essemi | ES32F36xx | musb |[es32f369_repo](https://github.com/CherryUSB/cherryusb_es32)|<= latest | Long-term | +|Phytium | e2000 | pusb2/xhci |[phytium_repo](https://gitee.com/phytium_embedded/phytium-free-rtos-sdk)|v0.10.2 | Long-term | +|Artinchip | d12x/d13x/d21x | aic/ehci/ohci |[luban-lite](https://gitee.com/artinchip/luban-lite)|<= latest | Long-term | +|Espressif | esp32s2/esp32s3 | dwc2 |[esp32_repo](https://github.com/CherryUSB/cherryusb_esp32)|<= latest | the same with ST | +|AllwinnerTech | F1C100S/F1C200S | musb |[cherryusb_rtt_f1c100s](https://github.com/CherryUSB/cherryusb_rtt_f1c100s)|<= latest | the same with Essemi | +|Bekencorp | bk7256/bk7258 | musb |[bk_idk](https://github.com/CherryUSB/bk_idk)| v0.7.0 | the same with Essemi | +|Sophgo | cv18xx | dwc2 |[cvi_alios_open](https://github.com/CherryUSB/cvi_alios_open)| v0.7.0 | the same with ST | +|WCH | CH32V307/ch58x | ch32_usbfs/ch32_usbhs/ch58x |[wch_repo](https://github.com/CherryUSB/cherryusb_wch)|<= v0.10.2 | TBD | +|Raspberry pi | rp2040 | rp2040 |[pico-examples](https://github.com/CherryUSB/pico-examples)|<= v0.10.2 | No more updated | ## Commercial Support -Refer to https://cherryusb.readthedocs.io/zh-cn/latest/support.html. +Refer to https://cherryusb.readthedocs.io/zh-cn/latest/support/index.html. ## Contact @@ -197,4 +198,4 @@ CherryUSB discord: https://discord.com/invite/wFfvrSAey8. Thanks to the following companies for their support (in no particular order). - \ No newline at end of file + \ No newline at end of file diff --git a/README_zh.md b/README_zh.md index 4e96150a..0aee5a75 100644 --- a/README_zh.md +++ b/README_zh.md @@ -115,7 +115,7 @@ CherryUSB Host 协议栈资源占用说明(GCC 10.2 with -O2): |usbh_hid.c | ~1000 | 128 | 4 + sizeof(struct usbh_hid) * x | 0 | |usbh_video.c | ~3700 | 128 | 4 + sizeof(struct usbh_video) * x | 0 | |usbh_audio.c | ~3100 | 128 | 4 + sizeof(struct usbh_audio) * x | 0 | -|usbh_rndis.c | ~3900 | 4096 + 2 * 2048 | sizeof(struct usbh_rndis) * 1 | 0 | +|usbh_rndis.c | ~3900 | 4096 + 2 * 2048(default)| sizeof(struct usbh_rndis) * 1 | 0 | |usbh_cdc_ecm.c | ~2500 | 2 * 1514 | sizeof(struct usbh_cdc_ecm) * 1 | 0 | |usbh_bluetooth.c | ~2300 | 2 * 2048(default) | sizeof(struct usbh_bluetooth) * 1 | 0 | @@ -148,7 +148,7 @@ x 受以下宏影响: | OHCI(intel) | none | OHCI | × | | EHCI(intel) | none | EHCI | √ | | XHCI(intel) | none | XHCI | √ | -| UHCI(intel) | none | UHCI | × | +| UHCI(intel) | none | UHCI | × | | DWC2(synopsys) | DWC2 | DWC2 | √ | | MUSB(mentor) | MUSB | MUSB | √ | | FOTG210(faraday)| FOTG210 | EHCI | √ | @@ -174,21 +174,22 @@ CherryUSB 快速入门、USB 基本概念,API 手册,Class 基本概念和 | Manufacturer | CHIP or Series | USB IP| Repo Url | Support version | Support status | |:--------------------:|:------------------:|:-----:|:--------:|:------------------:|:-------------:| |Bouffalolab | BL702/BL616/BL808 | bouffalolab/ehci|[bouffalo_sdk](https://github.com/CherryUSB/bouffalo_sdk)|<= latest | Long-term | -|ST | STM32F1x | fsdev |[stm32_repo](https://github.com/CherryUSB/cherryusb_stm32)|<= latest | Long-term | -|ST | STM32F4/STM32H7 | dwc2 |[stm32_repo](https://github.com/CherryUSB/cherryusb_stm32)|<= latest | Long-term | -|HPMicro | HPM6750 | hpm/ehci |[hpm_sdk](https://github.com/CherryUSB/hpm_sdk)|<= latest | Long-term | -|Essemi | ES32F36xx | musb |[es32f369_repo](https://github.com/CherryUSB/cherryusb_es32)|<= latest | Long-term | -|Phytium | e2000 | pusb2/xhci |[phytium_repo](https://gitee.com/phytium_embedded/phytium-free-rtos-sdk)|v0.10.2 | Long-term | -|artinchip | d12x/d13x/d21x | aic/ehci/ohci |[luban-lite](https://gitee.com/artinchip/luban-lite)|<= latest | Long-term | -|Espressif | esp32s2/esp32s3 | dwc2 |[esp32_repo](https://github.com/CherryUSB/cherryusb_esp32)|<= latest | the same with ST | -|AllwinnerTech | F1C100S/F1C200S | musb |[cherryusb_rtt_f1c100s](https://github.com/CherryUSB/cherryusb_rtt_f1c100s)|<= latest | the same with Essemi | -|WCH | CH32V307/ch58x | ch32_usbfs/ch32_usbhs/ch58x |[wch_repo](https://github.com/CherryUSB/cherryusb_wch)|<= v0.10.2 | TBD | -|Nordicsemi | Nrf52840 | nrf5x |[nrf5x_repo](https://github.com/CherryUSB/cherryusb_nrf5x)|<= v0.10.2 | No more updated | -|Raspberry pi | rp2040 | rp2040 |[pico-examples](https://github.com/CherryUSB/pico-examples)|<= v0.10.2 | No more updated | +|ST | STM32F1x | fsdev |[stm32_repo](https://github.com/CherryUSB/cherryusb_stm32)|<= latest | Long-term | +|ST | STM32F4/STM32H7 | dwc2 |[stm32_repo](https://github.com/CherryUSB/cherryusb_stm32)|<= latest | Long-term | +|HPMicro | HPM6750 | hpm/ehci |[hpm_sdk](https://github.com/CherryUSB/hpm_sdk)|<= latest | Long-term | +|Essemi | ES32F36xx | musb |[es32f369_repo](https://github.com/CherryUSB/cherryusb_es32)|<= latest | Long-term | +|Phytium | e2000 | pusb2/xhci |[phytium_repo](https://gitee.com/phytium_embedded/phytium-free-rtos-sdk)|v0.10.2 | Long-term | +|Artinchip | d12x/d13x/d21x | aic/ehci/ohci |[luban-lite](https://gitee.com/artinchip/luban-lite)|<= latest | Long-term | +|Espressif | esp32s2/esp32s3 | dwc2 |[esp32_repo](https://github.com/CherryUSB/cherryusb_esp32)|<= latest | the same with ST | +|AllwinnerTech | F1C100S/F1C200S | musb |[cherryusb_rtt_f1c100s](https://github.com/CherryUSB/cherryusb_rtt_f1c100s)|<= latest | the same with Essemi | +|Bekencorp | bk7256/bk7258 | musb |[bk_idk](https://github.com/CherryUSB/bk_idk)| v0.7.0 | the same with Essemi | +|Sophgo | cv18xx | dwc2 |[cvi_alios_open](https://github.com/CherryUSB/cvi_alios_open)| v0.7.0 | the same with ST | +|WCH | CH32V307/ch58x | ch32_usbfs/ch32_usbhs/ch58x |[wch_repo](https://github.com/CherryUSB/cherryusb_wch)|<= v0.10.2 | TBD | +|Raspberry pi | rp2040 | rp2040 |[pico-examples](https://github.com/CherryUSB/pico-examples)|<= v0.10.2 | No more updated | ## 商业支持 -参考 https://cherryusb.readthedocs.io/zh-cn/latest/support.html。 +参考 https://cherryusb.readthedocs.io/zh-cn/latest/support/index.html。 ## 联系 @@ -199,4 +200,4 @@ CherryUSB 微信群:与我联系后邀请加入 感谢以下企业支持(顺序不分先后)。 - + diff --git a/docs/assets/bekencorp.jpg b/docs/assets/bekencorp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..54d4fbe81a5ea7264638a10119dca97369057915 GIT binary patch literal 10944 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