V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
imbushuo
V2EX  ›  分享创造

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

  •  7
     
  •   imbushuo ·
    imbushuo · 2018-07-08 04:34:52 +08:00 · 12584 次点击
    这是一个创建于 2324 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    后续可以考虑学习下驱动开发, 如果能参与进来就好了~~( 我是 golang mmo 游戏开发)
    shiftedname
        41
    shiftedname  
       2020-01-15 15:50:29 +08:00
    那个。。win to go 的是不是不支持? win10 系统装在一块移动硬盘上,插在 2012 年的 air 上用。安装这个驱动的时候也会提示操作成功,但是设置-设备里没有看到触摸板。
    anticipated
        42
    anticipated  
       2021-08-22 15:09:30 +08:00
    刚才测试更新了蓝牙驱动,非常好用,感谢
    hlx
        43
    hlx  
       337 天前
    好用, 比 extramagic 好用一点, 但有时候点击的时候鼠标箭头会位移一段不知是为何, 手上的纹路问题? extramagic 没这个问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   504 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 21:57 · PVG 05:57 · LAX 13:57 · JFK 16:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.