MSCBSC 移动通信论坛
搜索
登录注册
网络优化工程师招聘专栏 4G/LTE通信工程师最新职位列表 通信实习生/应届生招聘职位

  • 阅读:1161
  • 回复:0
转帖 当BLE遇上MEMS——HID报告描述符介绍
微信Czh6402
中级会员
鎵嬫満鍙风爜宸查獙璇


 发短消息    关注Ta 

积分 530
帖子 106
威望 20482 个
礼品券 0 个
专家指数 0
注册 2020-9-23
专业方向 
回答问题数 0
回答被采纳数 0
回答采纳率 0%
 
发表于 2020-10-19 09:28:31  只看楼主 

当BLE遇上MEMS——HID报告描述符介绍

本帖最后由 lb8820265 于 2020-9-13 19:13 编辑

HID(human interface device)也就是人机接口设备,我们常见的鼠标键盘游戏手柄等都是HID,操作系统自带HID驱动的,有USB接口的,也有蓝牙接口的,都是相似的通信协议。因此这里参考USB接口的HID协议进行介绍。主要参考https://www.usb.org/hid网站中的两篇文档《Device Class Definition for HID 1.11 》《HID Usage Tables 1.2 》,可以直接在官网下载,也可以从本文附件中下载。


HID有自己协议,叫做报告描述符,用来描述发送的数据代表的含义(并不是发送的数据),包括是什么设备:鼠标、键盘、手柄等,和每一字节的含义。下面以键盘的报告描述符为例具体介绍。

参考例程:

nRF5_SDK_15.3.0_59ac345examplesle_peripheralle_app_hids_keyboard

main.c函数中的报告描述符如下表。

报告描述符简介0x05, 0x01, // Usage Pg (Generic Desktop)这是一个global类Usage Page作用数据0x09, 0x06, // Usage (Keyboard)表示这是一个键盘0xA1, 0x01, // Collection: (Application)表示下面所包含的是对键盘的解释0x05, 0x07, // Usage Pg (Key Codes)定义的是按键码0x19, 0xE0, // Usage Min (224)0x29, 0xE7, // Usage Max (231)按键码分别是 224~231,共总有 8 个按键码0x15, 0x00, // Log Min (0)0x25, 0x01, // Log Max (1)按键码的值是 0 和 1,分别代表放开和按下0x75, 0x01, // Report Size (1)0x95, 0x08, // Report Count (8)用 8 个 bit 分别表示 8 个按键的状态0x81, 0x02, // Input: (Data, Variable,Absolute)将这 8 个 bit 添加到本报告中0x95, 0x01, // Report Count (1)0x75, 0x08, // Report Size (8)0x81, 0x01, // Input: (Constant)另外再预留 8 个 bit 备用,暂时没用0x95, 0x05, // Report Count (5)0x75, 0x01, // Report Size (1)定义 5 个 1bit0x05, 0x08, // Usage Pg (LEDs)这是 LED0x19, 0x01, // Usage Min (1)0x29, 0x05, // Usage Max (5)5 个 bit 分别对应 LED1~LED50x91, 0x02, // Output: (Data, Variable,Absolute)将这 5 个 bit 添加到本报告中,LED 需要作为 OUT0x95, 0x01, // Report Count (1)0x75, 0x03, // Report Size (3)0x91, 0x01, // Output: (Constant)再增加 3 个 bit,与上面 5 个 bit 组成一个字节0x95, 0x06, // Report Count (6)0x75, 0x08, // Report Size (8)定义 6 个字节0x15, 0x00, // Log Min (0)0x25, 0x65, // Log Max (101)每个字节的取值范围是 0~1010x05, 0x07, // Usage Pg (Key Codes)这个也是键盘码0x19, 0x00, // Usage Min (0)0x29, 0x65, // Usage Max (101)分别是键盘码 0~键盘码 1010x81, 0x00, // Input: (Data, Array)将这 6 个字节添加到本报告中,表示同时可产生 6 个键值。0xC0, // End Collection结束

表中左边每一列由一个或者两个数字组成,第一个数字是前缀,第二个是数据(可无)

例如:0x05, 0x01, // USAGE_PAGE (Generic Desktop)

单位需要多本通信工程师职称证书挂资质,欢迎联系   150-0759-9549-微同

0x05表示前缀,0x01为数据部分,先看前缀,0x05转换成二进制,就是00000101,按照HID类协议的定义,这个字节被分成3个部分:(参考hid1_11.pdf

bit0~bit1代表的是这个前缀后面跟的数据长度,两位可以表示最大4字节的数据,即bsize


bit2~bit3代表的是这个前缀的类型,总共可以有三种类型:00=main,01=global,10=local,11=reserved;

bit4~bit7代表前缀的tag,这里根据bit2~bit3的不同类型有不同的定义,例如global类型下的定义如下图。(参考hid1_11.pdf

0000就表示Usage Page。所以前缀0x05代表的含义就是:一个global类型Usage Page作用数据量为1的前缀。


那我们做一个练习题:第二行出现的0x09,二进制就是:00001001,这就是local类型Usage Page作用数据量为1的前缀(local类型具体可以查看hid1_11.pdf的Local Items章节)。

下面来看数据0x01的作用

前缀是global类型Usage Page作用,那么这就要查看Usage Page作用的具体介绍。(参考hut1_2.pdf)

0x01表示Generic Desktop,表示桌面控制类型的设备,但具体是什么设备就要看第二行。


前面介绍了第二行0x09表示local类型Usage Page作用,参数为0x06,0x06表示键盘,查表如下。

这里主要就是介绍报告描述符的查阅方法,其他的描述符同样可以按照上述方法进行查阅。


键盘描述符的后定义的是发送数据的类型与格式。如下:

翻译出来就是,该协议支持一次最多发送6个按钮(键值0~101),支持最多同时按下8个功能按键(键值224~231)。键值表详见附件。


举例

例如我想要发送向上按钮,查表得出向上的键值是0x52(82),所以发送的8Byte数据为。

Byte0Byte1Byte2Byte3Byte4Byte5Byte6Byte70x000x000x520x000x000x000x000x00

例如我想发送Ctrl+A,查表得出左Ctrl的键值为0xE0(224),也就是第一字节的第一位为1,A的键值为4。所以发送的8Byte数据为。

Byte0Byte1Byte2Byte3Byte4Byte5Byte6Byte70x800x000x040x000x000x000x000x00此帖出自MEMS传感器论坛


扫码关注5G通信官方公众号,免费领取以下5G精品资料
  • 1、回复“LTBPS”免费领取《《中国联通5G终端白皮书》
  • 2、回复“ZGDX”免费领取《中国电信5G NTN技术白皮书
  • 3、回复“TXSB”免费领取《通信设备安装工程施工工艺图解
  • 4、回复“YDSL”免费领取《中国移动算力并网白皮书
  • 5、回复“5GX3”免费领取《 R16 23501-g60 5G的系统架构1
  • 6、回复“iot6”免费领取《【8月30号登载】物联网创新技术与产业应用蓝皮书——物联网感知技术及系统应用
  • 7、回复“6G31”免费领取《基于云网融合的6G关键技术白皮书
  • 8、回复“IM6G”免费领取《6G典型场景和关键能力白皮书
  • 对本帖内容的看法? 我要点评

     
    [充值威望,立即自动到帐] [VIP贵宾权限+威望套餐] 另有大量优惠赠送活动,请光临充值中心
    充值拥有大量的威望和最高的下载权限,下载站内资料无忧

    快速回复主题    
    标题
    内容
     上传资料请点左侧【添加附件】

    当前时区 GMT+8, 现在时间是 2024-05-03 11:56:57
    渝ICP备11001752号  Copyright @ 2006-2016 mscbsc.com  本站统一服务邮箱:mscbsc@163.com

    Processed in 0.255747 second(s), 13 queries , Gzip enabled
    TOP
    清除 Cookies - 联系我们 - 移动通信网 - 移动通信论坛 - 通信招聘网 - Archiver