本文通過在 RT-Thread 操作系統上,使用CherryUSB 軟件包作為USB Host 協議棧,驅動AIR780E 4G Cat.1 模塊 的 RNDIS 功能,并成功接入lwIP 網絡協議棧,最終在開發板上實現了通過 4G 模塊上網的功能,以STM32F429為例。
目錄
新建工程
配置cubemx
配置cherryusb
main.c添加代碼
完成
1 新建工程
2 配置cubemx
四大件不過多贅述
打開USB HOST功能
打開USB HOST中斷
cubemx配置到此結束,點擊生成工程,關閉cubemx
3 配置cherryusb
先編譯一下工程,發現會有個報錯:
把RT_WEAK刪掉重新編譯就不會報錯了
然后打開RT-Thread Settings,添加軟件包
配置cherryusb
其實這里可以只打開rndis,不打開CDC ACM也能驅動air780實現LWIP上網,但是終端會一大堆報紅提示不支持CDC ACM,強迫癥難受所以干脆打開
這時候保存,編譯會有一大堆報錯,不慌,一個一個解決:
1
usb_config.h報錯
解決辦法,在applications文件夾下添加usb_config.h代碼內容如下:
/** Copyright (c) 2022, sakumisu** SPDX-License-Identifier: Apache-2.0*/#ifndefCHERRYUSB_CONFIG_H#defineCHERRYUSB_CONFIG_H/* ================ USB common Configuration ================ */#defineCONFIG_USB_PRINTF(...) printf(__VA_ARGS__)#ifndefCONFIG_USB_DBG_LEVEL#defineCONFIG_USB_DBG_LEVEL USB_DBG_INFO#endif/* Enable print with color */#defineCONFIG_USB_PRINTF_COLOR_ENABLE/* data align size when use dma */#ifndefCONFIG_USB_ALIGN_SIZE#defineCONFIG_USB_ALIGN_SIZE 4#endif/* attribute data into no cache ram */#defineUSB_NOCACHE_RAM_SECTION __attribute__((section(".noncacheable")))/* ================= USB Device Stack Configuration ================ *//* Ep0 in and out transfer buffer */#ifndefCONFIG_USBDEV_REQUEST_BUFFER_LEN#defineCONFIG_USBDEV_REQUEST_BUFFER_LEN 512#endif/* Setup packet log for debug */// #define CONFIG_USBDEV_SETUP_LOG_PRINT/* Check if the input descriptor is correct */// #define CONFIG_USBDEV_DESC_CHECK/* Enable test mode */// #define CONFIG_USBDEV_TEST_MODE#ifndefCONFIG_USBDEV_MSC_MAX_LUN#defineCONFIG_USBDEV_MSC_MAX_LUN 1#endif#ifndefCONFIG_USBDEV_MSC_MAX_BUFSIZE#defineCONFIG_USBDEV_MSC_MAX_BUFSIZE 512#endif#ifndefCONFIG_USBDEV_MSC_MANUFACTURER_STRING#defineCONFIG_USBDEV_MSC_MANUFACTURER_STRING""#endif#ifndefCONFIG_USBDEV_MSC_PRODUCT_STRING#defineCONFIG_USBDEV_MSC_PRODUCT_STRING""#endif#ifndefCONFIG_USBDEV_MSC_VERSION_STRING#defineCONFIG_USBDEV_MSC_VERSION_STRING"0.01"#endif// #define CONFIG_USBDEV_MSC_THREAD#ifndefCONFIG_USBDEV_MSC_PRIO#defineCONFIG_USBDEV_MSC_PRIO 4#endif#ifndefCONFIG_USBDEV_MSC_STACKSIZE#defineCONFIG_USBDEV_MSC_STACKSIZE 2048#endif#ifndefCONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE#defineCONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156#endif#ifndefCONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE#defineCONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE 2048#endif#ifndefCONFIG_USBDEV_RNDIS_VENDOR_ID#defineCONFIG_USBDEV_RNDIS_VENDOR_ID 0x0000ffff#endif#ifndefCONFIG_USBDEV_RNDIS_VENDOR_DESC#defineCONFIG_USBDEV_RNDIS_VENDOR_DESC"CherryUSB"#endif#defineCONFIG_USBDEV_RNDIS_USING_LWIP/* ================ USB HOST Stack Configuration ================== */#defineCONFIG_USBHOST_MAX_RHPORTS 1#defineCONFIG_USBHOST_MAX_EXTHUBS 1#defineCONFIG_USBHOST_MAX_EHPORTS 4#defineCONFIG_USBHOST_MAX_INTERFACES 8#defineCONFIG_USBHOST_MAX_INTF_ALTSETTINGS 8#defineCONFIG_USBHOST_MAX_ENDPOINTS 4#defineCONFIG_USBHOST_MAX_CDC_ACM_CLASS 4#defineCONFIG_USBHOST_MAX_HID_CLASS 4#defineCONFIG_USBHOST_MAX_MSC_CLASS 2#defineCONFIG_USBHOST_MAX_AUDIO_CLASS 1#defineCONFIG_USBHOST_MAX_VIDEO_CLASS 1#defineCONFIG_USBHOST_DEV_NAMELEN 16#ifndefCONFIG_USBHOST_PSC_PRIO#defineCONFIG_USBHOST_PSC_PRIO 0#endif#ifndefCONFIG_USBHOST_PSC_STACKSIZE#defineCONFIG_USBHOST_PSC_STACKSIZE 2048#endif//#define CONFIG_USBHOST_GET_STRING_DESC// #define CONFIG_USBHOST_MSOS_ENABLE#ifndefCONFIG_USBHOST_MSOS_VENDOR_CODE#defineCONFIG_USBHOST_MSOS_VENDOR_CODE 0x00#endif/* Ep0 max transfer buffer */#ifndefCONFIG_USBHOST_REQUEST_BUFFER_LEN#defineCONFIG_USBHOST_REQUEST_BUFFER_LEN 2048#endif#ifndefCONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT#defineCONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT 500#endif#ifndefCONFIG_USBHOST_MSC_TIMEOUT#defineCONFIG_USBHOST_MSC_TIMEOUT 5000#endif/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size,* you can change with 2K,4K,8K,16K,default is 2K to get one TCP_MSS*/#ifndefCONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE#defineCONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE (2048)#endif#ifndefCONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE#defineCONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE (2048)#endif/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size,* you can change with 2K,4K,8K,16K,default is 2K to get one TCP_MSS*/#ifndefCONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE#defineCONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE (2048)#endif#ifndefCONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE#defineCONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE (2048)#endif/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size,* you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow.*/#ifndefCONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE#defineCONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE (2048)#endif/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */#ifndefCONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE#defineCONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE (2048)#endif/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size,* you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow.*/#ifndefCONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE#defineCONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE (2048)#endif/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */#ifndefCONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE#defineCONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE (2048)#endif#defineCONFIG_USBHOST_BLUETOOTH_HCI_H4// #define CONFIG_USBHOST_BLUETOOTH_HCI_LOG#ifndefCONFIG_USBHOST_BLUETOOTH_TX_SIZE#defineCONFIG_USBHOST_BLUETOOTH_TX_SIZE 2048#endif#ifndefCONFIG_USBHOST_BLUETOOTH_RX_SIZE#defineCONFIG_USBHOST_BLUETOOTH_RX_SIZE 2048#endif/* ================ USB Device Port Configuration ================*/#ifndefCONFIG_USBDEV_MAX_BUS#defineCONFIG_USBDEV_MAX_BUS 1// for now, bus num must be 1 except hpm ip#endif#ifndefCONFIG_USBDEV_EP_NUM#defineCONFIG_USBDEV_EP_NUM 6#endif/* ---------------- FSDEV Configuration ---------------- *///#define CONFIG_USBDEV_FSDEV_PMA_ACCESS 2 // maybe 1 or 2, many chips may have a difference/* ---------------- DWC2 Configuration ---------------- */// #define CONFIG_USB_DWC2_RXALL_FIFO_SIZE (320)// #define CONFIG_USB_DWC2_TX0_FIFO_SIZE (64 / 4)// #define CONFIG_USB_DWC2_TX1_FIFO_SIZE (512 / 4)// #define CONFIG_USB_DWC2_TX2_FIFO_SIZE (64 / 4)// #define CONFIG_USB_DWC2_TX3_FIFO_SIZE (64 / 4)// #define CONFIG_USB_DWC2_TX4_FIFO_SIZE (0 / 4)// #define CONFIG_USB_DWC2_TX5_FIFO_SIZE (0 / 4)// #define CONFIG_USB_DWC2_TX6_FIFO_SIZE (0 / 4)// #define CONFIG_USB_DWC2_TX7_FIFO_SIZE (0 / 4)// #define CONFIG_USB_DWC2_TX8_FIFO_SIZE (0 / 4)/* ---------------- MUSB Configuration ---------------- */// #define CONFIG_USB_MUSB_SUNXI/* ================ USB Host Port Configuration ==================*/#ifndefCONFIG_USBHOST_MAX_BUS#defineCONFIG_USBHOST_MAX_BUS 1#endif#ifndefCONFIG_USBHOST_PIPE_NUM#defineCONFIG_USBHOST_PIPE_NUM 12#endif/* ---------------- EHCI Configuration ---------------- */#defineCONFIG_USB_EHCI_HCCR_OFFSET (0x0)#defineCONFIG_USB_EHCI_FRAME_LIST_SIZE 1024#defineCONFIG_USB_EHCI_QH_NUM CONFIG_USBHOST_PIPE_NUM#defineCONFIG_USB_EHCI_QTD_NUM 3#defineCONFIG_USB_EHCI_ITD_NUM 20// #define CONFIG_USB_EHCI_HCOR_RESERVED_DISABLE// #define CONFIG_USB_EHCI_CONFIGFLAG// #define CONFIG_USB_EHCI_ISO// #define CONFIG_USB_EHCI_WITH_OHCI/* ---------------- OHCI Configuration ---------------- */#defineCONFIG_USB_OHCI_HCOR_OFFSET (0x0)/* ---------------- XHCI Configuration ---------------- */#defineCONFIG_USB_XHCI_HCCR_OFFSET (0x0)/* ---------------- DWC2 Configuration ---------------- *//* largest non-periodic USB packet used / 4 */#defineCONFIG_USB_DWC2_NPTX_FIFO_SIZE (512 / 4)/* largest periodic USB packet used / 4 */#defineCONFIG_USB_DWC2_PTX_FIFO_SIZE (1024 / 4)/** (largest USB packet used / 4) + 1 for status information + 1 transfer complete +* 1 location each for Bulk/Control endpoint for handling NAK/NYET scenario*/#defineCONFIG_USB_DWC2_RX_FIFO_SIZE ((1012 - CONFIG_USB_DWC2_NPTX_FIFO_SIZE - CONFIG_USB_DWC2_PTX_FIFO_SIZE))/* ---------------- MUSB Configuration ---------------- */// #define CONFIG_USB_MUSB_SUNXI#endif
然后再次編譯,報錯少了很多
2
RT_TIMER_THREAD_STACK_SIZE問題
解決辦法
注意,也要將空閑線程棧調大
3
lwip版本問題
解決辦法,使用lwip2.1.2
4
lwip接收線程問題
解決辦法,關閉lwip接收線程
5
lwip線程堆棧問題
解決辦法增大線程堆棧
6
鏈接腳本問題
解決辦法,在鏈接腳本里增加代碼
/* section information for USB Host class (CherryUSB) */ . =ALIGN(4); __usbh_class_info_start__ = .; KEEP(*(.usbh_class_info)) __usbh_class_info_end__ = .;
再次編譯,沒有問題
4 main.c添加代碼
#include#defineDBG_TAG"main"#defineDBG_LVL DBG_LOG#include#include#include"usbh_core.h"#include"lwip/tcpip.h"intmain(void){ usbh_initialize(0, USB_OTG_HS_PERIPH_BASE);returnRT_EOK;
5 完成
燒錄之后終端信息:
輸入ping命令:
-
操作系統
+關注
關注
37文章
7133瀏覽量
125386 -
開發板
+關注
關注
25文章
5644瀏覽量
103901 -
RT-Thread
+關注
關注
32文章
1396瀏覽量
41755
發布評論請先 登錄
如何在PSoC62 Evaluation kit開發板上運行RT-Thread呢?

如何使用RT-Thread Studio創建支持HPM6750開發板的RT-Thread項目
【原創精選】RT-Thread征文精選技術文章合集
RT-Thread開發,如何有效學習RT-Thread的五個步驟

RT-Thread Studio驅動SD卡

基于RoboMasterC型開發板的RT-Thread使用分享(一)
【QEMU系列】不用開發板運行RT-Thread指南-ARM架構

RT-Thread USB協議棧-CherryUSB快速上手指南

CherryUSB-HID設備實踐 | 技術集結

評論