第1章 USB简介 1
1.1 USB的发展史 2
1.1.1 规范的版本 3
1.1.2 USB 2.0 4
1.1.3 IEEE-1394 4
1.2 USB的优点 4
1.2.1 容易使用 4
1.2.2 传输速度快 5
1.2.3 低价位 6
1.2.4 低功耗 6
1.2.5 可靠性 6
1.2.6 操作系统的支持 7
1.2.7 外围设备的支持 7
1.2.8 灵活性 7
1.3.1 缺乏对旧硬件的支持 8
1.2.9 USB实施者论坛 8
1.3 USB的缺点 8
1.3.2 缺乏点对点的通信能力 9
1.3.3 速度的限制 9
1.3.4 距离的限制 9
1.3.5 硬件的错误或故障 9
1.3.6 协议的复杂性 9
1.3.7 费用 9
1.4 与其他接口的比较 10
1.5 PC的软硬件要求 11
1.5.1 主机控制器 11
1.5.2 操作系统 11
1.5.3 组件 12
1.5.4 总线拓扑 13
1.6 主机的责任 15
1.5.5 连接端口 15
1.7 外围设备的责任 16
1.8 传输速度 19
1.9 开发流程 20
1.9.1 所需的链路元件 20
1.9.2 开发工具 20
1.9.3 开发步骤 21
第2章 USB传输 23
2.1 传输的基础 23
2.1.1 配置通信 23
2.1.2 应用程序通信 23
2.1.3 管理总线的数据 24
2.1.4 主机速度和总线速度 25
2.2.1 设备的端点 26
2.2 传输要素 26
2.2.2 管道 27
2.2.3 传输类型 27
2.2.4 消息管道与流管道 29
2.2.5 传输的初始化 29
2.3 事务 30
2.3.1 事务的步骤 31
2.3.2 信息包的顺序 33
2.3.3 定时约束和保障 34
2.3.4 分割事务 34
2.4 联络信号 36
2.4.1 ACK 37
2.4.2 NAK 37
2.4.3 STALL 37
2.4.5 ERR 38
2.4.6 无响应 38
2.4.4 NYET 38
2.4.7 控制传输的状态 39
2.5 错误的检验 39
2.5.1 错误校验位 39
2.5.2 数据交替位 40
2.6 控制传输 41
2.6.1 结构 41
2.6.2 信息包的大小 44
2.6.3 传输速度 44
2.6.4 检测错误 45
2.7 批量传输 46
2.7.1 结构 46
2.7.4 检测错误 47
2.8 中断传输 47
2.7.2 信息包大小 47
2.7.3 传输速度 47
2.8.1 结构 48
2.8.2 信息包大小 48
2.8.3 传输速度 48
2.8.4 检测错误 49
2.9 等时传输 49
2.9.1 结构 49
2.10 时间关键的传输 51
2.10.1 总线的带宽 51
2.9.2 信息包大小 51
2.9.4 检测错误 51
2.9.3 传输速度 51
2.10.2 设备的能力 52
2.10.3 主机软件的能力 52
2.10.4 Windows的延迟 52
3.1 检测设备的过程 54
第3章 检测设备 54
3.1.1 检测的步骤 55
3.1.2 检测集线器 58
3.1.3 移除设备 58
3.2 描述符 59
3.2.1 类型 59
3.2.2 设备描述符 60
3.2.3 Device_Qualifier描述符 62
3.2.4 配置描述符 64
3.2.5 Other_Speed_Configuration描述符 65
3.2.6 接口描述符 66
3.2.7 端点描述符 68
3.2.8 字符串描述符 70
3.3 USB 2.0兼容设备的描述符 73
4.1 设置阶段 75
第4章 控制传输 75
4.1.1 令牌信息包 76
4.1.2 数据信息包 77
4.1.3 联络信息包 79
4.2 数据阶段 80
4.2.1 令牌信息包 81
4.2.2 数据信息包 81
4.2.3 联络信息包 81
4.3 状态阶段 81
4.3.1 令牌信息包 82
4.3.2 数据信息包 82
4.3.3 联络信息包 82
4.4 检测错误 83
4.5 请求 83
4.5.1 Clear_Feature 84
4.5.3 Get_Descriptor 85
4.5.2 Get_Configuration 85
4.5.4 Get_Interface 86
4.5.5 Get_Status 87
4.5.6 Set_Address 88
4.5.7 Set_Configuration 88
4.5.8 Set_Descriptor 89
4.5.9 Set_Feature 89
4.5.10 Set_Interface 90
4.5.11 Synch_Frame 91
4.5.12 类别特定的请求 91
4.5.13 厂商特定的请求 92
第5章 USB控制器芯片 93
5.1 USB控制器的组成 93
5.1.1 USB连接端口 93
5.1.4 程序内存 94
5.1.2 数据缓冲区 94
5.1.3 CPU 94
5.1.5 数据存储器 95
5.1.6 寄存器 95
5.1.7 其他接口 95
5.1.8 其他特性 96
5.2 USB控制器芯片结构 96
5.2.1 专为USB设计的芯片 96
5.2.2 与现有的芯片兼容 98
5.2.3 需要外部微处理器接口的芯片 99
5.2.4 芯片的文件 102
5.2.5 固件示例程序 102
5.2.6 驱动程序 103
5.2.7 调试工具 103
5.2.8 开发计划的考虑 104
5.3 Cypress enCoRe 105
5.3.1 CPU结构 105
5.3.2 USB控制器 106
5.4 Cypress EZ-USB 106
5.4.1 CPU结构 107
5.4.2 USB控制器 109
5.5 Microchip PIC 16C7x5 109
5.5.1 结构 109
5.5.2 USB控制器 111
5.6 Netchip NET2888 111
5.6.1 结构 111
5.6.2 USB控制器 112
5.7.1 结构 113
5.7 National Semiconductor USBN9603 113
5.7.2 USB控制器 114
5.8 Philips Semiconductor PDIUSBD11/12 114
5.8.1 结构 115
5.8.2 USB控制器 115
第6章 Cypress enCoRe 116
控制器芯片 116
6.1 选择适合的芯片 116
6.2 汇编语言编译器 116
6.2.1 汇编程序的基础 118
6.2.2 汇编语言码 119
6.2.3 汇编语言编译器的用法 120
6.3 C编译器 122
6.3.1 C语言的优点 122
6.4.1 特性和限制 123
6.4.2 芯片内部 123
6.4 芯片的结构 123
6.3.2 C编译器的用法 123
6.4.3 内存 124
6.4.4 程序堆栈指针 127
6.4.5 数据堆栈指针 127
6.5 USB通信 127
6.5.1 设备地址 129
6.5.2 模式 129
6.5.3 端点状态及控制 131
6.5.4 USB状态及控制 131
6.6 其他I/O 133
6.6.1 一般用途的I/O 133
6.6.2 内部电路 133
6.6.3 中断 135
6.6.4 SPI连接端口 136
6.6.5 PS/2接口 137
6.7 定时器的功能 138
6.7.1 执行定时工作 138
6.7.2 测量时距 139
6.8 中断的处理 140
6.8.1 中断服务例程 140
6.8.2 GPIO中断 141
6.8.3 USB端点中断 142
6.8.4 定时器中断 142
6.8.5 中断状态 143
6.9 CPU的状态、控制及脉冲 144
6.9.1 暂停CPU 144
6.9.2 重置 144
6.9.4 电源的管理 146
6.10 硬件的工作 146
6.9.3 选择和控制脉冲 146
6.11 固件的工作 147
6.11.1 端点0中断 147
6.11.2 传送数据给主机 149
6.11.3 从主机接收数据 151
6.11.4 处理中断传输 153
6.11.5 其他的响应 153
6.12 硬件开发工具 154
6.12.1 平台板 154
6.12.2 监视/调试器 155
第7章 驱动程序 157
7.1 设备驱动程序 157
7.2 设备驱动程序的来源 158
7.2.1 标准设备类型 158
7.4 Win32驱动程序模型 159
7.3 设备驱动程序的执行模式 159
7.2.2 客户化设备 159
7.5 分层的驱动程序 161
7.5.1 USB驱动程序层 161
7.5.2 函数驱动程序 161
7.5.3 总线驱动程序 162
7.6 通信的流程 163
7.6.1 用户的角色 163
7.6.2 应用程序的角色 163
7.6.3 设备驱动程序的角色 165
7.6.4 集线器驱动程序的角色 166
7.6.5 总线类别驱动程序的角色 166
7.6.6 主机控制器驱动程序的角色 167
7.6.7 设备的角色 167
7.6.8 响应 167
7.8 编写客户化的驱动程序 168
7.7.2 厂商提供的驱动程序 168
7.7 驱动程序的类型 168
7.7.1 Windows提供的驱动程序 168
7.6.9 通信的终结 168
7.8.1 工具软件 169
7.8.2 WinRT for USB 169
7.8.3 WinDriver USB 171
7.8.4 提供函数库的工具软件 172
7.9 Windows如何选择驱动程序 173
7.9.1 .inf文件 173
7.9.2 注册表 174
7.9.3 检测特定的设备 175
7.9.4 检测通用的设备 176
7.10 .inf文件简介 176
7.10.1 语法 178
7.10.3 ClassInstall区段 179
7.10.2 Version区段 179
7.10.4 Manufacturer区段 180
7.10.5 DestinationDirs区段 180
7.10.6 Strings区段 182
7.10.7 HID的通用.inf文件 182
7.10.8 建立.inf文件的工具 182
7.10.9 使用.inf文件的技巧 183
第8章 设备类别 185
8.1 类别 185
8.1.1 类别规范 185
8.1.2 类别的定义 186
8.2 标准类型的设备 188
8.2.1 键盘、鼠标和游戏杆 188
8.2.2 大容量存储设备 188
8.2.3 打印机 192
8.2.4 数码相机和扫描仪 193
8.2.5 音频 195
8.2.6 调制解调器 196
8.3 非标准类型的设备 197
8.3.1 以中等速度传输数据的设备 197
8.3.2 更新RS-232设备 197
8.3.3 POS设备 199
8.3.4 取代非标准并行端口设备 199
8.3.5 PC到PC的连接 200
8.3.6 无线连接 200
第9章 设备测试 202
9.1 USB测试工具 202
9.1.1 测试 203
9.1.2 HIDView 207
9.2.1 协议分析器 208
9.2 测试仪器 208
9.2.2 USB Expert的硬件 209
9.2.3 USB Expert的软件 209
9.2.4 CATC Traffic Generator 211
9.2.5 Root 1测试适配器 212
9.3 测试和标记 212
9.3.1 USB实施者论坛的合格计划 213
9.3.2 USB标志 214
9.3.3 Windows硬件品质实验室测试 214
9.3.4 驱动程序签名 214
第10章 电源管理和信号编码 216
10.1 电源的管理 216
10.1.1 电压 216
10.1.2 可以使用总线电源的设备 216
10.1.3 电源要求 217
10.2 集线器电源 218
10.1.4 通知主机 218
10.2.1 电的来源 219
10.2.2 过流保护 221
10.2.3 电源开关 222
10.3 节省电能 222
10.3.1 全局挂起和选择挂起 222
10.3.2 挂起设备的限制 222
10.3.3 恢复通信 223
10.4 低速和中速的总线状态 223
10.4.1 Differential 1和Differential 0状态 224
10.4.5 闲置状态 225
10.4.8 信息包结束 225
10.4.7 信息包开始 225
10.4.6 恢复状态 225
10.4.4 Data J和Data K状态 225
10.4.3 Single-ended 1状态 225
10.4.2 Single-ended 0状态 225
10.4.9 未连接状态 226
10.4.10 连接状态 226
10.4.11 重置状态 226
10.5 高速的总线状态 226
10.5.1 高速Differential 1和Differential 0状态 227
10.5.2 高速Data J和Data K状态 228
10.5.3 Chirp J和Chirp K 228
10.5.4 高速Squelch 228
10.5.5 高速闲置 228
10.5.6 高速信息包开始 228
10.5.7 高速信息包结束 228
10.6 数据编码 229
10.6.1 维持同步 229
10.5.8 高速未连接状态 229
10.6.2 位填充 230
10.6.3 SYNC字段 230
10.6.4 信息包结尾 231
10.6.5 时序正确性 231
10.7 信息包格式 232
10.7.1 SYNC字段 232
10.7.2 PID字段 232
10.7.3 地址字段 233
10.7.4 端点字段 233
10.7.5 帧号码字段 233
10.7.6 数据字段 233
10.7.7 CRC字段 234
10.7.8 信息包间的延迟 234
10.8 测试模式 234
11.1 接收器与信号 237
第11章 电路接口 237
11.2 低速和中速接收器 238
11.3 高速接收器 240
11.3.1 电路 240
11.3.2 转换速度 241
11.3.3 检测高速设备的移除 242
11.3.4 高速的挂起和恢复 242
11.4 信号电压 243
11.4.1 低速和中速 243
11.4.2 高速 243
11.5 电缆 246
11.5.1 连接器 248
11.5.2 可拆分的与捕获性的电缆 249
11.6.2 平衡线 250
11.6.1 噪声 250
11.6 信号的品质 250
11.5.3 电缆长度 250
11.6.3 双绞线 251
11.6.4 边缘速率 251
第12章 集线器 252
12.1 集线器的基础 252
12.1.1 避免设备进入挂起状态 253
12.1.2 可串联的集线器数目 253
12.2 集线器中继器 254
12.2.1 低速和中速的中继器 254
12.2.2 高速的中继器 254
12.3 事务转换器 255
12.4 集线器控制器 256
12.5 速度 257
12.6 集线器类别 257
12.6.1 标准描述符 258
12.6.2 集线器描述符 260
12.6.3 标准请求 261
12.6.4 集线器类别请求 262
12.6.5 连接端口指示器 265
第13章 HID设备 266
13.1 HID简介 266
13.1.1 硬件要求 267
13.1.2 固件要求 268
13.2 HID的描述符 269
13.2.1 描述符的内容 272
13.2.2 HID类别描述符 272
13.2.3 报表描述符 274
13.3 HID特定请求 278
13.3.3 Get_Idle 279
13.3.1 Get_Report 279
13.3.2 Set_Report 279
13.3.4 Set_Idle 280
13.3.5 Get_Protocol 281
13.3.6 Set_Protocol 281
13.4 传输数据 281
13.4.1 发送数据给主机 282
13.4.2 从主机接收数据 283
13.5 报表的结构 285
13.5.1 HID Descriptor Tool 286
13.5.2 短项目 287
13.5.3 长项目 287
13.6 Main项目类型 288
13.6.1 Input、Output和Feature项目 288
13.7 Global项目类型 291
13.6.2 Collection与End Collection标记 291
13.7.1 识别报表 292
13.7.2 数据的使用 293
13.7.3 转换原始数据 294
13.7.4 数据的大小与格式 296
13.7.5 Global项目的储存与恢复 296
13.8 Local项目类型 296
13.9 填充 298
13.10 实体描述符 298
第14章 HID程序设计 300
14.1 主机的通信 300
14.1.1 说明文件 301
14.1.2 HID函数 301
14.1.3 DirectX 302
14.2.1 使用Visual C++ 303
14.2 调用API函数 303
14.2.2 使用Visual Basic 304
14.3 取得HID类别的GUID 305
14.3.1 使用Visual C++ 306
14.3.2 使用Visual Basic 306
14.4 取得HID信息的结构数组 307
14.4.1 使用Visual C++ 307
14.4.2 使用Visual Basic 307
14.4.3 详解 307
14.5 识别HID接口 308
14.5.1 使用Visual C++ 308
14.5.2 使用Visual Basic 308
14.5.3 详解 309
14.6 取得设备的路径 309
14.6.1 使用Visual C++ 310
14.6.2 使用Visual Basic 311
14.7 取得设备的代号 312
14.7.1 使用Visual C++ 312
14.7.2 使用Visual Basic 313
14.8 取得厂商与产品ID 314
14.8.1 使用Visual C++ 314
14.8.2 使用Visual Basic 314
14.8.3 详解 315
14.9 取得包含设备能力的缓冲区指针 315
14.9.1 使用Visual C++ 315
14.9.2 使用Visual Basic 315
14.9.3 详解 316
14.10 取得设备的能力 316
14.10.1 使用Visual C++ 316
14.11 取得数值的能力 317
14.10.2 使用Visual Basic 317
14.10.3 详解 317
14.12 发送输出报表给设备 318
14.12.1 使用Visual C++ 318
14.12.2 使用Visual Basic 318
14.12.3 详解 319
14.13 从设备读取输入报表 319
14.13.1 使用Visual C++ 320
14.13.2 使用Visual Basic 320
14.13.3 详解 321
14.14 使用重叠ReadFile读取报表 321
14.14.1 使用Visual C++ 322
14.14.2 使用Visual Basic 323
14.15 使用多线程的ReadFile读取报表 324
14.15.1 使用Visual C++ 324
14.16.1 使用Visual C++ 326
14.16.2 使用Visual Basic 326
14.15.2 使用Visual Basic 326
14.16 发送特征报表给设备 326
14.17 从设备读取特征报表 327
14.17.1 使用Visual C++ 327
14.17.2 使用Visual Basic 327
14.18 关闭通信 327
14.18.1 使用Visual C++ 328
14.18.2 使用Visual Basic 328
第15章 HID设备开发实例 330
15.1 HID设备开发综述 330
15.2 HID温度计开发示例 333
15.3 用C语言来设计固件 400
附录 USB参考资料 430