[TOC]
# 【指南】為Sierra(以及后來的版本)進行USB功率特性注入
> 英文原文:[[Guide] USB power property injection for Sierra (and later)](https://www.tonymacx86.com/threads/guide-usb-power-property-injection-for-sierra-and-later.222266/)
# 綜述
看來Sierra已經改變了USB功率特性(USB power properties)的設置方式。在之前的版本中,我們已經直接對`XHC/EHCI`這個ACPI對象(on the XHC/EHCI ACPI objects),注入了AAPL,current-available, AAPL,current-extra, AAPL,current-extra-in-sleep, and AAPL,max-port-current-in-sleep。在`Sierra`中,這些似乎被注入到`ioreg`中的`AppleBusPowerControllerUSB`對象的新屬性所取代。
讓我們看一下所需的更改...
# 跟蹤證據(Tracing the evidence)
其中一些變化是在USBInjectAll.kext開發期間注意到的... 我還記得一些看起來很有趣的“`kUSB*`”屬性,這些屬性在一個USB kext 的 `Info.plist`文件中。一個簡單的grep搜索就能揭示我們查看的位置:
```
SPEEDY-NUC:nuc.git rehabman$ grep -l kUSB.* -R /System/Library/Extensions/IOUSBHostFamily.kext
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/Info.plist
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/MacOS/IOUSBHostFamily
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBEHCI.kext/Contents/MacOS/AppleUSBEHCI
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBEHCIPCI.kext/Contents/Info.plist
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBEHCIPCI.kext/Contents/MacOS/AppleUSBEHCIPCI
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBHostCompositeDevice.kext/Contents/MacOS/AppleUSBHostCompositeDevice
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBHostMergeProperties.kext/Contents/Info.plist
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBHub.kext/Contents/Info.plist
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBHub.kext/Contents/MacOS/AppleUSBHub
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBOHCIPCI.kext/Contents/MacOS/AppleUSBOHCIPCI
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBUHCI.kext/Contents/MacOS/AppleUSBUHCI
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBUHCIPCI.kext/Contents/MacOS/AppleUSBUHCIPCI
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBXHCI.kext/Contents/MacOS/AppleUSBXHCI
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBXHCIPCI.kext/Contents/Info.plist
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBXHCIPCI.kext/Contents/MacOS/AppleUSBXHCIPCI
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/IOUSBHostHIDDevice.kext/Contents/MacOS/IOUSBHostHIDDevice
```
嗯... 看起來`/System/Library/Extensions/IOUSBHostFamily.kext/Contents/Info.plist` 是個開始的好位置:
看看我們的發現了什么:

正如你所看到的有各種屬性(`kUSBSleepPortCurrentLimit`、`kUSBSleepPowerSupply`,`kUSBWakePortCurrentLimit`,`kUSBWakePowerSupply`),通過一個`AppleUSBHostMergeProperties`注射器,使它被注入到`AppleBusPOwerControllerUSB`提供者(provider)。
但是我檢查自己的`ioreg`,發現`AppleBusPowerControllerUSB`并沒有在任何地方被加載。那么問題是,是什么使它加載…另一個簡單的grep搜索將告訴我們:
```
SPEEDY-NUC:nuc.git rehabman$ grep -l AppleBusPowerControllerUSB -R /System/Library/Extensions
/System/Library/Extensions/AppleBusPowerController.kext/Contents/Info.plist
/System/Library/Extensions/AppleBusPowerController.kext/Contents/MacOS/AppleBusPowerController
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/Info.plist
```
現在看看`AppleBusPowerController.kext`的`Info.plist`:

我們可以看到它匹配了一個名為“`EC`”的ACPI設備。有些電腦使用`EC`作為嵌入式控制器(Embedded Controller),但大多數使用`EC0`或`H_EC`。
有了這些知識,我們可以簡單地重命名`H_EC->EC`,或者 `EC0->EC`,然后`AppleBusPowerControllerUSB`被加載,而且在`IOUSBHostFamily.kext/Contents/Info.plist`中,對每個支持的`SMBIOS`的相關注入也是如此。
現在,如果你仔細看 `IOUSBHostFamily`的`Info.plist`,你會發現新的SMBIOS不見了。例如`MacBookPro9,1`, `iMac17,1`, 和 `MacBookPro13,x`.。這些型號必須使用不同的方法來進行USB功率特性的注入。
`AppleBusPowerController`的反編譯顯示,它正在在`IOACPIPlane`中查找一個名為“`USBX`”的對象。然后,它似乎會從設備屬性中提取必要的數據。如果我們看一個`iMac17,1`的`ioreg`,我們會發現這個:

還有我們的能量性能(power properties )
看看 iMac17.1 中的`DSDT.aml `,我們找到`USBX` 的源代碼:
```
Scope (_SB)
{
...
Device (USBX)
{
Name (_ADR, Zero) // _ADR: Address
Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method
{
Store (Package (0x08)
{
"kUSBSleepPowerSupply",
0x13EC,
"kUSBSleepPortCurrentLimit",
0x0834,
"kUSBWakePowerSupply",
0x13EC,
"kUSBWakePortCurrentLimit",
0x0834
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}
}
```
嗯,不要驚訝這些... 四個USB能量性能(USB power properties)的標準的`_DSM`注入。
摘要:
- 如果該電腦存在`EC`,那么命名為“'EC”并且`AppleBusPowerControllerUSB`將被加載。
- 如果SMBIOS匹配`IOUSBHostFamily.kext/Contents/Info.plist` 中的其中一個“legacy SMBIOS”,該Mac型號的能量性能將被注入(它們可能適合您的硬件,也可能不適合)
- 如果在`IOUSBHostFamily.kext/Contents/Info.plist`沒有SMBIOS存在,那`ACPI`中的`USBX`設備會通過正常的`_DSM`屬性注入 來決定能量性能。
# 保證 AppleBusPowerControllerUSB 的加載
如果你有一個嵌入式控制器(大多數筆記本電腦,一些臺式機),你只需確保ACPI設備被命名為`EC`。這很容易通過`config.plist`的ACPI hotpatch來完成。我已經將兩個普通的`renames`添加到所有的筆記本指南`plist`文件中。
看起來就這樣:

注意:如果你正在使用靜態的打補丁的SSDTs(就是說,`ACPI/patched`目錄有打補丁的`OEM SSDTs`),你要確保在這些文件中都手動完成`EC`重命名。Clover的`config.plist/ACPI/DSDT/Patches`只對`ACPI/patched`的`DSDT.aml` 以及從BIOS中加載的`OEM DSDT`和`SSDTs`生效,…不會對`ACPI/patched`中的`SSDTs`生效。
如果你沒有嵌入式控制器,可以使用下面的`SSDT-EC.dsl`(編譯為AML)添加一個“假”的:
```
// Inject Fake EC device
DefinitionBlock("", "SSDT", 2, "hack", "EC", 0)
{
Device(_SB.EC)
{
Name(_HID, "EC000000")
}
}
//EOF
```
注意: 您可能會發現您的`DSDT`中有一個`EC`:帶有“`Name (_HID, EisaId ("PNP0C09"))`”的設備,即使它不活動。
例如,這是在我的NUC6i7KYK:
```
Scope (_SB.PCI0.LPCB)
{
Device (H_EC)
{
Name (_HID, EisaId ("PNP0C09")) // _HID: Hardware ID
Name (_UID, One) // _UID: Unique ID
Method (_STA, 0, NotSerialized) // _STA: Status
{
Store (0x03, ^^^IGPU.CLID)
Return (Zero)
}
...
```
正如您所看到的,它從`_STA`返回`0`。根據ACPI規范,這是“不存在”的。這意味著`H_EC`設備被有效地忽略了。你會注意到它沒有顯示在`ioreg`,`IOService`板面上。
不要試圖通過更改`_STA`的返回值來激活EC設備。這里返回`0`的原因是**該計算機沒有`EC`** 。在這種情況下,您應該添加上面提到的“假”`EC`。
# 一個SSDT注入USBX設備
對于`IOUSBHostFamily.kext/Contents/Info.plist`中尚未覆蓋的`SMBIOS` ,您將需要注入`USBX`設備來提供`AppleBusPowerControllerUSB`的能量性能。
下面是一個 `SSDT-USBX.dsl`示例:
```
// USB power properties via USBX device
DefinitionBlock("", "SSDT", 2, "hack", "USBX", 0)
{
Device(_SB.USBX)
{
Name(_ADR, 0)
Method (_DSM, 4)
{
If (!Arg2) { Return (Buffer() { 0x03 } ) }
Return (Package()
{
// these values from iMac17,1
"kUSBSleepPortCurrentLimit", 2100,
"kUSBSleepPowerSupply", 5100,
"kUSBWakePortCurrentLimit", 2100,
"kUSBWakePowerSupply", 5100,
})
}
}
}
//EOF
```
你可能會認為你也可以重寫(override) 該例子中`IOUSBHostFamily.kext/Contents/Info.plist`提供的值。在這種情況下,將使用支持的SMBIOS。但不幸的是,事實并非如此。`IOUSBHostFamily.kext/Contents/Info.plist`中的值重寫了由`USBX`提供的那些。
還有,如果你已經有了`SSDT-UIAC.aml`(你本該如此),通過簡單地添加`_SB.USBX`設備到那個`SSDT`,而不是創建一個新的,這可能會有意義的。
# 重載(override) `IOUSBHostFamily.kext/Contents/Info.plist`
Although you could patch this kext Info.plist to provide different properties for any supported SMBIOS, it is desirable to do so without patching since patching would need to be redone after any update that provided a new copy of the file.
雖然可以修補這個`kext`的 `Info.plist`來為任何受支持的SMBIOS提供不同的屬性,這樣不需要修補還是需要的,因為在提供了新文件副本的任何更新之后,會需要重新修改補丁。
I have added support in to inject these properties. And, at least in my testing, the properties injected by USBInjectAll.kext are succesful in overriding those from IOUSBHostFamily.kext.
我增加了`USBInjectAll.kext`的支持,來注入這些屬性。而且,至少在我的測試中,由`USBInjectAll.kext` 注入的屬性成功地重載了那些來自`IOUSBHostFamily.kext`的。
通過`USBInjectAll.kext`指定功率特性(power property)重寫,你必須在你的`UIAC.RMCF`中提供一個“`AppleBusPowerControllerUSB`” 。
例如:
```
DefinitionBlock ("", "SSDT", 2, "hack", "usb", 0)
{
//
// Override for USBInjectAll.kext
//
Device(UIAC)
{
Name(_HID, "UIA00000")
Name(RMCF, Package()
{
// USB Power Properties for Sierra (using USBInjectAll injection)
"AppleBusPowerControllerUSB", Package()
{
// these values happen to be iMac14,2 values...
"kUSBSleepPortCurrentLimit", 2100,
"kUSBSleepPowerSupply", 4700,
"kUSBWakePortCurrentLimit", 2100,
"kUSBWakePowerSupply", 4700,
},
// XHC overrides (8086:9cb1, NUC5)
"8086_9cb1", Package()
{
// other UIAC.RMCF content follows (for custom port injection)
...
}
//EOF
```
這個功能是在`USBInjectAll.kext`的v0.6.0版本中新增的,所以不要期望它在舊的版本中工作。
# 問題報告
閱讀FAQ,“問題報告”
https://www.tonymacx86.com/threads/faq-read-first-laptop-frequent-questions.164990/
- 簡介
- 基本命令
- 高效操作
- 命令操作
- 常用軟件
- 問題設置
- 命令行神器
- 開發配置
- 開發環境配置
- brew
- git
- Karabiner-Elements
- iTerm2
- MacVim
- aria2
- LaunchBar
- zsh
- Tmux
- Charles
- Emacs(感覺不需要了)
- 常用工具
- Alfred
- mac 詞典增強
- Mac 高級操作
- mac 資源
- 黑蘋果
- 個人配置
- 黑蘋果資源
- 驅動集合
- 工具集合
- 黑蘋果指南
- [FAQ] 開始必讀!筆記本電腦常見問題
- [指南] hackintosh之SSDT/DSDT
- [指南] hackintosh之hotpatch
- [指南] 為Sierra(以及后來的版本)進行USB電源屬性注入
- [指南] 10.11+ USB的變化和解決方案
- [指南] 為USBInjectAll.kext創建一個自定義的SSDT
- [指南] Intel IGPU HDMI/DP audio (Sandy/Ivy/Haswell/Broadwell/Skylake)
- [指南] 怎么給DSDT打補丁來顯示電池狀態
- [指南]在雙GPU筆記本電腦中禁用獨立顯卡.md
- [指南]
- OpenCore
- 多系統引導
- hotpatch
- 黑蘋果裝機
- 刷BIOS大法
- dd