V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
爱意满满的作品展示区。
imbushuo

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

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

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

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