长按的动作特征是按键按下后,一直不放开。此时CPU 检测到按键的持续按下,则在Ta 时刻发送出初次按键,发送出此时按键对应的红外键码,而在Trpc 时间内没有检测到按键的松开,则在Tb 时间输出重复码,直至检测到按键弹起为止.
2.5、语音采集
• 当启动Voice Key 后,ADC 开始采集
• 采集的数据通过DMA 搬运到应用的循环buffer 中,同时发送消息给Main 线程,让其处理语音数据。
• 如果Main 线程处理速度不够快,audioin 驱动就会因为分不到buffer,而将采集的语音数据丢弃。
2.6、BLE数据传送
• 将audioin 驱动发送上来的数据进行编码压缩。
• 然后将编码后的压缩数据切成几个20byte 的数据包
• 最后通过hid profile notify 接口发送给BLE 协议栈
2.7、应用软件Timer管理模块
2.8、LED管理模块
遥控器定义了几种LED 指示灯,用于指示遥控器的一些状态,如下表所示
通常遥控器只有一个物理的LED 灯用于各种场景的指示,这就需要软件上让其分时复用,如果同时需要显示两种状态,状态需要定义优先级,优先级高的状态先指示。如在配对模式下,处于闪灯状态下,这时候按下按键,那么灯还是处于快闪状态。
2.9、OTA升级模块
当前OTA 设计在应用中,系统随时可以升级,升级过程中,系统的其他模块仍然可以正常使用,升级完后,由对端设备决定是否重启系统,如果对端设备没有重启系统,系统将在下一次上电的时候,使用新的固件。
2.10、电池管理模块
电量检测采用标准的BAS Service,实现电量的读取(Read)和上报(Notification)。目前定义的电池电压检测范围1.8 ~ 3.25V,线性等分对应0%-100%,由于没有关机操作,当前配置了一个超低电门槛1.8V,低于超低门槛后,系统不再允许Nor 操作,蓝牙连接也会自动断开。BAS 的notification configuration characteristic 使能后,定时器每N 分钟读取一次电量并通过Notification 上报。
三、语音传送的HID PROFILE 介绍
• GATT 服务需求
• Report Map 介绍
Report Map 属性主要用于定义在HID Service 和report Host 端传送的input report、output report、feature report 格式。每个HID service 只能包含一个report map 属性,属性值长度为小于等于512byte。
• HID Reports 介绍
当前定义3 种HID input report IDs:
– Remote report
用于传送遥控器按键信息
– Voice report
用于传送语音信息,每次report 的数据为20byte
– Mouse report
用于传送空鼠信息,暂未使用
• Hid Profile 语音传输基本过程
– Client 端进行BLE 连接、配对及服务发现,并使能所有input 属性通知属性。
– Server 端通过HID profile 的Remote report 发送一个开始按键到Client 端,Client 准备接收audio Data。
– Server 端通过HID profile 的Audio Out 属性发送voice Data 到Client 端。
– Server 端通过HID profile 的Remote report 发送一个结束按键,Client 停止接收audio Data.
四、按键编码设计
五、按键行为规范
5.1 普通按键的行为
5.1.1. 在非连接状态,唤醒系统,发送回连包或者配对广播包,并通过红外发送红外码
5.1.2. 在连接状态下,发送蓝牙码
发送给远端设备的按键行为大致为:
down–>down–>down->…–>up
设备端并不处理长按或者短按逻辑,交由远端设备处理。
5.2 语音按键的行为
5.2.1. 在非连接状态,唤醒系统,发送回连包或者配对广播包
5.2.2. 在连接状态下,Down 状态发送语音开始标识,up 状态发送语音结束标识。
发给远端设备的按键行为大致为:
Down—>up
设备端过滤掉中间的down。
5.3 配对组合键的行为
配对组合按键会强制进入配对模式,发送配对广播包触发配对流程。
持续按住配对组合按键N s 以上,进入配对模式,之后的流程如下:
5.3.1. 如果有link key,先删除link key
5.3.2. 如果是连接状态,断开连接, 如果是非连接状态,发送配对广播包
5.3.3. 组合键键值不会发送给远端设备
六、休眠与唤醒
6.1 休眠
6.1.1. 在广播状态下,Host CPU 会进入deepsleep 状态,BLE 控制器处于广播状态.
6.1.2. 在连接状态下,不发送按键/语音,Host CPU 进入deepsleep,BLE 控制器处于连接状态,如果connSlaveLatency = 44,连接间隔为10ms,那么BLE 控制器进入deepsleep,每隔450 ms 醒来一次发一次空包回应对端,然后进入deepsleep 状态.
6.1.3. 在连接状态下,发送按键,按键发送完,进入2 状态.
6.1.4. 在连接状态下,发送语音,Host CPU 不会进入deepsleep,BLE 控制器处于连接状态.
6.1.5. 在无连接和广播状态,Host CPU 和BLE 控制器都会进去deepsleep 状态,即最省电模式,所以应用层还设计了在N 分钟内没有按键和语音操作,遥控器会主动断开连接进入deepsleep 模式,达到最省电模式。
6.2 唤醒
6.2.1. 遥控器Host CPU 可以由蓝牙事件唤醒,也可以由按键事件唤醒,还可以由timer事件唤醒
6.2.2. 在连接状态下,按键操作唤醒Host CPU 然后将键码/语音发出
6.2.3. 在没有连接状态下,按键操作会触发进入回连模式,在回连成功后,将键码发出
七、语音框架
总体框架如下图所示,大致包括2 个过程:
• BLE Server 语音采集、编码及传输
• BLE Client 语音接收、解码及识别
7.1 BLE Server 语音采集、编码及传输
7.1.1 MIC 语音采集
音频驱动使用DMA 方式接收,配置一个N×SIZE 的BufferQueue,N 个buffer 循环配置给DMA 使用。当BufferQueue buffer 消耗完,最后一个buffer 被覆盖使用。
7.1.2 语音编码
• 语音编码通常采用经典的IMA adpcm 编码,压缩率为1/4.
– 该算法优点:消耗CPU 和RAM 相对比较少
– 该算法缺点:压缩率低,有损压缩,音质一般
• 当前也设计支持了高压缩高音质的1/8、1/16 音频编码算法
7.1.3 BLE 语音传送
BLE 通过HID profile,按照每包20 个byte 数据将编码后的数据传送给对端BLE Hid Profile。
7.2 BLE Client 端语音接收、解码及识别
7.2.1 BLE 语音接收
Android hid input 驱动收到BLE 数据,通过event 事件上报给input 子系统,input 子系统再将事件上报给适配的事件处理handler。
7.2.2 Audio 驱动解码
当BLE hid 驱动收到遥控器开始语音按键后,就会开启Audio 设备(虚拟mic 驱动),Audio 会开启一个缓冲buffer 用于接收BLE 语音数据,当buffer 快满的时候,Audio驱动启动一个N ms 的timer 从buffer 取M byte 进行解码,解码后得到K byte 数据,然后放到pcm buffer 中。
7.2.3 录音识别
如果Android 上层已经开启录音设备,录音APK 就能从audioTrack 读取audio HAL层语音数据,进而读取Audio 设备驱动的pcm buffer 音频数据,录音APK 得到录音数据,通过http 传送远程识别服务器,最终得到识别结果返回给本地。
2.5、语音采集
• 当启动Voice Key 后,ADC 开始采集
• 采集的数据通过DMA 搬运到应用的循环buffer 中,同时发送消息给Main 线程,让其处理语音数据。
• 如果Main 线程处理速度不够快,audioin 驱动就会因为分不到buffer,而将采集的语音数据丢弃。
2.6、BLE数据传送
• 将audioin 驱动发送上来的数据进行编码压缩。
• 然后将编码后的压缩数据切成几个20byte 的数据包
• 最后通过hid profile notify 接口发送给BLE 协议栈
2.7、应用软件Timer管理模块
2.8、LED管理模块
遥控器定义了几种LED 指示灯,用于指示遥控器的一些状态,如下表所示
通常遥控器只有一个物理的LED 灯用于各种场景的指示,这就需要软件上让其分时复用,如果同时需要显示两种状态,状态需要定义优先级,优先级高的状态先指示。如在配对模式下,处于闪灯状态下,这时候按下按键,那么灯还是处于快闪状态。
2.9、OTA升级模块
当前OTA 设计在应用中,系统随时可以升级,升级过程中,系统的其他模块仍然可以正常使用,升级完后,由对端设备决定是否重启系统,如果对端设备没有重启系统,系统将在下一次上电的时候,使用新的固件。
2.10、电池管理模块
电量检测采用标准的BAS Service,实现电量的读取(Read)和上报(Notification)。目前定义的电池电压检测范围1.8 ~ 3.25V,线性等分对应0%-100%,由于没有关机操作,当前配置了一个超低电门槛1.8V,低于超低门槛后,系统不再允许Nor 操作,蓝牙连接也会自动断开。BAS 的notification configuration characteristic 使能后,定时器每N 分钟读取一次电量并通过Notification 上报。
三、语音传送的HID PROFILE 介绍
• GATT 服务需求
• Report Map 介绍
Report Map 属性主要用于定义在HID Service 和report Host 端传送的input report、output report、feature report 格式。每个HID service 只能包含一个report map 属性,属性值长度为小于等于512byte。
• HID Reports 介绍
当前定义3 种HID input report IDs:
– Remote report
用于传送遥控器按键信息
– Voice report
用于传送语音信息,每次report 的数据为20byte
– Mouse report
用于传送空鼠信息,暂未使用
• Hid Profile 语音传输基本过程
– Client 端进行BLE 连接、配对及服务发现,并使能所有input 属性通知属性。
– Server 端通过HID profile 的Remote report 发送一个开始按键到Client 端,Client 准备接收audio Data。
– Server 端通过HID profile 的Audio Out 属性发送voice Data 到Client 端。
– Server 端通过HID profile 的Remote report 发送一个结束按键,Client 停止接收audio Data.
四、按键编码设计
五、按键行为规范
5.1 普通按键的行为
5.1.1. 在非连接状态,唤醒系统,发送回连包或者配对广播包,并通过红外发送红外码
5.1.2. 在连接状态下,发送蓝牙码
发送给远端设备的按键行为大致为:
down–>down–>down->…–>up
设备端并不处理长按或者短按逻辑,交由远端设备处理。
5.2 语音按键的行为
5.2.1. 在非连接状态,唤醒系统,发送回连包或者配对广播包
5.2.2. 在连接状态下,Down 状态发送语音开始标识,up 状态发送语音结束标识。
发给远端设备的按键行为大致为:
Down—>up
设备端过滤掉中间的down。
5.3 配对组合键的行为
配对组合按键会强制进入配对模式,发送配对广播包触发配对流程。
持续按住配对组合按键N s 以上,进入配对模式,之后的流程如下:
5.3.1. 如果有link key,先删除link key
5.3.2. 如果是连接状态,断开连接, 如果是非连接状态,发送配对广播包
5.3.3. 组合键键值不会发送给远端设备
六、休眠与唤醒
6.1 休眠
6.1.1. 在广播状态下,Host CPU 会进入deepsleep 状态,BLE 控制器处于广播状态.
6.1.2. 在连接状态下,不发送按键/语音,Host CPU 进入deepsleep,BLE 控制器处于连接状态,如果connSlaveLatency = 44,连接间隔为10ms,那么BLE 控制器进入deepsleep,每隔450 ms 醒来一次发一次空包回应对端,然后进入deepsleep 状态.
6.1.3. 在连接状态下,发送按键,按键发送完,进入2 状态.
6.1.4. 在连接状态下,发送语音,Host CPU 不会进入deepsleep,BLE 控制器处于连接状态.
6.1.5. 在无连接和广播状态,Host CPU 和BLE 控制器都会进去deepsleep 状态,即最省电模式,所以应用层还设计了在N 分钟内没有按键和语音操作,遥控器会主动断开连接进入deepsleep 模式,达到最省电模式。
6.2 唤醒
6.2.1. 遥控器Host CPU 可以由蓝牙事件唤醒,也可以由按键事件唤醒,还可以由timer事件唤醒
6.2.2. 在连接状态下,按键操作唤醒Host CPU 然后将键码/语音发出
6.2.3. 在没有连接状态下,按键操作会触发进入回连模式,在回连成功后,将键码发出
七、语音框架
总体框架如下图所示,大致包括2 个过程:
• BLE Server 语音采集、编码及传输
• BLE Client 语音接收、解码及识别
7.1 BLE Server 语音采集、编码及传输
7.1.1 MIC 语音采集
音频驱动使用DMA 方式接收,配置一个N×SIZE 的BufferQueue,N 个buffer 循环配置给DMA 使用。当BufferQueue buffer 消耗完,最后一个buffer 被覆盖使用。
7.1.2 语音编码
• 语音编码通常采用经典的IMA adpcm 编码,压缩率为1/4.
– 该算法优点:消耗CPU 和RAM 相对比较少
– 该算法缺点:压缩率低,有损压缩,音质一般
• 当前也设计支持了高压缩高音质的1/8、1/16 音频编码算法
7.1.3 BLE 语音传送
BLE 通过HID profile,按照每包20 个byte 数据将编码后的数据传送给对端BLE Hid Profile。
7.2 BLE Client 端语音接收、解码及识别
7.2.1 BLE 语音接收
Android hid input 驱动收到BLE 数据,通过event 事件上报给input 子系统,input 子系统再将事件上报给适配的事件处理handler。
7.2.2 Audio 驱动解码
当BLE hid 驱动收到遥控器开始语音按键后,就会开启Audio 设备(虚拟mic 驱动),Audio 会开启一个缓冲buffer 用于接收BLE 语音数据,当buffer 快满的时候,Audio驱动启动一个N ms 的timer 从buffer 取M byte 进行解码,解码后得到K byte 数据,然后放到pcm buffer 中。
7.2.3 录音识别
如果Android 上层已经开启录音设备,录音APK 就能从audioTrack 读取audio HAL层语音数据,进而读取Audio 设备驱动的pcm buffer 音频数据,录音APK 得到录音数据,通过http 传送远程识别服务器,最终得到识别结果返回给本地。