给 MacBook 写一个更好的 Windows 触摸板驱动 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
imbushuo
V2EX    分享创造

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

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

    众所周知 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  
    PRO
       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
    AltaiT
        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  
    PRO
       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  
       2023-12-15 17:57:23 +08:00
    好用, 比 extramagic 好用一点, 但有时候点击的时候鼠标箭头会位移一段不知是为何, 手上的纹路问题? extramagic 没这个问题
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     855 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 19:31 PVG 03:31 LAX 12:31 JFK 15:31
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86