这个蓝牙绝对音量什么意思左边的啥意思

因为一直都是用airpods听歌的之前的系统用着也是挺好的,新系统更新之后连接airpods 声音变得超级小


SYD8801是一款低功耗高性能蓝牙低功耗SOC集成了高性能/

报告描述符是决定HID设备实现怎样功能。对于蓝牙设备来说它要实现的功能就是键盘键值的输入和指示灯的输出。下面以hidkbdservice.c攵件中的键盘的报告描述符为例分析它如何实现键盘的功能。

1、报告描述符的条目格式

报告描点符的每一个条目都由前缀+数据两部分组荿其中前缀占1个字节,它有由Tag(标签)、Type(类型)、Size(大小)如表1所示:

前缀所所表达的意思可以参考《HID1.1协议》,这里不多做解释

其中数据所占嘚大小不一,可能不存在数据可能占1个字节,也可能占1个以上的字节不过大多情况数据占1个字节。

2、报告描述符的用途选择

在报告描述符的最开始定义设备大概上的功能,如下:

其中0x05, 0x01条目用来确定HID设备的用途页用途页是笼统的功能分类。上面的条目一个全局条目(Type为1)用途页选择为普通桌面页。

接着0x09, 0x06条目用来确定用途页下的具体用途之前用途页选择为普通桌面用途页,而桌面用途页下存在如鼠标、鍵盘、游戏杆等具体的用途上面的条目选择具体的用途为键盘。(普通桌面页下的具体用途可参见《HID用途表》下的普通桌面用途页(Generic Desktop Page)表)

在下去的0xA1, 0x01条目表示定义一个应用集合,该集合用来定义用途的详细功能从该条目开始到0xC0之间的条目用来定义普通桌面页下键盘的详细功能。

报告描述符中定义可键盘的输出报告也就是LED的输出报告,如下:

条目0x75, 0x01条目表示输出报告的数据域大小为1bit;条目0x95, 0x05表示上面的数据域個数为5个也就说数据域总大小为5bit。

接着0x91, 0x02条目定义上面的数据域为输出数据属性为:Data,Var,Abs。Data表示这些数据可以变动;Var表示上面的5个1bit的数据域昰相互独立的每个数据域表示一个意思;Abs表示绝对值。

参照《HID用途表》的LED用途页表可知上面的5个1bit的数据分别表示键盘上的Num Lock、Caps Lock、Scroll Lock、Compose和Kana五盞指示灯的状态。某个数据域的值为1则表示对应的指示灯亮;某个数据域的值为0,则表示对应的指示灯灭

接着0x95, 0x01条目、 0x75, 0x03条目和0x91, 0x01条目又定義可3个1bit的数据域,属性为常量(Constant)可以认为数据域的值全部为0。之所以再定义这3个数据域是为了与上面的5个LED灯状态的数据域组成一个字节數据,然后才能作为输出报告

根据上述分析可知,输出报告有1个字节其中5个bit有效,用来表示指示灯的状态如下:

键盘上存在着很多特殊功能键,如shift、ctl等报告描述符的第1字节就是用来描述这些特殊功能键的:

首先条目0x05, 0x07定义用途页键盘。接着0x19, 0xE0条目定义用途的最小值为224條目0x29, 0xE7定义用途的最大值为231,参考《HID用途表》的键盘用途页表对应的用途如下表所示:

表3 特殊功能键的键值

最后条目0x81, 0x02定义数据域为输入数據,属性为:Data,Var,Abs于是输入报告的第1个字节组成如下:

表4 输入报告的第1字节格式

报告描述符的第2字节保留,如下:

所以报告描述符的第2字节嘚值固定为0

报告描述符的第3~8字节用来保存键盘的键值,如下:

键盘的报告描述符主要定义了两种报告:输入报告和输出报告输入报告含8个字节,第1字节为特殊功能键第3~第8字节为普通键值;输出报告共1字节,其中的5位个对应着一盏指示灯状态如下图所示:

下面是CSR蓝牙嘚HID的描述符示例:

报告在这里意思是数据传输(data transfer),而报告描述符是对这些传输的数据作用途(usage)上的说明

USB通讯协议的规范是以1ms产生一個USB帧(frame),USB设备可以每一个帧中发送和接收一个交换(transaction)交换是由几个封包(packet)组成,而传输是由一个或几个交换来完成传送一口中有效的數据在这里,传输和报告的意思相类似传输方式有四种,初始学一般只要了解控制型传输(control transfer)和中断型传输(interrupt transfer)即可控制型传输是当需要时財执行传输要求,是最一般的传输方式组态、命令和状态的通讯都可以使用控制型传输;控制型传输主要用于消息型数据(message-type data)。中断型傳输目的在做重复的数据更新(recurring data)传输精确一点而言,即是在每个有限有周期内(bounded period)作至少一次的小量数据发送或接收;所以适用于流动型數据(stream-type data),注意这里所谓的周期时间就是在端点描述符中的轮询间隔时间报告有三种:input,output,和Feature.后面将作进一步介绍。中断型输入管线(interrupt in pipe)仅可以传送input报告;中断型输出管线(interrupt out

数据本身没有任何意义要赋于用途才能明确其为控制什么(control);例如设备上的按钮指示灯和X与Y轴的位移等都通稱控制,数据则为按钮和指示灯的开关状态或X与Y轴的位移量为了这个目的应运而生报告描述符,其将数据的操控与它的用途作一对一的對应所以解读报告后就可以知道每个数据作何种操作。所以“传输的数据”和“操作”只是一事件的两种描述方式用途是以一个32位卷標(称作usage

pages(用途类页)和usage ID(用途识别名),使用者必须遵照文件的规范来声明操作的用途该文件的附录A有十多个报告描述符的范例,值得研究下

表1、报告描述符的标签

用途卷标只是报告描述符诸多标签的一个。表1列出所有的卷标利用这些卷标取可以清楚完整的描述符操作的用途。报告描述符的语法不同于USB标准描述符它是以项目(items)方式排列而成,无一定的长度;项目有一个前辍(prefix)然后跟着一个括号,内为该項目的数据:item = prefix(data)

项目分成三种类别:主项目,全局项目区域项目。主项目中的input,ouput,feature三个卷标用来表示报告中数据的种类这些是报告描述符Φ最主要的项目,其他项目都是用来修饰这三种项目主要项目中其他二个卷标后面再作详细的介绍。

>> Input 项:表示设备操作输入到主机的数據模式这个数据格式就形成一个输入报告,虽然输入报告可以用控制型管线以get report(input)来传输但是通常用中断型输入管线来传输以确保在烸一固定周期内都能将更新的输入报告传给主机。

>> Output项:表示由主机输出到装置操作的数据格式这个数据格式就形成一个输出报告。输出報告通常不适用轮询的方式来传送给设备而是由应用软件依实际需求以传令方式要求送出输出报告,所以大多用控制型管线以set report(output)指令来将報告送到设备当然也可以选择用中断型输出管线来传送,只是通常不建议这样用

>> Feature项:表示由主机送到设备的组态所需数据的数据格式。这个数据模式就形成一个特征报告特征报告只能用控制型管线以get report(feature)和set report(feature)指令分别来取得和设定设备的特征值。

>> 范例:考虑一个2X16字的显示装置它的列数、行数、字宽、和字高为固定值属于feature报告;显示状态例如“就绪”和“输入字错误”则属于input报告;光标位置和显示的字需可讀写,所以属于另一个feature报告;更新显示的字则为output报告为了区别两个features,要用到全局项目中的report

主项目用来定义报告中数据的种类和格式而說明主项目之意义与用途为全局

项 目和区域项目。顾名思义区域性项目只能适用于列于其下的第一个主项目,不适用于其他主项目若┅个主项目之上有几个不同的卷标的区域性项目,则这些区域性项目皆适用于描述该主项目相反,全局性项目适用于其下方的所有主项目除非另一个相同卷标的全局性项目出现。为了清楚说明报告描述符将使用“项目状 态表”(item state table)用来表示在某位址处适用的全局性项目的组合。图1显示全局性项目和区域性项目与所描述的主项目之对应关系

简单地说,区域性项目(见表1)只是说明用途而已Designator是要搭配實体描述符使用的,这里不对实体描述符进行介绍所以略过这些designator标签。

Minimum(Keyboard:0)和Usage Maximum(Keyboard:101)。很明显的扩充式用途指定法会取代『项目状态表』中的Usage Page。还有使用扩充式用途指定法时,数据的高16 个位为用途类页Usage Page低16 个位则为用途识别名Usage ID。往往一个报告数据会对应到几个操作因而会有幾个用途,例如101 按键的键盘利用不同代码代表不同的键每一个键是一个操作,有自己的用途要将所有Usage ID 列出不太现实,所以就需要Usage Minimum 和Usage Maximum 二個标签以键盘为例,主项目之上只要二个区域项目:Usage Minimum (0), Usage Maximum (101)如此一来,则无键按下(Usage ID 为0)和101 键中任一键被按下(Usage ID 为1 至101)的用途都被赋于到一个报告数據上后面会有一个范例进一步解说。

是这个字符串在字符串描述符中的位置索引如果需要用到几个字符串,则可以使用String Minimum 来指向字符串描述符中被用到字符串的最先位置索引和String Maximum 来指向最后位置索引。

Report SizeReport ID,Report Count 就足够了表2 列了二个蓝牙绝对音量什么意思操作的例子(蓝牙绝對音量什么意思增减键和蓝牙绝对音量什么意思旋钮)将用来辅助说明这些卷标,不过主项目括号内的数据会在后文中再做说明

用来设萣主项目(Input,OutputFeature)的报告字段大小,它的单位是位主项目会对每个操作产生一个报告字段,字段大小则由Report Size 决定而Report Count 用来设定主项目之报告字段的数目,其等于操作的数目蓝牙绝对音量什么意思增减键的例子中ReportCount (1)表示主项目Input 只产生一个字段,所以可知只有一个蓝牙绝对音量什么意思增减键﹔而Report Size (2)表示这个字段为2 位另一个蓝牙绝对音量什么意思旋钮例子也是只有一个旋钮,所以用Report Count (1)﹔但是因为Report Size (7)所以该旋钮的数据字段为7位,可以表示0到127之数值再举一例,如果是鼠标的三个按键每个按键占用一个一位的字段,则Report Size (1), Report Count (3)﹔那么这个报告长度为三个位可以哃时呈现出三个按键的状态(原状或被按下)。

代表1在蓝牙绝对音量什么意思旋钮例子中,虽然用7 位作一字段但是旋钮仅会产生0 到100 的數值,因为Logical Minimum (0)和Logical Maximum (100)假如实体程序错误产生超出逻辑数值的范围,则主机将会忽略该数值这种数值称作null value。

当要将同一种报告分成数个部分則每一个部分要给予一个识别值,这时就需用到卷标Report ID其数据值必须从1起算,不可使用0没有赋予Report ID 标签的报告,主机有可能会将其Report ID 视为0所以Report ID (0)被要求不能使用。这个标签对控制型管线才有意义因为它可以在请求报告时指定Report ID的值。对于中断型管线其为周期性传输报告,所鉯每次都会将所属报告传完没有仅传输部分之必要,所以Report ID 标签就无意义

卷标反过来将缓存器最顶层的『项目状态表』取回来取代目前の状态表。这二个标签对很长的报告描述符才有用处因为其可以节省多列一些全局项目。读者当要使用到时参考Universal Serial Bus HIDUsage Tables 文件的Appendix A.7 节中范例则可獲得正确使用方式。

不同厂家的鼠标有不同的分辨率若要让主机知道鼠标的分辨率,就必须用到物理量的标签不使用也不会影响到鼠標的功能,只是使用者无法由主机的驱动程式得知分辨率而已但是量测装置(例如温度计)的应用程序必须知道物理量,则这些标签就必备了分辨率r 的算法如下

一定要同时定义,否则无意义这些卷标的括号内数字为有符号的整数,可以是一个字节或二至四个字节字節数目会在卷标代码的最低二位定义,详情后文会叙述卷标Unit 的括号内数据比较复杂,总共用了7 个四位(nibbles)来描述各个四位之意义如表4,其Φ第8 个四位

表4:标签Unit的信息格式(表格中一个格子代表4BIT)

HID 共享了四种单位系统最低的四位就是决定使用的单位系统(System),不同的系统中当然粅理量的单位也不一样单位和系统间的对应关系如表5。

表5:物理量的单位之编码法

除了最低四位的值用来选择单位系统外其余每个四位皆表示该单位的幂次方,每个四位(nibble)都是有符号的整数可表示的范围为-8 至+7:

因此长度的单位若为公分则Unit (data)中data 的码为0x11,若为英吋则为0x13这二鍺中Length 的四位值皆为1 表示幕次方为1,即cm1 或in1 质量单位为公克之码为0x0101,加速度单位为公分除以平方秒之码为0xE011其中E 代表-2。所以力量单位为质量(公克)乘于加速度(公分/平方秒)的码为0xE111能量单位焦尔为力量乘于长度之码为0xE121,其等义于s?2g cm2 和单位系统为SI Linear

主项目中产生报告数据格式嘚三个卷标(Input,Output和Feature)具有共通的数据定义,这些数据和其代码列于表6中目前用到9个位来表示这些数据。如果第九位(bit 8)为0则仅需用一个芓节来表示该数据,即忽略第九位如果第九位为1,就需用到二个字节来表示该数据

表6:主项目的信息代码

Data/Constant:主项目之数据为可变值(設为Data),或为固定不可变值(设为Constant)Constant 都用于Feature 的报告,或是用于填充位(padding)使报告长度以字节为单位。

Array/Variable:主项目之数据的每个字段可以表示几個不同的操作的其中一个被触发(设为Array)或是每个字段仅表示一个操作(设为Variable)。如果是Variable则Report Count 的数据值等于报告数据的字段数。若是Array則Report Count 的数据值表示可以同时被触发的最多操作数目。后文中键盘之例会解说Array 的用法

Absolute/Relative:主项目的数据是以相对于固定的基准点方式提供绝对數值(设为Absolute),或是提供相对于前次报告的相对值(设为Relative)

【范例说明】前文中的蓝牙绝对音量什么意思操控范例,因为都是Data 和Variable二者嘚操作值皆为变化值,且一个字段仅表示一个操作但是蓝牙绝对音量什么意思增减键的例子为Relative,所以若报告值由0 变成+1则蓝牙绝对音量什么意思增大一个刻度,反之由0 变作-1 则蓝牙绝对音量什么意思减小一个刻度因而蓝牙绝对音量什么意思大小因输入值而作相对的变化。嘫而蓝牙绝对音量什么意思旋钮的例子为Absolute当输入值为最小值0 时,为静音而输入值为最大值100 时,为最大蓝牙绝对音量什么意思其余值莋百分比的蓝牙绝对音量什么意思调整,输入值和蓝牙绝对音量什么意思成绝对关系

No Wrap/Wrap:主项目的数据值达到极值后会转为极低值,反之亦同称作卷绕(设为Wrap)。例如一个转钮可以做360°旋转,输出值从0 至10若设定为Wrap,则值达10 后在同方向旋转则值变为0,反之若达到0再转僦得到10。

Linear/Nonlinear:主项目的数据与操作刻度为线性关系(设为Linear)或为非线性(设为Nonlinear)。

【范例说明】再以蓝牙绝对音量什么意思操作为例蓝牙绝对音量什么意思增减键的例子都没标注No Wrap,LinearPreferred State,但是没有标注即认定其属于默认值所以等同于是这些设定,只是这些设定对此例的操莋无意义所以不标出。蓝牙绝对音量什么意思旋钮的例子明确指出其为No Wrap Linear, No Preferred可见旋钮不是循环旋转,输出值与旋转角呈线性关系旋鈕释放开时会停留在释放前位置(因为No

最后来谈谈主项目的其它二个卷标:Collection 和End Collection。以鼠标而言在实体上是一个指针(pointer),只是应用为计算机鼠標﹔而这个指针含有三个按键和二个平移轴X 和Y所以指针的报告是由不同格式的数据所构成,因而需要用到Collection 和End Collection 将几个Input 项目集结成一组其鼡途为指针,再用Collection 和End Collection 将指针括起来说明其应用为鼠标

表7:报告集合的名称与代码

报告描述符的项目编码有二种:短项目和长项目。长项目仅是保留给未来使用所以不作介绍。短项目的编码形式如下:

最低字节分别标注项目大小(bSize)项目类别(bType),和项目卷标(bTag)﹔

其中bTag 占4个位其餘二者各占2个位。BSize 用来指出项目的数据所需字节的数目该数目仅可以为0(当bSize=0),1(当bSize=1)2(当bSize=2),和4(当bSize=3)﹔注意不可以为3个字节大蔀分的卷标仅需一个字节的数据﹔全局项目的卷标Unit 比较特殊有可能最多用到4 个字节来表示其资料。

中的主项目卷标代码中的『?』可以改为『00nnB』全局项目的可以改为『01nnB』,而区域项目的可以改为『10nnB』其中nn 代表bSize。

中的整合鼠标的键盘装置的范例这个装置只有一个组态描述苻,但是这个组态具有二个接口一个为键盘接口(接口编号为0x00),另一个为鼠标接口(接口编号为0x01)每一个接口都有一个自己的中断型输入端点,输出则都靠内定的控制型端点0这个整合鼠标的键盘装置的标准描述符,请参考附件中的『USB 标准描述符之技巧』文件在该攵中所使用的范例即为整合鼠标的键盘装置,只是仅列出一个接口描述符(即编号为0x00 的键盘接口)另一个编号为0x01 的鼠标接口在该文中没囿列出,读者可以自行参考本文所附的描述符程序代码descriptor.asm(即在标记为interface_descriptor01hid_descriptor01,和endpoint_descriptor01 处)

表8:范例的输入报告格式

表9:范例的输出报告格式

这个范例有输入报告和输出报告,其中输入报告有二组一组属于键盘接口,另一组属于鼠标接口表8 列出输入报告的数据格式。而输出报告呮有键盘接口需要表9 为输出报告的数据格式。因为有二个接口所以有二个报告描述符,分属于不同的界面二个报告描述元都列于表10 Φ。键盘的报告描述元中整个报告集合的用途为(Generic Desktop: Mouse)注意鼠标的按钮和位移轴又分属不同的用途类页,所以在内层集合中还要重新声明用途類页按钮的用途类业为Buttons,而二个位移轴所属的用途类业为Generic Desktop

10:报告描述符范例

从表8 看出,键盘的输入报告中最低的8位分别代表键盘上嘚8个修饰键(亦即左和右边的Control 键、Shift 键、Alt 键、和Windows 键)平常每位的值为0,当对应的修饰键被压下时则位值为1键盘报告描述符中第一个Input 项目必须声明这8位的格式。这8个修饰键为用途类页Key Codes 中的第224 个键到第231 键所以用Usage Minimum

来声明。很显然的每一个键占用一个数据位,而共需8个位因此ReportSize ( 1),而Report Count (8)请特别注意,最低位对应到Usage Minimum 的声明而最高位所对应的为Usage Maximum 的数据内容。这8 个位值是可变的数据每一个位是独立的变量,提供的徝不须与前次的值有相对关系总结而言,该8位的主项目必须为Input (Data,

键盘的输入报告中次高的字节被保留该字节的值无意义,也不需更新所以用Input (Constant)来填充(padding)。而最高的6 个字节则是最近同时被压下的6 个按键之代码这个键盘装置有101 个键,而报告格式的最高的6 个位组中任何一个字节嘟可以代表101 个键之任一键所以这101 键再加上无键被压下状态(代码为0x00)构成一组操作数组,这个装置允许同时压下6个键

键盘报告描述符ΦInput (Data, Array)即在声明这6个字节的数据格式,注意这个数据格式的逻辑值声明和用途代码声明具有相同的数据值(即0 和101)

键盘有一个输出报告,长喥为1个字节但是只用到最低5个位来代表五个LED 的操控,所以最高的3个位需要用Output (Constant)项目来填充输出报告的用途类页不再是Key Codes,而是Page of LEDs所以要重噺声明Usage Page,而主项目为Output (Data, Variable, Absolute)这个项目的数据内容如同输入报告的最低8位所声明的主项目之数据内容,不再作说明因为键盘接口的端点描述符呮有声明一个中断型输入端点,所以输出报告需要依赖内定控制型端点0来传送输入报告由声明的输入端点作中断型输入传输,当然也可鉯依需要用内定控制型端点0来作控制型读入传输

鼠标的报告描述符的输入数据格式中最低的一个字节只有最低3个位有意义,其分别对应箌鼠标上的三个按钮用途类页为Buttons。其它二个字节的用途为(Generic Desktop: X)和(Generic Desktop: X)分别对应到鼠标X 轴和Y 轴的位移操控。这二个位移值得逻辑范围为-127 到127即一個字节可以表示最大范围。位移的数值是相对值所以主项目为Input

HID 描述符编辑工具

USB 协会提供了一个HID 描述符编辑工具称作HID Descriptor Tool,其执行程序为DT.exe这個工具软件可以在USB 网站上取得。虽然称作HID 描述符工具事实上,仅提供编撰报告描述符之用执行DT.exe 后会出现如图2 之窗口,小内窗口HID Items 列出所囿报告描述符的标签以前面所举的实际范例中键盘的报告描述符为例,首先点选[USAGE_PAGE]后会出现一个次窗口列出所有的Usage Page 的选项,这个例子要選[Generic Desktop]按[OK]后则次窗口消失,DT 的主窗口中的右边小内窗口Report Descriptor 就出现Usage Page(Generic Desktop)并跟随着该项目的编码05 01(低字节在左边)也就是这个工具可以帮助作自动编碼的工作。程序员只要输入项目的卷标和内容则可以由这个工具软件提供报告描述符的程序代码。接着当点选第二个项目[USAGE]时,DT 软件会根据前面的编签Usage Page 的内容Generic Desktop而产生一个次窗口列出Generic Desktop 包含的所有Usage 选项。同样道理当选完Usage Page

在主窗口下,点选下拉选项[File]中的[Info]则会出现讯息窗口,告知编撰的描述符中项目的个数和描述符长度所需字节的数目编撰报告描述符完成后,还要做语法检验这时点选下拉选项[Parse Descriptor],则DT 软件會告知检查的结果并提供错误原因与更改的建议。

最后一个问题是如何将报告描述符加入微控器的汇编程序对于任何一种描述符,都昰以汇编语言中的一个标记来分辨例如第一个接口的报告描述符的标记就称作hid_report_descriptor00;同样的,第二个界面的就称作hid_report_descriptor01记得在报告描述符结束處也加上一个标记,如end_hid_report_descriptor00 和end_ hid_report_descriptor00组译器就会自动算出第一个报告描述符的长度这个长度以二个字节来记载。“dwl”为汇编语言的指示在于储存②个字节的数据,储存的方式为little Endian所谓little Endian 方法,就是将低字节的值存于低地址值的内存空间高字节之值存于高地址值处。

签箌排名:今日本吧第个签到

本吧因你更精彩,明天继续来努力!

成为超级会员使用一键签到

成为超级会员,赠送8张补签卡

点击日历上漏签日期即可进行补签

超级会员单次开通12个月以上赠送连续签到卡3张

该楼层疑似违规已被系统折叠 

我要回帖

更多关于 绝对音量 的文章

 

随机推荐