zoukankan      html  css  js  c++  java
  • 嵌入式开发之usb 转 net --- 支持持USB 网络适配器方案

    (1)、应用背景

    (2)、usb 简介

    (3)、网卡 接口

    (4)、usb 转net

    (5)、usb 网卡驱动实现

    (6)、usb 直连通信

    神奇的usb

    ----------author:midu

    -----------------dateTime:20200612

    ----------------------qq:1327706646

    (1)、应用背景

     许多项目在空间设计方面需要节省空间,可以考虑去掉网卡器件,预留usb 外接phy 转换芯片进行网络通信,或是直接usb 协议通信。

    现在市面有很多基于usb 接口的链接器可以使用,比如外接usb wifi模块、usb 外接摄像头模组、usb 外接存储盘、外接USB 网络模块(厂家有某绿)等等,丰富了接口应用

    (2)、usb 简介

    2.1 什么事usb

    直译就是通用串行总线。 

    2.2 usb 协议版本

    • USB 1.0/1.1(low/full speed),传输速率最大为12Mbps
    • USB 2.0(high speed),传输速率最大480Mbps
    • USB 3.0(super speed),传输速率最大5Gbps
    协议版本向下兼容
    2.3 usb 接口分类
    • Type A,即使我们电脑上的那种接口。
    • Type B,不太常见,比较方正的T型接口,有的嵌入式开发板会用。
    • Type C,现在开始流行起来了,最大的好处就是可以盲插,而不用区分正反。
    • Micro/mini,手机上比较常见。

    不管哪种接口,用的线都是4根,只是形状不同而已。

    2.4 usb 描述符
    谈到USB描述符,不得不说USB最强悍的地方就在这里。一个口可以插很多的设备,可以插U盘、上网卡、音频设备、还有的是复合设备,一个设备插上后可以虚拟出多个设备出来,太强了。
    主设备之所以能区分不同的从设备,靠的就是描述符。 于是USB协议里就规定了各种不同的USB描述符。让我们先看一下USB协议里四大描述符之间的关系

    设备描述(device description),配置描述符(configrue description),接口描述符(interface description),端点描述符(endpoint description)

    2.5 usb 累class

    class用来描述设备属于哪种设备,例如音频、键盘、U盘等。设备通过class来确认和加载相应的驱动。class分为device classinterface class。具体的class值以及含义,参考define class

    • class 包含
      1. class
      1. subclass
      1. protocol

    组合在一起,用来指出设备具体功能。

    2.6 usb 包packet

     包(Packet)是USB系统中信息传输的基本单元,所有数据都是经过打包后在总线上传输的。数据在 USB总线上的传输以包为单位,包只能在帧内传输。高速USB 总线的帧周期为125us,全速以及低速 USB 总线的帧周期为 1ms。帧的起始由一个特定的包(SOF 包)表示,帧尾为 EOF。EOF不是一个包,而是一种电平状态,EOF期间不允许有数据传输。 
           注意:虽然高速USB总线和全速/低速USB总线的帧周期不一样,但是SOF包中帧编号的增加速度是一样的,因为在高速USB系统中,SOF包中帧编号实际上取得是计数器的高11位,最低三位作为微帧编号没有使用,因此其帧编号的增加周期也为 1mS。

          • USB总线上的情形是怎样的?

          • 包是USB总线上数据传输的最小单位,不能被打断或干扰,否则会引发错误。若干个数据包组成一次事务传输,一次事务传输也不能打断,属于一次事务传输的几个包必须连续,不能跨帧完成。一次传输由一次到多次事务传输构成,可以跨帧完成。

            USB包由五部分组成,即同步字段(SYNC)、包标识符字段(PID)、数据字段、循环冗余校验字段(CRC)和包结尾字段(EOP),包的基本格式如下图:

     

    (3)、网卡 接口

    如果是转网络,可选usb转网络芯片模块,如文末附图物件;

    若是直接usb通信,就无须网络转接头,直接用两头公头连接,usb协议通信

    (4)、usb 转net

    https://blog.csdn.net/qq_22182835/article/details/89457512

    (5)、usb 网卡驱动实现

    5.1 usb 驱动框架

    a .主要驱动架构

    b. 主机驱动架构

     

    c. 设备端驱动架构

    从上图可知,设备端驱动包含两部分:
        1) 底层设备控制器驱动
        2) 上层大容量存储类驱动

    设备控制器驱动

     USB设备控制器驱动主要实现Gadget API定义的函数和中断服务函数,可按功能划分为:API函数实现模块和中断处理模块。
           API函数主要实现Gadget API定义的函数功能,如结构体usb_ep_ops和usb_gadget_ops中的函数、usb_gadget_register_driver函数。这些函数是供Gadget Driver调用。
           中断处理模块主要处理设备控制器产生的各种中断,包括端点中断、复位、挂起等中断。

    5.2 usb 初始化过程

    USB驱动作为一个系统,集成了众多的驱动模块,注册过程非常复杂。从USB系统的角度来说,USB主机驱动主要包含:

           1) USB核驱动

           2) 主机控制器驱动

           3) 集线器驱动

           驱动的加载执行流程如下图所示:

     a. USB Core的初始化

       USB驱动从USB子系统的初始化开始,USB子系统的初始化在文件driver/usb/core/usb.c

    1.  
      subsys_initcall(usb_init);
    2.  
      module_exit(usb_exit);

            subsys_initcall()是一个宏,可以理解为module_init()。由于此部分代码非常重要,开发者把它看作一个子系统,而不仅仅是一个模块。USB Core这个模块代表的不是某一个设备,而是所有USB设备赖以生存的模块。在Linux中,像这样一个类别的设备驱动被归结为一个子系统。subsys_initcall(usb_init)告诉我们,usb_init才是真正的初始化函数,而usb_exit将是整个USB子系统结束时的清理函数。

    b. 主机控制器的初始化及驱动执行(以EHCI为例)

       module_init(otg_init); 模块注册
       static init __init otg_init(void);
       platform_driver_register(); 平台注册
       static int __init otg_probe(struct platform_device *pdev); 探测处理函数
       reg = platform_get_resource(pdev, IORESOURCE_MEM, 0); 获取寄存器信息
       data = platform_get_resource(pdev,IORESOURCE_MEM, 1); 获取内存信息
       irq = platform_get_irq(pdev,0); 获取中断号
       usb_create_hcd(&otg_hc_driver, &pdev->dev, pdev->dev.bus_id);
       分配和初始化HCD结构体。对设备数据空间进行分配,初始化计数器、总线、定时器、hcd结构体各成员值。
       ret = usb_add_hcd(hcd,irq,SA_INTERRUPT);
       完成HCD结构体的初始化和注册。申请buffer,注册总线、分配设备端内存空间,向中断向量表中申请中断,注册根集线器,对根集线器状态进行轮询。

    c.注册集线器

           register_root_hub(hcd);
          在USB系统驱动加载的过程中,创建了集线器的线程(khubd),并且一直查询相应的线程事务。HCD驱动中,将集线器作为一个设备添加到主机控制器驱动中,然后进行集线器端口的初始化。在USB主机看来,根集线器本身也是USB主机的设备。USB主机驱动加载完成之后,即开始注册根集线器,并且作为一个设备加载到主机驱动之中。
           USB主机和USB设备之间进行数据交互,USB设备本身并没有总线控制权,U盘被动地接收USB主机发送过来的信息并做出响应。USB主机控制器与根集线器构成了主机系统,然后外接其它的USB设备。
           为了更好地探测到根集线器的状态变化,USB主机控制器驱动增加了状态轮询函数,以一定的时间间隔轮询根集线器状态是否发生变化。一旦根集线器状态发生变化,主机控制器就会产生相应的响应。
           USB主机和USB设备之间的数据传输以URB(USB Request Block)的形式进行。

    (6)、usb 直连通信

    鸣谢:

    https://wenku.baidu.com/view/54b8f334a200a6c30c22590102020740be1ecda8.html AX88772_USB转以太网PHY芯片原理设计

    https://www.jianshu.com/p/3afc1eb5bd32 usb 协议

    https://blog.csdn.net/myarrow/article/details/8279156 USB协议架构及驱动架构

    https://blog.csdn.net/songze_lee/article/details/77658094 usb 协议简介

    http://www.42xz.com/soft/3238.html#xzz  usbblyzer 下载地址

    https://blog.csdn.net/ZCShouCSDN/article/details/81448023 USB 之三 常用抓包/协议分析工具(Bus Hound、USBlyzer、USBTrace、USB Monitor Pro等)

    https://blog.csdn.net/g200407331/article/details/51682597 usb 通信协议深入理解

    https://blog.csdn.net/u010142953/article/details/82627591 USB协议基本知识

    http://bbs.ntpcb.com/read.php?tid-121943.html usb net pcb

    https://www.lulian.cn/product/list-115-cn.html  绿联USB有线百兆网卡

    https://www.asix.com.tw/cs/download.php?sub=driverdetail&PItemID=86  驱动代码,AX88772 驱动程序下载

    https://blog.csdn.net/weixin_33834075/article/details/85933953 

    https://blog.csdn.net/u010333084/article/details/102751186?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase USB网卡 AX88772C 驱动交叉编译

    https://www.asix.com.tw/FrootAttach/userguide/How_to_identify_Authentic_ASIX_USB-to-LAN_Products_v100.pdf usb 驱动详解

    http://bbs.16rd.com/forum-38-1.html 1牛网

  • 相关阅读:
    path.join()和path.resolve()的区别
    防抖debounce和节流throttle
    Promise原理剖析
    从页面到服务器,node实现文件下载
    从toString()方法到Object.prototype.toString.call()方法
    一个url加载的全过程
    vue2.0中配置文件路径
    vue2.0 #$emit,$on的使用
    跨平台移动应用引擎CrossApp V0.6.0 发布,增加视频控件
    天使汇&9秒闪投手游专场-寻找下一个《刀塔传奇》
  • 原文地址:https://www.cnblogs.com/pengkunfan/p/13109686.html
Copyright © 2011-2022 走看看