让开发板畅游网络:RT-Thread CherryUSB 驱动 RNDIS 模块详解 | 技术集结

描述

本文通过在 RT-Thread 操作系统上,使用 CherryUSB 软件包作为 USB Host 协议栈,驱动 AIR780E 4G Cat.1 模块 的 RNDIS 功能,并成功接入 lwIP 网络协议栈,最终在开发板上实现了通过 4G 模块上网的功能,以STM32F429为例。


 

目录


 

新建工程


 

配置cubemx


 

配置cherryusb


 

main.c添加代码


 

完成

1 新建工程


 

RT-Thread


 

2 配置cubemx


 

四大件不过多赘述

RT-ThreadRT-ThreadRT-ThreadRT-Thread

打开USB HOST功能

RT-Thread

打开USB HOST中断

RT-Thread

cubemx配置到此结束,点击生成工程,关闭cubemx


 

3 配置cherryusb


 

先编译一下工程,发现会有个报错:

RT-Thread

把RT_WEAK删掉重新编译就不会报错了

RT-Thread

然后打开RT-Thread Settings,添加软件包

RT-Thread

配置cherryusb

RT-Thread

其实这里可以只打开rndis,不打开CDC ACM也能驱动air780实现LWIP上网,但是终端会一大堆报红提示不支持CDC ACM,强迫症难受所以干脆打开


 

这时候保存,编译会有一大堆报错,不慌,一个一个解决:

1

usb_config.h报错

RT-Thread

解决办法,在applications文件夹下添加usb_config.h代码内容如下:

  •  

/* * Copyright (c) 2022, sakumisu * * SPDX-License-Identifier: Apache-2.0 */#ifndef CHERRYUSB_CONFIG_H#define CHERRYUSB_CONFIG_H/* ================ USB common Configuration ================ */#define CONFIG_USB_PRINTF(...) printf(__VA_ARGS__)#ifndef CONFIG_USB_DBG_LEVEL#define CONFIG_USB_DBG_LEVEL USB_DBG_INFO#endif/* Enable print with color */#define CONFIG_USB_PRINTF_COLOR_ENABLE/* data align size when use dma */#ifndef CONFIG_USB_ALIGN_SIZE#define CONFIG_USB_ALIGN_SIZE 4#endif/* attribute data into no cache ram */#define USB_NOCACHE_RAM_SECTION __attribute__((section(".noncacheable")))/* ================= USB Device Stack Configuration ================ *//* Ep0 in and out transfer buffer */#ifndef CONFIG_USBDEV_REQUEST_BUFFER_LEN#define CONFIG_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#ifndef CONFIG_USBDEV_MSC_MAX_LUN#define CONFIG_USBDEV_MSC_MAX_LUN 1#endif#ifndef CONFIG_USBDEV_MSC_MAX_BUFSIZE#define CONFIG_USBDEV_MSC_MAX_BUFSIZE 512#endif#ifndef CONFIG_USBDEV_MSC_MANUFACTURER_STRING#define CONFIG_USBDEV_MSC_MANUFACTURER_STRING ""#endif#ifndef CONFIG_USBDEV_MSC_PRODUCT_STRING#define CONFIG_USBDEV_MSC_PRODUCT_STRING ""#endif#ifndef CONFIG_USBDEV_MSC_VERSION_STRING#define CONFIG_USBDEV_MSC_VERSION_STRING "0.01"#endif// #define CONFIG_USBDEV_MSC_THREAD#ifndef CONFIG_USBDEV_MSC_PRIO#define CONFIG_USBDEV_MSC_PRIO 4#endif#ifndef CONFIG_USBDEV_MSC_STACKSIZE#define CONFIG_USBDEV_MSC_STACKSIZE 2048#endif#ifndef CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE#define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156#endif#ifndef CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE#define CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE 2048#endif#ifndef CONFIG_USBDEV_RNDIS_VENDOR_ID#define CONFIG_USBDEV_RNDIS_VENDOR_ID 0x0000ffff#endif#ifndef CONFIG_USBDEV_RNDIS_VENDOR_DESC#define CONFIG_USBDEV_RNDIS_VENDOR_DESC "CherryUSB"#endif#define CONFIG_USBDEV_RNDIS_USING_LWIP/* ================ USB HOST Stack Configuration ================== */#define CONFIG_USBHOST_MAX_RHPORTS          1#define CONFIG_USBHOST_MAX_EXTHUBS          1#define CONFIG_USBHOST_MAX_EHPORTS          4#define CONFIG_USBHOST_MAX_INTERFACES       8#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 8#define CONFIG_USBHOST_MAX_ENDPOINTS        4#define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4#define CONFIG_USBHOST_MAX_HID_CLASS     4#define CONFIG_USBHOST_MAX_MSC_CLASS     2#define CONFIG_USBHOST_MAX_AUDIO_CLASS   1#define CONFIG_USBHOST_MAX_VIDEO_CLASS   1#define CONFIG_USBHOST_DEV_NAMELEN 16#ifndef CONFIG_USBHOST_PSC_PRIO#define CONFIG_USBHOST_PSC_PRIO 0#endif#ifndef CONFIG_USBHOST_PSC_STACKSIZE#define CONFIG_USBHOST_PSC_STACKSIZE 2048#endif//#define CONFIG_USBHOST_GET_STRING_DESC// #define CONFIG_USBHOST_MSOS_ENABLE#ifndef CONFIG_USBHOST_MSOS_VENDOR_CODE#define CONFIG_USBHOST_MSOS_VENDOR_CODE 0x00#endif/* Ep0 max transfer buffer */#ifndef CONFIG_USBHOST_REQUEST_BUFFER_LEN#define CONFIG_USBHOST_REQUEST_BUFFER_LEN 2048#endif#ifndef CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT#define CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT 500#endif#ifndef CONFIG_USBHOST_MSC_TIMEOUT#define CONFIG_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 */#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE#define CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE (2048)#endif#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE#define CONFIG_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 */#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE#define CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE (2048)#endif#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE#define CONFIG_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. */#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE#define CONFIG_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 */#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE#define CONFIG_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. */#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE#define CONFIG_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 */#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE#define CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE (2048)#endif#define CONFIG_USBHOST_BLUETOOTH_HCI_H4// #define CONFIG_USBHOST_BLUETOOTH_HCI_LOG#ifndef CONFIG_USBHOST_BLUETOOTH_TX_SIZE#define CONFIG_USBHOST_BLUETOOTH_TX_SIZE 2048#endif#ifndef CONFIG_USBHOST_BLUETOOTH_RX_SIZE#define CONFIG_USBHOST_BLUETOOTH_RX_SIZE 2048#endif/* ================ USB Device Port Configuration ================*/#ifndef CONFIG_USBDEV_MAX_BUS#define CONFIG_USBDEV_MAX_BUS 1 // for now, bus num must be 1 except hpm ip#endif#ifndef CONFIG_USBDEV_EP_NUM#define CONFIG_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 ==================*/#ifndef CONFIG_USBHOST_MAX_BUS#define CONFIG_USBHOST_MAX_BUS 1#endif#ifndef CONFIG_USBHOST_PIPE_NUM#define CONFIG_USBHOST_PIPE_NUM 12#endif/* ---------------- EHCI Configuration ---------------- */#define CONFIG_USB_EHCI_HCCR_OFFSET     (0x0)#define CONFIG_USB_EHCI_FRAME_LIST_SIZE 1024#define CONFIG_USB_EHCI_QH_NUM          CONFIG_USBHOST_PIPE_NUM#define CONFIG_USB_EHCI_QTD_NUM         3#define CONFIG_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 ---------------- */#define CONFIG_USB_OHCI_HCOR_OFFSET (0x0)/* ---------------- XHCI Configuration ---------------- */#define CONFIG_USB_XHCI_HCCR_OFFSET (0x0)/* ---------------- DWC2 Configuration ---------------- *//* largest non-periodic USB packet used / 4 */#define CONFIG_USB_DWC2_NPTX_FIFO_SIZE (512 / 4)/* largest periodic USB packet used / 4 */#define CONFIG_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 */#define CONFIG_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

然后再次编译,报错少了很多

RT-Thread

2

RT_TIMER_THREAD_STACK_SIZE问题

RT-Thread

解决办法

RT-Thread

注意,也要将空闲线程栈调大

RT-Thread

3

lwip版本问题

RT-Thread

解决办法,使用lwip2.1.2

RT-ThreadRT-Thread

4

lwip接收线程问题

RT-Thread

解决办法,关闭lwip接收线程

RT-Thread

5

lwip线程堆栈问题

RT-Thread

解决办法增大线程堆栈

RT-Thread

6

链接脚本问题

RT-Thread

解决办法,在链接脚本里增加代码

RT-ThreadRT-Thread

  •  
  •  
  •  
  •  
  •  

/* section information for USB Host class (CherryUSB) */        . = ALIGN(4);        __usbh_class_info_start__ = .;        KEEP(*(.usbh_class_info))        __usbh_class_info_end__ = .;

再次编译,没有问题

RT-Thread


 

4 main.c添加代码


 

RT-Thread

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

#include#define DBG_TAG "main"#define DBG_LVL DBG_LOG#include#include#include"usbh_core.h"#include"lwip/tcpip.h"intmain(void){    usbh_initialize(0, USB_OTG_HS_PERIPH_BASE);return RT_EOK;


 

5 完成


 

烧录之后终端信息:

RT-Thread

输入ping命令:

RT-Thread


 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分