lisai9093 发表于 2014-2-26 07:41

VoodooPS2Controller v1.8.15

本帖最后由 lisai9093 于 2015-8-8 10:50 编辑

Reference: https://github.com/RehabMan/OS-X-Voodoo-PS2-Controller
http://www.tonymacx86.com/mavericks-laptop-support/114648-combined-u310-u410-mavericks-thread-22.html

前言:过了小半年Rehabman 终于更新了,这次的也特别给力:添加ACPI 支持。也就是说,即使不用ACPIBacklight 不设亮度快捷键也可以看到小太阳的现在,就像现在的音量一样。不过还是建议和ACPIBacklight 一起使用,避免一些不兼容的现象。另外Fn 键在我的机器上也可以被识别了,不过双击时好像有点问题,识别的不是很好,Rehabman 说可能和硬件有关,就先不搞了。

下载:



ACPI 功能键查找方法:
由于ACPI 功能键不在键盘Bus 上,所以必须借助DSDT 去查找功能键的位置(比如亮度调节)。

1. 首先添加 RMDT method,安装ACPIDebug.kext(上面有下载)。它们的用处是从DSDT 向OS X 的system.log 发送信息,这样我们就能看到是在执行哪里的DSDT 代码 ,从而分辨出亮度建的位置。
DSDT 最后添加:
Device (RMDT)
    {
      Name (_HID, "RMD0000")
      Name (RING, Package (0x0100) {})
      Mutex (RTMX, 0x00)
      Name (HEAD, Zero)
      Name (TAIL, Zero)
      Method (PUSH, 1, NotSerialized)
      {
            Acquire (RTMX, 0xFFFF)
            Add (HEAD, One, Local0)
            If (LGreaterEqual (Local0, SizeOf (RING)))
            {
                Store (Zero, Local0)
            }

            If (LNotEqual (Local0, TAIL))
            {
                Store (Arg0, Index (RING, HEAD))
                Store (Local0, HEAD)
            }

            Release (RTMX)
      }

      Method (FTCH, 0, NotSerialized)
      {
            Acquire (RTMX, 0xFFFF)
            Store (Zero, Local0)
            If (LNotEqual (HEAD, TAIL))
            {
                Store (DerefOf (Index (RING, TAIL)), Local0)
                Increment (TAIL)
                If (LGreaterEqual (TAIL, SizeOf (RING)))
                {
                  Store (Zero, TAIL)
                }
            }

            Release (RTMX)
            Return (Local0)
      }

      Method (COUN, 0, NotSerialized)
      {
            Acquire (RTMX, 0xFFFF)
            Subtract (HEAD, TAIL, Local0)
            If (LLess (Local0, Zero))
            {
                Add (Local0, SizeOf (RING), Local0)
            }

            Release (RTMX)
            Return (Local0)
      }

      Method (P1, 1, NotSerialized)
      {
            PUSH (Arg0)
      }

      Method (P2, 2, Serialized)
      {
            Name (TEMP, Package (0x02) {})
            Store (Arg0, Index (TEMP, Zero))
            Store (Arg1, Index (TEMP, One))
            PUSH (TEMP)
      }

      Method (P3, 3, Serialized)
      {
            Name (TEMP, Package (0x03) {})
            Store (Arg0, Index (TEMP, Zero))
            Store (Arg1, Index (TEMP, One))
            Store (Arg2, Index (TEMP, 0x02))
            PUSH (TEMP)
      }

      Method (P4, 4, Serialized)
      {
            Name (TEMP, Package (0x04) {})
            Store (Arg0, Index (TEMP, Zero))
            Store (Arg1, Index (TEMP, One))
            Store (Arg2, Index (TEMP, 0x02))
            Store (Arg3, Index (TEMP, 0x03))
            PUSH (TEMP)
      }

      Method (P5, 5, Serialized)
      {
            Name (TEMP, Package (0x05) {})
            Store (Arg0, Index (TEMP, Zero))
            Store (Arg1, Index (TEMP, One))
            Store (Arg2, Index (TEMP, 0x02))
            Store (Arg3, Index (TEMP, 0x03))
            Store (Arg4, Index (TEMP, 0x04))
            PUSH (TEMP)
      }

      Method (P6, 6, Serialized)
      {
            Name (TEMP, Package (0x06) {})
            Store (Arg0, Index (TEMP, Zero))
            Store (Arg1, Index (TEMP, One))
            Store (Arg2, Index (TEMP, 0x02))
            Store (Arg3, Index (TEMP, 0x03))
            Store (Arg4, Index (TEMP, 0x04))
            Store (Arg5, Index (TEMP, 0x05))
            PUSH (TEMP)
      }

      Method (P7, 7, Serialized)
      {
            Name (TEMP, Package (0x07) {})
            Store (Arg0, Index (TEMP, Zero))
            Store (Arg1, Index (TEMP, One))
            Store (Arg2, Index (TEMP, 0x02))
            Store (Arg3, Index (TEMP, 0x03))
            Store (Arg4, Index (TEMP, 0x04))
            Store (Arg5, Index (TEMP, 0x05))
            Store (Arg6, Index (TEMP, 0x06))
            PUSH (TEMP)
      }
    }*或者在MaciASL 添加源:http://raw.github.com/RehabMan/OS-X-ACPI-Debug/master ,自动打补丁。


2. 查找DSDT 下的 Device (EC0),可以看到它下面有很多 _QXX method(如_Q26,_QE9)。亮度功能键就在它们当中!下面要做的就是在每个_QXX 下添加这两行,一个在开头,一个在结尾:
\rmdt.p1("EC0._QXX enter") //开头\rmdt.p1("EC0._QXX exit") //结尾例如:
Method (_Q26, 0, NotSerialized)
            {
                Store (0x26, P80H)
                Notify (BAT1, 0x80)
                Notify (ACAD, 0x80)
            }修改后:
Method (_Q26, 0, NotSerialized)
{
\rmdt.p1("EC0._Q26 enter")
Store (0x26, P80H)
Notify (BAT1, 0x80)
Notify (ACAD, 0x80)
\rmdt.p1("EC0._Q26 exit")
}不过这个方法有点啰嗦,我猜测亮度调节可能会有一些特征,比如我的亮度调节是在_Q70 和_Q71:
Method (_Q70, 0, NotSerialized)
            {
                Store (0x70, P80H)
                If (LGreaterEqual (OSYS, 0x07D6))
                {
                  Notify (^^^IGPU.DD02, 0x86)
                }
            }

            Method (_Q71, 0, NotSerialized)
            {
                Store (0x71, P80H)
                If (LGreaterEqual (OSYS, 0x07D6))
                {
                  Notify (^^^IGPU.DD02, 0x87)
                }
            }
可以看到都调用了IGPU.DD02,也就是显卡的亮度函数。这样的方法可能更快,不过准确性还有待确认。

3. 修改好DSDT,安装好ACPIDebug 之后就可以重启了。打开系统日志(Console),搜索ACPIDebug,按亮度键的时候日志里就会出现以下类似的信息:
Feb 24 10:53:21 localhost kernel: ACPIDebug: "EC0._Q70 enter"
Feb 24 10:53:21 localhost kernel: ACPIDebug: "EC0._Q70 exit"这里可以看到 _Q70 是我们要找的亮度调节,不同机器这个数字可能不一样,不能通用。

4. 再次修改DSDT,使 _QXX 通知 Voodoops2Controller,这样DSDT 和键盘驱动就能建立联络了。
这是Rehabman 的补丁:
# Make EC-based brightness up/down work with RehabMan VoodooPS2 ACPI keyboard mechanism
into method label _Q70 parent_label EC0 replace_content
begin
    // Dell code for brightness up\n
    Notify (PS2K, 0x0206)\n
    Notify (PS2K, 0x0286)\n
end;

into method label _Q71 parent_label EC0 replace_content
begin
    // Dell code for brightness down\n
    Notify (PS2K, 0x0205)\n
    Notify (PS2K, 0x0285)\n
end;可以看到 _Q70 使亮度增加,_Q71 为减少。把这里的数字替换成上一步找到的数字,用MaciASL 打补丁即可。所有工作结束!

5. 如果和我一样有强迫症的话,记得清理下DSDT 和ACPIDebug~ GL

6* 联想 IdeaPad U310/410/430 ,_Q70 & _Q71 为亮度调节。希望大家多反馈自己的结果还有机型,我会更新到这里,有分儿哦~


qw3752258 发表于 2014-11-6 20:21

我再来补充一下,这个可能是我猜的,建议直接从Q60~Q72开始找Fn按键,它和F1~F12是对应的,某些机型可能可能中间缺少Q64,Q65,那么只能另寻办法了

my736250809 发表于 2014-2-26 07:44

支持一下

neycwby09 发表于 2014-2-26 07:56

改动不小啊。。。

lisai9093 发表于 2014-2-26 08:07

neycwby09 发表于 2014-2-25 16:56
改动不小啊。。。

对啊,所以之前才很期待。
Ps: 还有个功能没写,回头给加上

p.H 发表于 2014-2-26 10:19

{:9_410:}
看来我要给dsdt小改动一下

yokor 发表于 2014-2-26 13:12

提一个问题,那种wifi指示灯就在f12(wifi的快捷键)上,要从哪个地方控制。wifi开了灯还是黄色的(表示关了)。请大大提供个思路

dtkissme 发表于 2014-2-26 20:36

这个对台式机来说太有用了。试试新版。多谢楼主了。

芯蕊111 发表于 2014-2-26 20:39

mojelly 发表于 2014-2-26 22:19

支持一个~~~版主 以前用你的ACPIBacklight+DSDT驱动 修改的小太阳 用这个KEXT 会不会有什么不良反应?

w184440065 发表于 2014-2-26 22:32

make
准备全新安装

龙心梦飞 发表于 2014-2-26 22:39

感谢分享,我要试试,希望能像其他快捷键那样搞定亮度调节fn快捷键出现小太阳{:5_264:}

lisai9093 发表于 2014-2-26 23:20

yokor 发表于 2014-2-25 22:12 static/image/common/back.gif
提一个问题,那种wifi指示灯就在f12(wifi的快捷键)上,要从哪个地方控制。wifi开了灯还是黄色的(表示关了 ...

你需要找到wifi的快捷键 的scan code 才行,这个选项在keyboard 下的info.plist 可以开启。
如果日志里没有显示这个按键的scan code,则需要按照步骤1-3 找到对应的ACPI 代码,然后通知Voodoops2。

lisai9093 发表于 2014-2-26 23:22

mojelly 发表于 2014-2-26 07:19 static/image/common/back.gif
支持一个~~~版主 以前用你的ACPIBacklight+DSDT驱动 修改的小太阳 用这个KEXT 会不会有什么不良反应?
不会的,这个是更完善的驱动,就是为了配合以前的。如果不用acpibacklight 也许会出一些奇怪问题。

mojelly 发表于 2014-2-26 23:42

lisai9093 发表于 2014-2-26 23:22 static/image/common/back.gif
不会的,这个是更完善的驱动,就是为了配合以前的。如果不用acpibacklight 也许会出一些奇怪问题。

哦谢版主 回复~ 我安装试试~{:5_592:}

yokor 发表于 2014-2-27 10:00

lisai9093 发表于 2014-2-26 23:20 static/image/common/back.gif
你需要找到wifi的快捷键 的scan code 才行,这个选项在keyboard 下的info.plist 可以开启。
如果日志里没 ...

报告版主,扫不到scan code 是什么情况,之前就有几个键扫不出来。另外,苹果自己也没有wifi快捷键是么?

gcafrk 发表于 2014-2-27 15:53

发现Windows键变成MAC的Command键了。想改过来,不知如何改?

chao_hl 发表于 2014-2-27 16:16

lisai9093 发表于 2014-2-27 17:14

gcafrk 发表于 2014-2-27 00:53
发现Windows键变成MAC的Command键了。想改过来,不知如何改?

键盘设置可以修改

lisai9093 发表于 2014-2-27 17:15

chao_hl 发表于 2014-2-27 01:16
试了下,双至右键可用,但单击键盘上的右键却只闪一下右键菜单然后又立即消失,即键盘物理右键无法使用。等 ...

没遇到过,是Synaptics 触摸板吧?

chao_hl 发表于 2014-2-27 18:14

页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: VoodooPS2Controller v1.8.15