内容简介
《嵌入式协议栈μC/USB Device》全面深入地介绍了嵌入式USB设备协议的原理和Micriμm 的μC/USB设备协议栈的使用.一部分对USB进行了概述;第二部分讲述了如何用μC/USB设备堆栈构建基于成熟的硬件和软件平台的USB设备的基本方法.书中对各种USB类设备作了详细的介绍,包括USB转串口适配器(通信设备类)、鼠标或键盘(人机接口设备类)、可移动存储设备(MassStorage类)和USB医疗设备(个人保健设备类)等.
本书适用于嵌入式系统开发人员、咨询顾问、爱好者及有兴趣了解μC/USB设备协议栈工作原理的学生.
内页插图
目录
第1章 USB概述
1.1 USB历史概述
1.2 机械规范
1.2.1 电缆和连接器
1.2.2 电气规范
1.2.3 高速模式
1.3 USB设备供电
1.3.1 总线供电设备
1.3.2 自供电设备
1.4 总线状态
1.5 USB拓扑结构
1.5.1 USB主机
1.5.2 USB设备
1.5.3 USB设备结构
1.5.4 设备状态
1.5.5 主控制器
1.6 USB包
1.7 USB包类型
1.7.1 令牌包
1.7.2 数据包———低速和全速模式
1.7.3 数据包———高速模式
1.7.4 握手包
1.7.5 拆分事务特殊令牌包
1.8 数据流模型
1.8.1 端 点
1.8.2 管 道
1.8.3 传 输
1.9 事务、传输和帧
1.10 帧和微帧
1.11 USB实际吞吐量
1.12 枚 举
1.13 USB协议栈
1.13.1 设备协议栈
1.13.2 主机协议栈
1.13.3 USBOTG协议栈
1.14 一致性测试
1.14.1 USB设备测试
1.14.2 USB黄金树
1.14.3 USB主机测试
第2章 开始工作
2.1 准 备
2.2 下载源代码
2.3 安装文件
2.4 构建应用示例
2.4.1 理解Micriμm 示例
2.4.2 复制和修改临时文件
2.4.3 包含进USBDevice协议栈源代码
2.4.4 修改应用配置文件
2.5 运行应用范例
第3章 主机操作系统
3.1 微软Windows
3.2 关于INF文件
3.3 使用GUID
第4章 架 构
4.1 模块关系
4.1.1 应用程序
4.1.2 库
4.1.3 USB类层
4.1.4 USB内核层
4.1.5 端点管理层
4.1.6 实时操作系统抽象层
4.1.7 硬件抽象层
4.1.8 CPU 层
4.2 任务模型
4.2.1 发送和接收数据
4.2.2 处理USB请求和总线事件
4.2.3 处理调试事件
第5章 配 置
5.1 静态堆栈配置
5.1.1 基本配置
5.1.2 USB设备配置
5.1.3 接口配置
5.1.4 字符串配置
5.1.5 调试配置
5.1.6 通信设备类(CDC)配置
5.1.7 CDC抽象控制模型(ACM)串口类配置
5.1.8 人机接口设备(HID)类配置
5.1.9 大容量存储设备类(MSC)配置
5.1.10 个人健康设备类(PHDC)配置
5.1.11 供应商类配置
5.2 应用相关配置
5.2.1 任务优先级
5.2.2 任务堆栈大小
5.3 设备和设备控制器驱动配置
5.4 配置范例
5.4.1 简单的全速USB设备
5.4.2 组合高速USB设备
5.4.3 复杂的组合高速设备
第6章 设备驱动程序指南
6.1 设备驱动程序结构
6.2 设备驱动程序模型
6.3 设备驱动程序API
6.4 中断处理
6.4.1 带ISR处理参数的单个USBISR向量
6.4.2 单个USBISR向量
6.4.3 带ISR处理参数的多个USBISR向量
6.4.4 多个USBISR向量
6.4.5 USBD_DrvISR_HANDLER()
6.5 设备配置
6.6 内存分配
6.7 支持的CPU 和板子
6.8 USB设备驱动程序函数模型
6.8.1 设备同步接收
6.8.2 设备异步接收
6.8.3 设备同步发送
6.8.4 设备异步发送
6.8.5 设置设备地址
第7章 USB类
7.1 类实例的概念
7.2 类实例的结构
7.3 类和内核层通过回调函数的交互
第8章 通信设备类
8.1 概 述
8.2 架 构
8.3 配 置
8.4 ACM 子类
8.4.1 概 述
8.4.2 常规配置
8.4.3 子类实例配置
8.4.4 子类通知与管理
8.4.5 子类实例通信
8.4.6 使用演示应用程序
第9章 人机接口设备类
9.1 概 述
9.2 架 构
9.3 配 置
9.3.1 常规配置
9.3.2 类实例配置
9.3.3 类实例通信
9.3.4 同步通信
9.3.5 异步通信
9.4 使用演示应用程序
9.4.1 配置PC和设备应用程序
9.4.2 运行演示程序
9.5 移植HID类到RTOS层
9.6 周期输入报告任务
第10章 大容量存储类
10.1 概 述
10.1.1 大容量存储类协议
10.1.2 端 点
10.1.3 大容量类请求
10.1.4 小型计算机系统接口(SCSI)
10.2 体系结构
10.2.1 MSC体系结构
10.2.2 SCSI命令
10.2.3 存储层和存储介质
10.2.4 多个逻辑单元
10.3 RTOS层
10.4 配 置
10.4.1 一般配置
10.4.2 类实例配置
10.5 使用演示应用
10.5.1 USB设备应用
10.5.2 USB主机应用
10.6 MSC的存储层移植
10.7 MSC的RTOS移植
第11章 个人健康设备类
11.1 概 述
11.1.1 数据特性
11.1.2 操作模型
11.2 配 置
11.2.1 一般配置
11.2.2 类实例配置
11.3 类实例通信
11.3.1 使用元数据前文进行通信
11.3.2 无元数据前文的通信
11.4 RTOS基于QoS的任务调度程序
11.5 使用演示应用
11.5.1 演示应用的配置
11.5.2 运行演示应用
11.6 PHDC的RTOS移植
第12章 供应商类
12.1 概 述
12.2 配 置
12.2.1 通用配置
12.2.2 类实例配置
12.2.3 类实例通信
12.2.4 同步通信
12.2.5 异步通信
12.3 USBDev_API
12.3.1 设备和管道管理
12.3.2 设备通信
12.4 运行演示程序
12.4.1 配置PC和设备应用程序
12.4.2 编辑INF文件
12.4.3 运行演示程序
12.4.4 GUID
第13章 调试和跟踪
13.1 使用调试跟踪
13.1.1 调试配置
13.1.2 调试跟踪输出
13.1.3 调试格式
13.2 处理调试事件
13.2.1 调试事件池
13.2.2 调试任务
13.2.3 调试宏
第14章 μC/USB设备的实时操作系统移植
附录A 核心API参考
附录B 设备控制器驱动API参考手册
附录C CDCAPI参考手册
附录D HIDAPI参考手册
附录E MSCAPI参考手册
附录F PHDCAPI参考手册
附录G 供应商类API参考手册
附录H 错误代码
附录I 存储器占用
附录J μC/OS III和μC/USB Device软件许可政策
前言/序言
本书翻译工作接近尾声的时候,我们和原书μC/USB:TheUniversalSerialBusDeviceStack 的出版人、Micriμm 创始人和总裁Jeanlabrosse先生就中文版?嵌入式协议栈μC/USB Device?一书的序言交换了意见,他希望何小庆能为全书写一篇序言(实际上原书本身也没有序言),于是就有了下面的序言.
?嵌入式协议栈μC/USB Device?一书以嵌入式USB设备协议栈为重点,介绍了USB系统原理、操作系统移植和USB控制器驱动编写等方面的知识,并配有详实的软件代码实现的文档介绍,这样全面介绍嵌入式USB的图书还很少见到.市场上的USB图书多数介绍芯片级的USB功能实现,主要写USB芯片的驱动编程和支持该芯片特定类的软件实现,局限性很大.本书也是目前北京航空航天大学出版社出版的μC/OS III系列图书最新的一本,该系列已经出版了?嵌入式实时操作系统μC/OS III?、?嵌入式实时操作系统μC/OS III应用开发———基于STM32微控制器?和?嵌入式协议栈μC/TCP IP———基于STM32微控制器?.
本书原版中的第二部分“μC/USBandtheRenesasRX63N”,因为RenesasRX63N芯片在国内不是很流行,我们与Jeanlabrosse先生商量之后,决定将这部分内容移植到STM32微控制器后再在国内出版,这部分工作已经在进展之中.为了配合这个部分,北京麦克泰软件技术有限公司计划将把为μC/OS III图书配套的μC/Eval STM32F107评估板进行升级,发布一款新的板子,它既可以支持已经出版的三本书,还能很好地支持?嵌入式协议栈μC/USB Device?.STM32微控制器是最早进入市场的32位ARM Cortex M 核微控制器,在中国市场人气很旺,我们相信这样的安排能让中国的读者更容易通过μC/USB Device协议软件和STM32微控制器的结合,更好地学习和掌握嵌入式USB知识.
USB是计算机系统历史上最成功的通信接口,是连接个人计算机外设事实上的工业标准.USB在嵌入式系统中已经广泛采用,可实现设备之间或者设备与主机之间的通信和数据存储等功能,还可用于软件升级和内容更新.Micriμm 的μC/USBDevice是专门针对嵌入式系统设计的USB设备协议栈.依靠Micriμm 团队的共同努力,高质量、可伸缩和高可靠性的代码经过了很严格的认证过,μC/USB Device符合USB2.0规范.
截至本书出版,Micriμm 的μC/USB Device协议栈已经能够支持通信设备(CDC)类、人机接口设备(HID)类、大容量存储设备类(MSC)、个人健康设备类(PHDC)和供应商类.μC/USB Device协议栈的最新版本增加了CDC EEM 类和Audio类的支持,丰富了μC/USB Device协议栈的功能.Audio类可以帮助用户构建符合Audio1.0规范的音频设备,典型应用包括扬声器、麦克风、耳机等.
EEM(以太网仿真模型)类是一种在USB总线上高效率传输以太网数据包的一种规范.它是USBCDC规范的一部分,允许设备通过USB接口连接到以太网,所有典型的网络应用如HTTP、FTP、DHCP等,都可以运行在该设备上(这两个类没有在本书中体现).μC/USB Device协议栈设备控制器的驱动程序很丰富,支持许多MCU 芯片内置的USB 控制器,包括STM32、TITivaC 系列、LPC17xx、21xx和318x等近40余种.μC/USB Device协议栈的架构非常清晰,核心模块分为设备控制驱动、设备核心、类和RTOS移植四大部分,既可以支持μC/OS II或者μC/OSIII,也可以支持其他的RTOS.
μC/USB Device协议栈是MicriμmμC/OS 系列操作系统软件的成员之一,μC/OS的内核已经有第三代产品,第一代产品1992年问世,1998年有了μC/OSII,2009年发表了μC/OS III.1999年Jeanlabrosse先生创办Micriμm 公司之后开发了大量的μC/OS的组件,比如μC/FS、μC/TCP IP和μC/GUI等,这些组件和μC/OS组合,形成一个功能和性能很强大的嵌入式操作系统.μC/USB Device可以流畅地与μC/OS II或者μC/OS III配合工作,还能得到μC/FS和μC/TCPIP的支持.
本书的作者来自Micriμm USB 开发团队:Christian Légaré 是Micriμm 的CTO,有22年通信行业的经验,是?嵌入式协议栈μC/TCP IP———基于STM32微控制器?作者,目前负责物联网应用解决方案MicriμmSpectra的开发工作;CédricMigliorini是Micriμm USB 团队负责人,他改进和维护了USB设备和主机协议栈;Jean Fran?oisDeschênes是Micriμm USB团队的工程师,负责μC/USB Host软件;JuanP.Benavides是应用工程师,在Micriμm 美国佛罗里达Weston办公室.前面三位都在Micriμm 加拿大蒙特利尔办公室,何小庆在2014年6月曾经访问过这个办公室,与Christian就物联网操作系统进行了广泛和深入的交流,收获很多.
本书的翻译团队由两部分组成,其中一部分来自北京麦克泰软件技术公司专业工程师:张爱华,她在RTOS的移植和应用方面有丰富的经验,与何小庆一起翻译了?嵌入式实时操作系统μC/OS III应用开发———基于STM32微控制器?;韩志华和赵晓彤,他们对μC/OS和IAR 开发工具有实践经验.另外一部分是在校的优秀学生,何灵渊现是哥伦比亚大学计算机科学专业的研究生,他已经参与翻译了2本计算机专业的图书;江山是斯蒂文森理工大学电子工程专业的本科生.何小庆除在公司任职外,还在高校给研究生和本科生授课,在科技期刊和行业协会兼职.
本书的第1章和附录B、C、D由张爱华翻译;第2~4章,附录H、I、J及参考文献由何小庆翻译;第5~7章和附录E、F由韩志华翻译;第8、9章和附录G由赵晓彤翻译;第10、11章和附录A 由何灵渊翻译;第12~14章和附录A(部分)由江山翻译,全书由何小庆统稿和审校.
我们要感谢北京航空航天大学出版社让这本非常专业的嵌入式软件书籍可以与读者见面.策划编辑胡晓柏主任长期致力于嵌入式系统图书出版的精神感动和鼓励了我们.感谢北京麦克泰软件技术公司各方面的支持和帮助.
最后,希望读者能从本书的阅读中受益.我们的翻译如有不足和纰漏之处,还请
读者指正.
译 者
2015年8月
于北京、上海和美国纽约
现代嵌入式系统中的 USB 设备开发:机遇、挑战与实用指南 随着嵌入式系统在工业自动化、医疗设备、消费电子、汽车电子以及物联网等领域的广泛应用,高性能、高可靠性的通信接口扮演着越来越重要的角色。在众多通信协议中,通用串行总线(USB)以其便捷性、通用性、高传输速率和热插拔特性,成为嵌入式设备与主机系统(如PC、平板电脑、甚至其他嵌入式主机)之间进行数据交换和通信的首选接口之一。然而,要成功地将USB设备功能集成到资源受限的嵌入式系统中,开发者需要深入理解USB协议的复杂性,掌握高效的驱动程序开发技巧,并应对各种软硬件挑战。 本书旨在为嵌入式系统开发者提供一个全面、深入且高度实用的USB设备开发指南。我们并非局限于某一特定软件栈的介绍,而是致力于剖析USB协议的本质,探讨在各种嵌入式硬件平台上实现USB设备功能的通用原理、设计模式和最佳实践。本书将引导读者从理解USB协议的基本概念出发,逐步深入到实际的开发流程,最终能够独立完成复杂的USB设备功能设计与实现。 一、 USB协议深度解析:构建坚实的基础 理解USB协议是成功开发USB设备的首要前提。本书将从底层协议细节入手,系统性地梳理USB的各个关键组成部分: USB物理层: 详细介绍USB信号传输、数据编码(NRZI)、差分信号、时序要求、电源规范(5V、3.3V、1.5A、500mA、100mA)、连接器类型(Type-A, Type-B, Mini-A, Mini-B, Micro-A, Micro-B, Type-C)及其电气特性。特别会关注嵌入式系统中常用的低功耗USB(如USB Full-Speed, USB Low-Speed)以及高性能USB(如USB High-Speed, USB SuperSpeed)在物理层实现上的差异与考量。 USB协议层: 深入讲解USB的拓扑结构(主机-设备模型)、传输类型(控制传输、批量传输、中断传输、等时传输)的工作原理、数据包格式(同步包、PID、地址、端点号、CRC、数据包、握手包、ACK/NAK/STALL)以及它们之间的交互流程。我们将详细剖析USB的枚举过程,从设备插入、主机检测、设备描述符(设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符)的读取、地址分配到配置过程,这是构建任何USB设备功能的基础。 USB端点(Endpoint)概念: 详细阐述不同类型的端点(Control Endpoint 0, Bulk Endpoint, Interrupt Endpoint, Isochronous Endpoint)的功能、传输限制、缓冲管理策略,以及它们在实现特定设备功能(如CDC、HID、MSC等)中的作用。 USB设备类(Device Class)和请求(Request): 介绍USB标准化设备类(如CDC-Abstract Control Model for CDC Devices、Human Interface Device (HID)、Mass Storage Class (MSC)、Audio Class、Video Class等)的设计理念和常用命令。理解这些类可以帮助开发者快速构建功能丰富的USB设备,而无需从零开始定义私有协议。同时,我们将详细讲解USB控制传输中的标准请求(GET DESCRIPTOR, SET DESCRIPTOR, SET ADDRESS, SET CONFIGURATION, GET STATUS, CLEAR FEATURE, SET FEATURE等)和类特定请求,以及如何根据这些请求在设备端实现相应的处理逻辑。 二、 嵌入式USB设备软件架构与设计 在理解了USB协议之后,如何将其高效地映射到嵌入式系统的软件架构中是关键。本书将探讨以下核心内容: USB驱动程序模型: 介绍USB设备驱动程序在嵌入式系统中的常见实现方式,包括轮询、中断驱动和DMA(Direct Memory Access)驱动。重点分析不同驱动模型的优劣势,以及在资源受限的嵌入式环境中如何选择和优化。 USB通信栈的实现: 探讨USB通信栈(Protocol Stack)的设计理念。无论是基于RTOS(Real-Time Operating System)的栈,还是裸机(Bare-metal)实现,都将涉及USB的枚举、配置、数据传输、错误处理和状态管理等模块。我们将分析不同通信栈的实现策略,例如如何管理USB通信状态机、如何高效地处理USB中断、如何组织USB事务(Transaction)和传输(Transfer)。 硬件抽象层(HAL)与USB控制器: 阐述USB控制器(如ULPI, OTG, High-Speed PHY)与CPU之间的接口(如Host Interface)。介绍HAL在屏蔽底层硬件差异、实现软件可移植性方面的重要性。我们将讨论如何与特定的USB控制器驱动交互,包括寄存器配置、中断处理、DMA通道管理等。 内存管理与缓冲策略: USB通信涉及大量数据的缓存和传输。本书将深入探讨嵌入式系统中USB数据缓冲区的管理策略,包括固定大小缓冲区、环形缓冲区(Circular Buffer)、链表缓冲区等,以及如何根据不同的传输类型和设备需求进行优化,以平衡性能和内存占用。 功耗优化策略: 嵌入式设备的功耗是关键考量因素。我们将介绍USB设备在低功耗模式(如Suspend Mode)下的实现技术,包括如何检测主机发出的Suspend命令,如何管理设备的电源状态,以及如何在唤醒时快速恢复USB通信。 三、 典型USB设备功能实现 本书将通过丰富的实例,带领读者深入理解常见USB设备功能的开发与实现: CDC (Communication Device Class) 串口仿真: 介绍如何利用CDC类实现USB转串口功能,让嵌入式设备能够像标准串口一样与PC进行通信。我们将详细讲解CDC ACM(Abstract Control Model)的实现细节,包括如何处理控制接口(设置波特率、停止位、校验位等)和数据接口(发送和接收数据)。 HID (Human Interface Device) 接口开发: 探讨如何为自定义的输入设备(如按键、摇杆、传感器)或输出设备(如LED指示灯)开发HID报告。我们将详细讲解HID报告描述符的编写,以及如何根据主机的HID请求(如Get Report, Set Report)发送或接收设备数据。 MSC (Mass Storage Class) 存储设备实现: 讲解如何将嵌入式设备模拟成一个U盘或SD卡,实现文件的读写功能。我们将深入分析MSC协议的工作流程,包括SCSI命令的解析、数据传输模式(Bulk-Only Transport)以及存储介质的管理。 自定义USB设备开发: 除了标准设备类,本书还将指导读者如何设计和实现自定义的USB设备协议。这包括如何定义设备的功能和行为,如何设计私有的控制命令和数据传输格式,以及如何在设备端和主机端实现相应的驱动程序。 四、 调试与性能优化 在USB设备开发过程中,调试是必不可少且极具挑战性的环节。本书将提供实用的调试技巧和工具: USB协议分析仪的使用: 介绍如何利用Wireshark、Saleae Logic Analyzer等USB协议分析仪来捕获和解析USB数据包,识别通信错误和协议违规。 嵌入式调试工具: 讲解JTAG/SWD调试器、UART控制台输出等在USB设备调试中的应用。 常见问题诊断与排除: 针对USB枚举失败、数据传输错误、设备无响应等常见问题,提供系统性的诊断思路和解决方法。 性能瓶颈分析与优化: 分析USB通信中的性能瓶颈,如CPU占用率、中断处理延迟、DMA效率低下等,并提供相应的优化建议,如调整缓冲区大小、优化中断服务例程、合理使用DMA等。 五、 平台通用性与实战考量 本书的重点在于提供通用的USB设备开发原理和方法,使其能够适用于各种嵌入式平台和微控制器。我们将讨论: 微控制器USB外设的选型与特性: 分析不同微控制器(如STM32系列、NXP Kinetis系列、ESP32系列、Nordic nRF系列等)的USB外设接口特性,包括全速、高速支持、OTG功能、DMA集成度等,以及如何根据项目需求进行选型。 RTOS与裸机下的USB开发: 对比在实时操作系统(如FreeRTOS, RT-Thread, Zephyr)和裸机环境下实现USB设备功能的差异,包括任务调度、互斥访问、事件驱动等,并提供相应的开发建议。 USB OTG (On-The-Go) 技术: 介绍USB OTG技术,使其能够支持设备(Device)和主机(Host)的双重角色,并讨论相关的协议和实现细节。 USB Type-C 和 Power Delivery: 简要探讨USB Type-C接口带来的新特性,包括正反插、更大数据速率支持,以及Power Delivery(PD)协议在嵌入式设备中的应用可能性。 总结 本书旨在为读者打造一个坚实的USB设备开发知识体系。通过深入剖析USB协议的底层机制,理解软件架构的设计原则,掌握常见设备功能的实现方法,并学会有效的调试与优化技巧,读者将能够自信地应对嵌入式USB设备开发的各种挑战,并成功地将其集成到各类创新产品中。本书并非对某个特定软件栈的推销,而是致力于赋能开发者,使其具备独立解决USB设备开发问题的能力,从而在不断发展的嵌入式技术浪潮中,构建出更智能、更互联的下一代产品。