采用HID类的USB人机接口设计

发布时间:2024-01-29  

  目前市场上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后就能立刻开始工作,省去了安装驱动程序的过程,方便使用。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    已经形成覆盖基础层、技术层与应用层的脑机接口全产业链,并在医疗、教育、工业、娱乐等领域应用落地。 他表示:工信部将把脑机接口作为培育未来产业发展的重要方向,加强脑机接口应用场景的探索,加速推动脑机接口......
    Neuralink的说法,该技术可助力四肢瘫痪的人,让其通过控制鼠标指针来沟通。 在医学领域率先落地 不同于《阿凡达》、《蜘蛛侠2》、《攻壳机动队》、《银翼杀手》、《黑客帝国》等科幻电影,现实中的脑机接口应用......
    疾病诊断与调控所依赖的工具。 在定制化脑信号采集芯片设计过程中存在诸多技术挑战。精密放大器是脑信号采集芯片中的核心模块,在脑机接口应用场景中需要满足多重技术参数要求。 对于脑信号来说,其幅值微弱 (几十uV到几......
    制化脑信号采集芯片设计过程中存在诸多技术挑战。精密放大器是脑信号采集芯片中的核心模块,在脑机接口应用场景中需要满足多重技术参数要求。对于脑信号来说,其幅值微弱(几十μV到几个 mV)、频率低(0.5Hz 到数 kHz),因此......
    还表示担心该设备可能会过热,也有可能会损坏组织。在电池安全方面,FDA也存在担忧,如果设备中与电池电流相连的任何组件出现故障,电流就有可能损害脑组织。 对生物体实验的伦理标准较高,这是脑机接口应用......
    技术方面的整体布局,从底层的芯片到电极,再到应用到产品,回车科技实现了全链条的自主开发,冰推出了多款具有开创性意义的产品。 回车科技提供脑机接口的硬件产品,客户包括数字疗法和康复类企业。其于2021......
    人”未来的希望——技术。 :解码思维的力量        分为主动脑机接口和被动脑机接口,主动脑机接口中的一部分应用领域正是帮助患者恢复对于外界交流的能力以及拓展交流的方式。同时主动脑机接口......
    越来越多地开始集成AI功能,AI也越来越能够理解情感状态,可以形成使用反馈。 数字疗法是由软件程序驱动,以循证医学为基础的干预方案,用以治疗、管理或预防疾病。童路遥认为这是脑机接口离产业化最近的应用领域。目前的数字疗法主要面向与精神健康相关的领域......
    科学院深圳先进技术研究院中心主任、监审处处长   崔正哲,浙江迈联医疗科技有限公司CEO 芯原股份创始人、董事长兼总裁戴伟民(左一)主持圆桌论坛   脑机接口技术最先落地实现市场化的应用领域 (现场投票情况) 术理......
    技术的研究。值得期待的是,脑机接口技术的应用领域不止是医疗康复,当技术进一步成熟后,军事、游戏、教育、智能通讯、智慧养老、元宇宙等领域都有发展潜力。   为了......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>