键鼠-电脑BIOS的兼容性问题
整理已知的PC-BIOS的兼容性问题原因及注意点。
理论上,电脑BIOS只需要识别4字节鼠标报表+8字节键盘,能满足用户配置BIOS即可。以下所有BIOS兼容性问题,均与这个原则有关。
标准鼠标(4 字节)
字节 0:按键状态(左 / 右 / 中键,位图)
字节 1:X 轴相对位移(有符号 8 位)
字节 2:Y 轴相对位移(有符号 8 位)
字节 3:滚轮位移(垂直滚动,可选)
标准键盘(8 字节)
字节 0:修饰键(Ctrl/Shift/Alt/GUI 左右各 1 位)
字节 1:保留(固定 0x00)
字节 2–7:最多 6 个普通按键的 HID 键码
①非8字节键盘报文导致无法触发BIOS
随着时代发展,用户对使用体验的要求越来越高,键盘“仅是键盘”不够用,它还要是“鼠标、多媒体控制、系统控制”设备,以满足“一键关机/休眠”之类的应用需求。
在MCU代码端,常见的处理是将多个不同功能的报文,用ReportID区分,经由同一个端点上传给电脑,对于端点数量少的MCU较为友好。
但部分BIOS存在“不识别ReportID”的现象,第一个字节作为ReportID并加长键盘的键值报文到9字节时,会导致BIOS直接忽视过长的异常报文->键盘无法触发BIOS。
规避方案——将8字节键盘键值报文单独拎出来,放到单独的一个端点中上传给PC,不再需要添加ReportID。
②BIOS仅下发键/鼠功能端点的IN令牌包
比如说键盘端的接口描述符中配置为:键盘报文在端点1-IN上传,鼠标报文在端点2-IN上传。
但当键盘还需要在端点3上传一个64字节的自定义的HID信息时,BIOS又没在端点3下发IN令牌包,可能会到导致应用层相关功能的异常。
键盘MCU的应用层注意可能会碰到这样的情况就行,不要在上传失败时一直阻塞导致运行异常。
③BIOS中仅枚举到set_config
这样的BIOS遵守了开篇的原则,不能说它有问题,只是偷懒到了极致。
大部分BIOS,尽管可以检查接口描述符,可以知道到哪些接口的子类码和协议码是支持BIOS控制的,但还是会枚举完所有接口下的所有HID报表描述符。
个别电脑的BIOS会只识别:键盘的接口描述符,表明在哪个接口的哪个端点,上传键鼠键值。BIOS甚至不会索要任何HID报表描述符,默认了键鼠报表就是最基础的报文结构。
键鼠MCU注意将“枚举成功”标志变量,尽量放到set_config请求完成后,以允许MCU上传最基础的键鼠键值。
如果对程序的流程把握要求比较高,可以在HID报表描述符上传完成后添加其他标志变量如“HID描述符上传完成”标志变量。
浙公网安备 33010602011771号