基于HID类的USB人机接口设计

发布者:zuiquan最新更新时间:2012-02-01 来源: dzsc关键字:HID  人机接口设备  USB  描述符  中断传输 手机看文章 扫描二维码
随时随地手机看文章

  目前市场上USB设备的种类繁多,但是这些设备会有一些共同的特性,根据这些特性可以把USB设备划分为不同的类,如显示设备、通信设备、音频设备、大容量存储设备、人机接口设备(HID)。这里介绍如何实现HID类设备,以及如何在应用程序中对HID类设备进行访问。从Windows98操作系统开始,为HID类设备提供了通用的驱动程序,所以只要按照HID设备类的规范编写设备的固件程序,就能够让Windows系统自动识别设备,省去了复杂的驱动程序编写过程。

  1 HID协议简介

  人机接口设备(HID)主要是指一些人与计算机进行交互的设备,如键盘、鼠标、游戏杆等;但是HID设备不一定非要是这些人机交互设备,只要符合HID设备级定义规范要求的都可以认为是HID设备。HID设备有以下主要特点:

  ① 交换的数据存储在报告的结构内,设备必须支持HID报告格式。

  ② 每笔事务可以携带小量或中量的数据。低速设备每笔事务最大为8字节,全速设备每笔最大为64字节,高速设备最大为1 024字节;

  ③ 有最大传输速度的限制。低速设备最快10 ms一笔事务,最高速度为800 B/s;全速设备最快1 ms一笔事务,最高速度为64 KB/s;高速设备最快125 μs一笔事务,最高速度为24.576 MB/s。

  ④ 没有传输速度的保证。

  当插入USB设备后,主机会向设备请求各种描述符来识别设备。为了把一个设备识别为HID类别,设备在定义描述符的时候必须遵守HID规范。图1显示了HID各种描述符之间的关系。事实上,每个设备可以有多个接口描述符来实现多接口设备,而且每个接口描述符下应该有多个端点描述符。

  

  图1 HID各种描述符之间的关系

  从图1中可以看出,除了USB标准定义的一些描述符外,HID设备还必须定义HID描述符。另外设备和主机的通信是通过报告的形式来实现的,所以还必须定义报告描述符;而物理描述符不是必需的。还有就是HID描述符是关联于接口(而不是端点)的,所以设备不需要为每个端点都提供一个HID描述符。

  USB设备有4种传输方式与主机进行通信: 控制方式、中断方式、批量方式和同步方式。每种方式都有它的应用领域。HID只支持控制和中断传输方式。如图2所示,HID设备必须要有默认的控制管道和一个中断输入端点;中断输出端点是可选的。

  

  图2 HID类设备使用控制和中断传输方式

  中断输出传输是USB1.1规范才有的内容,且必须获得Windows系统的支持。从Windows98 SE版本开始才支持中断输出传输方式,所以如果需要中断输出传输方式的设备应该选择相应的操作系统。表1列出了传输类型和相关情况。

  表1 HID类设备支持的传输方式传输

  

  USB协议定义了11种请求命令,通过这些请求来获得设备的信息及对设备进行设置。HID类设备除了要支持这11种标准的请求外,还要实现以下6种特定请求:

  ① Get_Report——主机用控制传输从设备接收数据,所有HID类设备都要支持这个请求;

  ② Set_Report——设备用控制传输接收主机的数据,设备可以不支持此请求;

  ③ Get_Idle——主机读取设备当前的空闲速率,设备可以不支持此请求;

  ④ Set_Idle——设置闲置状态,设备可不支持此请求;

  ⑤ Get_Protocol——主机获得设备的当前活动是引导协议还是报告协议;

  ⑥ Set_Protocol——在引导协议和报告协议间切换,设备如果支持系统引导(如键盘和鼠标),就必须支持Get_Protocol和Set_Protocol请求。

  2 HID接口固件设计与实现

  该设备采用C8051F120微控制器和PDIUSBD12芯片来实现,如图3所示。

  

  图3 HID系统结构框图

  因为PDIUSBD12的主端点(Endpoint2)具有64字节的双缓冲,能够提供比较高的速度,所以在端点描述符里把它配置为中断传输方式,而Endpoint1没有使用。PDIUSBD12通过中断触发CPU来响应主机的各种请求。

  此系统采用的USB协议版本是1.1,所以能够支持中断输出传输。为了让主机把设备识别为HID类别,定义设备接口描述符时类别这一字段的值必须设置为0x03(HID类别),这样主机就会继续请求获得设备的HID描述符和报告描述符。在主机Get_Descriptor请求中,当值字段的高位字节为0x21时,表示主机要求获得HID描述符;当值字段高字节为0x22时,就是主机要求获得报告描述符。对于报告描述符,可以参考HID Usage Tables规范。HID Descriptor Tool工具可以帮助建立和测试编写的报告描述符。这里定义了一个输入和输出64字节数据的报告描述符。

  code unsigned char szReport[] = {

  0x06,0xA0,0xFF,//用法页(FFA0h, vendor defined)

  0x09, 0x01,//用法(vendor defined)

  0xA1, 0x01,//集合(ApplicatiON)

  0x09, 0x02 ,//用法(vendor defined)

  0xA1, 0x00,//集合(Physical)

  0x06,0xA1,0xFF,//用法页(vendor defined)

  //输入报告

  0x09, 0x03 ,//用法(vendor defined)

  0x09, 0x04,//用法(vendor defined)

  0x15, 0x80,//逻辑最小值(0x80 or -128)

  0x25, 0x7F,//逻辑最大值(0x7F or 127)

  0x35, 0x00,//物理最小值(0)

  0x45,0xFF,//物理最大值(255)

  0x75, 0x08,//报告长度Report size (8位)

  0x95, 0x40,//报告数值(64 fields)

  0x81, 0x02,//输入(data, variable, absolute)

  //输出报告

  0x09, 0x05,//用法(vendor defined)

  0x09, 0x06,//用法(vendor defined)

  0x15, 0x80,//逻辑最小值(0x80 or -128)

  0x25, 0x7F,//逻辑最大值(0x7F or 127)

  0x35, 0x00,//物理最小值(0)

  0x45,0xFF,//物理最大值(255)

  0x75,0x08,//报告长度(8位)

  0x95, 0x40,//报告数值(64 fields)

  0x91, 0x02,//输出(data, variable, absolute)

  0xC0,//集合结束(Physical)

  0xC0//集合结束(Application)

  };

  这样,后面数据的输入和输出都必须满足报告的格式才能够进行传输。

  

  图4 应用程序枚举HID设备流程

  3 应用程序设计实现

  Windows为应用程序访问HID设备提供了强大的支持,有一整套对HID设备进行访问的API。应用程序要访问设备就必须先枚举到设备,图4为应用程序枚举HID设备流程。

  枚举成功后根据返回的设备句柄,就可以用ReadFile和WriteFile来读写设备的数据了。这里采用异步方式来读写数据,这样不会发生读写时阻塞,提高了程序的效率。以下是异步方式读写设备的要点:

  ① 为了实现异步访问设备,在CreateFile打开设备时必须使用FILE_FLAG_OVERLAPPED标志。

  ② 打开设备成功后,使用CreateThread建立1个读设备线程。

  ③ 在这个线程中首先建立1个OVERLAPPED结构,并用CreateEvent函数初始化它的hEvent成员,这样就创建了1个事件对象。

  ④ 调用ReadFile函数,并传入这个结构。

  ⑤ 调用ReadFile后会立即返回,必须调用GetLaSTError获得出错码。 如果为ERROR_IO_PENDING, 说明此操作是在等待完成的;否则,说明调用出错。

  ⑥ 调用WaitForSingleObject等待hEvent事件的通知,并使此线程进入休眠状态。如果有数据发送到主机,读线程就会被激活。

  WriteFile的使用也同样要求异步操作,与ReadFile的使用差不多。

  这里要注意的是,在每次读写数据前都要先接收和发送1字节的PID标志,所以每次读写数据的时候都要多一个字节。比如,这里每次读写的是64字节数据,但是在这64字节之前必须放1字节的PID数据,所以是65字节。一般这个字节的值为0。

  4 小结

  充分利用PDIUSBD12主端口的双缓冲特性后,测试设备与PC间传输速度能达到8 KB/s以上,对于一些传输数据量不大,速度要求不高,而又必须在短时间内做出响应的场合基本能够满足要求。在此基础上只要生成不同的报告描述符,就能开发出各种不同的嵌入式设备;而且这样的设备无需驱动,在插入PC后就能立刻开始工作,省去了安装驱动程序的过程,方便使用。

 

关键字:HID  人机接口设备  USB  描述符  中断传输 引用地址:基于HID类的USB人机接口设计

上一篇:基于PCI9820和GP2015的GPS信号采集与频谱分析
下一篇:三种方式解决USB接口与串口设备之间互连问题

推荐阅读最新更新时间:2024-05-02 21:52

USB视频数据采集系统接口电路设计
  现在不论是插座,插口都出现了很多的功能,并且使用方式不同接口或者应用也会有所不同。有的增加了保险功能、电源指示功能、开关功能,有的增加了调压功能。这些插座的功能无论怎样,只能是单一的目的:为用电设备提供电源接口。它们的共同缺陷就是不具有信息化和智能化功能。为了实现插座的信息化和智能化,我们将研究设计的智能信息系统与插座结合,将该智能设备与电源插座合为一体,设计成多功能智能监测插座。该插座由于在建筑电气安装时一次性固定完成,采用照明电源供电,人们使用时就好象使用普通电源插座一样,免除了过多的连接线。    USB接口芯片及其工作原理   在这篇文章中我们采用PDIUSBD12芯片,这是一种价格便宜、功能完善的并行接口芯片,它支
[电源管理]
<font color='red'>USB</font>视频数据采集系统接口电路设计
通用串行总线在分组无线网中的应用
    摘要: 在讨论通用串行总线(USB)基本原理的基础上,介绍如何将USB技术应用到分组无线网中。讲述分组无线网络控制单元的USB接口设计,并实现了分组无线网络控制单元与计算机之间的高速通信。     关键词: 通用串行总线(USB) 分组无线网(PRN) 分组无线网络控制单元(PRU) 分组无线网(PRN)是一种新型的无线通信网络,是利用分组交换技术共享无线信道的数字通信网络。它采用先进的网络通信协议、动态的网络拓扑组织,使网络具有信道利用率高、组建方便和多跳转换覆盖面广等特点。分组无线网与一般计算机通信网、广域分级无线网和传统的局域网相比,具有机动灵活、组网迅速和抗毁能力强等特点。分组无线网络控制单元(
[网络通信]
技术干货:在汽车应用中转向USB Type-C™供电
作者:安森美半导体高级产品线经理Pete Chadbourne 当汽车工业引入‘信息娱乐’的概念时,对制造商而言是个重大转变,因为它带来了汽车功能系统和非功能系统之间更紧密的集成。信息娱乐为驾驶员创造了一个新的接口,因此,它对我们如何与技术交互的影响几乎与手机的引入一样重要。 我们看到了主导的标准配置文件和用户可升级的音频系统-这大都是独立的-被适合制造商的系统所替换,提供更多功能。它们迅速演变至包含导航,同时逐步整合更多对汽车其他系统的控制,例如气候控制。安全特性,是今天先进驾驶辅助系统(ADAS)的前身,如倒车摄像头,也成为信息娱乐中心的一部分,在相同的时期内,这些系统已被进一步扩展,使手机在汽车不断增长的功能列表中不
[汽车电子]
技术干货:在汽车应用中转向<font color='red'>USB</font> Type-C™供电
基于C8051F320 USB接口的数据采集存储电路的设计
在一些特殊的工业场合,有时需要将传感器的信号不断的实时采集和存储起来,并且到一定时间再把数据回放到PC机中进行分析和处理。在工作环境恶劣的情况下采用高性能的单片机和工业级大容量的FLASH存储器的方案恐怕就是最适当的选择了。CYGNAL公司的C8051F320 SOC是一种具有8051内核的高性能单片机,运行速度为普通8051的12倍。该芯片内部528字节随机RAM和2048字节XRAM为数据缓冲和程序运行提供了充足的空间。更受欢迎的是它的串行扩展功能为当前的各种串行芯片和外部设备接口的扩展提供了极大的方便。高速的SPI硬件接口与串行FLASH RAM的无缝连接大大简化了电路板布线,而片内自带的USB接口功能使数据的存储和回放变得
[单片机]
基于C8051F320 <font color='red'>USB</font>接口的数据采集存储电路的设计
差异化模拟产品在智能手机中的应用
近年来,便携式产品越来越多地采用多源设计,诸如手机和其它便携产品要求加入更多功能,如图像、视频、电子邮件、短信以及互联网接入。这对手机信号传输的带宽、电池的效率、EMI要求越来越严格,因此对音频芯片、USB接口芯片以及高效低成本背光驱动芯片的设计要求相应提高。本文从实际应用的角度,详细阐述了高速USB系列产品和大功率功放在智能手机中的具体应用,以及在设计端面临的困扰。在推荐差异化产品设计满足市场需求的同时,对产品的核心参数对系统的影响做一个全面的讨论。 图1为目前市场主流的智能手机设计架构。下面将从三个方面来讨论系统基带设计要点以及相关产品的核心指标:高速USB2.0开关选型和布线的要求;LED背光驱动电路的系统设计与选型的要
[嵌入式]
降压-升压充电+USB Type-C™PD如何提高功率密度
近几年,降压-升压型充电器变得越来越流行,因为它能够从几乎任何输入源为电池充电,无论输入电压是高于或低于电池电压。 USB Type-C被广泛采用的一大关键性优势是它被认为是目前实现通用适配器和减少相应电子废弃物减少理想方案。虽然USB Type-C接口是统一的,但是不同适配器的额定功率和电压仍然有很大的差异,这里面包含了传统的5 V USB适配器和能够提供5 V到20 V电压范围的USB PD适配器。此外,不同的便携式设备内部的电池数串联节数也有可能不同。这就要求电池充电器集成电路(IC)采用降压-升压拓扑结构, 去适应输入电压和电池电压的这些任意的变化。 具有高功率密度的降压-升压充电芯片不仅可以集成通用的充电功能模块,也
[电源管理]
降压-升压充电+<font color='red'>USB</font> Type-C™PD如何提高功率密度
MSP430 USB JTAG安装"INF找不到所需的段落" 的解方法
先前做过实验就发现自己的电脑上出现这款仿真器的INF错误,猜到可能是系统的原因,因为自己曾经将仿真器拿到同样一台非精简版的系统的电脑上就没有任何问题,今天终于找到解决方法: 1、首先按如下操作 这是你系统装的是精简版的问题 a.打开 控制面板 管理工具 服务 ,查看 smart card是否启用 ,没有的话,请手动启动。如果 smart card 服务也无法启用,可检查 scardsvr 服务是否存在,且已经启动,如果没有启动请手动启动,然后设为 自动 。 b.如果该服务不存在,则按以下步骤操作,单击 开始 运行 输入cmd 打开命令提示符窗口,先执行命令 scardsvr reinstall ,接着在执行命令 regsvr32
[单片机]
鑫创SSS1530/USB Typec音频声卡芯片方案设计参考资料
鑫创SSS1530设计方案,v136997/59787 SSS1623,SSS1629支持Mciro USB、Type-C 3.1接口,可以实现耳机、麦克风功能。 Type-c耳机、安卓耳机转接头方案 功能特性: 1、可以实现耳机+麦克风应用、单耳机输出、单麦克风输入功能; 2、支持播放暂停(接听挂断)、音量加减、上一首下一首按键;EQ、3D音效; 3、支持自定义复合按键用法音量加减和上下首复合按键;支持短按、长按等按法; 4、具有IIS INIIS OUT功能,可以外挂高品质codec,做高阶发烧应用; 5、具有IIC接口,支持外部MCU IIC控制; 产品概述 SSS1530+MCU支持TypeC线控接听/挂断电话
[嵌入式]
鑫创SSS1530/<font color='red'>USB</font> Typec音频声卡芯片方案设计参考资料
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved