Hello,大家好,今天我们来讨论一下USB总线中的枚举(Enumeration),首先简单介绍一下USB系统的基本架构,它由USB主机USB设备与USB电缆(本文忽略它)组成,如下图所示:

最常见的主机就是电脑了,现在很多有USBOTG(On-The-Go)功能的手机也可以做主机,无需过多赘述。USB设备实在太多了,例如,手机、MP4、U盘、移动硬盘、打印机、扫描仪等等,当然,作为工程师的你还可能会购买其它一些使用USB接口的仪器,例如逻辑分析仪,示波器等等。无论USB设备的具体形式是怎么样的,按照功能都可以分为两大类,其中之一就是USB功能设备。刚刚提到的USB设备都属于这类,它们都各自提供了一些特定的功能,例如,U盘就是存储数据,示波器就是采集数据。

另外一类USB设备就是USB集线器(USB Hub),它的功能与网络集线器相同,把一个USB接口扩展多个USB接口。例如,学校一个寝室有很多人,每个人都有一台电脑,但网线只有一根,怎么办?用网络集线器就可以解决这个问题,如下图所示

我们只需要特别留意:USB系统的数据或指令传输都是由主机启动的,USB设备只是根据主机的要求进行被动响应。在任意时刻,USB系统仅允许存在一个USB主机。

------------------------------------------------------------------------------------------------------

好的,现在有一个问题得先弄明白:为什么在电脑同一个USB接口依次插入鼠标、键盘或其它USB设备,电脑都能够正确地识别它的功能呢?这就是枚举的功劳。为了形象地理解枚举,我们来看一个面试对话场景:

------------------------------------------------------------------------------------------------

面试官:我看你的简历上说对三极管有比较深入的了解,那么请形象地讲讲三极管的放大原理。

:好的,你可以把三极管的三个区比作三个国家,然后…..

面试官:这个故事是你自己总结的吗?

:不瞒你说,是通过微信公众号《电子制作站》学来的。

面试官莞尔一笑:是嘛 ,难怪我怎么觉得这么熟悉,那另外一篇关于上下拉电阻的文章你看过没有?

:必须的呀!

面试官:那你说说拉电流与灌电流的区别?

:拉与灌只是电流方向不同而已,具体到电路结构,就是…..

…..

面试官:好的,我觉得你的水平确实不错,至少基础非常扎实,不愧是关注《电子制作站》微信公众号的老粉,值得信赖….

….

然后你就顺利进入了该公司,拿到了一个代表你是公司员工的工牌….

----------------------------------------------------------------------------------------------------------

在以上面试过程中,面试官首先提出一个问题,根据面试者的反馈后再跳到另一个知识点,依此循环,继而完成全面考察面试者业务水平的目的,最后才决定是否符合公司的录用标准,这其实就是一个枚举的过程。在面试的场景中,你就是USB设备,面试官就是USB主机,所以简单的说,枚举就是“识别”的同义词

同样的道理,当USB鼠标插入到电脑时,电脑也需要询问关于它的一些信息,以确定它到底是个什么东东。电脑当然是不能说话的,它只是会发送一些命令,USB设备必须对这些命令进行响应,不然枚举就会失败(问你话咋一声不吭呢?面试失败!)。当然,USB设备必须进行正确响应,乱来也会导致枚举失败(回答问题怎么牛头不对马嘴呢?面试失败!)。当然,即便枚举成功了,也不一定代表USB设备能用,枚举成功只是万里长征的第一些。(你小子面试时能说会道,做起实事来却完全不顶用,明天卷铺盖滚蛋吧,赶紧从我眼前消失!失败中的失败!!

概括来讲,如果我们开发自己的USB设备,关键的两个步骤是必须进行的。

其一:USB设备按照USB协议正确回应主机的命令,以成功完成枚举

其二:在枚举成功后,把数据按正确的格式进行传输

有些人想:虾米?还要响应命令呐,粗看了一下,貌似很复杂,玩不了,回家洗洗睡了!哈哈,必须得打击你一下,USB底层的实现确实有点复杂,但幸运的是,通常厂商都会把底层核心的东西做好了打包成库,我们只要修改一些应用方面的数据即可。也就是说,如果你只是使用USB总线传输数据,底层的东西你没机会(也不需要)去修改

那到底需要修改什么才能成功完成枚举呢?其实道理跟我们工程师做项目一样!例如使用单片机控制新的器件时,第一步需要做的就是了解新器件的基本原理,包括通讯时序、寄存器的定义、硬件电路的连接要求等等。器件厂家为了方便用户使用,通常都会准备好相应的数据手册(datasheet),它包含了用户应用该器件的所有信息。

同样的道理,如果把你当成一台电脑,当USB鼠标插入USB接口时,你又是怎么知道它是鼠标,而不是键盘或其它设备呢?很明显,你(电脑)也需要数据手册之类能够描述插入设备所有信息的媒介,对不对?USB协议中定义的描述符(descriptor)就是这个目的。

描述符在C语言实现层面通常就是结构体(Structure),应用上就是多个有一定关联的信息的集合体。例如,我要定义一个员工的描述符,它应该包含姓名、性别、年龄、工号等等信息,如下所示:

也就是说,USB描述符就是用来描述相应的USB设备具体是什么,有什么特点,能做什么(是不是真的能做就不知道了),所以在源代码编程自定义USB设备时,我们最先开始的工作就是:找到厂商提供的固件(firmware)或示例程序中描述符对应的位置,再根据USB协议的规定进行合适的修改。如果修改正常,厂商提供的固件会自动根据主机发送的命令提交你修改描述符信息,这样主机才能正确识别(会提示你插入了新设备,可以正常使用了),至于它具体能不能起到什么功能,就是枚举成功之后再去讨论的事了,先通过面试这一关才能发挥咱们的才干呐!

USB协议定义了很多描述符,结构也远比前面的员工信息要复杂的多,我们将在下一篇文章中继续讨论,么么哒~~

透彻理解USB总线应用之枚举的更多相关文章

  1. Linux驱动之USB总线驱动程序框架简析

    通用串行总线(USB)是主机和外围设备之间的一种连接.USB总线规范有1.1版和2.0版,当然现在已经有了3.0版本.USB1.1支持两种传输速度:低速为1.5Mbps,高速为12Mbps.USB2. ...

  2. EDK II之USB总线驱动的实现框架

    本文简单介绍一下UEFI中USB驱动的实现框架: 下图是USBD向上层驱动提供的接口: 1.从图中我们可以看出,USBDI的实现主要通过调用HCDI实现 和 访问USB_INTERFACE结构体(该结 ...

  3. Linux下的USB总线驱动(一)

    版权所有,转载请说明转自 http://my.csdn.net/weiqing1981127 一.USB理论 1.      USB概念概述 USB1.0版本速度1.5Mbps(低速USB) USB1 ...

  4. 回调函数透彻理解Java

    http://blog.csdn.net/allen_zhao_2012/article/details/8056665 回调函数透彻理解Java 标签: classjavastringinterfa ...

  5. USB总线介绍

    •USB 1.0出现在1996年的,速度只有1.5Mb/s1998年升级为USB 1.1,速度也提升到12Mb/s,称之为”full speed” •USB2.0规范是由USB1.1规范演变而来的.它 ...

  6. USB总线标准

    1.USB总线类型: OHCI(Open Host Controller Interface)是支持USB1.1的标准,但它不仅仅是针对USB,UHCI(Universal Host Controll ...

  7. linux usb总线驱动(一)

    目录 linux usb总线驱动框架 USB 介绍 传输类型 控制器接口 2440接口 基本流程 alloc_dev choose_address hub_port_init usb_get_devi ...

  8. 透彻理解Spring事务设计思想之手写实现

    前言 事务,是描述一组操作的抽象,比如对数据库的一组操作,要么全部成功,要么全部失败.事务具有4个特性:Atomicity(原子性),Consistency(一致性),Isolation(隔离性),D ...

  9. Spark2.1.0——深入理解事件总线

    Spark2.1.0——深入理解事件总线 概览 Spark程序在运行的过程中,Driver端的很多功能都依赖于事件的传递和处理,而事件总线在这中间发挥着至关重要的纽带作用.事件总线通过异步线程,提高了 ...

随机推荐

  1. 痞子衡嵌入式:串行NOR Flash的Continuous read模式下软复位后i.MXRT无法启动问题解决方案之RESET#

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT上使能NOR Flash的Continuous read模式在软复位后无法正常启动问题的解决经验. 前一篇文章 <在i ...

  2. createrepo 建立本地yum源

    linux使用createrepo制作本地yum源   目录 linux使用createrepo制作本地yum源 安装createrepo软件包 进入本地rpm包目录 执行完后可以看到生成的repod ...

  3. 查看报错原因 sshd -t

    b for ssh.service failed because the control process exited with error code. See "systemctl sta ...

  4. 单用户模式修改root密码

    单用户模式修改root密码 1.进入引导菜单界面2.按e进入grub,在linux或linux16那行结尾加上 rw init=/bin/bash,按Ctrl+x或F103.进入bash-4.3# , ...

  5. linux系统开机自动挂载光驱 和 fstab文件详解

    Linux 通过 UUID 在 fstab 中自动挂载分区 summerm6关注 2019.10.17 16:29:00字数 1,542阅读 607 https://xiexianbin.cn/lin ...

  6. 008.Ansible文件管理模块

    一  stat模块 检查文件状态使用,模块获取文件的状态等信息,类似与linux中的STAT命令可以用来获取文件的属主.可读/写.文件状态等信息 [root@node1 ansible]#  stat ...

  7. CGI开发-(转自 jemofh159)

    随着Internet技术的兴起,在嵌入式设备的管理与交互中,基于Web方式的应用成为目前的主流,这种程序结构也就是大家非常熟悉的B/S结构,即在嵌入式设备上运行一个支持脚本或CGI功能的Web服务器, ...

  8. 程序"三高"解决方案

    0. 程序三高 1. 缓存 2. 预处理和延后处理 3. 池化 3.1 内存池 3.2 线程池 3.3 连接池 4. 异步(回调) 5. 消息队列 5.1 服务解耦 5.2 异步处理 5.3 流量削峰 ...

  9. java并发编程工具类JUC第四篇:LinkedBlockingQueue链表队列

    在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue. LinkedBlockingQueue 队列是Blo ...

  10. 『动善时』JMeter基础 — 34、JMeter接口关联【XPath提取器】

    目录 1.XPath提取器介绍 2.XPath提取器界面详解 3.XPath提取器的使用 (1)测试计划内包含的元件 (2)网易首页请求界面内容 (3)XPath提取器界面内容 (4)百度首页请求界面 ...