x86 硬件上的 Mac OS X 2008–2024 技術文獻庫
InfiniteMac OSx86 › OSx86 10.X 核心架構與安裝配置 › DSDT 進階修改實錄:啟用電源鍵 (PWRB)、喚醒黑屏修正、盒蓋睡眠與 ASUS 熱鍵
625,378 reads · 2009-01-19 – 2013-01-21
技術文獻 10.X 核心架構 DSDT Gigabyte G31M / P35

DSDT 進階修改實錄:啟用電源鍵 (PWRB)、喚醒黑屏修正、盒蓋睡眠與 ASUS 熱鍵

透過修改系統 DSDT 表啟用機箱電源按鈕關機選單 (PWRB)、解決睡眠喚醒後螢幕黑屏、啟用 Clamshell 盒蓋睡眠及華碩手提電腦功能熱鍵的實用修補整理。

主筆作者
@pentiumpc 發表於 2009-01-19
所屬專區
OSx86 10.X 核心架構與安裝配置
典藏規模與紀錄
625,378 次歷史閱讀 · 101 則精選技術筆記(萃取自 107 則原始回帖) · 2009-01-19 – 2013-01-21
參與貢獻成員 (32)
@uman (21)@kizwan (18)@pentiumpc (8)@Slither2008 (6)@candykane (6)@richarda (5)@THeKiNG (4)@breakky (4)@Thireus (3)@Alexaar (2)@The Edge3000 (2)@Gurruwiwi (2)@EnzoFX (2)@Sweaty (2)@ping99 (2)@Nameci (2)+16 more
相關硬件參考
Workstation Coolers & Thermal Gear ↗ Gigabyte Motherboards ↗ Laptop RAM & SSD Upgrades ↗
香港繁體精譯技術專卷 · 完整保留原始指令、Kext 名稱、ACPI 節點與開機參數查看英文原版 (Original English) →

論壇上有許多關於使用 DSDT Override 安裝 OS X 的討論;一旦系統支援載入自訂 dsdt.aml,我們便能直接透過修改 ASL 程式碼來修復並啟用多項原生硬件功能:

已驗證可行的 DSDT 修正項目:

  1. 啟用 PWRB(機箱電源按鈕): 讓按下機箱實體電源鍵時彈出 Mac OS X 原生關機 / 睡眠確認對話框。
  2. 修正系統由睡眠喚醒後螢幕黑屏(Blank Display on System Wake): 修補顯示卡與 `_WAK` 喚醒方法。
  3. 配合 Clamshell.kext 啟用盒蓋睡眠(Clamshell Sleep): 讓手提電腦闔上螢幕時自動進入睡眠。
  4. 啟用華碩(ASUS)手提電腦專屬 Fn 熱鍵。

部分平台有效的實驗性修正:

  1. USB 睡眠斷電與卸載問題: 在我的 ASUS Eee PC 1000H 上完美解決,但在技嘉 EP35-DS3L 底板上仍需額外配合 EHCI/UHCI 注入。

以上是我上週末實測整理的成果,歡迎大家在此討論串分享更多底板的 DSDT 修改片段,作為社群共同的修補參考庫。

社群實測與技術補充筆記

自 107 則原始討論回帖中萃取 101 則高價值技術回應

作者修訂 #1 @pentiumpc 2009-01-19

啟用機箱電源按鈕(Power Button)

將 _HID 改為 _CID:

Device (PWRB)
{
Name (_HID, EisaId ("PNP0C0C")) ---> Name (_CID, EisaId ("PNP0C0C"))
Name (_UID, 0xAA)
Name (_STA, 0x0B)
}

這段修改是我在某個網站看到的,一時記不起出處(在此向原作者致謝)。
這樣修改後就能啟用實體電源鍵,按下時會彈出 OS X 原生的關機選單。

作者修訂 #2 @pentiumpc 2009-01-19

修正睡眠喚醒後螢幕黑屏問題

在 Eee PC 1000H 上,系統從睡眠喚醒後螢幕會保持黑屏,必須手動按一下亮度調節鍵才會點亮背光。目前的權宜做法是透過 SleepWatcher 配合 Reggie 直接寫入暫存器來點亮螢幕。

其實只要直接修改 DSDT 在喚醒時設定螢幕亮度,就能徹底解決這個問題:

Method (WAK, 1, NotSerialized) //WAKE up
{
\_SB.PCI0.SBRG.EC0.EC0W (Arg0)
\_SB.PCI0.NWAK (Arg0)
\_SB.PCI0.SBRG.SWAK (Arg0)
LPWK (Arg0)
Store(\_SB.ATKD.PBLG,local0) //---> Get Brightness level from NVS
\_SB.ATKD.PBLS(local0) //---> Set Brightness level.
}

加上最後那兩行程式碼,就能在喚醒時重設螢幕背光亮度。

你底板上的 Method 名稱可能略有不同,請在 DSDT 內尋找類似的段落;同時你也得找出負責讀取與設定亮度的對應 Method。
這個思路同樣可以用來處理其他喚醒後的硬件狀態重置問題。

作者修訂 #3 @pentiumpc 2009-01-19

手提電腦盒蓋睡眠(Clamshell Sleep)

大多數手提電腦在闔上螢幕上蓋(LID)時都不會自動進入睡眠。我試過在網上搜尋現成的 DSDT 修正方案但找不到(Google 是我最好的朋友),於是我自己動手寫了一段來解決。

如果你有更好或更簡潔的寫法,歡迎隨時指教,謝謝。

Device (LID0)
{
Name (_HID, EisaId ("PNP0C0D")) //LID detection
Method (_PRW, 0, NotSerialized)
{
Return (Package (0x02)
{
0x0B,
0x04
})
}
Name (LIDS, One)
Method (_LID, 0, NotSerialized)
{
Store (^^PCI0.SBRG.EC0.SF13, LIDS) //LID register
XOr (LIDS, One, Local0)
IF (Local0) //if LID is closed
{
Notify (SLPB, 0x80) //Set system to sleep
}
Return (LIDS)
}

LID 裝置在 DSDT 中應該很容易找到,只需補上一行程式碼,在偵測到上蓋闔上時向睡眠按鈕(SLPB)發送睡眠通知即可。

在大多數 PC 手提電腦上(據我推測),原本是由作業系統接收 LID 的狀態通知後才觸發睡眠,但 OS X 並不認識 PC LID 裝置發出的預設通知,所以我改為直接在硬件 ACPI 層面觸發 SLPB 睡眠訊號。

作者修訂 #4 @pentiumpc 2009-01-19

啟用 ASUS 功能熱鍵(Hotkeys)

如果你查看 IORegistry 裝置樹時看得到 "ASUS010" 或 "ATKD",就代表你的系統帶有華碩熱鍵控制裝置,Fn+Fx 組合鍵是可以驅動的。

你必須先找出每個按鍵會發送什麼 ACPI Notification 代碼。我特別寫了一個 Kext 來記錄並分析 Notification 代碼,接著再去 DSDT 的 _GPE 區段找出對應的中斷處理方法(Interrupt Handler)。把這些對應關係全部梳理清楚後,我便在 DSDT 中加入切換各項硬件開關的程式碼。

現在我可以自由開關螢幕背光、Wi-Fi、藍牙、讀卡機、視訊鏡頭以及調節螢幕亮度等。目前還在研究另外幾項功能,例如切換外接螢幕、調整 FSB 外頻等。

範例程式碼:
Method (CAMS, 1, Serialized) //Camera Set
{
Return (OCMS (Arg0))
}

Method (CAMR, 0, Serialized) //Camera toggle : added
{
Store (OCMG , Local0)
XOr (Local0, One, Local0)
Return (OCMS (Local0))
}

Method (CAMG, 0, Serialized) //Camera Set
{
Return (OCMG )
}

上面這段程式碼非常直觀,就是用來切換視訊鏡頭(Camera)開關的。

Method (_Q2A, 0, NotSerialized) //Camera
{
^^^^ATKD.CAMR //Toggle Camera
ATKN (0x1D) //notify ATKD
}

這是負責處理該按鍵事件的中斷服務常式(Interrupt Handler)。

作者修訂 #5 @pentiumpc 2009-01-19

USB 睡眠修正

Device (HPET)
                {
                    Name (_HID, EisaId ("PNP0103"))
                    Name (_CID, EisaId ("PNP0C01"))
                    Name (CRS, ResourceTemplate 
                    {
                        Memory32Fixed (ReadOnly,
                            0xFED00000,         // Address Base
                            0x00000400,         // Address Length
                            _Y03)
                    })
                    OperationRegion (^LPCR, SystemMemory, 0xFED1F404, 0x04)
                    Field (LPCR, AnyAcc, NoLock, Preserve)
                    {
                        HPTS,   2, 
                            ,   5, 
                        HPTE,   1, 
                                Offset (0x04)
                    }

Method (_STA, 0, NotSerialized)
{
Return (0x0F)
}

讓 HPET 的 _STA 狀態直接回傳 0x0F,似乎一併修好了我的 USB 睡眠問題(包括睡眠喚醒後 USB 失效以及無法熱插拔的問題)。

這項修正尚未完全嚴格驗證,因為我沒有刻意去重現故障(這不在我的優先待辦清單上),但我的系統目前以 10.5.6 原生核心(Vanilla)穩定運行,僅配搭 Decrypter、AnV SMBIOS、PS2Nub 與 Controller 以及 OpenHaltRestart。

完全沒有安裝任何 IOUSB 修補 Kext(那些 Kext 在我機上反而會導致死機)。

更新 —— 這個問題現在可以直接用 DSDT Patcher 加上 -newHPET 參數自動修正,打好修補後連 Disabler.kext 都不需要了。

技術筆記 #1 @Slither2008 2009-03-03

我最近一直在研讀我的 Asus EeePC 1000H 的 dsdt.aml,試圖更深入理解 _SB 下的各個 Method。

以下我整理的對應表看起來正確嗎?

Method - 功能說明

PBL (S/G) = 螢幕背光(BackLight)
CAM (S/G) = 視訊鏡頭(Camera)
CRD (S/G)= 讀卡機(Card Reader)
WLD (S/G) = 無線網絡卡設定/讀取(Wireless LAN Set / Get)
CFV (S/G) = FSB 外頻速度與電壓設定/讀取
CAM (S/G) = 視訊鏡頭設定/讀取
BTH (S/G) = 藍牙設定/讀取(Bluetooth Set / Get)
SDSP = 切換顯示輸出(Switch/Swap Display)
CRD (S/G) = 讀卡機設定/讀取
HDPS = ?
PBP (S/G) =
M3G (S/G) = 行動 3G 模組(Mobile 3G)
HWCF = ?
GNVS = 讀取音量?(我肯定這猜錯了,應該是讀取及設定記憶體參照位址?)
SNVS = 設定音量?(我肯定這猜錯了,應該是讀取及設定記憶體參照位址?)

我已經成功利用備用的 Fn 鍵(0x1d)來開關視訊鏡頭和藍牙了。接著我嘗試搞定 Wi-Fi 開關,但發現它的 Method 呼叫邏輯比單純傳入 ATKN(value) 複雜得多。

它內部似乎有一套判斷邏輯來決定要傳遞 0x11 還是 0x10。我目前只能用熱鍵把 Wi-Fi 關掉,關掉後就再也開不回來了(八成是我漏掉了某段狀態判斷邏輯)。

另外我可以確認,你寫的那個 Asus Test Kext 能正確捕捉到所有按鍵事件,唯獨按下關閉 Wi-Fi 的 Fn 鍵時會提示某個未映射的 Method,接著系統日誌就會開始跳出藍牙或 Wi-Fi 無法進入省電狀態(powersave state)的訊息;只要再按一次 Wi-Fi Fn 鍵,這些訊息就會停止。

你對這個現象有什麼看法?

順頌時祺,

Steve

技術筆記 #2 @Slither2008 2009-03-03

這是我目前用來作為參考的按鍵事件代碼表(Event Codes):

# 銀色快捷鍵(Silver buttons)
KEY_SILVER1="0000001a" # 空白鍵
KEY_SILVER2="0000001b" # 切換解析度
KEY_SILVER3="0000001c" # 自訂鍵 1 (User 1)
KEY_SILVER4="0000001d" # 自訂鍵 2 (User 2)

# Fn+F? 組合鍵
KEY_Fn_F1="00000080" # 睡眠
KEY_Fn_F2=("00000010" "00000011") # Wi-Fi 開關切換
KEY_Fn_F5="0000002*" # 調低亮度
KEY_Fn_F6="0000002*" # 調高亮度
KEY_Fn_F7="00000016" # 關閉背光
KEY_Fn_F8=("00000030" "00000031" "00000032") # XRandR 顯示切換
KEY_Fn_F9="00000012" # 工作管理員
KEY_Fn_F10="00000013" # 靜音
KEY_Fn_F11="00000014" # 調低音量
KEY_Fn_F12="00000015" # 調高音量

# 其他 ACPI 事件
POWER_AC="00000001"
POWER_BAT="00000000"

如果你想把 F3 和 F4 也改成自訂 Fn 熱鍵,我覺得在 Linux 下跑 acpi_listen 應該是最快找出對應事件代碼的方法。

我還在納悶為什麼音量控制鍵的相關函式在 DSDT 裡面這麼難找。

作者修訂 #6 @pentiumpc 2009-03-03 ↳ Re: @Slither2008

Fn+F1 不會回傳任何鍵碼……直接執行 Notify (SLPB, 0x80) 就會讓系統進入睡眠。
Fn+F5、Fn+F6 會回傳 0x20 到 0x2F 之間的代碼,對應 15 段螢幕亮度調節。
Fn+F8 會回傳下一個顯示輸出模式代碼:內置 LCD、外接 VGA 或雙螢幕延伸。
插上 AC 電源變壓器會回傳 0x50。
切換為電池供電會回傳 0x51。

以上大部分按鍵都需要配合專門的驅動程式才能真正運作。

最近我正職工作忙得不可開交,因此不得不暫停手頭上這個驅動程式的開發。
我目前有一個 Beta 測試版,歡迎大家下載試用:

ASUS Hotkey Enabler (media fire.com/download.php?4lnemnhjnzt)

這個安裝包整合了多項啟用熱鍵的解決方案,不再需要依賴 SleepWatcher,並將 Fn+F1 設為深度睡眠(Deep Sleep)、闔上螢幕上蓋設為淺層睡眠(Doze)。
此外,你還可以透過修改 plist 內的數值,自訂大部分熱鍵去觸發執行你自己的腳本。這套方案在我自己的系統上已經用了一段時間,表現相當穩定。

安裝前請務必先備份好你原本的 "DSDT.aml"。

作者修訂 #7 @pentiumpc 2009-03-03 ↳ Re: @Slither2008
@Slither2008Method - Description CFV (S/G) = FSB Speed & Voltage Set / Get SDSP = Switch/Swap Display HDPS = ? PBP (S/G) = HWCF = ? GNVS = Get Volume (I'm sure this is wrong. Probably gets and sets memory references?) SNVS = Set Volume (I'm sure this is wrong. Probably gets and sets memory references?) .

CFV = 僅用於設定 FSB 外頻,與電壓無關。
HDP/PBP = 設定內置 LCD、外接顯示器或雙螢幕同步顯示。雖然可以設定,但必須重新整理 Mac 的螢幕解析度才會生效,處理起來非常棘手。
HWCF = 用途未知。
GNVS / SNVS = 讀取或寫入 NVS(Non-Volatile SRAM,非揮發性記憶體,我猜是與 BIOS 共用的狀態區)。

BIOS 方法會回傳目前的 BIOS 版本。
INIT 用於初始化 ATKD 裝置(必須先執行這個方法,按鍵才會回傳 Keycode)。

我在家上網時連上 IPIS 論壇一直被自動登出,在辦公室又沒時間處理,所以無法親自過去發帖。方便的話請幫忙把我的 pkg 安裝包轉貼到那邊,謝謝!

技術筆記 #3 @Slither2008 2009-03-03

非常感謝你的詳細資訊,以及大方分享 Beta 版 Fn 熱鍵驅動程式!

我會把這些研究心得整理成一篇教學指南發佈到 IPIS 論壇上。

順頌時祺,

Steve

技術筆記 #4 @Slither2008 2009-03-03

套用你各項 DSDT 修正的討論串:
ipis-osx.wik idot.com/forum/t-135417/enabling-function-keys-by-modifying-your-dsdt#post-403326

測試你實驗性 Kext 驅動的討論串:
ipis-osx.wik idot.com/forum/t-135405/experimental-asus-hotkey-enabler-kext-driver#post-403338

技術筆記 #5 @Slither2008 2009-03-04

我很樂意貢獻自己的程式開發經驗,一起幫忙完善你寫的這個 Kext。

請問你方便公開分享這個實驗性 Kext 的原始碼嗎?

順頌時祺,

Steve

技術筆記 #6 @Slither2008 2009-03-05

我自己寫了一個帶有基本 WorkLoop 的骨架 Kext(Skeleton Kext)。

這個 Kext 可以正常初始化、探測(probe)、找到並配對 ATKD device nub,然後順利進入我的 start 函式。

但我在加入 IOInterruptEventSource 時遇到了問題。

我在 start 裡是這樣宣告的:

interruptSrc = IOInterruptEventSource::interruptEventSource(
(OSObject*)this,
OSMemberFunctionCast( IOInterruptEventAction,
this,
&com_ipis_driver_AsusFNKeys::interruptOccurred ),
(IOService*)provider,
(int)0);

我有寫一段檢查邏輯,如果無法加入 WorkLoop 就回報錯誤,但結果只要一載入啟動這個 Kext,系統就立刻發生核心錯誤(Kernel Panic)。

我把上面那段程式碼註解掉、將 Kext 簡化回最基本的空白模板後重新測試,驅動就能正常載入,證明確實是 IOInterruptEventSource 引發的 KP。

如果能指點一下迷津,我會非常感激!

技術筆記 #7 @Alexaar 2009-04-13

嗨!各位進展如何?
我想進一步改良 Eee PC 1000H 的 DSDT,需要大家幫忙看看幾個問題。

第一個問題是關於 PS/2 控制器(同時發帖於 http://www.insanelymac.com/forum/index.php?showtopic=90… ↗):

我們目前都在 DSDT 裡使用這段程式碼:

Device (PS2K)
                {
                    Name (_HID, EisaId ("PNP0303"))
                    Name (_CID, 0x0B03D041)
                    Method (_STA, 0, NotSerialized)
                    {
                        ShiftLeft (One, 0x0A, Local0)
                        If (And (IOST, Local0))
                        {
                            Return (0x0F)
                        }

                        Return (Zero)
                    }

                    Name (_CRS, ResourceTemplate ()
                    {
                        IO (Decode16, 0x0060, 0x0060, 0x00, 0x01)
                        IO (Decode16, 0x0064, 0x0064, 0x00, 0x01)
                        IRQNoFlags () {1}
                    })
                }

                Device (PS2M)
                {
                    Name (_HID, EisaId ("SYN0A04"))
                    Name (_CID, Package (0x03)
                    {
                        0x000A2E4F, 
                        0x02002E4F, 
                        0x130FD041
                    })
                    Method (_STA, 0, NotSerialized)
                    {
                        ShiftLeft (One, 0x0C, Local0)
                        If (And (IOST, Local0))
                        {
                            Return (0x0F)
                        }

                        Return (Zero)
                    }

                    Name (_CRS, ResourceTemplate ()
                    {
                        IRQNoFlags () {12}
                    })
                }

但這樣寫會導致 IORegistry 裡面出現重複的節點(doubling)。

另外提供一段從 OpenBSD 開機日誌擷取的硬件資訊作為參考:

ichpcib0 at pci0 dev 31 function 0 "Intel 82801GBM LPC" rev 0x02: PM disabled
isa0 at ichpcib0
isadma0 at isa0
pckbc0 at isa0 port 0x60/5
pckbc0: using irq 1 for kbd slot
pckbd0 at pckbc0 (kbd slot)
wskbd0 at pckbd0: console keyboard, using wsdisplay0

pmsi0 at pckbc0 (aux slot)
pckbc0: using irq 12 for aux slot
wsmouse0 at pmsi0 mux 0

雖然目前的程式碼運作正常,但如果能修掉節點重複的問題會更完美。有人有頭緒嗎?

第二個問題則是關於「掀開螢幕上蓋自動喚醒(Wakeup on Clamshell Open)」的功能,有人嘗試實作出來過嗎?

技術筆記 #8 @Alexaar 2009-04-29

還是沒有人回覆,真可惜。
這段期間我結合了樓上的修改與我自己的修正,編譯了一份自用的 DSDT。現在我的系統在 10.5.6 下運作與睡眠都十分完美,唯獨 Fn 熱鍵修正對我來說還是有些小 Bug。
我仍在探索更多能強化 1000H DSDT 的改法,例如我夢寐以求的「掀蓋自動喚醒(Clamshell Wakeup)」功能。大家有任何想法嗎?

技術筆記 #9 @Thireus 2009-05-07

我想請教一下,該在 DSDT 的哪個位置、用什麼方式設定 FSB 外頻,才能讓系統跑以下參數:

FSB=54
PCIE=176

這樣就能讓我的 Eee PC 1000H 運作頻率達到 1.9GHz,實現跟我在 Windows XP 下用 eeectl 一樣的超頻效果。

技術筆記 #10 @candykane 2009-05-13

從 InsanelyMac 論壇整理了一些資料過來,我覺得放進這個教學串裡會很有參考價值:
透過修改 _WAK 方法修復睡眠模式

information about the _WAK method.
Arguments:
0 The value of the sleeping state (1 for S1, 2 for S2, and so on).
Result Code (2 DWORD package):
Status Bit field of defined conditions that occurred during sleep.
0x00000000 Wake was signaled and was successful
0x00000001 Wake was signaled but failed due to lack of power.
0x00000002 Wake was signaled but failed due to thermal condition.
Other Reserved
PSS If non-zero, the effective S-state the power supply really entered.

這個數值是用來偵測是否因為電源供應器抽載電流過大,導致系統未能進入目標 S-state 睡眠狀態。

簡言之,_WAK 方法接收一個參數(即請求進入的睡眠狀態編號),並以包含 2 個 DWORD 的 Package 形式回傳結果。第一個數值代表喚醒是否成功(0 為成功,非 0 為失敗及對應原因);第二個數值在成功時同樣為 0,失敗時則回傳實際進入的睡眠狀態編號。所以它本質上就是一個成功/失敗的狀態回傳碼。

Package 宣告的第一個參數指定元素的數量,大括號內則是元素本身。因此上面的宣告單純定義了一個包含兩個 0 的雙元素 Package。之所以需要這樣加,是因為 ACPI 規範強制要求 _WAK 方法必須回傳兩個數值。
說穿了,這就是補上一個符合 ACPI 規範的虛擬回傳值(從而消除編譯警告),它本身不做任何額外動作,只是單純告訴作業系統「喚醒總是成功」。

修復睡眠模式步驟:

搜尋:_WAK

CODE
Method (_WAK, 1, NotSerialized)
{
Store (0xFF, DBG1)
If (LEqual (Arg0, 0x03))
{
Store (0x8F, SCP)
}

If (LEqual (Arg0, 0x04))
{
If (LEqual (OSFL, Zero))
{
If (LEqual (OSFX, 0x03))
{
Store (0x59, SMIP)
}
Else
{
Store (0x58, SMIP)
}
}

If (LEqual (OSFL, One))
{
Store (0x56, SMIP)
}

If (LEqual (OSFL, 0x02))
{
Store (0x57, SMIP)
}

If (LEqual (OSFX, 0x03))
{
Store (0x59, SMIP)
}
}

If (LEqual (Arg0, One)) {}
If (OSFL)
{
Notify (\_SB.PWRB, 0x02)
}
Else
{
If (LEqual (RTCW, Zero))
{
Notify (\_SB.PWRB, 0x02)
}
}

Notify (\_SB.PCI0.USB0, Zero)
Notify (\_SB.PCI0.USB1, Zero)
Notify (\_SB.PCI0.USB2, Zero)
Notify (\_SB.PCI0.USB3, Zero)
Notify (\_SB.PCI0.USB4, Zero)
Notify (\_SB.PCI0.USB5, Zero)
Return(Package(0x02){0x00, 0x00}) <------ 加在這裡,編譯前先編輯 dsdt_fixed.txt
}

技術筆記 #11 @candykane 2009-05-13

螢幕背光控制(Backlight Control)
手提電腦 DSDT 另一個很實用的修改項目(加在 _SB 區段下):

CODE
Device (PNLF)
{
Name (_HID, EisaId ("APP0002"))
Name (_CID, "backlight")
Name (_UID, 0x0A)
Name (_STA, 0x0B)
}

這樣能幫助系統載入原生的螢幕背光滑桿控制。

技術筆記 #12 @Thireus 2009-05-13

嗯……各位大佬都沒人能回答我的超頻問題嗎?

技術筆記 #13 @candykane 2009-05-13

修復睡眠以及喚醒後的 USB 裝置

我終於修好我手提電腦的睡眠功能了!

問題出在 USB 上……
修正方法很簡單,概念跟 _WAK 方法類似:

如果你查看 DSDT 裡所有 USB 控制器節點,會看到:
QUOTE
Method (_PRW, 0, NotSerialized)
{
Return (GPRW (0xYZ, 0xYZ))
}
接著搜尋 Method (GPRW,並將它結尾處的 Return (PRWP)(或你表裡對應的變數名稱)改為:
CODE
Return (Package (0x02)
{
Zero,
Zero
})

不過我還是得配合修改版的 EHCI/UHCI Kext;如果不裝修改版 Kext,雖然手提電腦可以正常進入睡眠,但喚醒後會遺失掛在 UHCI 下的裝置(如藍牙與指紋辨識器)。

說到修改版 EHCI Kext,我真的很討厭那些刷屏的 ownership debug 除錯訊息。真不懂為什麼這麼多開發者喜歡在發佈的 Kext 裡留一堆沒用的 debug 輸出,明明做成 normal / debug 兩個版本,或者在 plist 裡加個布林開關讓用家自行啟用/停用會乾淨得多……

補充:非常感謝 Slice 提供移除了除錯訊息的 Kext 修改版,我和我的系統日誌(system.log)都清靜多了!
順帶一提,我還在等關於那些 USB 修正原理的解答;因為你的 Kext 沒有公開原始碼,我實在不清楚裡面到底做了什麼處理——或許我們可以把那些修正直接移植進 DSDT 裡,至少值得一試……

再次補充:昨晚太累忘記提到 Device (PWRB)(即電源按鈕 Power Button)。我發現我的 DSDT 裡缺少了這個裝置,而真機 MacBook 的 DSDT 中許多 USB 裝置都會引用到它,所以我把它補了上去。
如果你的 DSDT 也沒有 PWRB,請搜尋 Device (SLPB) 並在它上方或下方加入,看起來像這樣:
CODE
Scope (_SB)
{
Device (PWRB)
{
Name (_HID, EisaId ("PNP0C0C"))
}

Device (SLPB)
{
Name (_HID, EisaId ("PNP0C0E"))
Method (_PRW, 0, NotSerialized)
{
Return (Package (0x02)
{
0x0B,
0x04
})
}
}
}
接著搜尋 Method (_Lxy,你會在那裡看到所有 USB 裝置的 GPE 事件方法。在每個 UHCI 項目下加入 Notify (\_SB.PWRB, 0x02);至於 EHCI 項目,我直接從真機 MacBook 移植了整段程式碼,看起來如下:
CODE
Scope (_GPE)
{
Method (_L03, 0, Serialized)
{
Notify (\_SB.PCI0.UHC1, 0x02)
Notify (\_SB.PWRB, 0x02)
}

Method (_L04, 0, Serialized)
{
Notify (\_SB.PCI0.UHC2, 0x02)
Notify (\_SB.PWRB, 0x02)
}

Method (_L0C, 0, Serialized)
{
Notify (\_SB.PCI0.UHC3, 0x02)
Notify (\_SB.PWRB, 0x02)
}

Method (_L0E, 0, Serialized)
{
Notify (\_SB.PCI0.UHC4, 0x02)
Notify (\_SB.PWRB, 0x02)
}

Method (_L05, 0, Serialized)
{
Notify (\_SB.PCI0.UHC5, 0x02)
Notify (\_SB.PWRB, 0x02)
}

Method (_L0D, 0, Serialized)
{
If (\_SB.PCI0.EHC1.PMES)
{
Store (0x01, \_SB.PCI0.EHC1.PMES)
Notify (\_SB.PCI0.EHC1, 0x02)
Notify (\_SB.PWRB, 0x02)
}

If (\_SB.PCI0.EHC2.PMES)
{
Store (0x01, \_SB.PCI0.EHC2.PMES)
Notify (\_SB.PCI0.EHC2, 0x02)
Notify (\_SB.PWRB, 0x02)
}
}
這段 EHCI 的修改似乎徹底解決了 EHCI 睡眠問題,至少在我的機器上再也不需要 ehcisleepenabler 了。
順帶提醒:如果那些 _Lxy 方法裡面原本有 HDEF 的通知,請務必刪掉,否則可能會破壞睡眠功能!
最後一個小秘訣:如果你希望用 USB 滑鼠或鍵盤喚醒手提電腦/桌面電腦,可以先從 IORegistry 查出該滑鼠或鍵盤插在哪個 USB 埠,然後在 DSDT 對應的 USB GPE 項目中把 PWRB 改為 SLPB 即可。

祝大家改機愉快!

技術筆記 #14 @candykane 2009-05-13

我剛剛也成功讓電源按鈕在按下時彈出關機/登出對話框了:
CODE
Device (PWRB)
{
Name (_HID, EisaId ("PNP0C0C"))
}

我只不過是把 _HID 改成 _CID 就搞定了。

技術筆記 #15 @candykane 2009-05-13

透過 DSDT 修正音效卡指南
驅動音效卡不應該搞得這麼複雜。既然大家多數都已經在用顯示卡的 device-property 字串(EFI String)或是修改版 DSDT,實在沒道理為了把硬件資訊注入系統而又多載入一個外掛 Kext,直接注入還能節省系統資源。

要讓音效卡正常運作,其實完全不需要 HDAEnabler.kext 或 ALCinject.kext。

真正需要的只有 AlainTox714 修改的 AppleHDA.kext 以及以下 3 項資訊:
layout-id
codec-id
PinConfigurations
你可以透過 device-property 字串注入,或者直接寫進 DSDT(透過 DSDT 的效果往往更理想)。

兩種方法我都實測過,都能成功驅動音效,但 DSDT 方案顯然更符合 ACPI 標準規範。

如果你手頭上的 /System/Library/Extensions/AppleHDA.kext/Contents/PlugIns/AppleHDAController.kext/Contents/Info.plist 檔案裡已經有 ConfigData,你就可以直接從中提取出 PinConfigurations 資料:

(你只需要提取每個 32-bit 區段的最後一個 byte 即可)
<00a71c1f 00a71d40 00a71e21 00a71f02 00b71c40 00b71d90 00b71ea1 00b71f02 00c71c2e 00c71d30 00c71e81 00c71f01 00d71c10 00d71d40 00d71e11 00d71f01 00e71c20 00e71d90 00e71ea1 00e71f01 00f71c12 00f71d10 00f71e11 00f71f01 01071c11 01071d70 01071e11 01071f01 02171c50 02171d21 02171e45 02171f01>

另一個方法是直接打開 Linux 提取出的 Codec Dump 檔案,搜尋包含 [Jack] 的行,將 Pin Default 的十六進位數值按 byte 反轉順序,並依照 Node 節點編號由小到大排列:
CODE
Codec: SigmaTel STAC9274D
Address: 2
Vendor Id: 0x83847621
Subsystem Id: 0x80860419
Revision Id: 0x100201
Default PCM: rates 0x7e0, bits 0x0e, types 0x1
Default Amp-In caps: ofs=0x00, nsteps=0x0e, stepsize=0x05, mute=0
Default Amp-Out caps: ofs=0x7f, nsteps=0x7f, stepsize=0x02, mute=1

Node 0x0a [Pin Complex] wcaps 0x400181: Stereo
Pin Default 0x0221401f: [Jack] HP Out at Ext Front
Conn = 1/8, Color = Green
becomes 1f402101
00a71c1f 00a71d40 00a71e21 00a71f02

Node 0x0b [Pin Complex] wcaps 0x400181: Stereo
Pin Default 0x02a19040: [Jack] Mic at Ext Front
Conn = 1/8, Color = Pink
becomes 4090a102
00b71c40 00b71d90 00b71ea1 00b71f02

Node 0x0c [Pin Complex] wcaps 0x400181: Stereo
Pin Default 0x0181302e: [Jack] Line In at Ext Rear
Conn = 1/8, Color = Blue
becomes 2e308101
00c71c2e 00c71d30 00c71e81 00c71f01

Node 0x0d [Pin Complex] wcaps 0x400181: Stereo
Pin Default 0x01114010: [Jack] Speaker at Ext Rear
Conn = 1/8, Color = Green
becomes 10401101
00d71c10 00d71d40 00d71e11 00d71f01

Node 0x0e [Pin Complex] wcaps 0x400181: Stereo
Pin Default 0x01a19020: [Jack] Mic at Ext Rear
Conn = 1/8, Color = Pink
becomes 2090a101
00e71c20 00e71d90 00e71ea1 00e71f01

Node 0x0f [Pin Complex] wcaps 0x400181: Stereo
Pin Default 0x01111012: [Jack] Speaker at Ext Rear
Conn = 1/8, Color = Black
becomes 12101101
00f71c12 00f71d10 00f71e11 00f71f01

Node 0x10 [Pin Complex] wcaps 0x400181: Stereo
Pin Default 0x01117011: [Jack] Speaker at Ext Rear
Conn = 1/8, Color = Yellow
becomes 11701101
01071c11 01071d70 01071e11 01071f01

Node 0x21 [Pin Complex] wcaps 0x400301: Stereo Digital
Pin Default 0x01452150: [Jack] SPDIF Out at Ext Rear
Conn = Optical, Color = Grey
becomes 50214501
02171c50 02171d21 02171e45 02171f01

取得 PinConfigurations 十六進位資料後,可以用以下終端機指令將它轉換為 device-property XML 檔案所需的 Base64 格式:
CODE
echo "1f4021014090a1022e308101104011012090a101121011011170110150214501" | xxd -r -p | openssl enc -base64
在我的 Intel BadAxe2(STAC9274D)底板上,這會得出:
CODE
H0AhAUCQoQIuMIEBEEARASCQoQESEBEBEXARAVAhRQE= for my BadAxe2 (STAC9274D)

接著找出音效卡所在的 PCI 路徑:
CODE
gfxutil -f HDEF; # if that fails try AZAL in place of HDEF

在 BadAxe2 上得到的結果是:
CODE
DevicePath = PciRoot(0x0)/Pci(0x1b,0x0)

I added the following to my XML file and then regenerated my string using gfxutil: (gfxutil -s -v -n -i xml -o hex in.plist out.hex)
CODE
    <key>PciRoot(0x0)/Pci(0x1b,0x0)</key>
    <dict>
        <key>PinConfigurations</key>
        <data>
        H0AhAUCQoQIuMIEBEEARASCQoQESEBEBEXARAVAhRQE=
        </data>
        <key>codec-id</key>
        <string>0x83847683</string>
        <key>layout-id</key>
        <string>0x04000000</string>
    </dict>

如果有人能寫個小腳本或工具,把 Codec Dump 拖進去就直接算出 PinConfigurations 資料那就太棒了。

最後我選擇在 BadAxe2 上直接用 DSDT 注入,因為我的 DSDT 已經改了這麼多東西,多加這幾十個 bytes 完全不痛不癢,還能省下載入一個多餘的 Kext。

只要符合以下條件,你也可以照做:
1. 你目前正在使用 HDAEnabler.kext 或 ALCinject.kext
2. 你使用 AppleHDA.kext
3. 你已經有(或能提取出)音效卡所需的這三項資訊,以及對應修改好的 AppleHDA.kext
不論用 device-property 字串還是 DSDT 都能達成,但 DSDT 方法好得多。以下附上 BadAxe1(採用 STAC9221D A2,我目前正在整理這塊底板的 DSDT)與 BadAxe2 在 IORegistry 中的 PinConfigurations 資訊,方便大家對照:

BadAxe1:
CODE
| | +-o HDEF@1B <class IOPCIDevice, registered, matched, active, busy 0, retain 8>
| | | | {
| | | | "IOPCIResourced" = Yes
| | | | "IOInterruptControllers" = ("io-apic-0","IOPCIMessagedInterruptController")
| | | | "IOName" = "pci8086,27d8"
| | | | "subsystem-id" = <17040000>
| | | | "IODeviceMemory" = (({"address"=18446744073225109504,"length"=16384}))
| | | | "class-code" = <00030400>
| | | | "revision-id" = <01000000>
| | | | "assigned-addresses" = <10d8008200000000000020e30000000000400000>
| | | | "built-in" = <00>
| | | | "acpi-device" = "IOACPIPlatformDevice is not serializable"
| | | | "name" = "pci8086,27d8"
| | | | "acpi-path" = "IOACPIPlane:/_SB/PCI0@0/HDEF@1b0000"
| | | | "subsystem-vendor-id" = <86800000>
| | | | "reg" = <00d800000000000000000000000000000000000010d800020000000000000000000000000040
000>
| | | | "compatible" = <"pci8086,417","pci8086,27d8","pciclass,040300">
| | | | "PinConfigurations" = <104021021010010120308101104001012190a1011160010130214501>
| | | | "layout-id" = 2
| | | | "IOPCIExpressLinkCapabilities" = 0
| | | | "IOPowerManagement" = {"ChildrenPowerState"=2,"CurrentPowerState"=2}
| | | | "IOInterruptSpecifiers" = (<1600000007000000>,<0400000000000100>)
| | | | "device-id" = <d8270000>
| | | | "vendor-id" = <86800000>
| | | | "device_type" = <"STAC9221A2">
| | | | "codec-id" = 2206496387
| | | | "IOPCIExpressLinkStatus" = 0
| | | | }

BadAxe2:
CODE
| | +-o HDEF@1B <class IOPCIDevice, registered, matched, active, busy 0, retain 8>
| | | | {
| | | | "IOPCIResourced" = Yes
| | | | "IOInterruptControllers" = ("io-apic-0","IOPCIMessagedInterruptController")
| | | | "IOName" = "pci8086,27d8"
| | | | "layout-id" = <04000000>
| | | | "subsystem-id" = <19040000>
| | | | "IOPCIExpressLinkCapabilities" = 0
| | | | "IODeviceMemory" = (({"address"=18446744073226158080,"length"=16384}))
| | | | "class-code" = <00030400>
| | | | "IOPowerManagement" = {"ChildrenPowerState"=2,"CurrentPowerState"=2}
| | | | "revision-id" = <01000000>
| | | | "IOInterruptSpecifiers" = (<1600000007000000>,<0200000000000100>)
| | | | "assigned-addresses" = <10d8008200000000000030e30000000000400000>
| | | | "built-in" = <00>
| | | | "acpi-device" = "IOACPIPlatformDevice is not serializable"
| | | | "device-id" = <d8270000>
| | | | "vendor-id" = <86800000>
| | | | "acpi-path" = "IOACPIPlane:/_SB/PCI0@0/HDEF@1b0000"
| | | | "subsystem-vendor-id" = <86800000>
| | | | "name" = "pci8086,27d8"
| | | | "IOPCIExpressLinkStatus" = 0
| | | | "reg" = <00d800000000000000000000000000000000000010d800020000000000000000000000000040
000>
| | | | "compatible" = <"pci8086,419","pci8086,27d8","pciclass,040300">
| | | | "PinConfigurations" = <1f4021014090a1022e308101104011012090a101121011011170110150214501>
| | | | "codec-id" = 2206496289
| | | | }

如果你不相信不用 HDAEnabler.kext 或 ALCinject.kext 也能驅動音效,不妨親自試試 device-property 字串,或者直接寫進 DSDT 體驗一下!

技術筆記 #16 @candykane 2009-05-13

以下是 DSDT 音效注入的基本程式碼。我提供兩個範例區段,一個是 BadAxe1,另一個是 BadAxe2,請勿同時貼上兩組程式碼。
AUDIO IN DSDT:
CODE
______________________________________________________________

// 這段放在 DSDT 開頭附近(緊接在 Method (_WAK, 1, Serialized) 之後)
Method (DTGP, 5, NotSerialized)
{
If (LEqual (Arg0, Buffer (0x10)
{
/* 0000 */ 0xC6, 0xB7, 0xB5, 0xA0, 0x18, 0x13, 0x1C, 0x44,
/* 0008 */ 0xB0, 0xC9, 0xFE, 0x69, 0x5E, 0xAF, 0x94, 0x9B
}))
{
If (LEqual (Arg1, One))
{
If (LEqual (Arg2, Zero))
{
Store (Buffer (One)
{
0x03
}, Arg4)
Return (One)
}

If (LEqual (Arg2, One))
{
Return (One)
}
}
}

Store (Buffer (One)
{
0x00
}, Arg4)
Return (Zero)
}

______________________________________________________________

// 將全文所有的 AZAL 替換為 HDEF

______________________________________________________________

// BadAxe1 範例(附註解)

______________________________________________________________

// 這段放在 Device (HDEF) 的最末端
// BadAxe1 (D975XBXLKR)
Method (_DSM, 4, NotSerialized)
{
Store (Package (0x08)
{
"codec-id",
Buffer (0x04)
{
0x83, 0x76, 0x84, 0x83 // the hex codec ID (reverse order)
},
"layout-id",
Buffer (0x04)
{
0x02, 0x00, 0x00, 0x00 // the hex layout ID (reverse order)
},
"device_type",
Buffer (0x16) // the hex count + 1 for null terminated ascii string
{
"SigmaTel STAC9221D A2" // the string identifier
},
"PinConfigurations",
Buffer (0x1C) // the actual hex count
{
/* the PinConfigurations data as it appears.
/* 0000 */ 0x10, 0x40, 0x21, 0x02, 0x10, 0x10, 0x01, 0x01,
/* 0008 */ 0x20, 0x30, 0x81, 0x01, 0x10, 0x40, 0x01, 0x01,
/* 0010 */ 0x21, 0x90, 0xa1, 0x01, 0x11, 0x60, 0x01, 0x01,
/* 0018 */ 0x30, 0x21, 0x45, 0x01 /* one entry seems missing */
}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}

______________________________________________________________

// BadAxe2 範例

______________________________________________________________

// 這段放在 Device (HDEF) 的最末端
// BadAxe2 (D975XBX2KR)
Method (_DSM, 4, NotSerialized)
{
Store (Package (0x08)
{
"codec-id",
Buffer (0x04)
{
0x21, 0x76, 0x84, 0x83 // the hex codec ID (reverse order)
},
"layout-id",
Buffer (0x02)
{
0x04, 0x00, 0x00, 0x00 // the hex layout ID (reverse order)
},
"device_type",
Buffer (0x13)
{
"SigmaTel STAC9274D"
},
"PinConfigurations",
Buffer (0x20)
{
/* 0000 */ 0x1f, 0x40, 0x21, 0x02, 0x40, 0x90, 0xa1, 0x02,
/* 0008 */ 0x2e, 0x30, 0x81, 0x01, 0x10, 0x40, 0x11, 0x01,
/* 0010 */ 0x20, 0x90, 0xa1, 0x01, 0x12, 0x10, 0x11, 0x01,
/* 0018 */ 0x11, 0x70, 0x11, 0x01, 0x50, 0x21, 0x45, 0x01
}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}

______________________________________________________________

技術筆記 #17 @kizwan 2009-06-01 ↳ Re: @pentiumpc

Acer 熱鍵啟用工具(Hotkey Enabler)

@pentiumpcFN+F1 don't return any code.. notify SLPB 0x80 will put the system to sleep. FN+F5,FN+F6 will return between 0x20 to 0x2F = 15 steps of brightness. FN+F8 return the next display code, LCD, EXT VGA or both spanning. AC power return 0x50 Batt return 0x51 most of these keys needs a driver to drive it. I am swamped with my day job, thus…

嗨 pentiumpc,

我想向你請教並尋求協助。我想在 OS X 下啟用手提電腦的幾個功能熱鍵。這些熱鍵在 Windows 下需要安裝名為 "Launch Manager" 的公用程式、在 Linux 下則需要載入 "acer-acpi" 模組才能運作,用來控制兩個關鍵硬件裝置的開關:無線網卡與藍牙。幸運的是,無線網卡在手提電腦開機時會自動開啟;但藍牙預設卻是關閉的,導致進入 OS X 後系統完全認不到藍牙,也無法使用。希望你能指點我如何將 "acer-acpi" 移植到 OS X 上。雖然我沒有編寫驅動程式或核心延伸模組(Kext)的經驗,但我學東西很快。

kizwan

技術筆記 #18 @uman 2009-06-02 ↳ Re: @kizwan

Acer-acpi

@kizwanI hope you can help me porting "acer-acpi" to OS X. I don't have experience in driver or kernel extensions programming but I'm a quick learner. kizwan

嗨 kizwan,真高興在這邊也能看到你(而不只是在 InsanelyMac)。我以前也常駐那裡,直到他們論壇改版遷移系統時把我的帳號弄丟了……

關於 acer_acpi:我兒子也有一部 Acer 手提電腦——如果我沒記錯的話型號跟你那部一樣——但它的硬碟快掛了,所以我現在沒辦法拿來測試。無論如何,最好的起點(正如 pentiumpc 所發現的)是參考 superhai 寫的 AMW0.kext。不過 superhai 已經把原始碼從他的主下載頁面移除了,我在網上到處都找不到備份,你可能需要私訊(PM)向他索取。

-u

技術筆記 #19 @uman 2009-06-02

Acer acpi

這搞不好可以直接在 DSDT 裡面搞定。我注意到在我的 Gateway 手提電腦上,DSDT 定義了一堆控制暫存器(Control Registers),我懷疑它們就是用來與熱鍵對接、進而切換無線網卡等硬件開關的介面。

你可以仔細翻翻 DSDT 裡的 Notify 方法,看看有沒有任何東西會在從睡眠喚醒時收到通知。因為進入睡眠時藍牙會被斷電關閉,如果睡眠前藍牙是開啟的,喚醒時系統就必須把它重新打開。所以你應該有機會在裡面找到測試某個暫存器狀態並據此開關裝置的邏輯。

技術筆記 #20 @uman 2009-06-02

kizwan:

你在 DSDT 裡面應該會看到一個名為 AMW0 的裝置(可以參考 acer_acpi 作者 Carlos 寫的這篇筆記:strang eworlds.co.uk/2007/11/24/amw0-later-models-aka-version-2-notes/)。

在還沒看過你 DSDT 的情況下,我猜這些控制硬件開關的功能鍵,很可能是寫在需要先檢查作業系統是否為 Windows 的 DSDT 條件區段內。你的 DSDT 裡有沒有只有在 _OSI 為 Windows 時才會執行的呼叫?我的電腦就有。

如果是這樣,那麼你「有可能」可以先在 DSDT 中強制啟用這些原本限定 Windows 的區段,接著再寫一個簡單的 Kext 去呼叫 DSDT 裡定義的 AMW0 裝置。說不定 superhai 當初就是這樣做的。

技術筆記 #21 @kizwan 2009-06-03

抱歉這麼晚才回覆,有人回帖時我沒有收到電郵通知。

你說得沒錯,這是我從我的 dsdt.dsl 檔案裡找到的段落:

        Device (AMW0)
        {
            Name (_HID, "pnp0c14")
            Name (_UID, Zero)
            Name (WLMP, Zero)
            Name (WMID, Zero)
            Name (B0ED, Buffer (0x04)
            {
                0x00, 0x00, 0x00, 0x00
            })
            CreateDWordField (B0ED, Zero, WLID)
            Name (B1ED, Buffer (0x04)
            {
                0x00, 0x00, 0x00, 0x00
            })
            Name (B2ED, Buffer (0x04)
            {
                0x00, 0x00, 0x00, 0x00
            })
            CreateDWordField (B2ED, Zero, BUID)
            Name (_WDG, Buffer (0x0118)

還有這段:

    Scope (_SB)
    {
        Method (_INI, 0, NotSerialized)
        {
            Store (0x07D0, OSYS)
            If (CondRefOf (_OSI, Local0))
            {
                If (_OSI ("Linux"))
                {
                    Store (One, LINX)
                }

                If (_OSI ("Windows 2001"))
                {
                    Store (0x07D1, OSYS)
                }

                If (_OSI ("Windows 2001 SP1"))
                {
                    Store (0x07D1, OSYS)
                }

                If (_OSI ("Windows 2001 SP2"))
                {
                    Store (0x07D2, OSYS)
                }

                If (_OSI ("Windows 2006"))
                {
                    Store (0x07D6, OSYS)
                }
            }

我已經花了幾天時間研究如何單靠修改 DSDT 來解決這個問題,但還是毫無斬獲。我會試著向 superhai 請教關於 AMW0.kext 的事。其實就算在 Windows(XP 與 Vista)下,如果不安裝 "Launch Manager" 這個程式,機身上的藍牙與無線網卡按鍵也一樣是毫無反應的。

我會再仔細研究我的 DSDT,看看能不能直接改出來。

謝謝你的回覆!

kizwan

技術筆記 #22 @uman 2009-06-03

你可以先忽略 _INI 那段程式碼,它只是設定作業系統版本變數(OSYS),供後面其他 Method 檢查並執行對應的分支邏輯。

你真正需要確保的是在 Device (AMW0) 內部沒有任何綁定 Windows 才執行的限制邏輯。這樣一來,該裝置就能完整初始化並掛載進 IORegistry 裡。接著配合 superhai 的 Kext,你應該就能:(a) 將你想要的開關行為直接寫死(hard-code)在驅動裡,或者 (b) 寫一個類似 Launch Manager 的 OS X 圖形介面程式(GUI),透過 User-Client 介面與核心內的 Kext 物件通訊。

如果 superhai 的 AMW0 是基於 IOKit 撰寫的,你可以使用標準的 Device Interface 來操作(參考 Apple 開發者文件:gemma.apple.com/documentation/DeviceDrivers/Conceptual/AccessingHardware/AH_IOKitLib_API/AH_IOKitLib_API.html#//apple_ref/doc/uid/TP30000380-BAJDAJDJ)。

我很樂意幫忙,但因為我手頭上暫時沒有 Acer 機器可以實測,恐怕幫不上太多忙。要是 pentiumpc 願意公開他的原始碼,你就能參考他的寫法,因為華碩的 "ASUS010" 或 "ATKD" 裝置跟 Acer 的 AMW0 應該非常類似,底層八成都是基於微軟的 WMI(Windows Management Instrumentation)介面實作的。

最值得參考的指南還是 Linux 社群 Carlos 對 acer_acpi 的研究成果。祝你順利!

技術筆記 #23 @THeKiNG 2009-06-03

我是一位既開心又鬱悶的 Asus M50SV 手提電腦用家。
我也遇到了同樣的 Fn 熱鍵問題……
在我的機器上,開箱即用(OOTB)的有:Wi-Fi/藍牙切換(F2)、睡眠(F1)、亮度調節(F5+F6,但必須先在 Windows 下把環境光感應器關閉)、關閉/開啟 LCD 螢幕(F7);而按 F8 切換 LCD/VGA 外接螢幕則會導致系統瞬間重啟,其餘的 Fn 組合鍵與多媒體鍵則完全沒有反應。
我試過安裝 pentiumpc 的 Kext(pkg),但完全沒作用。我覺得這很正常,因為我的 DSDT 裡面根本沒有 ASUS010,而是在 ATKD 裝置下定義了 ATK0100。我試著修改 Kext 的 plist 去配對我的硬件 ID,但依然無效。

後來我找到一個很棒的軟體(可惜只有 Windows 版):ASUS Notebook Keys (forum.noteboo kreview.com/showthread.php?t=150016),可以用來重新映射多媒體鍵與 Fn 熱鍵。我利用它成功捕捉到了那些在 OS X 下失效的多媒體鍵與 Fn 鍵的事件代碼;而且該軟體還公開了原始碼 (rapid share.com/files/74365305/AsusNbKeys_v1.3_SRC.zip),如果有人能結合 Linux 的 ACPID(acpid.sourc eforge.net/)移植到 OS X 上,或許就能讓所有熱鍵完美運作……
至於觸控板的多媒體切換功能,連這個軟體也捕捉不到事件,這讓我懷疑它完全是由 Synaptics 專有驅動在底層處理的。不過有個很神奇的現象:如果我在 Windows 下把觸控板設為「偵測到外接滑鼠時永遠保持多媒體模式」,那麼重啟進入 OS X 後,觸控板上的多媒體背光燈依然會亮著(只是拔掉外接滑鼠時不會自動熄滅),看來 Windows 驅動在某處設定了一個 ACPI 旗標……這點我還得再深入研究。

以下是我捕捉到的按鍵事件代碼列表:

失效的多媒體播放方向鍵:
Fn + "":
->:Event: 0x41 - 快轉(Fast forward)
<-:Event: 0x40 - 倒轉(Rewind)
^ :Event: 0x43 - 停止(Stop)
v :Event: 0x45 - 播放/暫停(Play/Pause)

功能鍵(Fn + F1-F12):
Fn + "":

F1:Event: 正常運作 - 因為一按就進入睡眠所以抓不到代碼
F2:Event: 0x5D 正常運作 - Wi-Fi/藍牙開關切換
F3:Event: 0x50 - 啟動郵件程式(Mail App)
F4:Event: 0x51 - 啟動瀏覽器(Launch browser)
F5:Event: 0x2D 正常運作 - 調低螢幕亮度
F6:Event: 0x1E 正常運作 - 調高螢幕亮度
F7:Event: 0x34 正常運作 - 開啟/關閉 LCD 背光
F8:Event: 0x61 - LCD/VGA 顯示切換(一按就會瞬間重啟)
F9:Event: 0x68 - 未知
F10:Event: 0x32 - 靜音(Mute)
F11:Event: 0x31 - 調低音量(Volume down)
F12:Event: 0x30 - 調高音量(Volume up)

失效的鍵盤組合鍵(+Fn):
Fn + "":
T:Event: 0x99 - 數據機開關(Modem on/off)
A:Event: 0x7A - 環境光感應器開關(Ambient light sensor)
C:Event: 0x8A - 未知
V:Event: 0x82 - 螢幕截圖(我猜的)
Space:Event: 0x5C - 啟動 Power4Gear 省電模式切換

機身獨立多媒體鍵:
Button 1:Event: 0x5C - 功能同 Fn+Space = 啟動 Power4Gear
Button 2:Event: 0x6B - 未知
Button 3:Event: 0x5C - 未知
Button 4:Event: 0x95 - 未知
請問各位對於如何修復剩下這些失效的 Fn 熱鍵有什麼想法嗎?

技術筆記 #24 @uman 2009-06-03

我會抽空去看看 acpid 的架構。

因為我自己沒有華碩手提電腦、對它的架構也不熟,除了以下幾點外我沒辦法給出太具體的建議:

1. 多參考 Linux 社群的成果——他們在 ACPI 逆向工程方面領先 OSx86 社群太多了。
2. 我贊同你的方向。要徹底馴服這頭怪獸,正確的做法應該是打造一套通用框架(就像 Linux 努力在做的那樣),再針對不同手提電腦/桌面電腦載入特定的規則庫或外掛。目前 OSx86 圈子裡太多人只針對單一機種寫死修改——例如玩 Dell Mini 的玩家把 ApplePS2Keyboard.cpp 改得面目全非,雖然修好了某些通病,但也把它改得只能在 Dell Mini 上用,對其他人毫無幫助。
3. 或許我們可以召集幾位手頭上擁有不同廠牌手提電腦/桌面電腦的開發者,一起合作寫出一個通用的 ACPI/WMI 基礎驅動,並支援透過外掛模組(Plugins)或 User-space GUI 來靈活客製化。

技術筆記 #25 @THeKiNG 2009-06-04 ↳ Re: @uman
@umanI will take a look at acpid. Since I don't have and am not familiar with ASUS, I don't have any good advice, other than: 1. Look to Linux-- they're way ahead of the OSX scene. 2. I think you are right. They way to solve this beast is a general solution, like Linux has tried to do, with laptop/desktop-specific code in libraries that…

哇!
回覆真快!
我剛才突然想起,superhai 以前跟我提過 ACPID 在 OS X 上派不上用場(因為核心缺少了某些對應介面),所以不用浪費時間看它了……
相信我,我已經翻遍了網上所有關於這部手提電腦在 Linux 下的資料,但因為底層機制不同,對 OS X 幾乎沒有直接幫助。
至於 ApplePS2,你試過 VoodooPS2 嗎?我已經用了很長一段時間,沒有遇到什麼大問題。
我也認為 superhai 的 AMW0 是個很好的起點,而且確實應該做成通用架構,再針對各家廠商的專屬實作提供外掛。
我自己並不是程式開發者,也不懂任何程式語言,我只是憑著邏輯推理和深入搜尋,把手頭上能找到的東西拿來拼湊測試而已。

技術筆記 #26 @kizwan 2009-06-05 ↳ Re: @uman
@umanYou can ignore the _INI code. That's just setting the OS version so that other methods can test it and do different logic. All you need to do is ensure that in the Device(ANW0) there isn't any Windows-specific logic going on. That way the device gets fully defined, and will be inserted into the ioreg. Using superhai's kext, you should…

我會好好研讀那份開發者文件,應該需要花點時間消化理解。

與此同時,我也試著根據我的 dsdt.dsl 裡存在的 Name 與 Method 修改了 AMW0.kext 的原始碼。雖然編譯載入後 IORegistry 裡確實出現了新的 AMW0 節點,但機身上的熱鍵按鈕依然沒有反應。

看來 AMW0.kext 還需要大量修改工作。或許我可以從 ACPI4ASUS.kext 的原始碼裡學到更多實作細節。

你能指點一下該如何在 dsdt.dsl 裡找出負責處理熱鍵按鈕動作的 Name 或 Method 嗎?我試著拿我的 DSDT 跟真機 MacBook3,1 的 DSDT 比對,但還是摸不著頭緒。另外,下面這個函式是不是用來指示無線網卡在開機 POST 階段自動開啟的?

    Method (LAMN, 1, NotSerialized)
    {
        If (\_SB.AMW0.WLMP)
        {
            Store (Arg0, \_SB.AMW0.WLID)
            Notify (\_SB.AMW0, 0xB0)
        }
        Else
        {
            PHSR (0x1F, Arg0)
        }
    }

kizwan

技術筆記 #27 @uman 2009-06-08

很遺憾,我自己也還在摸索學習 DSDT。而且絕大多數廠商根本不會公開任何關於這些 ACPI 裝置或內部 Method 的技術文件,恐怕只能靠不斷嘗試與除錯(Trial and Error)來推敲。

方便把 AMW0.kext 寄給我嗎?等我寫完手頭上的 SD 讀卡機驅動程式後(假設我兒子的 Acer 手提電腦能修好),我可以拿來把玩研究看看。

技術筆記 #28 @kizwan 2009-06-09 ↳ Re: @uman
@umanUmm. The source of the AMW0 kext. Thanks.

你可以在這裡下載 AMW0.kext 與它的原始碼:
supe rhai.com/xdarwin.html

原來你正在開發 SD 讀卡機的驅動程式!這太令人期待了。請問你的驅動程式有機會支援德州儀器(Texas Instruments, TI)的 SD 讀卡機晶片嗎?

另外,你的 GMA950 顯示卡還有破圖/畫面異常(artifacts)的問題嗎?你有試過 Natit.kext 或 EFI String 嗎?

kizwan

技術筆記 #29 @uman 2009-06-09 ↳ Re: @kizwan
@kizwanYou can download the AMW0.kext & source code here:- supe rhai.com/xdarwin.html

[拍額頭]我居然漏看了那個頁面!非常感謝你的連結!如果那部 Acer 下週左右能修好拿回來,我就來動手試試。

@kizwanSo, you're working on driver for SD card reader. That is interesting. Is there any chances that Texas Instrument SD card reader supported by your driver?

沒錯,正是針對 TI 晶片寫的——因為我的 Gateway 和 Acer 手提電腦裡裝的都是 TI 讀卡機。這主要是為了讓我自己練練手、熟悉 IOKit 與核心驅動程式開發。我還有其他想做的項目,所以想先挑個規模較小的專案來入門。

@kizwanYou still have problem with GMA950 (artifacts)? Have you try Natit.kext or EFI string?

我目前直接沿用 iPC 整合碟裡附帶的那兩個 Kext,還沒細看它們具體做了什麼。因為畫面瑕疵非常輕微,所以我還懶得去深究。之後我可能會試試看透過 DSDT 注入來解決,畢竟我也想精進 DSDT 修改技巧——不過你也知道,改 DSDT 實在是非常耗時費神!

-u

技術筆記 #30 @uman 2009-06-09 ↳ Re: @kizwan
@kizwanSo, you're working on driver for SD card reader. That is interesting. Is there any chances that Texas Instrument SD card reader supported by your driver?

看到昨天的新聞說 Apple 在新款 MacBook 上正式內建了 SD 讀卡機插槽,我決定先把這個開發計劃暫緩。我想先看看 Apple 官方原生驅動是怎麼實作的,再決定下一步。

展開其餘 64 則社群技術筆記完整歷史討論紀錄
技術筆記 #31 @THeKiNG 2009-06-10 ↳ Re: @uman
@umanI've put this on hold with yesterday's news that Apple is including SD card slots on the new macbooks. I'd like to see what they have done before proceeding.

For sure they use USB SD Reader i bet on that...
Wonder where did PentiumPC go...
Maybe he can release the source for ACPI4Asus.kext to help us understand what he did and maybe someone can continue his work, if he has no time for that, for the rest of the custom "OEM" stuff that make our life's so PITA.

技術筆記 #32 @kizwan 2009-06-10 ↳ Re: @uman
@umanI'm using the two? kexts that I found in iPC. I didn't really pay much attention to what they do. The artifacts are minor enough that I haven't bothered to track them down. I may try the DSDT approach, since I want to get better at DSDT mods, but it's so time-consuming, as you've no doubt found out! -u

I was using Natit.kext for GMA950 on Acer Aspire 3680. No artifacts…that I can confirm. Right now I'm using EFI string. Don't forget to restore vanilla AppleIntelIntegratedFramebuffer.kext. Don't get excited yet, dual monitor only works with mirror mode.

I still unable to get display working with DSDT yet except for nVidia Go 7300 on Aspire 9420.

kizwan

技術筆記 #33 @kizwan 2009-06-10 ↳ Re: @uman
@umanI've put this on hold with yesterday's news that Apple is including SD card slots on the new macbooks. I'd like to see what they have done before proceeding.

I only heard new iPhone is coming soon…iPhone 3G S. ^_^

技術筆記 #34 @uman 2009-06-18

King,

It may be that your DSDT just has functions defined for Windows, especially since Linux guys also had problems.

Have you talked to or contacted the people at OSXCORES? They have patched BIOSes for OSX:

M50SV AS207 (osxcores.sit e50.net/user/image/asus-m50sv-as207.zip)
ASUS

M50V as209 (osxcores.sit e50.net/user/image/m50vas.209.zip)
ASUS

I'm not sure what fixes they have made, but they do custom work too. See:
osxcores.sit e50.net/services.htm

Perhaps they can help.
-u

技術筆記 #35 @kizwan 2009-06-24

uman,

Just got a reply from Superhai. Its look like Superhai will not continue AMW0 project. Is there anybody interested continuing his project? :'(

Other topic…
Sleep:-
I found out that by deleting entry for EHCI devices in Acer Aspire 9420 DSDT, it was able to sleep. Now the EHCI devices detected as external/expansion card. Funny thing is external hard disk, which connected to EHCI port, is not turn off when putting laptop to sleep. Is this also happen with real MacBook?

I tried to compare DSDT from MacBook3,1 with mine and I found this:-
Acer Aspire 9420:-

        Method (_L03, 0, NotSerialized)
        {
            Notify (\_SB.PCI0.USB1, 0x02)
        }

MacBook3,1:-

        Method (_L03, 0, NotSerialized)
        {
            Notify (\_SB.PCI0.UHC1, 0x02)
            Notify (\_SB.PWRB, 0x02)
        }

I know that "Notify (\_SB.SLPB, 0x80)" will put computer to sleep but I don't know what "Notify (\_SB.PWRB, 0x02)" do. Do you know what "Notify (\_SB.PWRB, 0x02)" means? In my DSDT, PWRB is handle by SLPB (handle both sleep-button & power-button).

I also found "extra" method in EHCI function (MacBook3,1):-

                Method (_DSM, 4, NotSerialized)
                {
                    Store (Package (0x07)
                        {
                            "AAPL,current-available", 
                            0x04B0, 
                            "AAPL,current-extra", 
                            0x02BC, 
                            "AAPL,current-in-sleep", 
                            0x03E8, 
                            Buffer (0x01)
                            {
                                0x00
                            }
                        }, Local0)
                    DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
                    Return (Local0)
                }

I think instead of removing EHCI entry from DSDT, maybe I can use this code to set EHCI device as external device. Maybe this can fix sleep issue too.

Clamshell:-
Does real MacBook automatically resume from sleep when lid is open? Or still need to push keyboard button to resume from sleep, just like windows?

kizwan

技術筆記 #36 @uman 2009-06-24 ↳ Re: @kizwan
@kizwanuman, Just got a reply from Superhai. Its look like Superhai will not continue AMW0 project. Is there anybody interested continuing his project? :'(

I wish I could say yes, but my son's Acer has qualified for a replacement. So I won't have a machine that has an AMW0 to test. And that is a huge problem for development. As I understand it, Superhai's AMW0 basically allows you to call into the AMW0 device. The Linux project acer-acpi (and it's successor wmi-acpi) does the same, and supplies some utilities so that you can call/respond to the AMW0 methods.

The IOKit doc is pretty good at showing how to make a user-callable module that calls in-kernel routines. So if you know (or have someone who has an Acer and knows C) it shouldn't be hard to hack. My suggestion is to start a mini-group of Acer users, and see if anyone has any dev experience amongst the group.

Other topic… Sleep:- I found out that by deleting entry for EHCI devices in Acer Aspire 9420 DSDT, it was able to sleep. Now the EHCI devices detected as external/expansion card. Funny thing is external hard disk, which connected to EHCI port, is not turn off when putting laptop to sleep. Is this also happen with real MacBook?

I don't think you want to delete the EHCI devices. I think you need to Notify them like on my MacBook Pro DSDT.

I know that "Notify (\_SB.SLPB, 0x80)" will put computer to sleep but I don't know what "Notify (\_SB.PWRB, 0x02)" do. Do you know what "Notify (\_SB.PWRB, 0x02)" means? In my DSDT, PWRB is handle by SLPB (handle both sleep-button & power-button).

The Mac has 3 devices: PWRB (power button), SLPB (sleep button), and LID0 (the lid switch). Most hackbooks don't have all of these. I believe my gateway only had SLPB (although I am not sure-- my DSDT.dsl does have a PWRB, but I may have added it).

The power button has multiple functions. Normally if you hit it, it brings up a menu to sleep, shutdown, restart or cancel. But when the Mac is already sleeping (not thru lid sleep), it will wake from sleep. there is also some programmatic control of it in the System preferences. When a Mac has slept through the lid switch, then opening the lid switch resumes the Mac.

I also found "extra" method in EHCI function (MacBook3,1):- Method (_DSM, 4, NotSerialized) { Store (Package (0x07) { "AAPL,current-available", 0x04B0, "AAPL,current-extra", 0x02BC, "AAPL,current-in-sleep", 0x03E8, Buffer (0x01) { 0x00 } }, Local0) DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) } I think instead of…

Strange my Macbook dsdt does not have this code AT ALL.

Clamshell:- Does real MacBook automatically resume from sleep when lid is open? Or still need to push keyboard button to resume from sleep, just like windows?

Opening the lid resumes from sleep.

I'm sorry I can't be of much use now. I'm hoping next week that I will find the time to backup and do a retail install of 10.5.7. Only then will I try more DSDT hacking, since right now my machine is a mess of hacked kexts!

-u

技術筆記 #37 @kDawg 2009-07-15

Multiple video card mods

Has anyone done any work trying to integrate multiple video cards? I've been searching for weeks. Trying to find info regarding DSDT in general is tough.

技術筆記 #38 @aschar1 2009-08-07

Fixing sleep and usb after wake up

I finally fixed sleep on my lappie!

Hi candykane,

did you already update to 10.5.8 and is your sleep fix stillworking?
Apple probably changed something in Powermanagement which is breaking sleep on most installs.
Do you use Openhaltrestart.kext or is sleep working without it?

Thanks Al

技術筆記 #39 @sk1nhd33t 2009-08-09 ↳ Re: @pentiumpc
@pentiumpcchange _HID to _CID Device (PWRB) { Name (_HID, EisaId ("PNP0C0C")) ---> Name (_CID, EisaId ("PNP0C0C")) Name (_UID, 0xAA) Name (_STA, 0x0B) } This one I got it off some site, cannot remember where. (credit goes to him/her) This will activate your power button to bring up the shutdown menu.

hmm weird, tried doing this on my gigabyte board but the shutdown menu wont show, when i press the power button my hack will just sleep thats it

技術筆記 #40 @The Edge3000 2009-08-11 ↳ Re: @sk1nhd33t
@sk1nhd33thmm weird, tried doing this on my gigabyte board but the shutdown menu wont show, when i press the power button my hack will just sleep thats it

Uncheck "Allow power button to put the computer to sleep" in energy saver =P.

技術筆記 #41 @Gurruwiwi 2009-08-17

I dont mean to hijack the thread, but what beeter place for 2 quick DSDT questions for people who actually seem to know what they are talking about !
No one has been able to answer me, well... because no one seems to actually KNOW what they are saying... Please please help!
DSDT is the voodoo of computers for to me loool...
Ok, I've got 2 Acer laptops and 1 Asus laptop. Just for reference. All had OSx, 10.4 to 10.5, many distros, my latest and greatest in my sig.

How on earth do I know if DSDT is doing something or not ?

iAtkos v7 Chameleon 2 RC1 (now RC2) and fassls DSDT script checked. DSDT.aml
is in root, but I tried in Extra folder and felt absolutely no difference.
On first boot I press power, poweroff window comes up (native install) My multimedia controller on my keyboard controls volume and front row funtions! (photos in link in signature) - Video card not detected (but with strings + 2 kext native HD res QE etc)
Out of the box, FN and up down increases/decreases screen brightness. Other fn work, very few dont.
. Audio works OTB, clicks pops etc, no internal or external mic. VoodooHDA is the same,
Ehternet with kext only... didnt try stringing it because I got it to work
So how do I know if DSDT is working? if I remove it I am almost certain my laptop will respond the same.

My previous laptops, NONE used DSDT, I pressed power button, they worked fine! Brightness and other stuff too... etc etc
and I am scared because I read sometimes
"Patch DSDT at you own risk! !
as in flashing the bios or something... can I bick my laptop with DSDT !?! When can DSDT be dangerous?

I want to try decompiling and fixing my dsdt for Snow... but I dont even know if

1) I actually need it
2) If it is working or not
3) it is dangerous, or when is it dangerous?

ok, three questions

"

技術筆記 #42 @kizwan 2009-08-17 ↳ Re: @Gurruwiwi
@Gurruwiwi1) I actually need it 2) If it is working or not 3) it is dangerous, or when is it dangerous? …

1) You don't need it unless you need it. If everything is working properly, so you don't need it. DSDT override just for PC that have problem with CPU alias (only can use one core), sound, graphic card, power management & etc.
2) It is working.
3) No hard evidence that it is dangerous. DSDT override can be applied by 2 ways; i) by using dsdt.aml file. ii) by flashing it to ROM permanently. Of course the second one is dangerous if you do it wrongly.

kizwan

技術筆記 #43 @Gurruwiwi 2009-08-17

thanks for the reply

Ah, ok, you can actually flash a BIOS to mimic hardware change... ouch! no thanks.

The thing is kizwan, if I remove the DSDT.aml file, my system boots (Leo) and behaves the same! Which is really weird since I have perfect use of my multimedia pad (volume, next song, ff, rw, mute, hold and, believe it or not, and, the "enter" button works the same as Enter key, the arrows next to it like cursor, and the envolving white lines "tabs" stuffs depending on program, firefox, openoffice, folders, etc...) and 75% of bios FN keys etc.

For instance, my webcam, out of the box, reads in profile as "Acer Crystal Eye Webcam" - 100% opertional including ichat, ibooth, etc, which is know to crash with some "working" webcams - this withou dsdt or patching or stringing

That is why I say I have no idea, following logic from what I read, how the DSDT WORKS to help boot or not. even if its not present this laptop boots Leo like if it had.

Now I do have dual boot with dsdt present on both sides, but I guarantee you with single boot I had this behaviour

技術筆記 #44 @EnzoFX 2009-09-03

So the powerbutton fix, will make my power button do either sleep or shutdown/logout/resatart prompt? It depends on the setting in System Prefs is what you guys are saying? (Once enabled through dsdt)

My power button currently does nothing! =P

技術筆記 #45 @kizwan 2009-09-03 ↳ Re: @EnzoFX
@EnzoFXSo the powerbutton fix, will make my power button do either sleep or shutdown/logout/resatart prompt? It depends on the setting in System Prefs is what you guys are saying? (Once enabled through dsdt) My power button currently does nothing! =P

For a working power button in Mac OS X, a dialog box will appear if you press the power button. In this dialog box, you have a choice either you want to sleep, restart or shutdown (you will see all of the 3 choices).

If your power button does nothing, it means it have not yet enabled in DSDT (most machine has this enabled by default). If you have tried to enabled it in DSDT, maybe the code is wrong. Try to check it again.

kizwan

技術筆記 #46 @EnzoFX 2009-09-03

I have not tried, but I will.

I was just wondering if what it did (Once working) depended on the setting in Sys Prefs. I.e. whether it just sleeps, or if it gives you the shutdown/etc options.

技術筆記 #47 @kizwan 2009-09-03 ↳ Re: @EnzoFX
@EnzoFXI have not tried, but I will. I was just wondering if what it did (Once working) depended on the setting in Sys Prefs. I.e. whether it just sleeps, or if it gives you the shutdown/etc options.

Once it working it will always shows you the options, either sleep, shutdown or restart. There is no setting in System Preferences for power button.

kizwan

技術筆記 #48 @The Edge3000 2009-09-07

I applied the power button fix. However, It only seems to work when I check the box to allow it to sleep the computer. Other than that, it does nothing - no menu or anything.

技術筆記 #49 @Common_Sense 2009-09-08

I applied the power button fix but it doesn't work, when I press it my computer will enter sleep mode without displaying any message just like it did before I applied the fix, I have a gigabyte EP45-DS3LR, anyone knows whats wrong?, this is how the DSDT looks like:

Device (PWRB)
{
Name (_HID, EisaId ("PNP0C0C")) --> Name (_CID, EisaId ("PNP0C0C"))
Method (_STA, 0, NotSerialized)
{
Return (0x0B)
}
}

技術筆記 #50 @gnychis 2009-09-25

I have a Thinkpad X300, that whenever I put to sleep, I see the wireless light blink, and the the laptop wakes up. It seems as though the wireless card is waking the system after a second or two every time I sleep it.

Does anyone have any recommendations for this in terms of the DSDT? I've attached mine if it helps.

技術筆記 #51 @msingh 2009-10-05

DSDT advice needed

My system is a Dell D830.

After a lot of tinkering around, I managed to install Snow Leopard on it. Please see my guide ↗.

I did a few DSDT mods to get some basic fixes.

Now, the system sleeps (S3 suspend to ram) but does not deep sleep (S5 suspend to disk), shutdown or reboot. I am using OpenHaltRestart.kext and SleepEnabler.kext. The latter made it possible to even suspend.

I am including my dsdt.dsl (which includes my fixes, by the way).

I see tantalizing references to the sleep button, SBTN, etc., but I have not found any systematic documentation for the code (btw. I am comfortable with coding as I do plenty of numerical coding in my work).

Can anyone take a look and let me know what I need to do to fix my poweroff and hibernate problem ?

The DSDT repository does not contain a fixed DSDT for my laptop.

PS: Microsoft's ASL compiler should be outlawed.

技術筆記 #52 @2nerd4u 2009-10-20 ↳ Re: @sk1nhd33t
@sk1nhd33tchange _HID to _CID Device (PWRB) { Name (_HID, EisaId ("PNP0C0C")) ---> Name (_CID, EisaId ("PNP0C0C")) Name (_UID, 0xAA) Name (_STA, 0x0B) } This one I got it off some site, cannot remember where. (credit goes to him/her) This will activate your power button to bring up the shutdown menu.

hmm weird, tried doing this on my gigabyte board but the shutdown menu wont show, when i press the power button my hack will just sleep thats it
mine will shut down instantly
edit: well actually it just goes to sleep mode verry fast^^ too bad my system wont wake from sleep...

技術筆記 #53 @Sweaty 2009-12-21

DSDT shutdown patch

With this and new restart patch chameleon booter from Duvel (strong beer that) I have only fakesmc as an added kext, although I'm about to reinstall voodoohda so I can hopefully have two soundcards working.. anyway this is mm67's work I just found it a pain to find the detail on insane so posting it here.. Thanks to all who put together these fixes. Need to add the two operation region bits and change your method PTS

    OperationRegion (DEBG, SystemIO, 0x80, One)
    Field (DEBG, ByteAcc, NoLock, Preserve)
    {
        DBG1,   8
    }

    OperationRegion (PMRS, SystemIO, 0x0430, 0x13)
    Field (PMRS, ByteAcc, NoLock, Preserve)
    {
            ,   4,
        SLPE,   1,
                Offset (0x08),
        GPSE,   16, 
        GPSS,   16,
                Offset (0x12),
            ,   1, 
        SWGC,   1 
    }

    Method (_PTS, 1, NotSerialized)
    {
        Or (Arg0, 0xF0, Local0)
         Store (Local0, DBG1)
        Store (Zero, \_SB.PCI0.LPCB.AG3E)
        If (LEqual (Arg0, 0x05))
        {
            Store (Zero, SLPE)
            Sleep(0x10)
        }
    }

also your LPCB has to be like so

            Device (LPCB)
            {
                Name (_ADR, 0x001F0000)
                OperationRegion (LPC0, PCI_Config, 0xA4, 0x02)
                Field (LPC0, ByteAcc, NoLock, Preserve)
                {
                    AG3E,   1
                }

I suppose add device ID if you need it, I'm on ICH10 so don't.

Also attaching blackosx's duvel+rekursor version of RC4 here, replace your chameleon boot file with the one from here and add these to boot.plist to get unique UUID and restart fix:

    <key>DeviceID</key>
    <string>XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX</string>

    <key>RestartFix</key>
    <string>YES</string>
技術筆記 #54 @mm67 2009-12-21 ↳ Re: @Sweaty
@SweatyWith this and new restart patch chameleon booter from Duvel (strong beer that) I have only fakesmc as an added kext, although I'm about to reinstall voodoohda so I can hopefully have two soundcards working.. anyway this is mm67's work I just found it a pain to find the detail on insane so posting it here.. Thanks to all who put…

It's only this :

    OperationRegion (PMRS, SystemIO, 0x0430, 0x13)
    Field (PMRS, ByteAcc, NoLock, Preserve)
    {
            ,   4,
        SLPE,   1,

and this:

        If (LEqual (Arg0, 0x05))
        {
            Store (Zero, SLPE)
            Sleep(0x10)
        }

that make the shutdown work, rest of the code is Gigabyte specific. This address 0x0430 is also motherboard specific, it is PMBASE+30h. Address of PMBASE is defined in FACP, on most boards it can also be checked from processor definitions. For example I have this in my dsdt:

Processor (CPU0, 0x00, 0x00000410, 0x06)

Here 0x00000410 is referring to PMBASE+10h so I use 0x430 on my Gigabyte board. On my MSI board's dsdt I have this:
Processor (P001, 0x01, 0x00000810, 0x06) {}

So in MSI shutdown code I use this:
OperationRegion (PMRS, SystemIO, 0x0830, 0x13)

技術筆記 #55 @Sweaty 2009-12-21

Ok cheers mate, had to add the other bits on my board (asus p5ql/epu) to get it to compile, I'll try the simpler way later.. At least it did work the way I bodged it

EDIT: OK fixed code as you suggested I needed to use 0x830, also got rid of unnecessary bits, sometimes I needed to turn PSU off with 0x430 (before I could restart, shutdown was complete), that seems fixed now. Thanks a lot.

技術筆記 #56 @adityaxavier 2010-01-09

Im in a fix.. Everywhere there is a DSDT Fix for getting the USB port to be displayed as Built-in but i need the opposite..
USB - 3 shows as built-in, but it has bluetooth. hence on sleep i loose bluetooth.. if i remove the entry altogether, i have it as external but my sleep fails..

Am having Lenovo T60p. with ICH7-M chipset.

Thanks,
Xavier

技術筆記 #57 @ping99 2010-01-18

Shutdown & Restart with sleep fix-Thanks to Sweaty & mm67

Many thanks to Sweaty and mm67. You are really nice. This resolve the problem I thought it would never be resloved.

I just made a small change to Method (_PTS, 1, NotSerialized) in order to resolve sleep issue on my notebook CQ60-202TX. Now let me put all together step by step as a guide. This might help newbie.

1 Add OperationRegion below before Method (_PTS, 1, NotSerialized)
OperationRegion (DEBG, SystemIO, 0x80, One)
Field (DEBG, ByteAcc, NoLock, Preserve)
{
DBG1, 8
}

OperationRegion (PMRS, SystemIO, 0x0430, 0x13)
Field (PMRS, ByteAcc, NoLock, Preserve)
{
, 4,
SLPE, 1,
Offset (0x08),
GPSE, 16,
GPSS, 16,
Offset (0x12),
, 1,
SWGC, 1
}

2 Check Device (LPC) if there is a similar Operation Region "LPC" like below. If you don't have LPC device, just search Name (_ADR, 0x001F0000), sometimes the device name is different.
Device (LPC)
{
Name (_ADR, 0x001F0000)
OperationRegion (LPC0, PCI_Config, 0xA4, 0x02)
Field (LPC0, ByteAcc, NoLock, Preserve)
{
AG3E, 1
}
If there is no OperationRegion LPC, please add code above. In my dsdt's OperationRegion LPC0, there is an EXPE instead of AG3E. So I did not modify it, but had to change a bit in Method (_PTS, 1, NotSerialized) . See mine below:
OperationRegion (LPC0, PCI_Config, 0x40, 0xC0)
Field (LPC0, AnyAcc, NoLock, Preserve)
{
Offset (0x60),
, 10,
EXPE, 1
}

3 Add code below in Method (_PTS, 1, NotSerialized) like this
Method (_PTS, 1, NotSerialized)
{
Or (Arg0, 0xF0, Local0)
Store (Local0, DBG1)
Store (Zero, \_SB.PCI0.LPC.EXPE) //Please change to \_SB.PCI0.LPC.AG3E if you don't have the EXPE, but add AG3E.
If (LEqual (Arg0, 0x05))
{
Store (Zero, SLPE)
Sleep(0x10)
}
Else
{
//**Original Code, this resolved my sleep issue.
}
}

//This is written by mm67. You are really nice.
This address 0x0430 is also motherboard specific, it is PMBASE+30h. Address of PMBASE is defined in FACP, on most boards it can also be checked from processor definitions. For example I have this in my dsdt:

Processor (CPU0, 0x00, 0x00000410, 0x06)

Here 0x00000410 is referring to PMBASE+10h so I use 0x430 on my Gigabyte board. On my MSI board's dsdt I have this:
Processor (P001, 0x01, 0x00000810, 0x06) {}

So in MSI shutdown code I use this:
OperationRegion (PMRS, SystemIO, 0x0830, 0x13)

4 Add these in your com.apple.Boot.plist and then put "boot_RC4_Duvelv2.1_Rekursor" under your boot partition. 
        <key>DeviceID</key>
        <string>******XX-***X-***X-***X-************</string>
        <key>RestartFix</key>
        <string>YES</string>

Now you can remove OpenHaltRestart.kext and PlatformUUID.kext or other similar kexts.

技術筆記 #58 @Nameci 2010-01-31 ↳ Re: @pentiumpc
@pentiumpcMost portable system don't sleep on closing the LID, I tried to find a DSDT fix for it but cannot find it. (google is my best friend.) so I wrote 1 to fix my own. If you have a better or alternative method, please let me know. Thanks. Device (LID0) { Name (_HID, EisaId ("PNP0C0D")) //LID detection Method (_PRW, 0, NotSerialized) {…

Noob here.

Never did work on my dsdt, I have errors after compiling on which it cannot find the registers. After much of googling, I have edited one value on my dsdt, on the LID0, instead of 0x03 I have made it to 0x04. I have sleep on lid close now, but I still don't have wake on lid open or wake on keyboard press after sleep via Fn+F1.

Here is my DSDT.dsl if somebody care to point me to the right direction.

技術筆記 #59 @Nameci 2010-01-31

I have repatched the dsdt once again with a fresh one. I delete all dsdt and did the patching once again, i still have sleep on lid close, Fn+F1, on the power button. I can wake thru power button with no problems, I can wake buy plugging or unplugging a usb device. But no wake on lid open or keyboard.

With this dsdt, clamshelldisplay.kext is not necessary anymore, so I have removed this kext.

Btw I have modded my dsdt on LID as almost the same on earlier post by pentiumpc.

Any ideas on how to enabel wake on lid open?

技術筆記 #60 @uman 2010-03-04

What you need to find is the method that is called upon a lid switch event, which means it is under EC0, the embedded controller device. On a MacBook, it's typically _Q20, which looks like this:

                    Method (_Q20, 0, NotSerialized)
                    {
                        Store (LSTE, LIDS)
                        Notify (\_SB.LID0, 0x80)
                    }

On my Gateway, it's _Q8A:

                    Method (_Q8A, 0, NotSerialized)
                    {
                        If (LIDE)
                        {
                            Store ("_Q8A : LID Switch Event", Debug)
                            Store (0x01, LIDE)
                            If (IGDS)
                            {
                                Store (0x90, SMIF)
                                Store (0x00, TRP0)
                            }

                            Notify (\_SB.LID0, 0x80)
                        }

on many other notebooks, it's _Q09. So you'll need to find where it is, and add the appropriate Notify call, to inform the OS that the laptop should be woken up. (I've modified my DSDT to use LID0, to better match the MacBook DSDT).

技術筆記 #61 @kizwan 2010-03-11

Enabled bluetooth on Acer Aspire 9420

Do you remember, not a long time a go, I'm pursuing to enable bluetooth in Mac OS X? I'm still unable to get the bluetooth button working but I'm able to make the bluetooth device working via DSDT hacking. I'm still however unable to trigger the bluetooth ON/OFF button. I even trying to re-map the bluetooth ON/OFF button to another button (Fn+..) but unsuccessful. Therefore, I modify System Wake (_WAK) to enable bluetooth. This is for temporary solution. When hot booting the computer, it need to be put to sleep one time only & waking up the computer will turning ON the bluetooth device. To make it working cleanly, I modify both System Wake (_WAK) and Prepare to Sleep (_PTS). In the process, I also fixed the wireless device won't turn ON after waking from sleep.

_WAK code:-

    Method (_WAK, 1, NotSerialized)
    {
        Store (Arg0, P80H)
        If (LEqual (Arg0, 0x03))
        {
            Store (CIRT, \_SB.PCI0.LPCB.EC0.CIRE)
        }

        If (LOr (LEqual (Arg0, 0x03), LEqual (Arg0, 0x04)))
        {
            Store (EEPM, \_SB.PCI0.LPCB.EC0.WEPM)
            Store (CAST, \_SB.PCI0.LPCB.EC0.CAME)
            Store (WLPW, \_SB.PCI0.LPCB.EC0.WLEN)
            Store (BTPW, \_SB.PCI0.LPCB.EC0.BTEN)
            Store (WLLE, \_SB.PCI0.LPCB.EC0.WLLD)
            Store (BTLE, \_SB.PCI0.LPCB.EC0.BTLD)
        }

        Store (0x00, \_SB.PCI0.LPCB.EC0.MUTE)
        Store (0x00, \_SB.PCI0.LPCB.EC0.KTAF)
        Store (0x01, \_SB.PCI0.LPCB.EC0.KTEE)
        // start
        // Add support for Wireless & Bluetooth devices (power & LED).
        // Turned ON Wireless & Bluetooth devices after resume from Sleep.
        Store (0x01, \_SB.PCI0.LPCB.EC0.WLEN)
        Store (0x01, \_SB.PCI0.LPCB.EC0.WLLD)
        Store (0x01, \_SB.PCI0.LPCB.EC0.BTEN)
        Store (0x01, \_SB.PCI0.LPCB.EC0.BTLD)
        // end
..................

_PTS code:-
- Preventing the wireless device from turn OFF before goes to sleep. Therefore, the wireless device can be turn ON after waking from sleep.

    Method (_PTS, 1, NotSerialized)
    {
        Store (Arg0, P80H)
        Store (0x01, \_SB.PCI0.LPCB.EC0.MUTE)
        If (LEqual (Arg0, 0x03))
        {
            Store (\_SB.PCI0.LPCB.EC0.CIRE, CIRT)
        }

        If (LEqual (Arg0, 0x04))
        {
            Store (0x01, \_SB.PCI0.LPCB.EC0.BLNK)
            Store (0x00, \_SB.PCI0.LPCB.EC0.CIRE)
        }

        If (LOr (LEqual (Arg0, 0x03), LEqual (Arg0, 0x04)))
        {
            Store (\_SB.PCI0.LPCB.EC0.WEPM, EEPM)
            Store (\_SB.PCI0.LPCB.EC0.CAME, CAST)
            Store (\_SB.PCI0.LPCB.EC0.WLEN, WLPW)
            Store (\_SB.PCI0.LPCB.EC0.BTEN, BTPW)
            Store (\_SB.PCI0.LPCB.EC0.WLLD, WLLE)
            Store (\_SB.PCI0.LPCB.EC0.BTLD, BTLE)
        }

        Store (0x00, \_SB.PCI0.LPCB.EC0.CAME)
        Store (0x00, \_SB.PCI0.LPCB.EC0.CIRE)
        // Preventing Wireless device from turning OFF when system going to Sleep.
        // Store (0x00, \_SB.PCI0.LPCB.EC0.WLEN)
        // start
        // Add support for Wireless (LED) & Bluetooth (power & LED) devices.
        // Turned OFF Wireless (LED) & Bluetooth (power & LED) devices before going to Sleep.
        Store (0x00, \_SB.PCI0.LPCB.EC0.WLLD)
        Store (0x00, \_SB.PCI0.LPCB.EC0.BTEN)
        Store (0x00, \_SB.PCI0.LPCB.EC0.BTLD)
        // end
        If (LEqual (Arg0, 0x05))
        {
            PHSR (0x28, 0x00)
        }
    }

Applying this fix causing the computer unable to sleep anymore because USB4 device (where the bluetooth device attached to) causing the system wake immediately. I remember that according to ACPI Specification revision 4 documentation; in addition to the _PRW control method, _PSW control method can be used to enable or disable the device’s ability to wake a sleeping system.

Arguments: (1) Arg0 – An Integer containing a wake capability control 0 – Disable the device’s wake capabilities 1 – Enable the device’s wake capabilities

By looking at USB4 device in DSDT, there is _PSW entry that can be manipulate. This is the entry for USB4 device in DSDT after modifying the argument (set to 0):-

            Device (USB4)
            {
                Name (_ADR, 0x001D0003)
                OperationRegion (U4CS, PCI_Config, 0xC4, 0x04)
                Field (U4CS, DWordAcc, NoLock, Preserve)
                {
                    U4EN,   2
                }

                Name (_PRW, Package (0x02)
                {
                    0x0E, 
                    0x03
                })
                Method (_PSW, 1, NotSerialized)
                {
                    If (Arg0)
                    {
                        // Store (0x03, U4EN)
                        // Disable USB4 capability to wake a sleeping system
                        Store (0x00, U4EN)
                    }
                    Else
                    {
                        Store (0x00, U4EN)
                    }
                }

                Method (_S3D, 0, NotSerialized)
                {
                    Return (0x02)
                }

                Method (_S4D, 0, NotSerialized)
                {
                    Return (0x02)
                }
            }

The last FIX enable the computer to sleep again.

kizwan

技術筆記 #62 @uman 2010-03-12

Nice work! Too bad I don't have bluetooth!

I've come to the conclusion that getting access to keyboard events is impossible in DSDT. I think you have three choices: construct an AMW0 device kext to bind to the AMW0 (which I presume is in your DSDT). This would be a challenge, but might allow you to be straight retail. Two, hack at ApplePS2Keyboard (if PS2) or something else if USB. Or three, do the same with VoodooPS2 (again if PS2).

If you have USB, your job may be easier, since you might be able to do it outside kernel space.

技術筆記 #63 @kizwan 2010-03-12

Battery indicator

I'm successfully compiled AMW0.kext for SL but got kernel panic while initializing some MethodTerm at boot. Since AMW0.kext project is not finished, I think I'm going to try ACPI4ASUS.kext instead. If ACPI4ASUS.kext developed to works with AMW0 v2 interface (AMW0 and WMID), it should works with other laptop model too.

I'm trying to enable battery icon by patching DSDT. It is being done by adjusting ADP1 & BAT0 code according to DSDT from MBP4,1. Not successful yet, but the battery indicator did show up. It said battery is not detected & current power source is power adapter. Do you think it is possible to make it working by just patching the DSDT?

EDIT: I have found the right "query method" to automatically turn ON Bluetooth device during boot-up. I just tried all of the "query method" in the DSDT until I found the right one.

                    Method (_Q3F, 0, NotSerialized)
                    {
                        // start
                        // auto turn ON Bluetooth device during computer startup
                        Store (0x01, \_SB.PCI0.LPCB.EC0.BTEN)
                        Store (0x01, \_SB.PCI0.LPCB.EC0.BTLD)
                        // end
                        HKEY (0x3F)
                    }

kizwan

技術筆記 #64 @breakky 2010-03-13

Can you somebody help me to enable my audio on Snow Leopard?My audio chip is Realtek ALC662:
I make a codec dump:You can download and see it.

hot file.com/dl/32500771/8b28fa6/Realtek_ALC662_dump.txt.rar.html

I want to fix my audio in DSDT, so I read your tutorial and convert the Default pinconfig on each "[JACK]" device:

Mic (colour:Pink) 01a19830 ---> reversed 3098a101

Mic which is not a jack 99a3093f ---> 3f09a399

HP - 0121401f ---> 1f402101

SPDIF -01441120 ---> 20114401

This is my audio configuration on my laptop.

I don't know how to generate values which I haveto enter in my DSDT.This is my DSDT (HDEF):

Device (HDEF)
            {
                Name (_ADR, 0x001B0000)
                OperationRegion (HDAR, PCI_Config, 0x4C, 0x10)
                Field (HDAR, WordAcc, NoLock, Preserve)
                {
                    DCKA,   1, 
                            Offset (0x01), 
                    DCKM,   1, 
                        ,   6, 
                    DCKS,   1, 
                            Offset (0x08), 
                        ,   15, 
                    PMES,   1
                }

                Name (_PRW, Package (0x02)
                {
                    0x0D, 
                    0x03
                })
            }
技術筆記 #65 @breakky 2010-03-13 ↳ Re: @kizwan
@kizwanEDIT: I have found the right "query method" to automatically turn ON Bluetooth device during boot-up. I just tried all of the "query method" in the DSDT until I found the right one. Method (_Q3F, 0, NotSerialized) { // start // auto turn ON Bluetooth device during computer startup Store (0x01, \_SB.PCI0.LPCB.EC0.BTEN) Store (0x01,…

Where you put this code?

I searched in my DSDT for

Method (_Q3F, 0, NotSerialized)

, But didn't find it.I have a laptop with Bluetooth, where to put this code?

技術筆記 #66 @uman 2010-03-13 ↳ Re: @kizwan
@kizwanI'm successfully compiled AMW0.kext for SL but got kernel panic while initializing some MethodTerm at boot. Since AMW0.kext project is not finished, I think I'm going to try ACPI4ASUS.kext instead. If ACPI4ASUS.kext developed to works with AMW0 v2 interface (AMW0 and WMID), it should works with other laptop model too.

So does Asus use AMW0, or do you need to add that code from AMW0. A WMID kext would be useful as many PC vendors use that interface. uninc's DSDT was hideously intertwined with WMID.

I'm trying to enable battery icon by patching DSDT. It is being done by adjusting ADP1 & BAT0 code according to DSDT from MBP4,1. Not successful yet, but the battery indicator did show up. It said battery is not detected & current power source is power adapter. Do you think it is possible to make it working by just patching the DSDT?

I'm not sure, but given that the ACPI 4.0 spec devotes pages and pages to battery and power issues, I think it is at least possible. I also intend to try to solve this (but it's a lower priority for me because my laptop battery is toast anyway). I tried VoodooBattery, which worked great (it told me my battery was toast, lol), but then it kernel panic'ed HARD and I had to repair my disk, so I won't be using that again.

EDIT: I have found the right "query method" to automatically turn ON Bluetooth device during boot-up. I just tried all of the "query method" in the DSDT until I found the right one. Method (_Q3F, 0, NotSerialized) { // start // auto turn ON Bluetooth device during computer startup Store (0x01, \_SB.PCI0.LPCB.EC0.BTEN) Store (0x01,…

I still don't understand how query methods are executed, nor how they are bound to some device. ACPI says:

"For an embedded controller event, OSPM will queue the control method of the name _QXX, where XX is the hex format of the query code. Notice that each embedded controller device can have query event control methods. Similarly, for an SMBus driver, if no driver registers for SMBus alarms, the SMBus driver will queue control methods to…

And then they discuss it more with a completely unhelpful example. Oh wait, the acpi implementers guide is more helpful:

What’s the trap? Using decimal instead of hexadecimal numbers in _Lxx, _Exx, and _Qxx names in your ASL code. When the number (xx) in the _Lxx, _Exx, or _Qxx event handler object name in the ASL code does not match the number of the bit in the GPE register block (or match the number of the embedded controller query number in the case…

DSDT is fun but time consuming!

技術筆記 #67 @uman 2010-03-13 ↳ Re: @breakky
@breakkyWhere you put this code? I searched in my DSDT for Method (_Q3F, 0, NotSerialized) , But didn't find it.I have a laptop with Bluetooth, where to put this code?

Each laptop model is going to be different. That's why you have to be prepared to do some work to get DSDT going. You will first need to determine what symbols, events, and queries correspond to your bluetooth device. Then kizwan's code can act as a guide.

技術筆記 #68 @kizwan 2010-03-13 ↳ Re: @breakky
@breakkyWhere you put this code? I searched in my DSDT for Method (_Q3F, 0, NotSerialized) , But didn't find it.I have a laptop with Bluetooth, where to put this code?

It is hardware & BIOS specific. You may have different query method. I'm afraid, you need to try & error every query method in your DSDT.

EDIT: You may want to follow uman suggestion (next post) to get your audio working. It is much easier.
As for your sound, you need to do a lot of work to get your sound working. You already have HDEF entry in DSDT, so you just missing legacy/patched kext. You need to put your ConfigData & Pin Config in legacy/patched kext. Use this legacy kext as a template:-
media fire.com/?vkzyzmtzozo
If you like to put ConfigData & PinConfigurations in DSDT, this is how HDEF entry will look like (between "// start" & "// end"):-

            Device (HDEF)
            {
                Name (_ADR, 0x001B0000)
                Name (HDWA, 0x00)
                Name (_PRW, Package (0x02)
                {
                    0x05, 
                    0x03
                })
                Method (_PS0, 0, Serialized)
                {
                    If (LEqual (HDWA, 0x00))
                    {
                        Store (0x01, HDWA)
                        HKEY (0x8F)
                    }
                }

                Method (_PS3, 0, Serialized)
                {
                    Store (0x00, HDWA)
                }
                // start - required code
                Method (_DSM, 4, NotSerialized)
                {
                    Store (Package (0x0C)
                    {
                        "built-in",
                        Buffer (One)
                        {
                            0x00
                        },

                        "codec-id",
                        Buffer (0x04)
                        {
                            0x83, 0x08, 0xEC, 0x10
                        },

                        "ConfigData",
                        Buffer (0x40)
                        {
                            /* 0000 */    0x01, 0x47, 0x1C, 0x30, 0x01, 0x47, 0x1D, 0x11,
                            /* 0008 */    0x01, 0x47, 0x1E, 0x0B, 0x01, 0x47, 0x1F, 0x01,
                            /* 0010 */    0x01, 0x87, 0x1C, 0x10, 0x01, 0x87, 0x1D, 0x01,
                            /* 0018 */    0x01, 0x87, 0x1E, 0xA0, 0x01, 0x87, 0x1F, 0x90,
                            /* 0020 */    0x01, 0xA7, 0x1C, 0x20, 0x01, 0xA7, 0x1D, 0x31,
                            /* 0028 */    0x01, 0xA7, 0x1E, 0x81, 0x01, 0xA7, 0x1F, 0x01,
                            /* 0030 */    0x01, 0xE7, 0x1C, 0x40, 0x01, 0xE7, 0x1D, 0xE1,
                            /* 0038 */    0x01, 0xE7, 0x1E, 0x45, 0x01, 0xE7, 0x1F, 0x01
                        },

                        "layout-id",
                        Buffer (0x04)
                        {
                            0x0C, 0x00, 0x00, 0x00
                        },

                        "device-type",
                        Buffer (0x11)
                        {
                            "Mobile ALC883 S/T"
                        },

                        "PinConfigurations",
                        Buffer (0x10)
                        {
                            /* 0000 */    0x30, 0x11, 0x0B, 0x01, 0x10, 0x91, 0xAB, 0x01,
                            /* 0008 */    0x20, 0x31, 0x81, 0x01, 0x40, 0xE1, 0x45, 0x01
                        }
                    }, Local0)
                    DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
                    Return (Local0)
                }
                // end - required code
            }

I'll try to construct ConfigData & PinConfigurations for you but I can't promise.

kizwan

技術筆記 #69 @uman 2010-03-13

Are you planning to use VoodooHDA, or AppleHDA? If Voodoo, first rename all references to HDEF to ALC6 (or whatever turns you on :)) Doing so will prevent AppleHDA from loading and matching your HDA device. If AppleHDA is loaded, then VoodooHDA doesn't load.

Next, and this is common for both Apple and Voodoo. Add this to your HDEF or ALC6 device:

Method (_DSM, 4, NotSerialized) { Store (Package (0x04) { "layout-id", Buffer (0x04) { 0x0C, 0x00, 0x00, 0x00 }, "PinConfigurations", Buffer (Zero) {} }, Local0) DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) }

You can then add your pin configs in there or in the plist depending on how you want to get sound going. See the great guide on infinitemac, or the one on projectosx.

Search my posts and look for my question on pinconfigs to find the links. I'm still trying to find out how to get my pinconfigs without Windows, since I don't run that anymore!

技術筆記 #70 @barnum 2010-03-13 ↳ Re: @kizwan
@kizwanBy looking at USB4 device in DSDT, there is _PSW entry that can be manipulate. This is the entry for USB4 device in DSDT after modifying the argument (set to 0):- Device (USB4) { Name (_ADR, 0x001D0003) OperationRegion (U4CS, PCI_Config, 0xC4, 0x04) Field (U4CS, DWordAcc, NoLock, Preserve) { U4EN, 2 } Name (_PRW, Package (0x02) {…

can you tell me what modification should I apply to this code to disable sleep for a device in usb2 ?

regards,
Vincent

技術筆記 #71 @kizwan 2010-03-13 ↳ Re: @uman
@umanSo does Asus use AMW0, or do you need to add that code from AMW0. A WMID kext would be useful as many PC vendors use that interface. uninc's DSDT was hideously intertwined with WMID.

Looks like I still need to go through WMI and ACPI documentation to have better understanding. Then I can make this successful.

@umanI'm not sure, but given that the ACPI 4.0 spec devotes pages and pages to battery and power issues, I think it is at least possible. I also intend to try to solve this (but it's a lower priority for me because my laptop battery is toast anyway). I tried VoodooBattery, which worked great (it told me my battery was toast, lol), but then…

Yeah, it's a low priority for me too. Just playing around.

I guess to make it working, maybe need to determine which query method it use. I said that because I found that there are query method that called ADP1 & BAT0 device. Just don't know what it do & what it contribute to battery detection.

@umanI still don't understand how query methods are executed, nor how they are bound to some device. ACPI says: And then they discuss it more with a completely unhelpful example. Oh wait, the acpi implementers guide is more helpful:

I'm going to grab the acpi implementers guide.

@umanDSDT is fun but time consuming!

I agree.

技術筆記 #72 @kizwan 2010-03-13 ↳ Re: @barnum
@barnum… can you tell me what modification should I apply to this code to disable sleep for a device in usb2 ? …

Do you mean you want to disable USB2 capability to wake a sleeping system, don't you? If in "Device (USB2)" entry it have _PSW (Power State Wake) method, you will need to change it according to my modification.

                Method (_PSW, 1, NotSerialized)
                {
                    If (Arg0)
                    {
                        // Store (0x03, U4EN)
                        // Disable USB4 capability to wake a sleeping system
                        Store (0x00, U4EN)
                    }
                    Else
                    {
                        Store (0x00, U4EN)
                    }
                }

Refer to arguments for _PSW:

Arguments: (1) Arg0 – An Integer containing a wake capability control 0 – Disable the device’s wake capabilities 1 – Enable the device’s wake capabilities

That is why I change both condition to execute the same thing. So that it always execute the same "Store" operation as if it is Arg0=0.

kizwan

技術筆記 #73 @breakky 2010-03-13 ↳ Re: @uman
@umanAre you planning to use VoodooHDA, or AppleHDA? If Voodoo, first rename all references to HDEF to ALC6 (or whatever turns you on :)) Doing so will prevent AppleHDA from loading and matching your HDA device. If AppleHDA is loaded, then VoodooHDA doesn't load. Next, and this is common for both Apple and Voodoo. Add this to your HDEF or…

I planed to use AppleHDA with DSDT.aml fix.This is my original DSDT.aml

hot file.com/dl/32576445/45eb3b8/DSDT.dsl.zip.html

By the way I use AsereBLN booter 1.1.9.

技術筆記 #74 @kizwan 2010-03-13 ↳ Re: @breakky
@breakkyI planed to use AppleHDA with DSDT.aml fix.This is my original DSDT.aml

Try this legacy kext for ALC662 (Snow Leopard):-
media fire.com/?kmnykkqmy5m

Make sure AppleHDA.kext in /System/Library/Extensions/ folder is original kext. Remember to put _DSM method in Device (HDEF) (please refer to uman's post #81 →).

You also need to put DTGP code in DSDT. Put it afterMethod (_WAK) function.

    Method (DTGP, 5, NotSerialized)
    {
        If (LEqual (Arg0, Buffer (0x10)
                {
                    /* 0000 */    0xC6, 0xB7, 0xB5, 0xA0, 0x18, 0x13, 0x1C, 0x44, 
                    /* 0008 */    0xB0, 0xC9, 0xFE, 0x69, 0x5E, 0xAF, 0x94, 0x9B
                }))
        {
            If (LEqual (Arg1, One))
            {
                If (LEqual (Arg2, Zero))
                {
                    Store (Buffer (One)
                        {
                            0x03
                        }, Arg4)
                    Return (One)
                }

                If (LEqual (Arg2, One))
                {
                    Return (One)
                }
            }
        }

        Store (Buffer (One)
            {
                0x00
            }, Arg4)
        Return (Zero)
    }

kizwan

技術筆記 #75 @breakky 2010-03-14

When I try to compile my dsdt.dsl I get one error:

4644: DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Error    4067 -    ^ Object is not accessible from this scope (DTGP)


Nevermind I found where is the error and fix it!

技術筆記 #76 @kizwan 2010-03-14 ↳ Re: @breakky
@breakkyWhen I try to compile my dsdt.dsl I get one error: 4644: DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Error 4067 - ^ Object is not accessible from this scope (DTGP) Nevermind I found where is the error and fix it!

How about the sound? Is it working?

技術筆記 #77 @richarda 2010-03-16

This thread has been very useful for me. I now just miss one last step to have the "perfect" install.
I'm running Snow Leopard on an ASUS eeePC 901 from the SD card. It's a bit slow but this is OK.

My problem: whenever I go to sleep and wake-up from sleep, I guess the SD card (my "boot drive") gets brutally ejected and…well, it's bad.

My question: is there any DSDT mod that would allow my SD card to stay mounted (powered maybe) during all the cycle wake-sleep-wake ?

I found a lot of approaching stuff on the thread but nothing exactly like that. this would make may day.

Any idea anyone ?

Thanks, Richard.

技術筆記 #78 @uman 2010-03-18 ↳ Re: @richarda
@richardaThis thread has been very useful for me. I now just miss one last step to have the "perfect" install. I'm running Snow Leopard on an ASUS eeePC 901 from the SD card. It's a bit slow but this is OK. My problem: whenever I go to sleep and wake-up from sleep, I guess the SD card (my "boot drive") gets brutally ejected and…well, it's bad.…

Yes, but it depends on the underlying hardware. I've found los of good info about my own laptop in my chipset doc (ICH7), and there is lots of good info on the SATA part of the device control. I assume the SSD is controled through SATA?

技術筆記 #79 @richarda 2010-03-18

Thanks for the info. Not sure I was clear enough tough. I'm having the problem with the SD card (I believe it's using an internal USB port) and the machine is an eeePC 901.
I need help on this one…please.

技術筆記 #80 @uman 2010-03-19 ↳ Re: @richarda
@richardaThanks for the info. Not sure I was clear enough tough. I'm having the problem with the SD card (I believe it's using an internal USB port) and the machine is an eeePC 901. I need help on this one…please.

My bad. I'm so used to SD cards not working, that I assumed you meant SSD.

You could try the following:

1. Determine what USB slot your SD card is occupying. Easiest is to highlight he drive in disk utility and right-click Information. You should see something like: IODeviceTree:/PCI0@0/USB7@1D,7. That tells me that it's using USB7.

2. Edit your DSDT to replace the _PRW for the indicated USB slot with:

            Device (USB7)
            {
                ...
            // package (argnum) {GPEbit, Wakelevel, PowerResource}
            Name(_PRW, Package()
                {
                    <xx>, // Bit number in GPEx_EN to enable USB resume 
                    0x01  // Reference to lowest sleeping state which can be 
                       // entered while still providing wake functionality
                       // no relative power resource specified
                })

where I have <xx> above, keep your DSDT's existing value, as that's the handler in the GPE for USB7. What I've highlighted in red is the change. Your existing DSDT likely has 0x03, which is effectively powered off.

What the 0x01 does is says that the drive still needs power. That *might* be enough to keep it from being ejected. But it might also prevent the computer from sleeping.

Take a look at the ACPI spec (4.0 rev) Chapter 7.2 for some of the things you can do with power management.

技術筆記 #81 @saul1d 2010-03-20

ive been lurking around on this thread for a week or two now, and i'm more interested in getting my laptop fully working. ive been running osx for about a year now and i'm pretty familiar with everything except DSDT.

basically what i'm trying to get working:

- GMA X3100: was working with leo, but with 10.6.2 i lost the ability to make the
screen turn off.(although i still have QE/CI)
- Backlight: has never worked, "invalid firmware max backlight" problem. i was
hoping DSDT would be able to fix this
- Sleep: although i'm not too worried about it, it would be nice.

I have a Gateway M6841. I don't think it's a too popular system to be using for a hackintosh, so there's not much help that i've found in the forums.

here is my patched DSDT. its patched for sleep, backlight, and gmax3100 but it hasnt changed any of the problems. thanks to anyone that can help or at least point me in the right direction, i do have programming experience if it helps.

技術筆記 #82 @richarda 2010-03-20 ↳ Re: @uman
@umanMy bad. I'm so used to SD cards not working, that I assumed you meant SSD. You could try the following: 1. Determine what USB slot your SD card is occupying. Easiest is to highlight he drive in disk utility and right-click Information. You should see something like: IODeviceTree:/PCI0@0/USB7@1D,7. That tells me that it's using USB7.…

Hello,
Thanks a lot. In the disk utility I got: /PCI0@0/EUSB@1D,7
And in the DSDT file, at Device(EUSB) I don't have a lot of things. Just

{
Name (_ADR, 0x001D0007)
}

nothing else. Any idea what else I can add to make it working in that case ?

技術筆記 #83 @kizwan 2010-03-20 ↳ Re: @richarda
@richardaThanks a lot. In the disk utility I got: /PCI0@0/EUSB@1D,7 And in the DSDT file, at Device(EUSB) I don't have a lot of things. Just { Name (_ADR, 0x001D0007) } nothing else. Any idea what else I can add to make it working in that case ?

You're allowed to add what it don't have.

kizwan

技術筆記 #84 @richarda 2010-03-20

Allright, I got that but in this case I guess I have to pute something like

Name(_PRW, Package
{
<xx>, // Bit number in GPEx_EN to enable USB resume
0x01 // Reference to lowest sleeping state which can be
// entered while still providing wake functionality
// no relative power resource specified
})

But how to determine the <xx> value then ?

技術筆記 #85 @uman 2010-03-21 ↳ Re: @richarda
@richardaAllright, I got that but in this case I guess I have to pute something like Name(_PRW, Package { <xx>, // Bit number in GPEx_EN to enable USB resume 0x01 // Reference to lowest sleeping state which can be // entered while still providing wake functionality // no relative power resource specified }) But how to determine the <xx> value…

That's the problem then. You really need to have some of the resources specified for your USB (UHCI) and EHCI ports. Since you don't have anything, you can add the GPE handlers, and things should work. The best way to proceed, is to first identify which Mac model your machine is closest to, and then take the requisite parts, carefully excising out the problematic parts.

For my hack, I looked at the list of mac models on wikipedia, and then chose MacBook 2,1 as the closest. I then edited my smbios.plist to reflect those values. I then compared my DSDT to the MacBook 2,1 DSDT and ioreg, and found they were surprisingly close. I've included below, some pieces for you to try from a MacBook 2,1 DSDT:

    Scope (\_GPE)
    {
...
        Method (_L03, 0, NotSerialized)
        {
            Notify (\_SB.PCI0.USB1, 0x02)
            Notify (\_SB.PWRB, 0x02)
        }

        Method (_L04, 0, NotSerialized)
        {
            Notify (\_SB.PCI0.USB2, 0x02)
            Notify (\_SB.PWRB, 0x02)
        }
...
        Method (_L0C, 0, NotSerialized)
        {
            Notify (\_SB.PCI0.USB3, 0x02)
            Notify (\_SB.PWRB, 0x02)
        }

        Method (_L0D, 0, NotSerialized)
        {
            Notify (\_SB.PCI0.USB7, 0x02)
            Notify (\_SB.PWRB, 0x02)
        }

        Method (_L0E, 0, NotSerialized)
        {
            Notify (\_SB.PCI0.USB4, 0x02)
            Notify (\_SB.PWRB, 0x02)
        }
...

Note the parts in red. If you already have level handlers in your GPE scope that use these numbers (so say you already have _L03), you will have to change them, and change the part in the USB1 declaration for, say, _L03. Don't put really large numbers, because there's a part in the DSDT that says the handlers go only up to 0xXX (I've forgotten where that is). Just make sure you use unused numbers. For example, in my DSDT I added one for _L11 for my firewire.

            Device (USB1)
            {
                Name (_ADR, 0x001D0000)  // keep your existing ADDR lines!!!
                Device (HUB1)                       // will become HUB2 for USB2
                {
                    Name (_ADR, 0x00)
                    Device (PRT1)
                    {
                        Name (_ADR, 0x01)
                    }

                    Device (PRT2)
                    {
                        Name (_ADR, 0x02)
                    }
                }

                OperationRegion (U1CS, PCI_Config, 0xC4, 0x04)
                Field (U1CS, DWordAcc, NoLock, Preserve)
                {
                    U1EN,   2
                }

                Name (_PRW, Package (0x02)
                {
                    0x03,     // must match number you use in _Lxx handler
                    0x03
                })
                Method (_PSW, 1, NotSerialized)
                {
                    If (Arg0)
                    {
                        Store (0x03, U1EN)
                    }
                    Else
                    {
                        Store (0x00, U1EN)
                    }
                }

                Method (_S3D, 0, NotSerialized)  // note: I don't have these
                {
                    Return (0x03)
                }

                Method (_S4D, 0, NotSerialized) // note: I don't have these
                {
                    Return (0x03)
                }
            }

The parts in red will change to match each USB port, so U1CS, U1EN becomes U2CS and U2EN for USB2, along with changing HUB1 to HUB2. I don't have the _S3D and _S4D methods in my DSDT and from reading the spec, I don't think they are needed.

So USB2, looks like:

            Device (USB2)
            {
                Name (_ADR, 0x001D0001)
                Device (HUB2)
                {
                    Name (_ADR, 0x00)
                    Device (PRT1)
                    {
                        Name (_ADR, 0x01)
                    }

                    Device (PRT2)
                    {
                        Name (_ADR, 0x02)
                    }
                }

                OperationRegion (U2CS, PCI_Config, 0xC4, 0x04)
                Field (U2CS, DWordAcc, NoLock, Preserve)
                {
                    U2EN,   2
                }

                Name (_PRW, Package (0x02)
                {
                    0x04,      // A different _L04 is a different _LXX handler than USB1!
                    0x03
                })
                Method (_PSW, 1, NotSerialized)
                {
                    If (Arg0)
                    {
                        Store (0x03, U2EN)
                    }
                    Else
                    {
                        Store (0x00, U2EN)
                    }
                }

                Method (_S3D, 0, NotSerialized)
                {
                    Return (0x03)
                }

                Method (_S4D, 0, NotSerialized)
                {
                    Return (0x03)
                }
            }

Do the same edits for USB3 and USB4 (if you have USB4) and even USB5, and USB6 if you have a desktop with lots of USB ports (although I suspect you will need another EHCI hub there, but I don't know).

USB7 is quite different:

            Device (USB7)
            {
                Name (_ADR, 0x001D0007)
                Device (HUB7)
                {
                    Name (_ADR, 0x00)
                    Device (PRT1)
                    {
                        Name (_ADR, 0x01)
                    }

                    Device (PRT2)
                    {
                        Name (_ADR, 0x02)
                    }

                    Device (PRT3)
                    {
                        Name (_ADR, 0x03)
                    }

                    Device (PRT4)
                    {
                        Name (_ADR, 0x04)
                    }

                    Device (PRT5)
                    {
                        Name (_ADR, 0x05)
                    }

                    Device (PRT6)
                    {
                        Name (_ADR, 0x06)
                    }

                    Device (PRT7)
                    {
                        Name (_ADR, 0x07)
                    }

                    Device (PRT8)
                    {
                        Name (_ADR, 0x08)
                    }
                }

                Name (_PRW, Package (0x02)
                {
                    0x0D,     // yet another different handler
                    0x03      // I suggested you change this to 0x1
                })
                Method (_S3D, 0, NotSerialized)
                {
                    Return (0x03)
                }

                  Method (_S4D, 0, NotSerialized)
                {
                    Return (0x03)
                }
            }

Remove the parts in yellow for the USB7, since they don't match the change from 0x03 -> 0x01. Plus I suspect they really aren't needed.

技術筆記 #86 @uman 2010-03-21

Oh, and if this doesn't work, there are bits you can set that essentially control power settings, ejectability, etc. But that is hugely dependent on your chipset. I have an ICH7, and most of that is the same in ICH9, and ICH10, but if you have an nvidia chipset, that's *totally* different.

技術筆記 #87 @richarda 2010-03-21

OK, I'm 200% lost now. This is way too complex for me. I guess I have to find somebody litterate enough who solved the problem on the eee901 and just copy his settings.

Thanks anyway.

技術筆記 #88 @barnum 2010-03-26
                Device (HUB1)                       // will become HUB2 for USB2
                {
                    Name (_ADR, 0x00)
                    Device (PRT1)
                    {
                        Name (_ADR, 0x01)
                    }

                    Device (PRT2)
                    {
                        Name (_ADR, 0x02)
                    }
                }

Hi,
Can You explain me what the "utility" of this part of the usb declaration"

In my dsdt, I doesn't have that.
Thank,
Barnum

技術筆記 #89 @uman 2010-03-29

You won't need it, then. It's because on my gateway, the ports have integrated hubs. See ACPI spec, section 9.13 for full details.

技術筆記 #90 @adriangb 2010-04-01 ↳ Re: @ping99

Sorry of reviving this and cutting in
@ping99
I have an ASRock x58 Extreme (similar to ASUS boards), and sleep doesn't work OTB. I've been looking around, and it seems I would need to modify Method (_PTS, 1, NotSerialized).
I read your post, and it seems that the edits you did are somewhat similar to what I should do in my DSDT, whoever I have a few doubts:

@ping99... 1 Add OperationRegion below before Method (_PTS, 1, NotSerialized) OperationRegion (DEBG, SystemIO, 0x80, One) Field (DEBG, ByteAcc, NoLock, Preserve) { DBG1, 8 } OperationRegion (PMRS, SystemIO, 0x0430, 0x13) Field (PMRS, ByteAcc, NoLock, Preserve) { , 4, SLPE, 1, Offset (0x08), GPSE, 16, GPSS, 16, Offset (0x12), , 1, SWGC, 1 }

Is

OperationRegion (DEBG, SystemIO, 0x80, One)
    Field (DEBG, ByteAcc, NoLock, Preserve)
    {
        DBG1,   8
    }

really necessary? mm67 seems to think not (or is that for shutdown only?)

@ping99...2 Check Device (LPC) if there is a similar Operation Region "LPC" like below. If you don't have LPC device, just search Name (_ADR, 0x001F0000), sometimes the device name is different. Device (LPC) { Name (_ADR, 0x001F0000) OperationRegion (LPC0, PCI_Config, 0xA4, 0x02) Field (LPC0, ByteAcc, NoLock, Preserve) { AG3E, 1 } If there…

Here is my LPCB:

Device (LPCB)
            {
                Name (_ADR, 0x001F0000)
                Device (IELK)
                {
                    Name (_HID, "AWY0001")
                    OperationRegion (RXA0, PCI_Config, 0xA0, 0x20)
                    Field (RXA0, ByteAcc, NoLock, Preserve)
                    {
                            ,   9, 
                        PBLV,   1, 
                                Offset (0x10), 
                            ,   1, 
                        PBMS,   1, 
                            ,   1, 
                        PMCS,   1, 
                        ECNS,   1, 
                                Offset (0x11), 
                        ECT1,   16, 
                        ELEN,   1, 
                                Offset (0x14)
                    }

                    Method (\_GPE._L0A, 0, NotSerialized)....

Where should I put OperationRegion (LPC0...? Before Device (IELK)? After Name (_HID, "AWY0001")? Inside OperationRegion (RXA0, PCI_Config, 0xA0, 0x20) somehow?

@ping993 Add code below in Method (_PTS, 1, NotSerialized) like this Method (_PTS, 1, NotSerialized) { Or (Arg0, 0xF0, Local0) Store (Local0, DBG1) Store (Zero, \_SB.PCI0.LPC.EXPE) //Please change to \_SB.PCI0.LPC.AG3E if you don't have the EXPE, but add AG3E. If (LEqual (Arg0, 0x05)) { Store (Zero, SLPE) Sleep(0x10) } Else { //**Original…

Here is my current -disastrous- Method (_PTS, 1, NotSerialized):

Method (_PTS, 1, NotSerialized)
    {
        Or (Arg0, 0xF0, Local0)
        Store (Arg0, DBG8)
        PTS (Arg0)
        Store (Zero, Index (WAKP, Zero))
        Store (Zero, Index (WAKP, One))
        If (LAnd (LEqual (Arg0, 0x04), LEqual (OSFL (), 0x02)))
        {
            Sleep (0x0BB8)
        }

        If (LEqual (Arg0, 0x05))
        {
            Store (0x99, SMIP)
            Store (One, \_SB.PCI0.LPCB.IELK.AG3E)
            Store (Zero, SLPE)
            Sleep (0x10)
        }
        Else
        {
            Store (Zero, \_SB.PCI0.LPCB.IELK.AG3E)
        }
        Store (ASSB, WSSB)
        OSYS ()
        Store (AOTB, WOTB)
        Store (AAXB, WAXB)
        Store (Arg0, ASSB)
        Store (OSFL (), AOTB)
        Store (OSYS (), OSTP)
        Store (Zero, AAXB)
    }

The original is:

Method (_PTS, 1, NotSerialized)
    {
        Store (Arg0, DBG8)
        PTS (Arg0)
        Store (Zero, Index (WAKP, Zero))
        Store (Zero, Index (WAKP, One))
        If (LAnd (LEqual (Arg0, 0x04), LEqual (OSFL (), 0x02)))
        {
            Sleep (0x0BB8)
        }

        Store (ASSB, WSSB)
        Store (AOTB, WOTB)
        Store (AAXB, WAXB)
        Store (Arg0, ASSB)
        Store (OSFL (), AOTB)
        Store (OSYS (), OSTP)
        Store (Zero, AAXB)
    }

, Adrian

Post Scriptum (P.S.): I attached my DSDT's, CST and IST tables, so if someone could lok at them and tell me if I -for example- managed to insert the C-States, P-States, etc-States into the DSDT correctly, I would be eternally grateful.

技術筆記 #91 @ping99 2010-07-04

First all, you just need to add OperationRegion PMRS below.

OperationRegion (PMRS, SystemIO, 0x0430, 0x13)
Field (PMRS, ByteAcc, NoLock, Preserve)
{
, 4,
SLPE, 1
}

* Pay attention to 0x0430 in red. It depends your motherboard. You have Processor (CPU0, 0x00, 0x00000410, 0x06) in your dsdt, you can use 0x0430. If you have Processor (P001, 0x01, 0x00000810, 0x06) then use 0x0830. It is PMBASE+30h.

Secondly, look into Method (_PTS, 1, NotSerialized) to see whether "If (LEqual (Arg0, 0x05))" there. If not, add code as below. If already there, just insert.

If (LEqual (Arg0, 0x05))
{
Store (0x01, \_SB.PCI0.LPC.EXPE) // hibernate fix. Will return to S5 after power back
Store (Zero, SLPE) // zero SLP_SMI_EN, else won't shutdown
Sleep (0x10) // wait for bit to set
}

Yours is modified as below:

Method (_PTS, 1, NotSerialized)
{
Store (Zero, \_SB.PCI0.LPC.EXPE) //Check Device (LPC) or LPCB if you have this EXPE or something like this. change it to match yours.
If (LEqual (Arg0, 0x05))
{
Store (0x01, \_SB.PCI0.LPC.EXPE) // hibernate fix. Will return to S5 after power back
Store (Zero, SLPE) // zero SLP_SMI_EN, else won't shutdown
Sleep (0x10) // wait for bit to set
}

Store (Arg0, DBG8)
PTS (Arg0)
Store (Zero, Index (WAKP, Zero))
Store (Zero, Index (WAKP, One))
If (LAnd (LEqual (Arg0, 0x04), LEqual (OSFL , 0x02)))
{
Sleep (0x0BB8)
}

Store (ASSB, WSSB)
Store (AOTB, WOTB)
Store (AAXB, WAXB)
Store (Arg0, ASSB)
Store (OSFL , AOTB)
Store (OSYS , OSTP)
Store (Zero, AAXB)
}

技術筆記 #92 @SaGaR 2010-12-20

i tried the sleep fix, but i can't get it to work, sleep in general doesn't work, when i press the sleep button, my screen freezes and that's all, when i press the powerbutton i get the restart/shutdown popup and all works again.

Lidsleep also does the same, screen freezes but stays on.

i wanna ask you if you plz wanna look at it?

技術筆記 #93 @ribben89 2011-02-05

really nice job!

Here is my problem... I have a Compal Ifl90 with intel 7300 @ 2GHz and 8600m gt 512mb with Snow Leopard 10.6.3 .

The problem i have is that my screen brightness slider at setting wasn't there! But with some dsdt editing i managed to show up but when i move the slider nothing happen and returns to it's original position! Any help please below is my code from Device (LCD)

Device (LCD)
                    {
                        Method (_ADR, 0, NotSerialized)
                        {
                            Return (0x0110)
                        }

                        Method (_DCS, 0, NotSerialized)
                        {
                            ^^^^LPCB.PHSS (0x0C)
                            Store (CADL, Local0)
                            Store (CSTE, Local1)
                            And (Local0, One, Local0)
                            And (Local1, One, Local1)
                            If (Local0)
                            {
                                Store (One, LCDA)
                            }
                            Else
                            {
                                Store (Zero, LCDA)
                            }

                            If (LCDA)
                            {
                                If (LEqual (Local1, One))
                                {
                                    Return (0x1F)
                                }
                                Else
                                {
                                    Return (0x1D)
                                }
                            }
                            Else
                            {
                                If (LEqual (Local1, One))
                                {
                                    Return (0x0F)
                                }
                                Else
                                {
                                    Return (0x0D)
                                }
                            }
                        }

                        Method (_DGS, 0, NotSerialized)
                        {
                            If (LCDA)
                            {
                                Return (One)
                            }
                            Else
                            {
                                Return (Zero)
                            }
                        }

                        Method (_DSS, 1, NotSerialized)
                        {
                        }

                        Method (_BCL, 0, NotSerialized)
                        {
                            If (^^^^LPCB.ECOK ())
                            {
                                If (LEqual (OSYS, 0x07D6))
                                {
                                    If (LEqual (^^^^LPCB.EC0.OSTY, Zero))
                                    {
                                        Store (One, ^^^^LPCB.EC0.OSTY)
                                    }
                                }
                                Else
                                {
                                    If (LEqual (^^^^LPCB.EC0.OSTY, One))
                                    {
                                        Store (Zero, ^^^^LPCB.EC0.OSTY)
                                    }
                                }
                            }

                            Return (Package (0x0A)
                            {
                                0x46, 
                                0x28, 
                                Zero, 
                                0x0A, 
                                0x14, 
                                0x1E, 
                                0x28, 
                                0x32, 
                                0x3C, 
                                0x46
                            })
                        }

                        Method (_BCM, 1, NotSerialized)
                        {
                            Divide (Arg0, 0x0A, Local0, Local1)
                            Store (Local1, ^^^^LPCB.EC0.BRTS)
                        }

                        Method (_BQC, 0, NotSerialized)
                        {
                            Multiply (^^^^LPCB.EC0.BRTS, 0x0A, Local0)
                            Return (Local0)
                        }
                    }

In my try to make it show up i also added

Name (_HID, EisaId ("LCD1234"))

in Device (LCD)

And

Device (PNLF)
                    {
                        Name (_HID, EisaId ("APP0002"))
                        Name (_CID, "backlight")
                        Name (_UID, 0x0A)
                        Name (_STA, 0x0B)
                    }

right above Device (LCD)

Also i am able to change brightness from my Fn Buttons but no notification is shows as the sound changing does!

Please any ideas?

技術筆記 #94 @Marchrius 2013-01-21

Led Wireless

How I can turn on wireless led with code in DSDT?

參與實測與協作驗證成員: @Thireus @uman @THeKiNG @pocenk @adriangb
文獻來源與貢獻者溯源名錄(共 32 位具名成員 · 原始討論串 #1960)
成員用戶名本卷貢獻角色發帖數活躍時間窗
@uman核心貢獻者212009-06-02 → 2010-03-29
@kizwan核心貢獻者182009-06-01 → 2010-03-20
@pentiumpc主筆作者82009-01-19 → 2009-03-03
@Slither2008核心貢獻者62009-03-03 → 2009-03-05
@candykane核心貢獻者62009-05-13
@richarda核心貢獻者52010-03-16 → 2010-03-21
@THeKiNG核心貢獻者42009-06-03 → 2009-06-18
@breakky核心貢獻者42010-03-13 → 2010-03-14
@Thireus核心貢獻者32009-05-07 → 2009-05-13
@Alexaar協作成員22009-04-13 → 2009-04-29
@The Edge3000協作成員22009-08-11 → 2009-09-07
@Gurruwiwi協作成員22009-08-17
@EnzoFX協作成員22009-09-03
@Sweaty協作成員22009-12-21
@ping99協作成員22010-01-18 → 2010-07-04
@Nameci協作成員22010-01-31
@barnum協作成員22010-03-13 → 2010-03-26
@adriangb協作成員22010-04-01
@kDawg協作成員12009-07-15
@aschar1協作成員12009-08-07
@sk1nhd33t協作成員12009-08-09
@Common_Sense協作成員12009-09-08
@gnychis協作成員12009-09-25
@msingh協作成員12009-10-05
@2nerd4u協作成員12009-10-20
@mm67協作成員12009-12-21
@adityaxavier協作成員12010-01-09
@pocenk協作成員12010-01-29
@saul1d協作成員12010-03-20
@SaGaR協作成員12010-12-20
@ribben89協作成員12011-02-05
@Marchrius協作成員12013-01-21

選擇語言 · Choose your language