基于HID的人机接口设备的设计及应用.doc_第1页
基于HID的人机接口设备的设计及应用.doc_第2页
基于HID的人机接口设备的设计及应用.doc_第3页
基于HID的人机接口设备的设计及应用.doc_第4页
基于HID的人机接口设备的设计及应用.doc_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于基于 HID 的人机接口设备的设计及应用的人机接口设备的设计及应用 摘摘 要要 通用串行总线 USB 是连接计算机系统与外部设备的一个串口总线标准 也是输入 输出接口的技术规范 被广泛应用于个人电脑和移动设备等信息通讯产品 并扩展至摄 影器材 数字电视 机顶盒 游戏机等相关领域 HID Human Interface Device 类设备是 USB 设备类型中的一种 是直接与人交互的设备 如键盘 鼠标等 HID 类设备并不一定是标准的外设类型 只要交换的数据格式存储在报 文的结构中 并且设备固件支持报文的格式 则任何工作在该限制之内的设备均可称为 HID 设备 如电压计 温度计 读卡器等 因此 人机接口设备有巨大的应用市场 针对以上需求 本文致力于开发一个基于 HID 的人机接口设备 在上位机编写相应的应 用软件 实现人机接口设备与主机的通信 本文首先阐述了开发基于 HID 的人机接口设备在经济和技术上的意义 继而描述了系 统架构 基于 VC 的上位机软件开发 以及设备端固件代码的编写 文中对 USB 接口通信 协议做了简要的介绍 并介绍了基于 VC 的 Windows 下 USB 接口驱动软件开发 最后 本文对在研究和开发人机接口设备工作中的不足之处和需要改进的地方进行了总 结 同时也展望了低成本的人机接口设备的市场潜力和 USB 发展的美好前景 关键词 HID 类 人机接口设备 USB 通信协议 HID device based on HID class ABSTRACT Universal Serial Bus is a serial bus standard which connects the computer system and the peripheral equipments It is the input output interface specification as well It is widely used in communication products such as personal computers and mobile devices It is extending to the related fields such as Camera Equipment Digital Television STB and Game Console HID class which short for Human Interface Device is one of the USB device class As we know the Typical HID device are mouse keyboard etc HID class device didn t always be the standard USB device If only the data format is contained by the report structure which is supported by the USB firmware Then we can call all of those devices as HID device such as Voltmeter Thermometer Card reader and so on Therefore the human interface device has a vast potential market So as this this project aims to develop a HID device based on HID class To implement the communication between PC host and the device I need to program the PC application program software etc Firstly this paper set forth the economic and technical importance of the HID device based on HID class And then describe the system framework Also briefly describe the USB specification This paper concludes the shortage during the developing And also prospect the bright future for the low cost HID device Key words HID class HID USB specification 目 录 摘 要 I ABSTRACT II 1 绪 论 1 1 1 选题背景 1 1 2 选题目标 1 1 3 需求分析 2 1 3 1 用户需求分析 2 1 3 2 功能需求分析 2 1 4 主要内容 2 1 5 本章小结 3 2 USB 接口技术介绍 4 2 1 USB 接口技术 4 2 1 1 USB 简介 4 2 1 2 USB 的总线拓扑结构 4 2 1 3 USB 系统分层 5 2 1 4 USB 的编码方式 6 2 1 5 USB 的即插即用 7 2 2 USB 接口 HID 设备类 7 2 2 1 HID 设备类简介 7 2 2 2 HID 数据传输方式 8 2 2 3 HID 设备枚举过程 8 2 2 4 HID 设备类描述符 9 2 3 本章小结 10 3 人机接口设备系统设计 11 3 1 系统框架 11 3 2 人机接口设备平台简介 12 3 2 1 USB 控制器方案 12 3 2 2 ST2211U 芯片简介 13 3 3 主要功能 14 3 4 本章小结 14 4 基于 VC 的 HID 上位机软件开发 15 4 1 Windows 驱动程序模式 15 4 1 1 Windows 驱动方式 15 4 1 2 WDM 驱动程序的分层结构 15 4 2 USB 接口 HID 类驱动原理 16 4 2 1 USB 设备驱动体系 16 4 2 2 与 HID 设备通信的主要 API 函数 17 4 3 基于 VC 的应用程序开发 18 4 3 1 开发流程 18 4 3 2 打开设备功能模块 19 4 3 3 LCD 显示功能模块 23 4 3 4 键盘功能模块 23 4 4 本章小结 24 5 HID 设备软硬件设计与实现 25 5 1 HID 设备系统设计 25 5 2 HID 功能模块设计与实现 25 5 2 1 USB HID 驱动开发 25 5 2 2 LCD 驱动开发 29 5 2 3 键盘驱动开发 30 5 3 本章小结 32 6 整机系统调试 33 6 1 调试流程 33 6 2 Bus Hound 调试工具简介 33 6 3 HID 设备接口通信调试 33 6 4 基于 VC 的应用软件调试 34 6 5 测试结果 36 7 总结与展望 39 参考文献 40 附 录 41 谢 辞 54 1 绪 论 1 1 选题背景 随着计算机硬件飞速发展 外围设备日益增多 键盘 鼠标 调制解调器 打印机 扫描仪早已为人所共知 数码相机 MP3随身听接踵而至 这么多的设备 如何接入个人 计算机 为了满足用户的需求 以Intel 为首的七家公司 Intel Compaq Microsoft IBM DEC Northern Telecom 以及日本NEC 于1994 年11月推出了USB Universal Serial Bus 通用串行总线 协议的第一个草案专用于低中速的计算机外设 USB可把多达127个外设同时连到用户的系统上 所有的外设通过协议来共享USB的带 宽 其12Mbps的带宽对于键盘鼠标等低中速外设是完全足够的 USB允许外设在主机和其 它外设工作时进行连接配置使用及移除 即所谓的即插即用 Plug 2 获得指向 HID 设备集合句柄 SetupDiGetClassDevs 函数查询所有已安装的 HID 设备 得到一个指向该 HID 设备集 合的句柄 SetupDiGetClassDevs IN LPGUID ClassGuid OPTIONAL IN PCSTR Enumerator OPTIONAL IN HWND hwndParent OPTIONAL IN DWORD Flags 3 识别 HID 接口 SetupDiEnumDeviceInterfaces 函数用来读取识别一个接口的结构的指针 每一次调用 必须传递一个数组索引来指定一个接口 SetupDiEnumDeviceInterfaces IN HDEVINFO DeviceInfoSet IN PSP DEVINFO DATA DeviceInfoData OPTIONAL IN LPGUID InterfaceClassGuid IN DWORD MemberIndex OUT PSP DEVICE INTERFACE DATA DeviceInterfaceData 4 获取目标设备详细信息 对每一个接口 调用 SetupDiGetDeviceInterfaceDetail 函数获取其详细的信息 包括 设备名称 头四个字节 CreateFile 用此设备名打开设备 SetupDiGetDeviceInterfaceDetail IN HDEVINFO DeviceInfoSet IN PSP DEVICE INTERFACE DATA DeviceInterfaceData OUT PSP DEVICE INTERFACE DETAIL DATA A DeviceInterfaceDetailData OPTIONAL IN DWORD DeviceInterfaceDetailDataSize OUT PDWORD RequiredSize OPTIONAL OUT PSP DEVINFO DATA DeviceInfoData OPTIONAL 5 打开设备 调用 CreatFile 函数打开设备 CreateFile LPCSTR lpFileName DWORD dwDesiredAccess DWORD dwShareMode LPSECURITY ATTRIBUTES lpSecurityAttributes DWORD dwCreationDisposition DWORD dwFlagsAndAttributes HANDLE hTemplateFile 6 获取 USB 设备的有关属性 调用 HidD GetAttributes 获取设备的零售商 ID 产品 ID 及产品的版本号等 如果获 取成功 则将属性中的 VID PID 以及设备版本号与我们的目标设备进行比较 如果一致 则是目标设备 则使用读写方式打开目标设备 BOOLEAN stdcall HidD GetAttributes IN HANDLE HidDeviceObject OUT PHIDD ATTRIBUTES Attributes 7 释放设备信息集合 SetupDiDestroyDeviceInfoList 函数释放设备节点及内存分配 WINSETUPAPI BOOL WINAPI SetupDiDestroyDeviceInfoList IN HDEVINFO DeviceInfoSet 图 4 4 即为 VC 中调用 Windows API 函数打开 HID 设备的流程图 开开始始 使使用用HidD GetHidGuid 得得到到HID类类GUID 结结束束 错错误误号号是是 ERROR NO MORE ITEMS 使使用用SetupDiEnumInterfaceDevice 枚枚举举设设备备接接口口 使使用用SetupDiEnumDeviceInterfaces 取取得得设设备备接接口口详详细细信信息息 成成功功 是是否否需需要要操操作作设设备备 N 使使用用SetupDiGetClassDev 得得到到HID设设备备类类信信息息 利利用用上上一一步步取取得得的的设设备备路路径径信信息息 使使用用CreateFile打打开开设设备备 使使用用Hid GetAttributes 取取得得VID PID等等信信息息 使使用用GetLastError Y N 图 4 4 打开设备流程图 在完成打开设备功能之后 主机便可与 HID 设备进行通信了 主机在接收报告的时 候 需要从报告中提取数据 由于报告中包含了各种类型的数据 为了便辨别不同类型 的数据 HID 类提供了 HidP GetXxx 例程 从设备中读取不同类型的数据 如果程序员 知道各个数据的含义 则可直接使用 ReadFile 函数读出数据 同样 主机发送数据给设 备的时候 也要先创建报告 为了方便发送不同类型的数据给设备 HID 类提供了 HidP SetXxx 函数 当然 如果程序员知道各个数据的含义 也可以直接使用 WriteFile 函数将报告传给设备 在 LCD 显示与键盘键盘功能模块上 我们使用 HidD SetFeature 来传送一个特征报文给 HID 设备 HidD SetFeature IN HANDLE HidDeviceObject IN PVOID ReportBuffer IN ULONG ReportBufferLength 4 3 3 LCD 显示功能模块 LCD 显示功能模块 首先用函数 GetDlgItemText 从文本框获取用户输入信息 并设 置报告缓冲区第 1 字节为 0 x01 自定义 开启 LCD 显示功能 主要代码如下 ReportBuffer 0 0 x00 ReportBuffer 为报文缓冲区 ReportBuffer 1 0 x01 Display command ReportBuffer 2 sendLen HidD SetFeature hDevHandle ReportBuffer 0 x21 读写报文缓冲区时 第一个字节是 Report ID 其后是报文数据 报文缓冲区默认是 八个报文 并且环状排列 因为数据读写是发生在主机轮训设备的时候 并不是由设备 触发产生硬件中断 所以如不能及时读写 新的数据会覆盖旧的数据 导致生报文丢失 当数据读写频繁时应使用特征报文 它可以保证当报文数据没有变化时 HID 不会传送新 的数据 当设备接收到该命令 设备将启动 LCD 功能模块显示最多 30 个字符到 LCD 屏上 LCD 命令定义 见表 4 2 表 4 2 LCD 命令定义 偏移量域大小 字节 值描述 00hbLCDCmd101h LCD 显示命令 01hbLength1 定义显示字符的长度 02habDatabLength 显示在 LCD 上的字符 03h bLengthabRandomData29 bLength 随机数 4 3 4 键盘功能模块 键盘功能模块 可启动开发板的键盘功能 并读取键值 需将报告缓冲区第 1 字节 设置为 0 x02 自定义 主要代码如下 ReportBuffer 0 0 x00 ReportBuffer 1 0 x02 Read key command HidD SetFeature hDevHandle ReportBuffer 0 x21 当 HID 设备接收到该命令 设备将在 LCD 上显示 Enter Data 以提示用户 并调 用按键功能模块等待用户输入按键 用户只能输入 0 9 之间的按键 但输入的按键达到 最大长度 6 或者有 Enter 键按下时 设备返回所有所按的按键给 PC 读取键值流程结束 按键命令定义见表 4 3 表 4 3 按键命令定义 偏移量域大小 字节 值描述 00hbKeyCmd102h 读键值命令 01habRandomData31 31 个字节的随机数 4 4 本章小结 本章详细介绍了主机端 上位机 应用程序设计 详细分析了打开设备功能模块 设备枚举的流程 键盘功能模块与 LCD 功能模块 5 HID 设备软硬件设计与实现 5 1 HID 设备系统设计 本项目的人机接口设备端需要硬件设计与软件设计 硬件方面包括芯片选择 电路 图的设计等 软件方面 即固件代码 包括 USB 协议栈的编写 键盘驱动及 LCD 驱动的 编写 这些都是项目开发的重点与难点 USB 设备端的软件开发实际上包含着很大的工作量 因为开发者需要在自己的平台上 实现一个 USB 设备端的协议栈 简单说来 USB 设备端的软件主要需要两个功能 一是 监视设备的状态 控制设备的行为 自动产生状态信息和用户命令信息 二是完成主机 与设备之间的 USB 总线通讯 自动处理主机的控制和查询命令 实现前一个功能的软件 模块我们称为 USB 设备的通用模块 而实现后一个功能的软件模块我们称为 USB 设备的 协议模块 5 2 HID 功能模块设计与实现 5 2 1 USB HID 驱动开发 1 固件流程图 USB 设备作为一个完整的硬件设备 由硬件和固件两部分组成 其中 固件包括有关 系统配置和 CPU 的一些设置模块 USB 协议栈模块等部分 图 5 1 为本项目中 USB 设备固 件流程图 开开始始 设设备备复复位位 系系统统初初始始化化 发发送送USB中中断断 是是否否是是EP0中中断断 是是否否有有数数据据发发送送 数数据据存存入入缓缓冲冲区区等等待待US B中中断断 是是否否有有 其其它它USB中中断断 清清系系统统变变量量 USB线线是是否否连连接接 结结束束 EP0中中断断服服务务程程序序 Y N Y Y N N Y N N Y 图 5 1 USB 固件流程图 2 HID 属性描述符 如 2 2 4 所述 HID 类支持标准的 USB 描述符 即设备描述符 配置描述符 接口描 述符 端点描述符和字符串描述符 此外 作为一个特定的设备类 HID 有其独有的类描 述符 即 HID 描述符 报告描述符和物理描述符 下面主要介绍本项目使用的 HID 描述符 端点描述符与报告描述符 HID 描述符跟接口描述符 端点描述符类似 也是随配置信息一起返回给主机的 主 机并不会单独发出请求来读取它 HID 描述符在配置信息中的位置是紧接接口描述符 HID 描述符详细设计如下 HID CLASS DESCRIPTOR DB 09H bLength 域 HID 描述符的长度为 9 个字节 DB 21H bDescriptorType 域 描述符种类为 HID 类描述符 DB 00H bcdHID 域 HID 规范版本号为 0 x0100 DB 01H DB 00H bCountryCode 域 不支持硬件的目的国家识别码 DB 01H bNumDescriptors 域 支持的附属描述符数为 1 即报告描述符 DB 22H bDescriptorType 域 HID 相关描述符为 0 x22 即报表描述符 DB 30H bDescriptorLength 域 报告描述符的总长度 0 x0030 即 48 字节 DB 00H 端点描述符详细设计如下 ENDPOINT DESCRIPTOR INTERRUPT IN DB 07H bLength 域 端点描述符长度为 7 个字节 DB 05H bDescriptorType 域 描述符种类为端点描述符 DB 83H bEndpointAddress 端点号为 3 DB 03H bmAttributes 域 端点号为 3 的端点是 Interrupt In 端点 DB 08H wMaxPacketSize 域 0 x0008 DB 00H DB 10H bInterval 域 轮询间隔为 2 ms 报告描述符 顾名思义就是描述 报告 格式的 这个格式使主机和设备能遵循着 同一个规则来解释一个报告中所含有的数据 报告 是主机和 HID 设备之间进行数据交 换的最小单位 也就是说 在主机完成对设备的识别之后 在具体应用上的数据交换就 得以 报告 的方式进行 报告 的类型有三种 输入报告 输出报告和特征报告 输 入报告就是设备发给主机的报告 而输出报告就是主机发给设备的报告 特征报告是主 机发给设备的报告 特征报告常在自定义 HID 设备中被用作主机向设备发送自定义数据 通过报告 USB HOST 可以分析出报告中数据所表示的含义 并通过控制输入端点 0 返回 另外 主机使用获取报告描述符命令来获取报告描述符 注意 该请求是发送到接口 而不是发送到设备 一个报告描述符可以描述多个报告 不同的报告通过报告 ID 来识别 报告 ID 在报告最前面 即第一个字节 当报告描述符中没有规定报告 ID 时 报告中就 没有 ID 字段 而直接以数据开始 与 HID 描述符不同 主机会发出单独的请求来读取报告描述符 关于报告描述符的 组成 HID 设备类定义文档中明确指出 一个报告描述符必须包含但不仅限于以下数据项 输入 输出或特征 指明了报告的类型 用法 用法页 用法和用法页一起指明了数据 项的用法 逻辑最小值 逻辑最大值 逻辑最小值和逻辑最大值指明了报告所使用的数 据值的范围 报告大小 指明数据项的位数 报告计数 指明有多少个这样的数据项 报告描述符详细设计如下 HID REPORT DESCRIPTOR DB 06H 用法页 0 xFFA006 自定义 修饰其下所有主项 DB A0H DB FFH DB 09H 用法 0 x0109 局部项 只修饰下面集合主项 DB 01H DB A1H 应用集合开始 01A1 DB 01H DB 09H 用法 0 x0209 DB 02H DB A1H 物理集合开始 0 x00A1 DB 00H DB 06H 用法页 0 xFFA106 DB A1H DB FFH DB 09H 用法 0 x0309 DB 03H DB 15H 逻辑最小值 127 DB 80H DB 25H 逻辑最大值 128 DB 7FH DB 35H 物理最小值 00 DB 00H DB 45H 物理最大值 255 DB FFH DB 75H 报告大小 8 bits DB 08H DB 95H 报告计数 8 DB 08H DB 81H 输入 数据 变量 绝对值 DB 02H DB 09H 用法 0 x0409 DB 04H DB 15H 逻辑最小值 127 DB 80H DB 25H 逻辑最大值 128 DB 7FH DB 35H 物理最小值 00 DB 00H DB 45H 物理最大值 255 DB FFH DB 75H 报告大小 8 bits DB 08H DB 95H 报告计数 32 DB 20H DB B1H 特征 数据 变量 绝对值 DB 02H DB C0H 物理集合结束 DB C0H 应用集合结束 5 2 2 LCD 驱动开发 本项目采用 ST7070 点阵液晶显示控制器来驱动字符显示 ST7070 控制器集成了显示 RAM 字符发生器 液晶驱动模块 MCU 只需利用 3 线 SPI 跟 ST7070 通信 通过写入一些 控制命令给 ST7070 来控制 ST7070 驱动液晶屏达到显示字符等的目的 图 5 2 显示了 LCD 驱动器的原理框图 主主微微控控制制器器 ST2211U LCD驱驱动动器器 ST7070 LCD 液液晶晶显显示示屏屏 主主微微控控制制器器 ST2211U LCD驱驱动动器器 ST7070 LCD 液液晶晶显显示示屏屏 图 5 2 LCD 驱动器原理框图 ST7070 点阵式液晶显示控制器及 LSI 驱动器提供包括显示字母数字 片假名及符号 的功能 在 4 8 位微处理器控制下 可以对 ST7070 进行配置 以驱动处理点阵式液晶显 示器 外接的微处理器可以通过高速串行接口 如 3 线 SPI 或 4 线 SPI 直接控制 ST7070 由于驱动一个点阵液晶显示器所需要的功能 例如 显示 RAM 字符发生器和液 晶驱动 都是由内部芯片提供的 故此控制器兼容了最小的系统 ST7070 部分兼容了 HD44780 KS0066 和 SED1278 的功能 因此允许用户使用 ST7070 来代替它们 ST7070 字 符发生存储器可扩展至生产共达 496 个不同的 5 8 点阵式字型 ST7070 提供了 2 7V 5 5V 的电源供应 适合低使用便携式电池驱动的低功耗产品 ST7070 的 LCD 驱动 器组成的 16 个通用信号驱动器和 80 段信号驱动器 可以通过级联段驱动器 ST7921 扩展 其尺寸 最大的显示尺寸可以是一行 80 个字符或两行 40 个字符 单个 ST7070 可以显示 最大可显示一行 16 个字符或两行 16 个字符 LCD 驱动器初始化流程 如图 5 3 所示 Power On Delay 41ms After Vcc 4 5V Function set Delay 38us Display ON OFF control Delay 37us Display clear Delay 1 53ms Entry mode set Initialization end 图 5 3 LCD 驱动器初始化流程图 5 2 3 键盘驱动开发 本项目采用 4 5 矩阵键盘 在键盘中按键数量较多时 为了减少 I O 口的占用 通 常将按键排列成矩阵形式 如图 5 4 所示 在矩阵式键盘中 每条水平线和垂直线在交 叉处不直接连通 而是通过一个按键加以连接 键盘是由一组规则排列的按键组成 一 个按键实际上是一个开关元件 按键按下时 与此键相连的行线与列线导通 行线在无 键按下时处在高电平 显然 如果让所有的列线也处在高电平 那么 按键按下与否不 会引起行线电平的变化 因此 必须使所有列线处在低电平 只有这样 当有键按下时 该键所在的行电平才会由高电平变为低电平 CPU 根据行电平的变化 便能判定相应的 行是否有键按下 图 5 4 4 5 矩阵键盘电路图 行列扫描法又称为逐行 或列 扫描查询法 是一种最常用的按键识别方法 项目 中 ST2211U 微控制器的 GPIO 口提供的 I O 端口分为四组 Port A B C D 将行线所接 的 PB 7 4 口作为输出端 列线所接的 PA 4 0 口作为输入端 识别方法 首先 判断 键盘中有无键按下 将全部行线 PB 7 4 置为低电平 然后逐一检测列线的电平状态 只要有一列的电平为低 则表示键盘中有键被按下 而且闭合的键位于低电平线与 4 根 行线相交叉的 4 个按键之中 若所有列线均为高电平 则键盘中无键按下 若确认有键 按下 则要判断闭合键所在的位置 依次将行线置为低电平 即在置某根行线为低电平 时 其它线为高电平 在确定某根行线置为低电平后 再逐行检测各列线的电平状态 若某列为低电平 则该列线与置为低电平的行线交叉处的按键就是闭合的按键 图 5 5 为本项目的键盘驱动流程图 开开始始 行行X置置为为低低电电平平 并并 开开始始扫扫描描各各列列Y 是是否否有有键键按按下下 列列Y是是否否为为高高电电平平 列列值值Y增增一一 列列值值为为6 行行值值X增增一一 行行值值为为5 键键值值为为0 结结束束 Y Y Y 记记录录键键值值 N N N N 图 5 5 键盘驱动流程图 5 3 本章小结 本章详细描述了设备端的各个模块驱动开发 USB HID 驱动开发 LCD 驱动开发及键 盘驱动开发 6 整机系统调试 6 1 调试流程 正确 合理的调试方法是成功开发一个 USB 人机接口设备必不可少的环节 本项目 的调试过程分三步进行 首先 对于人机接口设备 借助 PC 调试软件 Bus House 将设 备端的 USB 协议 数据交换等调通 然后 使用调试好的人机接口设备接口开发上位机 上的应用程序 最后 进行整机测试 6 2 Bus Hound 调试工具简介 Bus Hound 软件是由美国 perisoft 公司研制的一种专用于 PC 机各种总线 数据包监 视和控制的开发工具软件 其名 hound 的中文意思为 猎犬 即指其能敏锐地感知到总线 的丝毫变化 Bus Hound 是一个超级软件总线协议分析器 用于捕捉来自设备的协议包和输入输出 操作 其优良特性如下 支持所有版本的 IDE SCSI USB 1394 总线 支持各类设备如硬盘 库 DVD 鼠标 扫描仪 网络照相机等 支持 Windows9X WindowsMe NT4 0 2000 2003 XP 和嵌入式 XP 操作系统 捕捉数据的总量仅受机器内存限制 可以设置触发信号自动停止 捕获操作 测试读取 同步等设备性能 捕获设备驱动包 例如 IRP 捕获任意数量的并行 设备 而不管其总线类型 易于交换与下载 捕获的数据易于拷贝到其它环境生成 Html 格式 捕获的数据能保存为文本文件或 ZIP 文件 所有的可捕获设备以树形结构列出 让 选择设备来得更轻松些 可捕获设备的启动过程 用户爱好设定功能 如用户可调整捕获 到的数据显示宽度 更宜于查看和使用 查看底层协议包括 SCSI 的 sense 数据和 USB 的 设置包 查看每阶段的时间变化精确到微秒 将输入输出发生的操作实时显示到屏幕上 纯软件解决方案 不需要对硬件进行任何变更等等 Bus Hound 是一款可以查看 USB 总线数据的调试软件 Bus Hound 的调试步骤如下 打开 Bus Hound 中的 Devices 页 在 Devices 页选中本项目的 HID compliant device 再转至 Capture 页 点击 Run 插入 HID 设备 6 3 HID 设备接口通信调试 采用 Bus Hound 捕获数据 枚举过程数据获取如下 表 6 1 设备枚举数据捕获 传输类型传输数据描述 CTL80 06 00 02 00 00 ff 00 获取配置描述符的 FF 个字节 09 02 22 00 01 01 00 80 32 09 04 00 00 01 03 00 00 00 09 21 00 01 00 01 22 30 00 DI 07 05 83 03 08 00 10 CTL80 06 00 01 00 00 12 00 获取设备描述符的 18 个字节 DI12 01 10 01 03 00 00 08 71 04 12 a1 01 00 01 02 00 01 设备描述符 CTL80 06 00 02 00 00 09 00 获取配置描述符的 9 个字节 DI09 02 22 00 01 01 00 80 32 配置描述符 CTL80 06 00 02 00 00 22 00 获取设备描述符的 34 个字节 09 02 22 00 01 01 00 80 32 配置描述符 09 04 00 00 01 03 00 00 00 接口描述符 09 21 00 01 00 01 22 30 00 HID 描述符 DI 07 05 83 03 08 00 01 端点描述符 其中 CTL 表示 控制传输 DI 表示数据输入 可根据 Bus House 捕获到的信息判 断 HID 设备是否被正确的配置 识别 同此法 亦可获取数据交互的具体数据 6 4 基于 VC 的应用软件调试 VC 的调试方法 首先必须使程序中包含调试信息 为了增加调试信息 可以按照下 述步骤进行 打开 Project settings 对话框 可以通过快捷键 ALT F7 打开 也可以通 过 IDE 菜单 Project Settings 打开 选择 C C 页 Category 中选择 general 则出 现一个 Debug Info 下拉列表框 可供选择的调试信息方式如表 6 2 所示 本项目采用 Program Database for Edit and Continue 的方式 表 6 2 VC 调试信息方式 命令行 Project settings 说明 无 None 没有调试信息 ZdLine Numbers Only 目标文件或者可执行文件中只包含全 局和导出符号以及代码行信息 不包 含符号调试信息 Z7C 7 0 Compatible 目标文件或者可执行文件中包含行号 和所有符号调试信息 包括变量名及 类型 函数及原型等 ZiProgram Database 创建一个程序库 PDB 包括类型信息 和符号调试信息 ZIProgram Database for Edit and Continue 除了前面 Zi 的功能外 这个选项允许 对代码进行调试过程中的修改和继续 执行 再选择 Link 页 选中复选框 Generate Debug Info 这个选项将使连接器把调试 信息写进可执行文件和 DLL 如图 6 1 所示 本项目须添加 hid lib setupapi lib 如果 C C 页中设置了 Program Database 以上的选项 则 Link incrementally 可以选择 选 中这个选项 将使程序可以在上一次编译的基础上被编译 即增量编译 而不必每次都 从头开始编译 图 6 1 VC 调试信息设置 6 5 测试结果 打开人机接口设备演示程序 1 打开设备功能测试 点击打开设备按钮 会出现如图 6 2 所示的提示信息 具体的枚举过程见 2 2 3 USB 总线枚举过程 及表 6 1 枚举数据的捕获 图 6 2 打开设备功能测试 2 LCD 显示功能测试 在输入框输入欲显示在 LCD 上的字符 再点击 LCD 显示按钮 如图 6 3 所示 设备 上的 LCD 液晶显示屏即会显示输入的字符 图 6 3 LCD 显示功能测试 具体 LCD 传输数据用 Bus Hound 捕获如表 6 3 其中 CTL 为控制传输 D0 为数据输 出 D0 输出的第一个字节 01 为 LCD 显示命令 后面为 31 个字节为欲显示的字节 表 6 3 LCD 传输数据捕获 传输类型传输数据描述 CTL21 09 00 03 00 00 20 00SET REPORT DO01 0e 48 65 6c 6c 6f 20 44 61 76 69 64 21 21 21 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3 键盘功能测试 点击键盘输入功能 即可在开发板实现按键功能 并回传至人机接口设备 如下图 6 3 所示 显示框成功输出 33 32 31 30 37 36 图 6 4 键盘功能测试 具体键盘传输数据用 Bus Hound 捕获如表 6 4 其中 CTL 为控制传输 D0 为数据输 出 DI 为数据输入 D0 输出的第一个字节 02 为键盘命令 DI 为设备传回的键值 表 6 4 键盘传输数据捕获 传输类型传输数据描述 CTL21 09 00 03 00 00 20 00SET REPORT DO02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 DI06 31 30 31 32 33 34 35 DI00 06 31 30 31 32 33 34 35 7 总结与展望 在本项目的开发过程中 本人深深的感悟到开发一个 USB HID 设备看起来容易 实 则艰难 选择 HID 设备类 虽然省略了主机端驱动程序的开发 但是设备端定义为一个 全速 HID 设备 需要深入了解 USB 2 0 协议 深入了解 HID 描述符的内涵 项目中的许 多地方 比如键盘与 LCD 的同步处理 线程的响应也做得并不完善 还有待提高 虽然 项目是结束了 但是感觉对 USB 协议的理解仍是九牛一毛 是远远不够的 在后续的工 作中 还要加强学习 2008 年 11 月 16 日 随着 USB3 0 规范的发布 新一轮的接口技术将引领 IT 业接口 技术的发展 USB 接口技术脱胎换骨 USB3 0 支持高达 5 0Gbps 的传输速率 并且保持 了良好的向下兼容 十倍于 USB2 0 的传输速率和更高的节能效率 标志着 USB 向高速外 设进军的又一里程碑 USB3 0 毫无悬念的将带动 USB 接口技术走向更美好的明天 参考文献 1 王云飞 USB 系统研究 M 清华大学工程物理系 2001 5 2 李英伟 王成儒 胡正平 USB 2 0 原理与工程开发 国防工业出版社 2006 3 武安河 周利莉 Windows 设备驱动程序 VxD 与 WDM 开发实务 M 电子工业出 版社 2001 4 范文庆 周彬彬 安靖 精通 Windows API 函数 接口 编程实例 M 人民邮电 出版社 2009 5 周立功 等 PDIUSBD12 USB 固件编程与驱动程序 M 北京航空航天大学出版社 2003 6 马斌 单片机原理及应用 M 人民邮电出版社 2009 7 李建忠 单片机原理及应用 M 西安电子科技大学出版社 2002 8 珧建刚 魏安阳 邱淑范 通用串行总线 USB 设备的驱动 J 电子技术应用 2001 年第 5 期 第 14 16 页 9 詹客团 侯国志 吕铁良等 USB HID 类设备开发 J 电测与仪表 2004 年 第 5 期 第 48 50 页 10 Walter Oney Programming the Microsoft Windows Driver Model Microsoft press 2000 11 Compaq Intel Philips Universal Serial Bus Specification Revision2 0 http www usb org 2000 12 Compaq Intel Philips Device Class Definition for Human Interface Devices HID http www usb org 2001 13 ST2211 Integrated Microcontroller User s Manual 2006 14 HID Usage Tables Version 1 11 2001 15 ST7070 Dot Matrix LCD Controller Driver 2008 附 录 附录一 上位机打开设备代码 void CHidSchoolDlg OnOpenDev 定义一个 GUID 的结构体 HidGuid 来保存 HID 设备的接口类 GUID GUID HidGuid 定义一个 DEVINFO 的句柄 hDevInfoSet 来保存获取到的设备信息集合句柄 HDEVINFO hDevInfoSet 定义 MemberIndex 表示当前搜索到第几个设备 0 表示第一个设备 DWORD MemberIndex DevInterfaceData 用来保存设备的驱动接口信息 SP DEVICE INTERFACE DATA DevInterfaceData 定义一个 BOOL 变量 保存函数调用是否返回成功 BOOL Result 定义一个 RequiredSize 的变量 用来接收需要保存详细信息的缓冲长度 DWORD RequiredSize 定义一个指向设备详细信息的结构体指针 PSP DEVICE INTERFACE DETAIL DATApDevDetailData 定义一个用来保存打开设备的句柄 HANDLE hDevHandle 定义一个 HIDD ATTRIBUTES 的结构体变量 保存设备的属性 HIDD ATTRIBUTES DevAttributes 初始化设备未找到 MyDevFound FALSE 对 DevInterfaceData 结构体的 cbSize 初始化为结构体大小 DevInterfaceData cbSize sizeof DevInterfaceData 对 DevAttributes 结构体的 Size 初始化为结构体大小 DevAttributes Size sizeof DevAttributes 调用 HidD GetHidGuid 函数获取 HID 设备的 GUID 并保存在 HidGuid 中 HidD GetHidGuid 根据 HidGuid 来获取设备信息集合 其中 Flags 参数设置为 DIGCF DEVICEINTERFACE DIGCF PRESENT 前者表示使用的 GUID 为 接口类 GUID 后者表示只列举正在使用的设备 因为我们这里只 查找已经连接上的设备 返回的句柄保存在 hDevinfo 中 注意设备 信息集合在使用完毕后 要使用函数 SetupDiDestroyDeviceInfoList 销毁 不然会造成内存泄漏 hDevInfoSet SetupDiGetClassDevs AddToInfOut 开始查找设备 然后对设备集合中每个设备进行列举 检查是否是我们要找的设备 当找到我们指定的设备 或者设备已经查找完毕时 就退出查找 首先指向第一个设备 即将 MemberIndex 置为 0 MemberIndex 0 while 1 调用 SetupDiEnumDeviceInterfaces 在设备信息集合中获取编号为 MemberIndex 的设备信息 Result SetupDiEnumDeviceInterfaces hDevInfoSet NULL 如果获取信息失败 则说明设备已经查找完毕 退出循环 if Result FALSE break 将 MemberIndex 指向下一个设备 MemberIndex 如果获取信息成功 则继续获取该设备的详细信息 在获取设备 详细信息时 需要先知道保存详细信息需要多大的缓冲区 这通过 第一次调用函数 SetupDiGetDeviceInterfaceDetail 来获取 这时 提供缓冲区和长度都为 NULL 的参数 并提供一个用来保存需要多大 缓冲区的变量 RequiredSize Result SetupDiGetDeviceInterfaceDetail hDevInfoSet 然后 分配一个大小为 RequiredSize 缓冲区 用来保存设备详细信息 pDevDetailData PSP DEVICE INTERFACE DETAIL DATA malloc RequiredSize if pDevDetailData NULL 如果内存不足 则直接返回 MessageBox 内存不足 SetupDiDestroyDeviceInfoList hDevInfoSet return 并设置 pDevDetailData 的 cbSize 为结构体的大小 注意只是结构体大小 不包括后面缓冲区 pDevDetailData cbSize sizeof SP DEVICE INTERFACE DETAIL DATA 然后再次调用 SetupDiGetDeviceInterfaceDetail 函数来获取设备的 详细信息 这次调用设置使用的缓冲区以及缓冲区大小 Result Set

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论