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

       最近接了一个任务,就是拿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虚拟键盘鼠标,在IOS上面遇FN键的问题实现。_第1张图片

                                                       

总算是找到了思路,搞起苹果电脑。在苹果上抓USB包呢,不像windows用Bus Hound。根据此文章来抓包:

Mac端Wireshark抓包工具使用 - 简书 (jianshu.com)

软件就绪后,插入苹果USB键盘,好家伙,这包也太多了吧,一个一个找:

1、首先映入眼帘的是:

关于USB虚拟键盘鼠标,在IOS上面遇FN键的问题实现。_第2张图片

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

关于USB虚拟键盘鼠标,在IOS上面遇FN键的问题实现。_第3张图片

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

看到了,HID报表描述符了:

关于USB虚拟键盘鼠标,在IOS上面遇FN键的问题实现。_第4张图片

不用说,搬。

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虚拟键盘鼠标,在IOS上面遇FN键的问题实现。_第5张图片

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是键盘的,这29对应键盘的东西,全世界都知道了。第10个字节就是我们今天讲的重点,FN的标志了。

关于USB虚拟键盘鼠标,在IOS上面遇FN键的问题实现。_第6张图片

所以第10个字节我们传2就代表FN也按下了,上图是Fn+F1按下的时候。如果FN没有按下,第10位为0即可。

到这里,就支持FN了。大家要记住啊,是苹果的,不是普通键盘的FN哈。

你可能感兴趣的:(c++,kotlin)