USB协议概念学习

2023-05-16

1. USB总线结构

usb的总线拓扑结构如下所示:
在这里插入图片描述

从USB总线结构可以看出,主要由3部分组成:USB主机(Host)、USB线缆、USB设备(hub/Func等)。

  • USB主机:一般成为USB Host,包含USB主控制器,并且能够完成USB主机和设备之间的数据管理和传输。在整个USB的通信过程中,USB主机处于主导地位,由USB主机发起数据和命令的传输,USB设备被动响应USB主机发起来的请求命令。在USB规范中,仅允许一个USB主机存在于一个USB子系统中,并且USB主机最多只能分配127个地址(1~127).

  • USB线缆:连接USB主机和USB设备的线缆,譬如常见的micro usb线

  • USB设备:USB设备根据自身功能分为USB集线器(USB Hub)和USB功能设备(U盘等)。

    • USB集线器:用于扩展USB主机的USB端口,支持级联和USB速度转换,一个USB系统中,最多有5个USB集线器(不包含主机根集线器)

    • USB功能设备:一个独立的外围设备,可以是多功能或者单功能:

      • USB复合设备(Compound Device):就是指将Hub和连接在Hub上的设备封装到一起所组成的设备,每个设备都会分配一个设备地址。如图Compound Device。

      • USB组合设备(USB composite device):所示在USB系统中,除了Compound Device,还有Composite Device概念,是指具有多个接口且接口间相互独立的USB设备。一个USB组合设备只有一个设备地址,可以将不同的功能与不同的接口对应,来开发多功能USB设备,即组合设备采用一个USB控制芯片,同时联接不同的USB设备(或芯片),主机可同时与这些USB设备通信。

尽管USB设备在物理上以各种复杂形式连接到USB主机,但从软件角度看,USB主机在跟连在USB主机上的设备通信时,每个设备就像直接连接到USB主机上的RootHub一样,如下图所示:
在这里插入图片描述

2. USB device抽象

USB device一般很复杂,有些设备支持多功能,譬如手机设备,对应一个usb devices来说,这个算是一个功能复杂的设备了,通过同一个usb接口,既可以提共adb调试功能,也可以提供mass storage等,但只能分时复用,不能同一时刻同时使用这两种功能,有些设备确功能很单一,譬如常见的U盘、usb键盘、usb鼠标等,只能使用其特地的功能,因此软件角度对这些进行了抽象,如下所示:
在这里插入图片描述
在usb设备的逻辑组织中,包含设备,配置,接口,端点4个层次。

  • 设备:就是指USB设备,一个设备包含一个或多个配置,但每次只能使用一个配置

  • 配置:每个USB设备提供不同的配置,使用不同的配置,设备表现出不同的功能

  • 接口:代表一个基本功能,驱动对应的抽象对象,一个配置中的所有接口都可以同时有效

  • 端点:USB数据传输的通道,每个USB设备接口,在USB主机看来,就是一个端点的集合,主机只能通过端点与usb设备通信,每个端点在usb系统中都有唯一地址,一般以端点号编码,且一个端点地址对应一个方向,所以,端点2-IN 与端点2-OUT 完全不同。 每个器件有一个默认的双向控制端点0,因此不存在端点0-IN 和端点0-OUT,且USB设备必须实现端点0

注:端点中的输入(IN)/输出(OUT)都是以主机为参考对象的,向主机发送数据叫做IN,从主机发出数据叫OUT。

3 USB传输概念

先看一张图,了解一下USB传输过程,如下所示:
在这里插入图片描述
这张图是使用USB协议分析工具抓包,然后解析得到,从图中,可以看出,usb传输由几部分组成,如下图所示:
在这里插入图片描述
下面将对USB传输、USB事务、USB包等概念进行介绍

3.1 USB传输

USB传输:USB协议规定了USB传输是用于完成一组特定目的的事务,一般由一个或者多个事务组成,在USB协议中,规定了4种传输类型,包括控制传输(control transfers)、中断传输(interrupt transfers)、批量传输(bluk transfers)、同步传输(isochronous transfers)。

  • 控制传输

控制传输是一种特殊的传输方式。当USB设备初次连接主机时,用控制传输传送控制命令等对设备进行配置。同时设备接入主机时,需要通过控制传输去获取USB设备的描述符以及对设备进行识别,在设备的枚举过程中都是使用控制传输进行数据交换。

控制传输相对于其它三个传输方式比较复杂,且具有以下特点:

  1. 无论低速设备还是高速设备都可以使用控制通道。
  2. 高速模式的最大包长固定为64个字节;
  3. 全速模式可在8、16、32、64字节中选择;
  4. 低速模式的最大包长固定为8个字节。
  5. 超高速USB3.0控制端点有固定的最大控制传输的数据有效载荷为 512 字节,最大突发大小为 1.
  6. 控制传输的应用场合:主要应用于设备的枚举过程(如读取设备描述符,设置地址,设置配置等)和对数据准确性要求较高的场合

控制传输的过程,总结如下图所示:
在这里插入图片描述
一次控制传输过程抓包如下图所示:
在这里插入图片描述
从图可以看出,本次控制传输是用来分配和设置设备地址的,由2个事务构成,一个Setup事务,一个IN事务,Setup事务用于设置设备地址,IN事务用于host向devices请求一个0字节的数据包,用于对上一个事务的数据确认。

  • 中断传输

中断传输一般用于小批量的和非连续的数据传输,通俗的来说就是用于数据量小的数据不连续的但实时性高的场合的一种传输方式,一般由IN/OUT事务组成,主要应用于人机交互设备(HID)中的USB鼠标和USB键盘等。

USB中断传输和我们传统意义上的中断不一样。它不是由设备主动地发起一个中断请求,主机响应再操作,而是由主机保证在不大于某个时间间隔内按排的一次传输,所以USB的中断实际意义是实时查询操作,即USB的中断传输是主机在一定的时间不断地主动轮询设备检查其是否有数据需要传输,对此有3个重要参数需要在端点描述符中进行配置

  1. 传输类型
  2. 每次传输的最大数据包大小
  3. 轮循时间间隔,中断端点需指定一个范围在1-255毫秒内的询查周期。主机保留足够的带宽以确保在指定频率上直接向中断端点发出IN或OUT事务

中断传输特点:

  1. 高速设备和低速设备均可使用中断传输,全速模式最大包长上限为64Byte,低速模式最大包长上限为8Byte,高速模式的最大包长上限为1024Byte
  2. 高速模式下,中断传输端点要指定其可以在超高速总线上接受或传输的最大数据包负载大小。对于支持突发大小大于 1 的中断端点,唯一允许的最大的数据包负载大小为 1024Byte;对于突发大小等于1的中断端点,最大的数据包负载大小可以在1Byte到1024Byte之间任意大小。中断端点的最大突发大小是3

中断传输过程总结如下图所示:
在这里插入图片描述
一次中断传输过程抓包如下图所示:
在这里插入图片描述
从图中可以看出,该次中断传输只有IN事务构成,对于中断传输,如果传输的数据长度大于端点支持的最大包长度,这时一个中断传输内会有多个事务。在传输数据时,如果最后一个事务的数据长度小于端点支持的最大包长度,则认为数据传输完成。

  • 批量传输

批量传输一般用于批量的和非实时的数据传输,通俗的来说就是用于数据量大但对时间要求又不高的场合的一种传输方式,类似用于USB打印机和USB扫描仪等等。

批量传输特点:

  1. 只能用于全速和高速设备,低速模式不支持批量传输
  2. 全速模式最大包长可在8、16、32、64Byte中选择
  3. 高速模式最大包长可在8、16、32、64、512Byte中选择
  4. 超高速设备数据包最大长度为1024字节,批量传输端点应在其端点描述符中设置最大的数据包负载大小为 1024Byte。它还指定端点可以接受或者发送到超高速总线的突发大小。对于批量端点允许的突发大小应在 1 至 16 范围

批量传输过程总结如下图所示:
在这里插入图片描述
一次批量传输过程抓包如下图所示:
在这里插入图片描述
从图中可以看出,该次批量传输由多个IN事务构成,每个IN事务的DATA包通过DATA1/DATA0交替出现来保证数据包的发送和接收的同步。

  • 同步传输

等时传输也有"同步传输"的叫法,一般用于要求数据连续、实时且数据量大的场合,其对传输延时十分敏感,类似用于USB摄像设备,USB语音设备等等,同步传输只能用于全速或者高速USB设备。

同步事务没有握手包,当一个同步传输中有多个事务时,最后一个事务之前的事务的数据长度必须是端点所支持的最大包长度。如果最后个事务的数据长度小于端点支持的最大包长度,则认为数据传输完成。对于全速模式的同步传输,USB设备或主机应可能接收DATA0和DATA1包,但只能发送DATA0包。

同步传输特点:

  1. 高速模式的最大包长上限为1024个字节;
  2. 全速模式的最大包长上限为1023个字节;
  3. 低速模式不支持同步传输。
  4. 超高速等时传输的端点指定所需的最大数据包有效负载大小为1024字节(对于支持大于1的突发大小,可以是0到1024之间的任何大小,以实现同步突发大小等于1的终结点。等时传输突发大小应在 1 至 16 范围。但是,在相同的时间间隔内一个等时端点最多可以请求3个突发事务。参见超高速端点伴随描述符的bmAttributes和bMaxBurst字段。

同步传输过程总结如下图所示:
在这里插入图片描述
一次同步传输过程抓包如下图所示:
在这里插入图片描述
从图中可以看出,该次批量传输由多个IN事务构成,可以看出,同步传输和批量传输很类似,但是同步传输是没有握手阶段,因此同步传输不能保证每次传输数据的正确性。

3.2 USB事务

USB事务:USB事务是保证usb实现可靠传输的最小单位。单独的包没有错误检测机制,但事务利用各个包实现了一个带有错误反馈机制的通信,保证usb传输的可靠性。

在usb协议种,按照令牌包的类型,对usb事务进行以下分类:

  • Setup事务
  • IN事务
  • OUT事务
  • Ping事务
  • SOF事务
  • SPLIT事务
  • PRE事务

一般USB事务都由3个包组成,如抓包所示:
在这里插入图片描述
从图中可以看出,USB事务由令牌包(IN包)、数据包(DATA包)(可选)、握手包(ACK)(可选)组成。

USB常见的事务如下所示:

  • Setup事务
    在这里插入图片描述
    从图中可以看出,Setup事务是由令牌包(Setup包)、数据包、握手包(ACK)组成的。Setup事务,必须收到ACK,才能表示这个事务传输成功,否则就是失败。

  • IN事务
    在这里插入图片描述
    从图中可以看出,IN事务是由令牌包(IN包)、数据包、握手包(ACK)组成的。

  • OUT事务
    在这里插入图片描述
    从图中可以看出,OUT事务是由令牌包(OUT包)、数据包、握手包(ACK)组成的。

3.3 USB包

USB 包:包(package)是USB事务处理过程中主机和设备之间数据传输的基本单位,主要有以下类型:

  • 令牌包
  • 数据包
  • 握手包

根据包的标识符(PID),又简单为各类包提供了一个PID包名:

  • 令牌包,包含Setup包、IN包、OUT包等
  • 数据包,包含DATA0包,DATA1包等
  • 握手包,包含ACK包,NAK包,STALL包等
  • SOF包

各类包格式如下所示:

  • 令牌包
    在这里插入图片描述
    如抓到的Setup包,如下所示:
    在这里插入图片描述
  • 数据包
    在这里插入图片描述
    如抓到的data1包,如下所示:
    在这里插入图片描述
  • 握手包
    在这里插入图片描述
    如抓到的ack包,如下所示:
    在这里插入图片描述
  • SOF包
    在这里插入图片描述
    如抓到的sof包,如下所示:
    在这里插入图片描述

3.4 USB包的域

USB包,都是由各个域组成的,不同类型的包,所包含的域不一样,但所有包都是以同步域(sync)开始,以包结束符EOP结束。USB包的域有包标志符(PID)域、包目的地址(ADDR)域、包目标端点(ENDP)域、数据域、帧号域、循环冗余校验码(CRC)域,下面对重要的的域字段进行介绍:

  • 同步域(SYNC):在USB系统中,由于没有同步时钟,因此无法保证接收方和发送方在传输数据过程中保持同步,因此在一次USB事务中,所有数据包都必须以一个同步字段开始。

  • 包标志符(PID):包的类型是通过长度为8bit的标志符指定,其中包括4bit的包类型字段和4bit校验位字段。

包PID说明如下图所示:
在这里插入图片描述

  • 包目的地址

每个设备都有一个由USB主机管理分配的地址,USB设备在被USB主机分配一个地址之前,都会使用默认的0地址进行通信,在收到USB主机分配的地址后,USB设备会一直使用这个地址和USB主机通信,直到USB设备拨出、掉电或者复位。

这个地址域长度只有7bit,因此USB最大只能管理到127个设备。如果传输的USB包的地址和端点号与USB设备地址不匹配,USB设备会忽略该包。

  • 包目的端点

对USB主机而言,USB设备和USB主机是建立在一个个管道(PIPE)上,在PIPE两端,对应就是USB主机的端点和设备的端点,端点号在包中由4bit表示,因此USB设备最大可以支持16个双向端点,其中端点0为专用的控制端点。

0地址进行通信,在收到USB主机分配的地址后,USB设备会一直使用这个地址和USB主机通信,直到USB设备拨出、掉电或者复位。

这个地址域长度只有7bit,因此USB最大只能管理到127个设备。如果传输的USB包的地址和端点号与USB设备地址不匹配,USB设备会忽略该包。

  • 包目的端点

对USB主机而言,USB设备和USB主机是建立在一个个管道(PIPE)上,在PIPE两端,对应就是USB主机的端点和设备的端点,端点号在包中由4bit表示,因此USB设备最大可以支持16个双向端点,其中端点0为专用的控制端点。

4. 参考链接

usb中文网

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

USB协议概念学习 的相关文章

  • 2014年计算机求职总结--准备篇

    版权所有 xff0c 转载请注明出处 xff0c 谢谢 xff01 http blog csdn net walkinginthewind article details 13000431 找工作是一个长期准备的过程 xff0c 突击是没什
  • 2022智源大会议程公开 | 人工智能新基建论坛

    2022年北京智源大会召开在即 xff0c 5月31日至6月2日 xff0c 持续三天 xff0c 26场由各领域领军学者主导的专题论坛 大会将紧紧围绕这些当前学术领域迫切需要解决的问题 xff0c 以及产业落地过程中存在的诸多挑战 xff
  • 因特尔神经计算棒(NCS)+树莓派+yolo-v3实现object-detection

    因特尔神经计算棒 NCS 43 树莓派 43 yolo v3实现object detection 踩了好多坑啊 一言难尽 Step1 在树莓派上安装环境 首先安装openVINO工具包 xff08 最好不要在树莓派上装NCSDK 太坑了 x
  • prometheus监控k8s集群

    prometheus监控k8s集群 1 监控方式 node expoter部署在k8s节点收集当前节点资源 xff0c Prometheus用来分析处理收集汇总的数据 xff0c grafana用来进行图形展示 2 部署Prometheus
  • 耦合、解耦是什么?怎么做到解耦呢?

    一 耦合 耦合指的是两个类之间的联系的紧密程度 xff1b 强耦合 类之间存在着直接关系 弱耦合 xff1a 在两个类的中间加入一层 xff0c 将原来的直接关系变成间接关系 xff0c 使得两个类对中间层是强耦合 xff0c 两类之间变为
  • 圈复杂度检测

    1 下载链接 xff1a https github com terryyin lizard 2 使用 xff1a python lizard py 文件名 文件路径 3 显示 NLOC xff1a 代码行数 CCN xff1a 复杂度 to
  • 服务限流降级

    https segmentfault com a 1190000015967922 高并发的线上服务 xff0c 有时候面对突发流量 xff0c 比如流量突然激增 xff0c 服务扛不住了 xff0c 类似这种场景 xff0c 需要有一个防
  • gdb调试

    c 43 43 编译生成可执行文件 g 43 43 main cpp 1 进入gdb gdb main 2 运行 r 查看 l 断点 b line num 查看 p 参数 展示display 参数 继续 c 3 比如展示vector首地址
  • git 修改commit的名字与撤回提交

    当你不小心 xff0c 写错了提交的注视 信息 xff0c 该如何处理呢 理论上 xff0c SCM是不应该修改历史的信息的 xff0c 提交的注释也是 不过在git中 xff0c 其commit提供了一个 amend参数 xff0c 可以
  • SQLAlchemy 的 scoped_session

    SQLAlchemy 的 scoped session 是啥玩意 通常我们用 SQLAlchemy 写数据的时候要创建 Session 对象来维护数据库会话 xff0c 用完了再关掉 但是听说还有个叫scoped session的玩意 xf
  • python 的StringIO

    1 IO的含义 在计算机中 xff0c IO是Input Output的简写 xff0c 也就是输入和输出 由于程序和运行时数据是在内存中驻留 xff0c 由CPU这个超快的计算核心来执行 xff0c 涉及到数据交换的地方 xff0c 通常
  • python 的fcntl模块

    python 中给文件加锁 fcntl模块 import fcntl 打开一个文件 f 61 open 39 test 39 当前目录下test文件要先存在 xff0c 如果不存在会报错 对该文件加密 xff1a fcntl flock f
  • Jmeter添加MD5方法插件

    1 xff1a 下载 https jmeter plugins org install Install 2 xff1a jmeter plugins manager 1 3 jar放到 apache jmeter 5 0 lib ext目录
  • sql 语句 将查询结果中数字等标示转成汉字

    使用case 语句 将sex 字段进行转换 0 1 2 男 xff0c 女 xff0c 未知 SELECT u userid u username CASE u sex WHEN 0 THEN 39 女 39 WHEN 1 THEN 39
  • linux的more命令

    more命令 xff0c 功能类似 cat xff0c cat命令是整个文件的内容从上到下显示在屏幕上 more会以一页一页的显 示方便使用者逐页阅读 xff0c 而最基本的指令就是按空白键 xff08 space xff09 就往下一页
  • docker入门实例

    1 image文件 Docker 把应用程序及其依赖 xff0c 打包在 image 文件里面 只有通过这个文件 xff0c 才能生成 Docker 容器 image 文件可以看作是容器的模板 Docker 根据 image 文件生成容器的
  • vim批量替换&行首尾增加&删除列

    删除列 删除列的方法 xff1a 1 ctrl 43 v 这样会启动可视模式 xff0c 按 j k 可以发现它能够在一列上面选中字符 2 按下 G 这样可以从文本的第一行选中到最后一行 3 按下 x 就会把这一列删掉 行首尾替换 xff1
  • vim 支持 python

    https www jianshu com p 3e606e31da5f 前段时间刚玩linux时为了图个简单打算直接用vim来写python代码省得再下个软件 xff08 好吧 xff0c 其实是自己下了好多次都失败了 xff0c 一气之
  • 用户态和核心态的概念以及为什么要区别?以及两者之间的切换

    一 用户态和核心态的概念 用户态 xff1a 内核态与用户态是操作系统的两种运行级别 当程序运行在3级特权级上时 xff0c 就可以称之为运行在用户态 xff0c 因为这是最低特权级 xff0c 是普通的用户进程运行的特权级 xff0c 大
  • strstr(str1,str2)函数使用时注意事项

    可能有的人还没听过strstr函数 xff0c 个人认为这个一个很实用的函数 xff0c strstr str1 str2 函数是字符串处理函数之一 xff0c 位于头文件 string h 中 对于处理字符串的一些问题有很大的帮助 定义

随机推荐

  • Java This 的用法

    JAVA This的用法 先写一个要调用的类 都放在名为test的包下面 在这里插入代码片package test span class token keyword public span span class token keyword
  • 关于松耦合和紧耦合的理解

    松耦合系统通常是基于消息的系统 xff0c 此时客户端和远程服务并不知道对方是如何实现的 客户端和服务之间的通讯由消息的架构支配 只要消息符合协商的架构 xff0c 则客户端或服务的实现就可以根据需要进行更改 xff0c 而不必担心会破坏对
  • 第六篇 键盘中断与应用程序读取键盘缓冲区

    这篇博文主要介绍在X86下键盘的中断过程 xff0c 以及应用程序如何利用中断读取键盘缓冲区内容 一 撰写该篇博文的背景介绍 在我们全屏看视频时 xff0c 按下Esc键 xff0c 播放器还原或者最小化 xff1b 在利用其他软件的时候
  • 发现一个aruco在线生成器,可以在线生成aruco CharucoBoard GridBoard AprilTag 图片, 真香

    最近在研究 opencv 检测 aruco标记项目 xff0c 想弄点aruco标记码来测试 xff0c 发现网上很少在线生成aruco标记码的工具 xff0c 导致在做测试时候浪费了很多时间去搞这个码 xff0c 基本上大家都用 xff0
  • FreeRTOS基础六:中断管理1

    嵌入式实时系统需要对外界的某个事件做出及时的响应动作 例如串口外设收到了一帧数据后 xff0c 需要通知数据解析任务 xff0c 同时还要将数据帧传递给解析任务 xff0c 完成数据的处理 设计出一种好的策略来完成这个过程时需要考虑以下几个
  • FreeRTOS基础四:队列

    简介 FreeRTOS中的队列是一种用于实现 任务与任务 xff0c 任务与中断 以及 中断与任务 之间的通信 机制 此外 xff0c 任务从队列读数据或者写入数据到队列时 xff0c 都可能被阻塞 这个特性使得任务可以被设计成基于事件驱动
  • FreeRTOS基础二:堆内存管理之heap_4方案

    背景知识 从FreeRTOS V9 0 0内核版本开始 xff0c 内核对象占用的内存可以在编译期间静态分配 xff0c 也可以在运行期间动态分配 内核对象如 xff1a tasks xff08 任务 xff09 xff0c queues
  • MQ与Webservice的区别

    Webservice 和MQ MessageQueue 都是解决跨平台通信的常用手段 xff0c 两者有哪些区别呢 xff1f 个人认为最本质的区别在于 Webservice近乎实时通信 xff0c 而MQ却通常是延时通信 什么意思呢 xf
  • uORB通信机制和添加自己的topics学习笔记

    本文参考 Ubuntu16 04下PX4环境快速搭建及uORB通信机制进行操作 结合网上一篇uROB的介绍PX4 Pixhawk uORB深入理解和应用进行深入的了解 1 简介 uORB Micro Object Request Broke
  • 看到一篇很好的介绍磁力计原理的博客

    详细内容戳这里http blog sina com cn s blog 402c071e0102v8ig html
  • QT工程转换为VS2013项目文件

    xff08 win7系统 xff09 1 点击开始 xff0c 输入cmd xff0c 打开cmd 2 输入cd c apm点击回车键 注 xff1a apm是我的qt的工程文件夹 xff0c 最好放在c盘 xff0c 其他盘转换都不成功
  • C语言:函数返回字符串的四种方法

    转载连接 xff1a 1 https blog csdn net turkeyzhou article details 6104135 comments 2 https www cnblogs com qingergege p 649668
  • C语言:字符串中查找指定字符——strchr()和strrchr()

    参考文章连接 xff1a 1 http c biancheng net cpp html 161 html 2 http c biancheng net cpp html 172 html 1 头文件 xff1a include lt st
  • C语言:整型、浮点型和字符串间转换

    参考文章链接 xff1a 1 http c biancheng net cpp html 1573 html 2 http c biancheng net cpp html 1574 html 1 整型 浮点型 gt 字符串 整数转换为字符
  • 学习贵在坚持!

    最近学习颇为不顺 xff0c 周围都是一些不利的消息 xff0c 有些心灰意冷 可是这不是与我写本文的初衷相悖了么 xff1f 看到了比自己优秀的人干出来辉煌的事情 xff0c 写出来文字优美的文章 xff0c 自己就有相形见绌的自卑感 可
  • Qt中 QString 和int, char等的“相互”转换

    原文链接 xff1a https blog csdn net ei nino article details 7297791 Qt中 int float double转换为QString 有两种方法 1 使用QString number 如
  • 计算器第二版:C语言,VC++6.0

    使用栈实现 xff0c 前缀表达式变后缀表达式的原理 xff0c 但是没有转换 xff0c 是边转换边实现 xff1a include lt stdio h gt include lt stdlib h gt include lt coni
  • 计算器第三版:C语言,递归,VC++6.0

    参考文章 xff1a https blog csdn net u011692041 article details 49796343 https blog csdn net u011692041 article details 497991
  • 计算器第四版:C++,QT

    核心算法和第二版一样 xff1a 头文件 xff1a calculate h ifndef CALCULATE H define CALCULATE H include lt QMainWindow gt include lt QPushB
  • USB协议概念学习

    1 USB总线结构 usb的总线拓扑结构如下所示 xff1a 从USB总线结构可以看出 xff0c 主要由3部分组成 xff1a USB主机 Host USB线缆 USB设备 hub Func等 USB主机 xff1a 一般成为USB Ho