badfellow 发表于 2021-5-17 14:27

[原创首发] VoodooPS2Controller - ALPS 键盘/触控板驱动修复(含教程)

我在为Dell Precision M4800适配Big Sur时,如果直接使用2017年2月发布的 DrHurt 版本的VoodooPS2Controller for ALPS有以下bug:
[*]数字锁定键Num Lock和LED指示灯,及功能切换不工作
[*]亮度调节键被映射到Fn+F3和Fn+Insert,Dell原生亮度键调节键Fn+↓和Fn+↑不工作。
[*]触控板开关键Fn+F5不工作
[*]SysRq/PrntScrn 不工作
[*]Pause(Fn+Insert)不工作
[*]计算器键Calc不工作
[*]Ctrl+Alt+Delete不工作
因此,为了完美使用Big Sur,必须对其进行修复。为此,研究了下特别简单地改写了下驱动,终于完美适配了,记录了下驱动改写过程,算是个简单的教程吧,特意分享给大家。如果有同样的ALPS键盘/触摸驱动出现问题的,理论上同样可以适用。源码已上传Github见附件:修复教程:DrHurt的远程仓库VoodooPS2Controllergit clone git@github.com:DrHurt/OS-X-ALPS-DRIVER.gitcd OS-X-ALPS-DRIVER
[*]用Xcode打开项目VoodooPS2Controller.xcodeproj,并根据你的MacOS版本配置好环境,确保Xcode下Product/Build测试编译成功
[*]下载ioio调试工具, 解压后将ioio二进制文件复制到目录/usr/local/bin/wget https://bitbucket.org/RehabMan/os-x-ioio/downloads/RehabMan-ioio-2014-0122.zip
[*]为了动态抓取键位的PS code/ADB code映射我们先写个简单的脚本vim ioio_debug.sh, 复制以下几行代码然后在vim中:wq保存退出#!/bin/shioio -s ApplePS2Keyboard LogScanCodes 1watch "sudo dmesg | grep ApplePS2Keyboard | tail -20"并赋予可执行权限 chmod 755 ./ioio_debug.sh。 (注:如没有watch命令需要安装 brew install watch)
[*]终端下运行./ioio_debug.sh测试键位调试是否成功,成功后终端会有以下输出argv = { ioio }argv = { -s }argv = { ApplePS2Keyboard }argv = { LogScanCodes }argv = { 1 }ioio: setting property 'ApplePS2Keyboard:LogScanCodes' as number to 1 (0x1)Password:键入本机管理员密码后, 然后按任意键屏幕上会按照你的键位返回对应的PS Code和ADB Code,就会显示如下终端输出信息.[ 2585.028727]: ApplePS2Keyboard: sending key 31=2d down[ 2585.102607]: ApplePS2Keyboard: sending key 1f=1 down[ 2585.683917]: ApplePS2Keyboard: sending key 7=16 down[ 2585.846499]: ApplePS2Keyboard: sending key 5=15 down[ 2586.028108]: ApplePS2Keyboard: sending key 3=13 down
至此,准备工作完成,现在我们可以愉快的进行修复工作了。
步骤二 修复数字锁定键和小键盘映射首先分析源码,得到键盘驱动源码主文件为VoodooPS2Keyboard.cpp,先在终端下运行./ioio_debug.sh,点按小键盘上的每一个按键,先得到数字锁定键的PS2键位码为 , 然后再得到数字小键盘区域每个按键得到数字小键盘PS2 Code映射表,并结合ApplePS2ToADBMap.h整理出一份Apple的ADB Code映射关系如下:
PS2 CodeADB Code(数字键)ADB Code(功能键)描述(数字键/功能键)
0x5b0x7e8 up arrow
0x540x7d2 down arrow
0x560x7b4 left arrow
0x580x7c6 right arrow
0x520x920 insert / CDROM inject
0x410x75. delete
0x5c0x749 page up
0x550x793 page down
0x590x737 home
0x530x771 end

然后在 bool ApplePS2Keyboard::init(OSDictionary * dict) 函数加一行 "_numKeypadLocked = true;" 初始化_numKeypadLocked变量.下一步再在 dispatchKeyboardEventWithPacket函数的switch (keyCode)方法中加入数字锁定键 的执行逻辑如下:bool ApplePS2Keyboard::dispatchKeyboardEventWithPacket(const UInt8* packet){    // handle special cases    switch (keyCode)    {      // ......            case 0x45://num lock remapping            keyCode = 0;            //NUM LOCK fix For DELL Precision M4800            if(goingDown)            {                setNumLockFeedback(_numKeypadLocked);                _numKeypadLocked = !_numKeypadLocked;            }            // remap NUM PAD by NUMLOCK LED status            if(!_numKeypadLocked)            {                _PS2ToADBMap = 0x5b;   // 8 up arrow                _PS2ToADBMap = 0x54;   // 2 down arrow                _PS2ToADBMap = 0x56;   // 4 left arrow                _PS2ToADBMap = 0x58;   // 6 right arrow                _PS2ToADBMap = 0x52;   // 0 insert / CDROM inject                _PS2ToADBMap = 0x41;   // . delete                _PS2ToADBMap = 0x5c;   // 9 page up                _PS2ToADBMap = 0x55;   // 3 page down                _PS2ToADBMap = 0x59;   // 7 home                _PS2ToADBMap = 0x53;   // 1 end                            }            else            {                _PS2ToADBMap = 0x7e;      // 8 up arrow                _PS2ToADBMap = 0x7d;      // 2 down arrow                _PS2ToADBMap = 0x7b;      // 4 left arrow                _PS2ToADBMap = 0x7c;      // 6 right arrow                _PS2ToADBMap = 0x92;      // 0 insert / CDROM inject                _PS2ToADBMap = 0x75;      // . delete                _PS2ToADBMap = 0x74;      // 9 page up                _PS2ToADBMap = 0x79;      // 3 page down                _PS2ToADBMap = 0x73;      // 7 home                _PS2ToADBMap = 0x77;      // 1 end            }            break;      // .......      }}最后在键盘初始化函数initkeyboard里加入一行代码 "setNumLockFeedback(_numKeypadLocked);" 启用开机小键盘数字键锁定Num Lock。void ApplePS2Keyboard::initKeyboard(){    //......    setNumLockFeedback(_numKeypadLocked);       //开机启用小键盘数字键锁定Num Lock,点亮LED指示灯    //......}至此,数字小键盘按键修复完成。编译打包,将生成的ApplePS2Controller.kext复制到/EFI/OC/Kexts/替换掉原来的文件,重启测试成功。
步骤三 修复Dell原生亮度调节键Fn+↑/↓第一步: 修改SSDT,启用 e005和e006 Dell原生PS2键位码(此处为不再详述,可参详SSDT源码)。第二步: 在VoodooPS2Keyboard-Info.plist的Custom ADB Map中加入以下映射将亮度调节键映射到F14和F15。e005=6b;FN+down arrow to brightness downe006=71;FN+up arrow to brightness up原生亮度调节键修复完成。
步骤四 修复Dell原生触控板开关键Fn+F5先在终端下运行./ioio_debug.sh,点按Fn+F5得到PS2键位码为 。 在 dispatchKeyboardEventWithPacket函数的switch (keyCode)方法中加入 (注:e0为扩展码标志,程序执行为0x01)的执行逻辑如下:bool ApplePS2Keyboard::dispatchKeyboardEventWithPacket(const UInt8* packet){    // handle special cases    switch (keyCode)    {      case 0x011e:    // fn+f5 (Dell precision M4800)      {            unsigned origKeyCode = keyCode;            keyCode = 0;            if (!goingDown)                break;            if (!checkModifierState(kMaskLeftControl))            {                // get current enabled status, and toggle it                bool enabled;                _device->dispatchMouseMessage(kPS2M_getDisableTouchpad, &enabled);                enabled = !enabled;                _device->dispatchMouseMessage(kPS2M_setDisableTouchpad, &enabled);                break;            }            if (origKeyCode != 0x011e)                break; // do not fall through for 0x0128            // fall through      }      // .......      }}编译打包,原生触控键修复完成。
步骤五 修复截屏键SysRq/PrntScrn第一步: 先在终端下运行./ioio_debug.sh,点按Fn+End/Home得到PS2键位码为 第二步: 分析源码,我们可以看到源码中有case 0x0137:的执行逻辑是将 映射到了触控板控制开关。所以,我们将原这段代码删除或者注释掉。//      case 0x0128:    // alternate that cannot fnkeys toggle (discrete trackpad toggle)//      case 0x0137:    // prt sc/sys rq//      {//            unsigned origKeyCode = keyCode;//            keyCode = 0;//            if (!goingDown)//                break;//            if (!checkModifierState(kMaskLeftControl))//            {//                // get current enabled status, and toggle it//                bool enabled;//                _device->dispatchMouseMessage(kPS2M_getDisableTouchpad, &enabled);//                enabled = !enabled;//                _device->dispatchMouseMessage(kPS2M_setDisableTouchpad, &enabled);//                break;//            }//            if (origKeyCode != 0x0137)//                break; // do not fall through for 0x0128//            // fall through//      }第三步: 在VoodooPS2Keyboard-Info.plist的Custom ADB Map中加入以下映射将SysRq和PrntScrn映射到F13e037=69;fn+Home/End to F13第四步: 编译打包,将生成的ApplePS2Controller.kext复制到/EFI/OC/Kexts/替换掉原来的文件,重启。打开系统偏好设置>键盘>快捷键, 将截屏映射到SysRq/PrntScrn(F13)。
步骤六 修复Pause(Fn+Insert)第一步: 先在终端下运行./ioio_debug.sh,点按Fn+Insert得到PS2键位码为 第二步: 在VoodooPS2Keyboard-Info.plist的Custom ADB Map中加入以下映射将Pause(Fn+Insert)映射到F18。第三步: 重复 步骤五 >第四步 将Pause(Fn+Insert)映射到你需要的功能键。
步骤七 修复 计算器键Calc第一步: 先在终端下运行./ioio_debug.sh,点按Fn+Insert得到PS2键位码为 第二步: 在VoodooPS2Keyboard-Info.plist的Custom ADB Map中加入以下映射将Calc映射到F19。第三步: 编译打包,将生成的ApplePS2Controller.kext复制到/EFI/OC/Kexts/替换掉原来的文件,重启第四步:用MacOS字带的工具自动操作将Calc(F19)映射到计算器app。
步骤八 修复Ctrl+Alt+Delete第一步: 先在终端下运行./ioio_debug.sh,点按Delete得到PS2键位码为 第二步: 分析源码VoodooPS2Keyboard.cpp, 得到case 0x0153 的运作逻辑是屏蔽了Ctrl+Alt+Delete以避免触发电源开关造成异常关机. 为了实现与Windows一样的锁屏效果,修改case 0x0153源码如下将Ctrl+Alt+Delete映射到Ctrl+Command+Q。bool ApplePS2Keyboard::dispatchKeyboardEventWithPacket(const UInt8* packet){    // handle special cases    switch (keyCode)    {      case 0x0153:    // delete                        // check for Ctrl+Alt+Delete? (three finger salute)            if (checkModifierState(kMaskLeftControl|kMaskLeftAlt))            {                keyCode = 0;                if (goingDown)                {                  // Note: If OS X thinks the Command and Control keys are down at the time of                  //receiving an ADB 0x7f (power button), it will unconditionaly and unsafely                  //reboot the computer, much like the old PC/AT Ctrl+Alt+Delete!                  // That's why we make sure Control (0x3b) and Alt (0x37) are up!!                  // then map to Ctrl + Command + Q (screen lock)                  dispatchKeyboardEventX(0x37, true, now_abs);                  dispatchKeyboardEventX(0x3b, true, now_abs);                  dispatchKeyboardEventX(0xc, true, now_abs);                  dispatchKeyboardEventX(0x7f, false, now_abs);                }                              dispatchKeyboardEventX(0x37, false, now_abs);                dispatchKeyboardEventX(0x3b, false, now_abs);                dispatchKeyboardEventX(0xc, false, now_abs);                dispatchKeyboardEventX(0x7f, false, now_abs);            }            break;      // .......      }}第三步: 编译打包,将生成的ApplePS2Controller.kext复制到/EFI/OC/Kexts/替换掉原来的文件,重启
自此,历经步骤一到步骤八,我们所有按键均修复完成,可以愉快地玩耍了。。。。。。

badfellow 发表于 2021-5-17 15:18

论坛支持不好,好好排版后发布后格式全部乱了,重新贴下教程链接如下。。。。
https://github.com/hansyao/OS-X-ALPS-DRIVER/blob/master/M4800_keyboard_fix.md

qsxl 发表于 2021-5-17 15:31

666666666666

luoling76 发表于 2021-5-17 15:40

这个教程绝了
!!之前看到的直接看不懂,现在豁然开朗。

lgq_qq 发表于 2021-5-17 16:40

谢谢分享

黄增光 发表于 2021-5-17 18:44

lz你的Dell Precision M4800啥具体配置的呢,完美吗

badfellow 发表于 2021-5-17 19:27

黄增光 发表于 2021-5-17 18:44
lz你的Dell Precision M4800啥具体配置的呢,完美吗

https://bbs.pcbeta.com/forum.php?mod=viewthread&tid=1888958&mobile=yes

badfellow 发表于 2021-5-17 19:32

黄增光 发表于 2021-5-17 18:44 https://www.pcbeta.com/static/image/common/back.gif
lz你的Dell Precision M4800啥具体配置的呢,完美吗

https://bbs.pcbeta.com/forum.php?mod=viewthread&tid=1888958

黄增光 发表于 2021-5-17 21:26

badfellow 发表于 2021-5-17 19:32 https://www.pcbeta.com/static/image/common/back.gif
https://bbs.pcbeta.com/forum.php?mod=viewthread&tid=1888958

感谢啊 有机会搞一台耍耍

loveqp 发表于 2021-5-18 08:18

badfellow 发表于 2021-5-17 15:18 https://www.pcbeta.com/static/image/common/back.gif
论坛支持不好,好好排版后发布后格式全部乱了,重新贴下教程链接如下。。。。
https://github.com/hansyao ...

这种文章就很好

泮安宁 发表于 2021-5-18 08:36

很好的教程,厉害

kinvanhon 发表于 2021-5-18 18:58

支持,留名

kuiben 发表于 2021-5-21 22:19

有时间好好研究下。谢谢。

jy0311 发表于 2021-5-22 21:55

ALT+C是复制能改成ctrl+C复制吗

snakeop 发表于 2021-6-14 00:26


很好的教程,厉害

wty1226 发表于 2021-8-11 17:25

想学着大佬的教程修复自己笔记本黑苹果的键位 看了一些有些退缩了......{:5_280:}

gangligegang 发表于 2021-9-3 10:27

学习了,非常牛掰                              

@ljh520 发表于 2021-9-13 18:07

qsxl 发表于 2021-5-17 15:31 https://bbs.pcbeta.com/static/image/common/back.gif
666666666666

看不懂。。。

@ljh520 发表于 2022-2-18 11:30

谢谢。。。。

xoy10 发表于 2022-8-25 20:40

voodoops2键盘
页: [1]
查看完整版本: [原创首发] VoodooPS2Controller - ALPS 键盘/触控板驱动修复(含教程)