皇上,还记得我吗?我就是1999年那个Linux伊甸园啊-----24小时滚动更新开源资讯,全年无休!

Linux内核补丁终于实现了通过蓝牙监控苹果妙控键盘/妙控鼠标电量的功能

除了持续推进Linux对新款苹果硅片系统级芯片的适配工作仍面临诸多挑战外,Linux平台对苹果外设的支持度目前仍参差不齐,不同产品的适配体验差异极大。近期开发者正在攻坚落地的全新功能,就是让苹果妙控鼠标与妙控键盘在蓝牙连接状态下也能正常上报剩余电量。

此前Linux早已支持将妙控鼠标、妙控键盘作为普通输入设备正常使用,但长期存在一个功能局限:只有通过有线USB连接外设时,系统才能读取并显示电量数据——而这个场景的实用性其实很低,恰恰是用户通过蓝牙无线连接使用外设时,实时查看剩余电量的需求才最为迫切。当前正式版Linux内核在蓝牙连接苹果这几款外设时,会直接显示电量为0%,完全没有实际参考价值。

Linux内核补丁终于实现了通过蓝牙监控苹果妙控键盘/妙控鼠标电量的功能
开源开发者亚历克·霍尔发布了一组内核补丁,成功实现了苹果妙控键盘、妙控鼠标2与妙控板2的蓝牙连接状态下的电量上报功能。亚历克在这组补丁的说明文档中,针对这个长期存在的显著缺陷作出了解释:

苹果的妙控键盘、妙控板2与妙控鼠标2本身会主动向主机上报自身电量,但当前内核仅能在USB有线连接场景下读取该数据;几乎所有用户日常都靠蓝牙使用这些设备,可蓝牙连接时内核的电源管理子系统读取到的电量会一直卡在0%。

目前两款外设的驱动其实已经实现了电量获取逻辑(通过发送GET_REPORT指令读取编号为0x90的输入报告),但该逻辑仅对USB连接生效。如果直接粗暴开启蓝牙场景下的电量读取,会直接导致整机硬死锁:电量获取操作原本从定时器回调(原子上下文)中触发,而蓝牙的uhid传输通道在调用hid_hw_request()接口时会触发休眠操作,违反了原子上下文不能休眠的内核规则。因此本次提交的每款设备驱动补丁,都把电量获取操作迁移到了工作队列中,之后才正式开启蓝牙场景下的电量上报功能。最后一个补丁则给hid-magicmouse驱动新增了从设备状态字节中读取充电状态的能力。

第三个补丁中解析的厂商自定义状态字节,其各位的功能定义是开发者通过实测逆向推导得出的;如果审核人员更倾向于其他实现方案,我可以把该部分逻辑重构为通过修改报告描述符的方式,直接对外暴露标准的HID_BAT_CHARGING字段来实现相同功能。

本次适配已在2021款妙控键盘、妙控板2上,基于BlueZ蓝牙协议栈(uhid通道)完成全流程测试。

目前这组补丁正处于内核审核流程中,顺利通过后这两项hid-magicmouse、hid-apple驱动的功能优化就会正式合并进入Linux内核主线。

转自 Linux Patches Finally Allow Apple Magic Keyboard/Mouse Battery Monitoring Via Bluetooth – Phoronix