查看: 581|回复: 0

[分享] 使用i.MX RT1060连接USB 4G module(RNDIS模式)

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3298

    主题

    6545

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32003
    最后登录
    2024-4-9
    发表于 2023-5-23 16:57:23 | 显示全部楼层 |阅读模式
    使用i.MX RT1060连接USB 4G module(RNDIS模式)


    NXP的SDK里面有一个例程evkbmimxrt1060_lwip_dhcp_usb_bm,该例程可以实现连接3款不同的支持RNDIS的手机,实现USB 4G上网功能。但是如果客户实际使用的上网终端是4G模块,而不是这三款手机,这个例程就有可能不能直接跑起来,需要我们去做适配。

    本文就将介绍,当上网的终端更改为Quectel的4G LTE模块C200A-CN时(支持RNDIS模式),如何来做响应的适配,并实现上网的功能。

    一、基础知识
    1.1 什么是RNDIS

    RNDIS = Remote Network Driver Interface Specification,即远程网络驱动接口规范。这是微软定义的一套基于USB的通信协议。基于该协议的USB设备,可以免驱直接接入windows系统,在windows操作系统上显示为一个网卡。

    1.2 网络层次模型
    使用RT1060连接USB 4G module上网的网络层次模型如下:
    11.png
    从便于理解的角度上,我们可以把RNDIS看成是一个特殊的PHY,完成MAC的传输。
    1.3 RNDIS上网接口/端点分析

    在SDK原例程中,使用了2个接口,3个端点,见下图。
    12.png

    其中数据接口就是用来传输以太包的,每个方向有一个端点。RNDIS接口主要是用来查询设备状态。
    1.4 C200A接口/端点分析


    C200A的实现了5个接口,其中包含了上述接口:
    13.png
    额外需要使用到的接口是AT接口,见下图。
    14.png
    AT接口的功能是拨号,这里面包括了对模块的状态查询和控制等。我们需要在这里向4G模块查询相关的状态,并且发送联网命令,这样模块才能接入互联网,这样后面发送的IP包才能和互联网进行通信。使能AT接口以及在AT接口上拨号,是我们使能/适配新的4G module需要做的主要工作。
    4G模块其他定义的接口,我们这里并不需要使用到,所以本文在此不做介绍。
    1.5 关于NXP SDK USB HOST的一些基础知识

    1)SDK会自动解析配置描述符,这里会识别出配置描述符中所有的接口和端点。参见USB_HostParseDeviceConfigurationDescriptor(),这个函数在/evkbmimxrt1060_lwip_dhcp_usb_bm_c200a/usb/host/usb_host_devices.c。
    15.png
    2)Event回调,参见USB_HostEvent(),此函数在/evkbmimxrt1060_lwip_dhcp_usb_bm_c200a/lwip/port/usb_ethernetif_bm.c。
    16.png
    3)为每个接口open pipe。
    参见USB_HostCdcOpenDataInterfac(),USB_HostCdcOpenControlInterface(), in usb_host_cdc.c。
    17.png
    4)状态机维护
    状态机的维护请参见USB_HosCdcRndisTask(),以及
    USB_HostCdcRndisControlCallback() in
    /evkbmimxrt1060_lwip_dhcp_usb_bm_c200a/lwip/port/usb_ethernetif_bm.c
    下图展示的是默认的状态机,我们需要做一些调整来使能4G模块的AT接口以及在AT接口上拨号。
    18.png
    二、实现细节


    基于前面介绍的基础知识,本章节主要介绍适配到C200A的实现细节,这里更侧重于代码更改来讲述。代码的更新主要集中于usb_ethernet_bm.c和usb_ethernet.h。
    增加AT接口对应的数据结构
    19.png
    更新状态机
    20.png
    增加对应的API和callback,具体细节请参见本文相关的代码,下面列出了关键的API。
    1. USB_HostCdcRndisATInCallback();
    2. USB_HostCdcRndisATOutCallback();
    3. dial_tx(); // Send command on AT interface
    4. dial_rx(); // Receive message from AT interface
    5. lte_dial(); // Dial, then USB 4G module can connect to internet
    6. USB_HostCdcRndisC200ACallback();
    7. ep0_communicate(); // API used for AT interface enablement, to send/receive command/message to/from EP0
    8. init_c200a(); // Initiate C200A, then AT interface communication is available
    复制代码
    支持的最大接口数。


    这个最大接口数在连接不同的USB 4G Module的时候,可能需要更改。比如对于LE910C1-EU,需要更改为8。对于本文中使用到的C200A,默认的5就可以工作。
    1. #define USB_HOST_CONFIG_CONFIGURATION_MAX_INTERFACE (8U)
    复制代码
    更新状态机,主要代码变动在evkbmimxrt1060_lwip_dhcp_usb_bm\lwip\port\usb_ethernetif_bm.c中的USB_HostCdcRndisControlCallback()以及USB_HosCdcRndisTask()中,具体细节请参见本文相关的代码。
    适配4G模块的RNDIS接口和AT接口,这里的AT接口序号是通过USB协议分析仪抓出的log反向推导出来的。我们需要把协议栈解析出来的接口绑定到g_RndisInstance.atInterfaceHandle上。以下代码位于\evkbmimxrt1060_lwip_dhcp_usb_bm\lwip\port\usb_ethernetif_bm.c 中的
    USB_HostCdcRndisEvent();。该代码直接将协议栈解析好的interface[3](通过usb分析仪抓包解析得出)付给对应的接口handle。
    21.png

    三、注意事项
    由于4G模块比较耗电,在本例中i.MX RT1060模块需要使用电源适配器外接供电。否则如果供电不足会导致4G模块重复复位。
    22.png

    四、小结
    在万物互联的时代,越来越多的嵌入式设备会有接入互联网的需求。本文阐述了通过USB去连接4G模块去实现上网的相关基础知识和实现细节。希望这些内容能在读者在碰到相关的应用时能有所帮助。

    五、代码链接
    本文的代码可以从以下链接获取:
    https://gitee.com/nxa16038/usb_rndis_4g_module_public





    签到签到
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-20 01:22 , Processed in 0.134896 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表