STM32驱动开发(二)--USB Device RNDIS虚拟网卡(USB2.0 基础概念讲解)

STM32驱动开发(二)–USB Device RNDIS虚拟网卡(USB2.0基础概念讲解)

一、简介
  本文基于stm32 Rndis实例,github开源, 使用STM32F407单板。结合协议讲解stm32中USB虚拟网卡驱动的实现。达到外部主机(手机)通过USB接口访问物联网设备网页的功能。

二、参考资料
  目前关于USB驱动、RNDIS协议讲解的资料非常少,较多的是windows和linux中的案例,也并没有系统讲述细节。初学者可以看看《圈圈教你玩usb》,结合着书的简介结合标准英文协议来看。本人根据网上找的例子,根据HAL库重新移植实现。把这个案例梳理下来,希望对以后有相同需求的开发者提供一个借鉴的作用。总体参考的资料如下:
   1) USB 2.0标准协议
   https://usb.org/sites/default/files/usb_20_20210701.zip

  2) CDC通信设备类标准协议
   https://usb.org/sites/default/files/CDC1.2_WMC1.1_012011.zip

  3) 微软RNDIS标准协议 (3290页开始)
   https://docs.microsoft.com/en-us/windows-hardware/drivers/opbuildpdf/network/toc.pdf?branch=live

  4) STM32 usb库官方实例
https://www.st.com/content/ccc/resource/technical/document/user_manual/1c/6b/06/e6/19/6c/46/bf/CD00289278.pdf/files/CD00289278.pdf/jcr:content/translations/en.CD00289278.pdf

  5) 参考的github中实例源码(原作貌似是俄罗斯人)
   https://github.com/fetisov/lrndis

三、实现效果
  如下图,图片来源于参考的github作者的演示,可以通过手机USB连接设备,访问设备的WEB页面:
在这里插入图片描述
在这里插入图片描述
  通过手机,可以对设备进行参数设置和LED控制:
在这里插入图片描述
  通过USB自动虚拟网卡,在设备维护中,不再需要通过手提电脑网线接入,配置网络参数创建网卡等操作,实现轻松运维

四、相关概念详解
  下面进入正文,整个案例涉及的概念非常多,相比于其他基本驱动,USB驱动的确是属于较为高级的驱动。整个案例涉及的概念有:

  1)USB标准中的域、包、事务、传输(控制传输、中断传输、批量传输、定时传输,当前涉及前三种);

  2)USB标准中的描述符、设备、配置、接口、端点(控制端点、数据端点、中断端点(当前模型中用作通知端点));

  3)USB标准中的CDC通信设备类(Communications Devices Class)定义;

  4)USB标准中所有标准请求(Standard Device Requests), CDC类的特有请求(Class-Specific Request)和协议封装请求(SEND_ENCAPSULATED_COMMAND 、GET_ENCAPSULATED_RESPONSE)定义;

  5)RNDIS设备定义以及消息协议。基于CDC类基础上通过协议封装请求传输RNDIS控制消息(RNDIS Control Messages),使用自定义数据端点传输数据消息(RNDIS Data Messages)。

  6)lwip协议栈虚拟网卡与USB虚拟网卡的数据交互(透传);

  后面需要对所有概念串成一个整体来讲,比较容易理解其中的关系。

五、USB 2.0标准
  首先介绍USB标准中的定义,USB 2.0标准总共十一章正文,三章附录。与软件相关的有四、五、八、九、十章、目录如下:
在这里插入图片描述
   第四章重点内容如下:
   4.1 USB 系统描述
   整个USB系统分为USB主机,USB设备,USB集线器三部分。
   其中USB拓扑图如下:
在这里插入图片描述
   在系统中,只能有一个主机Host(主机包含硬件,固件,软件部分), Hub表示集线器(连接USB主机与设备),Func表示一个设备。

   对应原文部分:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

   4.2 物理接口
   USB线缆结构为:
在这里插入图片描述
   其中,VBUS, GND用于供电,通常是+5V,主机可为设备供电,设备也可以自供电。
   D+,D-用于差分传输信号。总共有三种速度,高速HS(480 Mb/s.),全速FS(12 Mb/s.)和低速LS(12 Mb/s.)。USB OTG多了一根ID线,总共有五根线。

   对应原文部分:

在这里插入图片描述 在这里插入图片描述
在这里插入图片描述

  目前使用OTG全速规格实现,对应芯片引脚为PA11, PA12,芯片引脚和电路图如下:
在这里插入图片描述
在这里插入图片描述

   4.4 总线协议
   大多数传输都由三个包组成。分别是token包,data包和handshake包。必定从token开始,handshake结束。
   token包:每个事务都从token包开始。由主机发出,标识了传输类型和方向、设备地址和端点地址。所有令牌包都由主机发出。
  data包:根据token包的定义,发具体的data包(也可能没有data包);SOF令牌包没有data阶段。
  handshake包:由传输源(待定)发送完数据之后发出,表示数据传输完成。
  包的定义后面还有详解。

  原文对应如下:

在这里插入图片描述

   概念有点多,同学们照着上面给的路径看,下一篇直接结合协议进入报文分析。

版权声明:本文为CSDN博主「同人与野」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chenlonglong2014/article/details/119859503

生成海报
点赞 0

同人与野

我还没有学会写个人说明!

暂无评论

相关推荐

趣聊51之串口通信(概念篇)

对于刚刚接触单片机的同学们来说,串口通信似乎是一个神秘感十足的东西,笔者在刚刚开始学习51单片机时,读的是郭天祥先生的那本著名的《新概念51单片机教程》,贼厚的一本书,但是等

ANO匿名上位机V7协议&STM32

ANO匿名上位机V7协议&STM32 说明:以下程序为自己编写,若有误欢迎各位指出。 基于ANO匿名V7上位机的通信协议编写的代码 前言 提示:以下内容需用到C语言中的指针、结构体、枚举、及大小端