#使用Voodoo-PS2-Controller驱动后发现f1-f12功能键不正常
- 自定义属于自己的fn-f12
一开始我也不知道如何自定义,于是去了Voodoo-PS2-Controller项目的地址
发现了这些
VoodooPS2Controller.kext/Contents/PlugIns/VoodooPS2Keyboard/Contents/Info.plist 中,分别有一个数据段用来配置上述的重映射操作。如果你使用Finder,可以通过右键,然后选择“显示包内容”来打开kext驱动。
特别注意Info.plist文件的以下数据段:
<key>Custom PS2 Map</key>
<array>
<string>;Items must be strings in the form of scanfrom=scanto</string>
<string>;The following 12 items map Fn+fkeys to fkeys</string>
<string>e05f=3b</string>
<string>e012=3c</string>
<string>e017=3d</string>
.
.
.
<string>57=e022</string>
<string>58=e019</string>
</array>
这个部分表示将Fn+fkeys和正常的fkeys的扫描码进行交换。这个array标签中的每个string对一个扫描码进行重映射。扫描码用十六进制表示,这个数值与你在voodoo kext的Debug版本看到的完全一致。这个数据段使用的是PS2扫描码至PS2扫描码映射的功能实现的。它也可以使用PS2扫描码至ADB码实现。但是除非你能阅读源码,否则不容易操作ADB码。在这里,我们只希望能够将一个按键映射为另一个,所以使用PS2至PS2扫描码映射实现就可以了。
看看这组映射的第一项: e05f=3b。每个映射条目遵循模式:scanFrom=scanTo。在HP 4530s的键盘上,e05f是按键Fn+F1的扫描码(其他键盘可能有所不同),3b是按键F1的扫描码。所以这一项将按键Fn+F1映射至F1。注释行以分号(;)开始。扫描码可以是普通扫描码或扩展扫描码。以e0开始(如前面所说的e05f)的表示一个扩展扫描码。当把扫描码发送至驱动时,一次只会发送一个字节。所以当发送一个扩展扫描码时,首先会发送“e0”,接着才是具体的按键扫描码。当在检查调试输出时,你会分别看到这些项目。
上面贴出的配置中的最后一个条目是将按键F12映射为Fn+F12。
如果你想要移除任何一组映射,直接删除Info.plist中对应行即可。在编辑Info.plist前,最好将整个驱动从/System/Library/Extensions拷贝出来。当完成编辑时,把Info.plist文件保存在该处,然后重新安装整个驱动。当然,也可以直接编辑安装好的驱动中的Info.plist文件,但这里不讨论这个问题。如果你不知道如何操作,则遵循以上的建议。
你可以通过文件编辑器或plist文件编辑器来编辑Info.plist文件。如果你使用文件编辑器的话,你必须很仔细地遵守XML文件的语法规则。苹果的Xcode开发环境包含了一个plist文件编辑器,而且我确定也会有其他免费的plist文件编辑器。
看了这些你会发现还是不太懂
下载 OS-X-ioio,执行:
ioio -s ApplePS2Keyboard LogScanCodes 1
按下功能键(例如:F1),用控制台应用搜索ApplePS2Keyboard看看是否有如下日志输出,如果有,说明功能键受PS/2控制,可以继续下去。例如:
ApplePS2Keyboard: sending key e020=4a down
然后记录好自己的每个映射
根据ADBMAP做好映射,然后修改VoodooPS2Controller.kext/Contents/PlugIns/VoodooPS2Keyboard/Contents/Info.plist
例如:
##修改后重启电脑,就会变成你想要的键位了。
#不过一旦Voodoo-PS2-Controller升级就会非常麻烦 我们可以在ssdt中修改。
/*
* Intel ACPI Component Architecture
* AML/ASL+ Disassembler version 20161117-64(RM)
* Copyright (c) 2000 - 2016 Intel Corporation
*
* Disassembling to non-symbolic legacy ASL operators
*
* Disassembly of iASLJ4Iwbu.aml, Fri Nov 3 14:18:59 2017
*
* Original Table Header:
* Signature "SSDT"
* Length 0x000004AC (1196)
* Revision 0x02
* Checksum 0x2E
* OEM ID "hack"
* OEM Table ID "KBD0"
* OEM Revision 0x00000000 (0)
* Compiler ID "INTL"
* Compiler Version 0x20161117 (538317079)
*/
DefinitionBlock ("", "SSDT", 2, "hack", "KBD0", 0x00000000)
{
External (_SB_.PCI0, DeviceObj) // (from opcode)
External (_SB_.PCI0.LPCB, DeviceObj) // (from opcode)
External (_SB_.PCI0.LPCB.EC__, DeviceObj) // (from opcode)
External (_SB_.PCI0.LPCB.KBD0, DeviceObj) // (from opcode)
Scope (_SB.PCI0.LPCB.KBD0)
{
Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method
{
If (LNot (Arg2))
{
Return (Buffer (One)
{
0x03
})
}
Return (Package (0x04)
{
"RM,oem-id",
"LENOVO",
"RM,oem-table-id",
"ideapad700"
})
}
Name (RMCF, Package (0x0C)
{
"Controller",
Package (0x02)
{
"WakeDelay",
Zero
},
"Sentelic FSP",
Package (0x02)
{
"DisableDevice",
">y"
},
"ALPS GlidePoint",
Package (0x02)
{
"DisableDevice",
">y"
},
"Mouse",
Package (0x02)
{
"DisableDevice",
">y"
},
"Synaptics TouchPad",
Package (0x08)
{
"DynamicEWMode",
">y",
"MultiFingerVerticalDivisor",
0x09,
"MultiFingerHorizontalDivisor",
0x09,
"MomentumScrollThreshY",
0x0C
},
"Keyboard",
Package (0x0A)
{
"Breakless PS2",
Package (0x06)
{
Package (0x00) {},
"e064",
"e065",
"e068",
"e06a",
"e027"
},
"Custom ADB Map",
Package (0x07)
{
Package (0x00) {},
"e063=3f",
"e068=4f",
"e0f2=65",
"e06b=6b",
"e06c=71",
"e06a=70"
},
"Custom PS2 Map",
Package (0x02)
{
Package (0x00) {},
"e037=64"
},
"Function Keys Special",
Package (0x19)
{
Package (0x00) {},
"e020=e020",
"e02e=e02e",
"e030=e030",
"e064=e064",
"e065=e065",
"e066=e028",
"e067=e067",
"e068=e068",
"e069=e0f0",
"e06a=e06a",
"e06b=e06b",
"e06c=e06c",
"3b=3b",
"3c=3c",
"3d=3d",
"3e=3e",
"3f=3f",
"40=40",
"41=41",
"42=42",
"43=43",
"44=44",
"57=57",
"58=58"
},
"Function Keys Standard",
Package (0x19)
{
Package (0x00) {},
"e020=3b",
"e02e=3c",
"e030=3d",
"e064=3e",
"e065=3f",
"e066=40",
"e067=41",
"e068=42",
"e069=e0f2",
"e06a=44",
"e06b=57",
"e06c=58",
"3b=e020",
"3c=e02e",
"3d=e030",
"3e=e064",
"3f=e065",
"40=e028",
"41=e067",
"42=e068",
"43=e0f1",
"44=e06a",
"57=e06b",
"58=e06c"
}
}
})
}
Scope (_SB.PCI0.LPCB.EC)
{
Method (_Q1D, 0, NotSerialized) // _Qxx: EC Query
{
Notify (^^KBD0, 0x046B)
}
Method (_Q1C, 0, NotSerialized) // _Qxx: EC Query
{
Notify (^^KBD0, 0x046C)
}
}
}