爱意满满的作品展示区。
imbushuo

给 MacBook 写一个更好的 Windows 触摸板驱动

  •  7
     
  •   imbushuo ·
    imbushuo · Jul 8, 2018 · 13992 views
    This topic created in 3048 days ago, the information mentioned may be changed or developed.

    众所周知 Boot Camp 的触摸板驱动不是那么好用,所以我们就来实现一个在 Windows 10 上能用的触摸板驱动吧。微软在 Windows 8.1 后加入了一套新的触摸板模型,叫做 Precision Touchpad,相关文档可以看这里。微软建议是用硬件( USB 或者 I2C )来实现 PTP 的 HID 设备,对于像 MacBook 这种不是原生 PTP HID 的设备来说,我们可以写一个 HID Miniport 驱动来把它变成一个 PTP HID 设备。

    要完成这个 HID Miniport 驱动,驱动需要注册自己为一个过滤驱动,然后把后续的事情交给 HID KMDF/UMDF (mshidkmdf/mshidumdf),再完成相关的 IOCTL Routine。注意 HID KMDF/UMDF 的 IOCTL 略有不同,且一些 IO 操作也不同,比如 KMDF 可以直接读 IRP 包的 Buffer,而 UMDF 必须走 WDF 的那套拿 Buffer。

    之后驱动需要实现 PTP 所需要的所有 HID 描述符和 Top-level Collection。HID 的描述符会被对应到相应的 C Struct 里。

    之后需要配置和读取设备。配置设备其实就是给触摸板写一个 HID Feature Report 来打开触摸板模式,在基于 USB 的 MacBook 触摸板可以用 USB Control Transfer,基于 SPI 的触摸板需要给 IoTarget 发 IOCTL_HID_SET_FEATURE 的 Internal Device Control。

    之后便可以读取设备。在基于 USB 的 MacBook 触摸板上,可以使用中断,而 SPI 的需要使用轮询。按照 PTP 的 HID 描述符要求把数据喂回去然后完成请求即可。

    几个坑和提示

    • 设备 D0/D3 转换的时候可以关掉触摸板来省电(反正 MacBook 没 S0ix )
    • 一定要精确报告每个 Input Frame 的测量时间,不然加速度会变得非常奇怪(你可以用 KeQueryPerformanceCounter / QueryPerformanceCounter,分别对应 km 和 um )来获得每一次读取的差值。注意在 HID 报告里,Timing 的单位是 100 微秒,且这个 Timing 的数据只有两个 2 Byte。数据允许 Rollover )
    • 没有来得及完成的 Request 在转换和 Unload 时清理掉(STATUS_CANCELLED)。不然等着蓝屏吧
    • Polling 单独开一个 System Thread,然后 Synchronous IOCTL Request 能不用就不要用(我还需要改 SPI 的这一部分)。

    Q & A

    为什么要这么干?好好用 macOS 不好吗?

    因为我能这么干,为什么不这么干呢。其实有一些硬需求用 Windows 也挺好的。

    有没有演示?

    代码在哪

    SPI 版本目前还需要一些重构,稍后会合并到主干。

    Acknowledgements

    43 replies  •  2023-12-15 17:57:23 +08:00
    Tink
    Tink
    Jul 8, 2018 via iPhone
    1
    😱厉害了
    wl2358
    wl2358
    Jul 8, 2018 via Android
    2
    mark
    loading
    loading
    Jul 8, 2018 via iPhone❤️2
    3
    驱动级大佬!
    geelaw
    geelaw
    Jul 8, 2018 via iPhone
    4
    赞
    AltairT
    AltairT
    Jul 8, 2018 via iPhone
    5
    好奇楼主的技术栈和从事的职位是啥?
    只做过简单的单片机开发,感觉桌面系统的驱动开发复杂多了😃
    carlclone
    carlclone
    Jul 8, 2018
    6
    想问下楼主,有办法给 mac 下的触控板添加类似 Windows 下 synaptic 的惯性移动功能么 , 不是惯性滚动
    BingoXuan
    BingoXuan
    Jul 8, 2018 via Android
    7
    给大佬送上铜币;-)
    orangeade
    orangeade
    Jul 8, 2018 via Android
    8
    咦,原来是 Twitter 上让 Lumia 能装上 WindowsRT 和 Windows10 的大佬,膜拜一个
    ifaii
    ifaii
    Jul 8, 2018 via iPhone
    9
    太硬核了 大佬
    but0n
    but0n
    Jul 8, 2018 via iPhone
    10
    硬核玩家
    hjc4869
    hjc4869
    Jul 8, 2018 via iPhone
    11
    大佬!
    jedihy
    jedihy
    Jul 8, 2018 via iPhone
    12
    LZ 是我司的啊?
    Blanke
    Blanke
    Jul 8, 2018
    13
    我想知道普通 windows 笔记本在 windows 上有方案可以实现类似或接近 mac 触摸板的效果吗?
    ranleng
    ranleng
    Jul 8, 2018
    14
    膜拜一下... 真大佬
    131
    131
    Jul 8, 2018 via Android
    15
    膜拜大佬!
    qinxi
    qinxi
    Jul 8, 2018 via Android
    16
    厉害啊
    huyinjie
    huyinjie
    Jul 8, 2018 via iPhone
    17
    膜拜大佬
    imbushuo
    imbushuo
    OP
    Jul 8, 2018
    18
    @carlclone 可以的,不过可能按照鼠标的 HID TLC 来报告做这件事情会更容易一点
    imbushuo
    imbushuo
    OP
    Jul 8, 2018
    19
    @AltairT 学生(
    技术栈是从汇编写到前端,但是前端半桶水,最近固件和驱动碰得很多
    hljjhb
    hljjhb
    Jul 8, 2018 via Android
    20
    厉害了
    love4taylor
    love4taylor
    Jul 8, 2018
    21
    牛批, 仰望
    JRay
    JRay
    Jul 8, 2018
    22
    高端玩家
    murmur
    murmur
    Jul 8, 2018
    23
    驱动级玩家
    跪了
    MOmc
    MOmc
    Jul 8, 2018 via iPhone
    24
    赞!
    May725
    May725
    Jul 8, 2018 via iPhone
    25
    厉害👍 虽然看不懂
    Dowding
    Dowding
    Jul 8, 2018 via Android
    26
    厉害了,我现在都是通过 extramagic 在 windows 笔记本上用 trackpad2
    walkbox
    walkbox
    Jul 8, 2018
    27
    膜拜大佬
    icestraw
    icestraw
    Jul 8, 2018
    28
    很想知道如果不是 Mac 的硬件,Windows 本身的 Precision Touchpad 有可能实现 三指拖移 吗?原理上似乎可以但是一直没有看到有实现...
    maemolee
    maemolee
    Jul 8, 2018
    29
    感谢大佬!指不定那天我要用 Windows 就得受大佬恩惠。
    d7101120120
    d7101120120
    Jul 8, 2018
    30
    在充满撕逼戾气的热门帖里面,终于看到了一条不一样的技术贴而且还这么厉害,感谢感谢。
    mortal
    mortal
    Jul 8, 2018
    31
    膜拜
    mortal
    mortal
    Jul 8, 2018
    32
    有支持 Trackpad 1 的计划么?
    quericy
    quericy
    Jul 8, 2018
    33
    大佬!
    这不是推特上的 imbushuo 大佬么
    zzzim
    zzzim
    Jul 9, 2018 via Android
    34
    睡前一个完美的技术贴
    hanxiV2EX
    hanxiV2EX
    Jul 9, 2018 via Android
    35
    赞一个!!!
    galenzhao
    galenzhao
    Jul 9, 2018
    36
    @icestraw 急需 win10 三指拖拽,那个点两次拖拽太脑残
    toou123
    toou123
    Jul 9, 2018
    37
    牛逼
    lovelinghan
    lovelinghan
    Jul 9, 2018
    38
    膜拜大佬
    yishanxin
    yishanxin
    Jul 9, 2018
    39
    赞
    ayanmw
    ayanmw
    Jul 16, 2019
    40
    因为这个在 macbook 下 bootcamp windows 的体验比较差,我都想卖了笔记本了.已经买了台式机了(性能好) ;

    如果这个 触控板 好用起来, 那简直就是好事一件,持续关注!!!

    后续可以考虑学习下驱动开发, 如果能参与进来就好了~~( 我是 golang mmo 游戏开发)
    shiftedname
    shiftedname
    Jan 15, 2020
    41
    那个。。win to go 的是不是不支持? win10 系统装在一块移动硬盘上,插在 2012 年的 air 上用。安装这个驱动的时候也会提示操作成功,但是设置-设备里没有看到触摸板。
    anticipated
    anticipated
    Aug 22, 2021
    42
    刚才测试更新了蓝牙驱动,非常好用,感谢
    hlx
    hlx
    Dec 15, 2023
    43
    好用, 比 extramagic 好用一点, 但有时候点击的时候鼠标箭头会位移一段不知是为何, 手上的纹路问题? extramagic 没这个问题
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1086 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 93ms · UTC 18:10 · PVG 02:10 · LAX 10:10 · JFK 13:10
    ♥ Do have faith in what you're doing.