HID开发笔记
+ -

关于USB虚拟键盘鼠标,在IOS上面遇FN键的问题实现 键盘FN,鼠标

2022-11-18 379 67

最近接了一个任务,就是拿USB单片机做一个鼠标和键盘。合成的,其实网上包括芯片生产商都有案例,太多了,但是,都没有谁提起怎么才能支持苹果手机(15以上系统)及苹果电脑的FN键问题。因为FN呢,本身没有键码,所以你怎么去USB官网都查不到的。

USB要搞键盘,鼠标。USB官网标准的HID报表描述符是这样子的:

/*HID类报表描述符,键盘*/
UINT8C KeyRepDesc[62] =
{
    0x05,0x01,0x09,0x06,0xA1,0x01,0x05,0x07,
    0x19,0xe0,0x29,0xe7,0x15,0x00,0x25,0x01,
    0x75,0x01,0x95,0x08,0x81,0x02,0x95,0x01,
    0x75,0x08,0x81,0x01,0x95,0x03,0x75,0x01,
    0x05,0x08,0x19,0x01,0x29,0x03,0x91,0x02,
    0x95,0x05,0x75,0x01,0x91,0x01,0x95,0x06,
    0x75,0x08,0x26,0xff,0x00,0x05,0x07,0x19,
    0x00,0x29,0x91,0x81,0x00,0xC0
};
//鼠标
UINT8C MouseRepDesc[52] =   
{
    0x05,0x01,0x09,0x02,0xA1,0x01,0x09,0x01,
    0xA1,0x00,0x05,0x09,0x19,0x01,0x29,0x03,
    0x15,0x00,0x25,0x01,0x75,0x01,0x95,0x03,
    0x81,0x02,0x75,0x05,0x95,0x01,0x81,0x01,
    0x05,0x01,0x09,0x30,0x09,0x31,0x09,0x38,
    0x15,0x81,0x25,0x7f,0x75,0x08,0x95,0x03,
    0x81,0x06,0xC0,0xC0
};

这样是可以出键盘鼠标了,但是,苹果的FN呢?
在网上转了好几了圈关于苹果FN键的问题,没有,无赖,只得找国内某芯片公司去问,如图:

总算是找到了思路,搞起苹果电脑。在苹果上抓USB包呢,不像windows用Bus Hound。根据此文章来抓包:
Mac端Wireshark抓包工具使用 - 简书 (jianshu.com)

软件就绪后,插入苹果USB键盘,好家伙,这包也太多了吧,一个一个找:
1、首先映入眼帘的是:

标准的USB协议交互,看到我们亲爱的配置描述符

接口描述符端点描述符,一律搬到自己的代码里面。编译单片机代码,开始烧入。。。结果还是不行。继续抓包往下看。
看到了,HID报表描述符了:

不用说,搬。
HID报表描述符这样:

  0x05,0x01,0x09,0x06,0xa1,0x01,0x85,0x01,0x05,0x07,
    0x19,0xe0,0x29,0xe7,0x15,0x00,0x25,0x01,
    0x75,0x01,0x95,0x08,0x81,0x02,0x95,0x01,
    0x75,0x08,0x81,0x01,0x95,0x05,0x75,0x01,
    0x05,0x08,0x19,0x01,0x29,0x05,0x91,0x02,
    0x95,0x01,0x75,0x03,0x91,0x01,0x95,0x06,
    0x75,0x08,0x15,0x00,0x26,0xff,0x00,0x05,
    0x07,0x19,0x00,0x29,0xff,0x81,0x00,0x05,
    0x0c,0x75,0x01,0x95,0x01,0x09,0xb8,0x15,
    0x00,0x25,0x01,0x81,0x02,0x05,0xff,0x09,
    0x03,0x75,0x07,0x95,0x01,0x81,0x02,0xc0

全搬后,windows设备管理器里面报无法识别,通过Bus Hound,看后才知,原来上面的包超127了,需要修改单片机代码:

把USB搞成全速、端点包搞成16以上,我16就够了。
这一步完成后,我们就要分析他这个HID报表描述符怎么发起键盘按下呢?通过USB标准请求及描述符在线分析工具 - USB中文网 (usbzh.com)把协议整理了一下。
发送是这样的:

       /*键盘数据*/
     UINT8 HIDKey[10] = {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};

共10个字节,第一个是报表ID。第2到第9是键盘的,这2到9对应键盘的东西,全世界都知道了。第10个字节就是我们今天讲的重点,FN的标志了。

所以第10个字节我们传2就代表FN也按下了,上图是Fn+F1按下的时候。如果FN没有按下,第10位为0即可。
到这里,就支持FN了。大家要记住啊,是苹果的,不是普通键盘的FN哈。

HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

USB鼠标HID报告描述符数据格式分析
注意:这里的鼠标为普通鼠标报告描述符的信息解释,其并不适用于全鼠标报表描述符。一个示例如下:0x05,0x01, // Global Generic Desktop0x09,0x02, // Local Mouse0xa1,0x01, // Main app collection0x09,......
为什么Windows7重新安装系统后插在USB3.0端口的鼠标不能使用?
在 Windows 7 及更早版本的操作系统中,USB 3.0 驱动程序堆栈由第三方提供,操作系统不提供USB3.0驱动栈。 因此,Windows7重新安装系统后插在USB3.0端口上的所有设备都无法工作,需要安装第三方提供的USB控制器和集线器驱动,这样才能识别出挂接在该USB总线下的设备。从Wi......
HID 报表描述符鼠标实例
USAGE_PAGE (Generic Desktop) 05 01USAGE (Mouse) 09 02COLLECTION (Application) A1 01 ......
Win10使用虚拟USB鼠标实现自动挂机测试功能
昨天要测试一个软件不停的整机的功能:在整机软件中需要不停地点击某个软件的按钮,启动会议功能,然后隔一段时间后,需要再次呼出关闭按钮,并点击将该按钮停止会议,如此往复的操作。当然这些操作是需要人工操作点击软件界面的某些按钮实现的。本以为是一个很简单的东西,没想到还是弄出了花样。初始版本 - 脚本方......
USB鼠标HID全局坐标报表描述符
常用的USB HID鼠标是相对的描述符,鼠标的移动是相对当前位置的相对移动。如相对当前位置左移,右移等。这种相对的坐标描述符有的时候在使用上有一定麻烦的,最重要的原因就是需要计算鼠标指针的当前位置。如本人之前做的一个USB鼠标挂机测试脚本,内容详见:http://www.usbzh.com/ar......
HID复合设备(键盘、鼠标)的实现
在使用一些USB键盘或鼠标的时候,特别是一些电竟高档HID设备时,经常发现这些设备会额外定义一些特别的快捷键,使得这些设备不仅有基础设备(如键盘,鼠标)的功能,也有一些特别的快捷功能(如系统声音的放大放小)。甚至更有一些复杂的设备,只需要一个USB接口,就同时支持鼠标键盘功能或在键盘的额外区域支持触......
Windows10下开发虚拟USB鼠标之枚举子设备失败(STATUS_DEVICE_DATA_ERROR)
之前发过一篇文章:Win10使用虚拟USB鼠标实现自动挂机测试功能(文章地址:http://www.usbzh.com/article/detail-476.html ) 使用的是虚拟驱动实现的一个虚拟USB鼠标,实现了产品的自动测试功能。生成的设备在设备管理器中如下:但在开发过程中,并不是一帆......
Windows下通过USB虚拟的键盘鼠标总结
产品级详见:https://www.usbzh.com/article/detail-1182.html哐哐铛铛的,终于把以前搞的虚拟键盘、鼠标的驱动代码重新整理完成,并且在此基础上将USB虚拟的键盘和鼠标整合到一个驱动中。将键盘和鼠标的代码合并在一起的原因很简单:第一是为了验证自己写的这个虚......
USB虚拟鼠标功能演示
该功能是USB中文网的开发例程,其设计原理见:http://www.usbzh.com/article/detail-476.html使用驱动程序实现的是虚拟USB鼠标功能。鼠标的事件由应用应用层下发:当前完成的功能:鼠标指针的移动鼠标的点击事件动态创建和销毁鼠标设备支持WIN7,WIN10 ......
USB鼠标HID设备示例
本示例的鼠标是一个最简单的USB鼠标,不包括任何其它附加设备。该设备在设备管理器中如下图所示:该USB鼠标的枚举过程如示:Device Length Phase Data Descriptio......
USB中文网出品-HID虚拟全局坐标鼠标
以往我们的鼠标指针移动都是相对当前的坐标进行移动,如果要移动到指定的位置,需要不停地获取当前应用层的鼠标指针进行逼近,这样实现鼠标的定位移动或者按下等动作。但是在实际的USB鼠标分类中,还存在另一种鼠标类型,叫做全局坐标鼠标类型,即通过在指定相关的XY坐标进行相应的鼠标动作,其实现原理也和触摸屏类似......
USB键盘鼠标芯片选型
型号协议功能时钟工作温度封装 CH93292.0 全速 Device串口转HID键盘/鼠标/自定义HID芯片,支持多种工作模式和串口通讯模式内置-40~+85℃SOP16 CH93282.0 全速 Device串口转HID键盘芯片,实现串口数据转US......
BIOS下HID鼠标枚举实例及数据抓包分析
通过BIOS下识别USB键盘一节可以知道,一个鼠标想要在BIOS下使用,使用系统默认的报告描述符即主机不再主动获取报告描述符,并且这的一个前提条件是接口描述符的bInterfaceSubClass必须为1,表示HID设备符是一个启动设备(Boot Device)。实际在使用时,发现有获取这个报告......
HID报告描述符教程
USB HID报告描述符是USB主机可以从USB设备请求获取的描述符之一。HID 设备使用报告向主机发送数据,HID报告描述符告诉主机如何解释数据。这里我们将尝试向您展示如何编写这些描述符。什么是USB HID 报告描述符?HID 协议使设备的实现非常简单。设备定义它们的数据包,然后向主机提供一个......
使用USB鼠标HID报告描述符分析HID_REPORT及成员HID_REPORT_ITEM关系
HID报告描述分过程比较麻烦,对于MAIN ITEM,相对来说比较简单,就是一个简单的树形结构。但对于GLOBAL ITEM和LOCAL ITEM组织的数据结构定义,还是相对比较麻烦的。每一个HID报告描述符都会有很多集合,这是由MAIN ITEM的Collection关键字定义的,无论它是Appl......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!