2012年11月21日 星期三

Lion on Lenovo S10

Preface

OS 從 32-bit 轉移到 64-bit 是一個不可逆且是正向的潮流(利用其提升的定址能力,增進內部傳輸的效率,可使用更多的 RAM, ..., etc),但我還是想了解 How can 32-bit CPU do its best? 時至今日的主流 OS 依然對其支援,不論是新出的 Windows 8,或是 Linux Family;但自我風格強烈的 Mac OS X 選擇放棄 32-bit, 將重心完全推入 64-bit,就在今年的 10.8 Mountain Lion。

10.6 Snow Leopard 尚且支援 32-bit CPU,10.8 Mountain Lion 確定沒有 32-bit mode,這是我在 Wiki 查到的明確結果。但是 10.7 Lion —— 在中文與英文版的 Wiki 講法就有些出路 —— 在支持平臺上,中文版是說 x86, x64 CPU 皆有支援,但英文版表示僅有 x64。不過就這一點讓我燃起 S10 也能裝上 Lion 的期待。

而針對 S10 如何 Hackintosh 的教學,網路上找的到,且足夠明確,皆是 based on Snow Leopard。二鳥在林不如一鳥在手,初次搞 Hackintosh 還是先可以穩穩用再說,當下就選擇學習如何搞定 Snow Leopard。而在這期間,我亦慢慢地了解 Mac OS X 的系統結構,也理出 Lion 的那份過渡性,真正的狀況是:

Lion 的 driver 依舊保留 32-bit 部分,而 kernel 亦能透過參數設定(arch=i386) 來使用 32-bit driver,但有一些關鍵 components 僅有 64-bit,導致 32-bit CPU 無法使用。

體會至此,我也有一種既然如此,那就不要強求的想法,直到我讀到 Prasys 的文章 (OSX Lion on my netbook – proof of concept - http://prasys.info/2011/08/osx-lion-on-my-netbook-proof-of-concept/, comments 很重要!) 以及 Traveller 寫的 Lion 安裝概略(HCL 10.7.0/Portables - http://wiki.osx86project.org/wiki/index.php/HCL_10.7.0/Portables#Compaq_CQ_10-110ES) 完全搔起我對 S10 Atom N270 運行 Lion 的好奇心,以下就是騎「獅」難下的血淚史:

開始之前,如果是和我同有 S10 的朋友,推薦這篇文章 (Guide on how to install Lion DP1 (build 11A390) on Lenovo IdeaPad S10 and S10e - rolf -
http://s10lenovo.com/viewtopic.php?f=33&t=4802&start=60#p32201),雖然是 DP1 的事,了解過後將有助於接下來的理解。

[Preparation]

  1. Hardware: Lenovo S10(Existed Snow Leopard), Acer 5920G(Core 2 Duo T7500), USB HDD 320G
  2. Software: Mac OS X Lion Install DVD(10.7.0), Mac OS X Lion Combo Update(10.7.5)

Lion 10.7.0 Installation

[S10 Side]

  1. 使用 S10 的 Snow Leopard,透過磁碟工具程式將 Lion 10.7(11a511) 回復到 USB 外接硬碟上
      步驟簡述如下,細節請自行參考網路上的教學:
    • 將 InstallESD.dmg 底下的 BaseSystem.dmg 掛載之後,回復到要做為安裝的空白分區(> 5G)
    • 刪除安裝分區下的 /System/Install/Packages(是個捷徑)
    • 同目錄下,新增一個 Packages 資料夾
    • 把 InstallESD.dmg 的 Packages 資料夾之所有 .pkg, .mpkg 複製到剛剛新建的 Packages 下
    • mach_kernel 複製到安裝分區的根目錄
    • 把修改過的 OSInstall 取代 /System/Library/PrivateFrameworks/Install.framework/Frameworks/OSInstall.framework/Versions/A/OSInstall (for installation on MBR)
    • 同為修改過的 OSInstall.mpkg 取代 /System/Installation/Packages/OSInstall.mpkg (安裝時可細部自定,無須全部安裝,且需與 OSInstall 對應)

    • p.s. 如需查看隱藏檔,可透過 Houdini
  2. 在回復的分區上安裝 Chameleon
  3. 在 /Extra/Extensions 加入 ElliottForceLegacyRTC.kext(不使用的話,確定 5920G BIOS 會被 Reset), FakeSMC.kext, NullCPUPowerManagement.kext, patched IOPCIFamily.kext v2.6.7(5920G 會卡 PCI Configuration)

[5920G Side]

一開始是照著 Traveller 所寫,將安裝分區下該替換的檔案都替換下來,然後用 S10 開機去安裝,但是不知什麼原因,它會卡在 launchd錯誤(describe as this[http://osx86.co/f36/legacy-kernel-10-6-8-with-custom-dyld-t7318/post54897.html]),導致根本進不去安裝畫面(語言選單)。想說要放棄之際,突然看到有人提及 SuperDuper 這個備份軟體。靈機一動,乾脆先用支援的 CPU(bypass vanilla 的檢查) 安裝,之後再把該分區 copy 回 S10,因此就決定使用 5920G 的 T7500 來執行這個任務:
  1. 使用 5920G 選擇從 USB HDD 開機
  2. [Note] PCI Configuration Hangs

    Solution: 在(重大突破!完美解决较低配置困扰已久的PCI configuration begin,可使用原版IOPCI! - jjzxg - http://bbs.pcbeta.com/viewthread-1122678-1-1.html) 有提供 patched IOPCIFamily v2.6.7, 用來取代 10.7.0 裡的 v2.6.5, 便可順利度過。
  3. 進入安裝界面後,選擇將 10.7.0 安裝在 USB HDD 上事前分割出來的分區裡。
  4. 安裝完成後,系統會自動重新啓動,但因為新裝的分區上沒有任何破解用檔案,直接懸停當機。長按電源鍵關機
  5. 拔出 USB HDD,然後重新插回 S10,將安裝分區上的 /Extra/Extensions 複製到新安裝的 Lion 分區。
  6. 再到 5920G 用 USB HDD 開機,進入新安裝 Lion 分區。依照指示進行帳戶相關設定,然後進到桌面。
  7. Lion 10.7.0 安裝完成

Update to 10.7.5

  1. 先在 5920G 下載 OS X Lion Update 10.7.5 (Client Combo),將這個 .dmg 放在內部硬碟(讀取速度快)
  2. 再把 USB HDD 插回 S10, 用 Snow Leopard 的磁碟工具程式,把 Lion 回復到 USB HDD 預留的另一個分區,完成後將分區名稱改為 Lionbak
  3. [Trick] Lionbak = Lion Back up!!!

    有經驗的人會發覺第 2 步根本是在備份 Lion,沒錯!它確實有這樣的一個目的,更重要的是為等會升級為 10.7.5 做準備。因為如果直接使用 Combo Update 10.7.5 更新系統所在的分區時,會有 KP。所以必須把 Combo Update 10.7.5 拉到外面來做,但在 Snow Leopard 下,Combo Update 會判定系統不是 Lion 不給執行,只好如此迂迴的搞出另一個 Lion 系統 —— Lionbak,透過它來更新原先的 Lion (順便備份)。

    根據查到的資訊,其實有更簡單,且可直接在 Lion 系統上做 10.7.5 的 Combo Update, 請先跳到第 4 步,將含有序號smbios 放入 /E/E 裡,就不會有 ApplePolicyControl 的 KP。理論上是沒問題,但我沒實際跑過,可以試試,看起來省時省力!
  4. 用 5920G 開機進 Lionbak,然後執行 Combo Update 10.7.5,並將對象選擇為 USB HDD 上的 Lion
  5. 完成 Update 後,將 (新手常见(五国)(-v图)错误解决(原版,破解kernel,补丁kext下载) - crazybirdy - http://bbs.pcbeta.com/viewthread-863656-1-1.html) 裡 A26 所說的具序號smbios(Mac BookPro 8.1, iMac 12,1 應該也可以,就選擇一個硬體設備相近的) 放進 Lion 磁區的 /Extra/Extensions。
  6. 再次替換 IOPCIFamily.kext(v2.7, 還是會讓 5920G 卡 PCI Configuration) 為 patched v2.6.7。更換前,請先備份,因為 S10 在 Lion 沒有卡 PCI Configuration 的問題,可直接使用 v2.7, 稍候換回。
  7. 重新開機,選擇 Lion 分區進入,能成功進入後,點選 "關於這台 Mac" 查看是否為 10.7.5。若確認無誤,那麼恭喜 update 成功

Back to S10

  1. 先在 Snow Leopard 上插回 USB HDD,再次使用磁碟工具程式,選擇 USB HDD 的 Lion 分區回復到 S10 上已事先分割出來的分區。
  2. 使用 Lion DP1 Kernel
    1. 將 andyvand (Lion+Snow bootloader and Lion DP2 atom 64bit kernel - http://osx86.co/f36/lion-snow-bootloader-and-lion-dp2-atom-64bit-t7131/)所製作的 Lion DP1 patched kernel [mach_kernel_dp1_atom_apic(11.0.0 root:xnu-1699.21.15~1)] 複製到根目錄。
    2. org.chameleon.Boot.plist 添加 <key>Kernel</key> <string>mach_kernel_dp1_atom_apic</string>
  3. 可用驅動
    • 鍵盤&滑鼠

      VoodooPS2Controller.kext, AppleACPIPS2Nub.kext(小 bug:USB 滑鼠的捲動方向相反 —— 往下滾時,頁面是向上瀏覽;上滾時,頁面卻是向下瀏覽)
    • 圖形顯示

      使用 rolf (OS X Lion on S10e - http://s10lenovo.com/viewtopic.php?f=33&t=4802&start=60#p32201 ) 為安裝 DP1 所修改的 AppleIntelGMA950.kext(v7.0.31_patch <-- v7.4.1), AppleIntelIntegratedFramebuffer.kext(v7.0.31_patch <-- v7.4.1),並在 org.chameleon.Boot.plist 添加 <key>device-properties</key> <string>6d0000000100000001000000610000000200000002010c00d041030a000000000101060000027fff0400100000006d006f00640065006c0000000b000000474d4120393530200000004100410050004c002c00480061007300500061006e0065006c0000000800000001000000</string>
    • 音效

      VoodooHDA.kext(v2.7.4)
    • Wireless

      IO80211Family.kext(v3.2_patch <-- v4.2)
    • Ethernet

      BCM5722D.kext
    • Battery

      Snow Leopard 10.6.8 的 AppleACPIPlatform.kext(v1.3.6_stock <-- v1.5) + VoodooBattery.kext
    • Speedstepping

      VoodooPowerMini.kext(v1.2.49)
    • IOStorageFamily

      使用 10.7.0 的 IOStorageFamily.kext(v1.7_stock <-- v1.7.2)
    • [Note] still waiting for root device!!!

      如果我們使用 10.7.5 的 IOStorageFamily.kext(v1.7.2),系統開機時會發生 AppleFileSystemDriver 錯誤,檔案系統無法載入,造成 still waiting for root device。推測 IOStorageFamily.kext 有變更,導致 ooooold DP1 kernel 無法順利使用 AppleFileSystemDriver.kext。
      這層神奇的關係在
      都有提及,AMD 也有這個問題,看來這是使用舊 kernel 的通病,發生的其間都是更新 10.7.4 所致,因此 IOStorageFamily.kext 至少得回復到 10.7.3 之前的版本(有 v1.7.1??? v1.7.0 確定可用)
    • IOPCIFamily

      IOPCIFamily.kext(v2.6.7_patch --> v2.7_stock),因為 S10 很神奇地不卡 PCI Configuration, 那我們就換回 10.7.5 的原版 kext。
  4. 更換 Finder
    10.7.0 的 Finder 已經是 64-bit app(會出現白色禁止符號),S10 完全無法使用。32-bit app 的最後一個版本似乎是 DP2(http://www.mediafire.com/?2560lfp1i63hmec),請用它替換 /System/Library/CoreServices 下的 Finder。

    [Trick] 增加 Finder 的顯示語言

    本來這應該是透過安裝語言套件就可解決的 easy job,可惜對象是已經分離出來的 app。而網路上所提供的 DP2 Finder 通常為了縮減體積,可能都僅留下英文的界面,但其實我們只要把中文的字檔資源放回 Finder.app 底下就好。可是我們要如何取得 DP2 Finder 英文以外的字檔?一個直觀卻暴力的做法:「新安裝一個 Lion DP2 的系統,同時選擇安裝全語言套件,之後再取出 Finder.app 來用」。不過殺雞焉用牛刀,這麼做也太麻煩,況且 DP2 的 kernel 早就是 64-bit,真要安裝 DP2 那麼就如同要再跑一次 10.7.0 安裝流程,太不符合經濟效應。其實我們可以直接向 10.7.5 的 Finder.app 來偷天換日,以下為其流程:
    1. 在 10.7.5 Finder.app 上按右鍵,選擇 "顯示套件內容",會彈出一個視窗。
    2. 點選滑鼠到 Contents/Resources 目錄下,這就是 Finder.app 所用到資源之目錄,你會發現除了許多圖檔外,有不少資料夾是以 .lproj (e.g., English.lproj, zh_TW.lproj, ..., etc)做結尾的,這些就是語言字檔。
    3. 選取你想要的字檔資料夾,並且複製。
    4. 開啓 DP2 Finder.app 的 Contents/Resources 目錄。
    5. 將剛才複製的 .lproj 檔貼上。
    6. 把這個多了新語言字檔的 Finder.app 丟入 Lion 的 /System/Library/CoreServices,並修復權限。
    7. 重開機後,Finder 就會根據系統的語言對應顯示。
    當然,也許會有字檔對應不完全的問題,但至少選單上的翻譯都沒有少(我用繁體中文,95% 以上完備),而且方便又快速,這才是重點!
  5. 重新開機,選擇 Lion 磁區進入,建議在 Chameleon 選單時加上 -v -f,以方便 debug,經過一大串數量誇張的 kernel parameter can't find 之畫面後,顯示登入畫面;正常的話,解析度是 1024 x 600,且開啓圖形加速。輸入密碼後,就會看到 Lion 的桌面。點選 左上角的蘋果 --> 關於這台 Mac,你會發現真的是 10.7.5!

Problem

順著上述步驟,確實讓 S10 吃上 Mac OS X Lion 10.7.5,但一剛進入後,就會發現非常的 lag。打開活動監視器一看,吃 CPU 資源第一名的是叫 mds 的程序,不僅如此,CPU使用率根本都是滿百。如果有裝過 Lion DP1 的人,應該有注意到這個狀況,mds 是 Spotlight 的 process,它會花一段不短的時間做 indexing,當然它會視你硬碟上檔案的多寡,決定需要花費的時間,3 - 4 hours 甚至花上半天都有可能。當然有加速的方法,就是只讓它 indexing 你的開機磁碟(否則一些搜尋的系統功能會無法使用),其它的非開機磁碟透過 系統偏好設定 --> Spotlight --> 隱私,通通打入禁止 indexing 名單,如此一來應該會加快不少。

就 DP1 的情況而言,解決 Spotlight 之後,CPU resource 使用率就會恢復到一個正常值(開機之後,CPU 資源閒置 % 在 80% 以上)。但是 10.7.5 並非如此,開完機後,打開活動監視器一看:「CPU 資源使用率 100%!!」,佔用排行榜前三名依序為 syslogd, revisiond, launchd,只要仔細地觀察一、兩分鐘,會發覺這三個人,都有能力在一瞬間吃光所有 CPU resource 的能力,而 syslogd 基本上都是從 60% 起跳,80% 是平均,90% 不意外。

syslogd -- 光看名字也不難猜出它是做什麼用的 -- 系統紀錄,但為什麼系統紀錄會佔用 CPU 資源到如此誇張的地步?

證據是顯而易見,打開 工具程式 --> 系統監視程式,點開左邊的 kernel.log,然後放開你的滑鼠,仔細看,kernel 正以非常高的頻率在報錯,即使是你停下滑鼠之後。裡面最常見的訊息就是
kernel xxx parameter can't find...
這說明了 DP1(Darwin 11.0.0) 的 kernel 與 10.7.5(Darwin 11.4.2) 間存在非常巨大地差異,當它與 10.7.5 的驅動程式溝通時,有著相當嚴重地牛頭不對馬嘴。和一堆常駐的 daemon 亦不例外,終究導致無時無刻都在報錯,syslogd 有寫不完的 log。

其實這問題,和正式版(10.7.0) 的 kext (我有先留在 10.7.0 測試過) 就如此,到了 10.7.5 想當然爾,情況只有更壞不可能更好。說真的,要用 DP1 的 kernel 去驅動 10.7.5 的 driver 確實有些強人所難。但整個 Lion 的歷史中,也只有 DP1 的 kernel 還支援 32-bit 的 CPU,為了讓 S10 用,也只能硬著頭皮上。

DP1 kernel 是完全一無是處嗎?卻也不是這樣,就一個 Demo 來說,它算是成功,也就是說,除了 syslogd 等 daemon 佔據 95% 以上的 CPU resource 外,配合上置換的 kext 幾乎是能完整驅動 S10(QE/CI, resolution = 1024 x 600, WiFi, Ethernet, Audio, Keyboard & Mouse 均可工作)。但高 CPU 佔用率這個問題,就足以摧毀一切,開機前五分鐘,也許開啓一些程式,尚可競爭到一些資源;五分鐘後,因為這些程式在使用當中,不可避免地會透過 driver 使用到硬體,一使用 driver 就會讓 syslogd 報錯情況加劇,加劇後佔用更多的 CPU resources, 之後整個系統就 hang!

如果你真的使用過,就會發現,連關機都是一件可遇不可求的事!(開機後等系統載入完畢立刻關機,大概十次只會成功一次,隨著因無法正常關機而強制 power off, 導致系統異常的機會增加,降低下次正常關機成功率。在這惡性循環下,終將使整個系統趨向不可用!)

對於 syslogd 的問題,我也是試圖透過 # launchctl unload com.apple.syslogd 阻止它工作,但它旋即重新載入,無效!

如果直接將 /System/Library/LaunchDaemons/com.apple.syslogd.plist 刪除,那會無法進入 10.7.5 系統,還是無效!

因為能力有限,解題到此我也束手無策,雖然不甘心,但也只能接受,S10 真的無法拿 Lion 來作日常使用。當然如果有高手能破解這個難題,希望您也不吝指教!如果可以,我還是很樂意再做嘗試,希望有一天真能讓 S10 馴服 Lion! ^^

2012年11月15日 星期四

仿製 AppleHDA - ALC269 for Lenovo S10

Preface

最近試著讓 Lenovo S10(Atom N270) 吃上 Mac OS X,查了些資料,發現 Mountain Lion(kext 全都是 64-bit only) 是無望,理論的極限為 Lion(32-bit kext supported),可以 demo,但是 very unusable,下一篇我會談如何讓 S10 demo Lion(僅能如此)。因此 S10 可供日常使用的上限,就是 Snow Leopard。

關於如何讓 S10 吃上 Snow Leopard 我想資源最豐富的是 Lenovo IdeaPad S Series Forum,我就是根據 vaniii 所製作的 enabler(http://s10lenovo.com/viewtopic.php?f=33&t=3280) 來讓 S10 的各項功能在 Mac 底下得以使用。而 vaniii 用來驅動 ALC269 的方法是使用 VoodooHDA,功能上基本可用,但跑 Hackintosh 的精神是能折騰就盡量折騰能多用一個 Apple 原生的 kext 是一個。恰巧,在 vaniii 的大樓底下 rals2007(http://s10lenovo.com/viewtopic.php?f=33&t=3280&start=2580#p32373) 這位仁兄為大家仿製了一個 AppleHDA,我測試後,確實可用,但有兩個缺點:
  1. 仿製版本過時,其版本為 1.8.7,並非 Snow Leopard 10.6.8(10K549) 所用的 2.0.5
  2. kernel log 大約每 30 秒產生一個錯誤訊息,且是不斷地重複,從開機載入 AppleHDA 就開始
Error message 重複性的產生——這是一個可大可小的問題,看起來是不影響使用,但自從我讓 S10 硬上 Lion 後,絕不允許這種週期性的報錯(如果你曾被 syslogd 吃掉 80%↑ 的 CPU resource  荼毒過,我想你會和我一樣......)。然而 VoodooHDA 並不會如此,但我也不想回頭。

試著找其他人修改的 ALC269,結果就查到遠景上 nksmiles 所發表的教學,先用隨附的 AppleHDA, 可惜不管用,看來同為 ALC269 但腳位的接法卻是不同(實際操作時驗證這一點,差異在內建麥克風所在的節點不相同),但既然附有教學,我便嘗試自行仿製給 S10 專用的 AppleHDA,以下就是我實作之後的一些見解與補充。


在開始之前,我們先來確認一些前置知識:

Reference

  • <Ref1> 完整製作仿冒 LegacyHDA.kext - 紫米http://bbs.pcbeta.com/viewthread-623626-1-1.html
    仿 AppleHDA 的三大要素:ConfigData, Layout, PathMap, 我皆是根據紫米的流程走下來,因此不打算全盤講起,實際操作前建議至少瞄過一遍,紫米講的很詳盡,當初我可是拿這篇不斷的交相對照才學會。
  • <Ref2> ALC269仿冒驱动完美工作!分享修改方法。 - nksmiles - http://bbs.pcbeta.com/viewthread-888781-1-1.html
    因為紫米是使用 ALC883 做為教學案例,一些參數上的設定,對我而言參考價值是不太充足,身為同宗的 ALC269(僅腳位接法差異),在算 ConfigData 時,可說是半個標準答案。
  • <Ref3> 抛弃10.6的声卡驱动,修改lion原版声卡驱动来驱动你的声卡 - jianyili -http://bbs.pcbeta.com/viewthread-869832-1-1.html
    這篇看似與我們無關,但如果你把 rals2007 所仿製的 v1.8.7 與現行 v2.0.5 AppleHDA 相比較,確實會發現內部檔案架構有變化。據 jianyili 的說法,其實自 10.6.6 起 AppleHDA 就已經改變,而 Lion 沿用這樣的變化。假設,我們照紫米的教學使用 LegacyHDA,然後再透過 jianyili 的教學轉成新版格式,那就拐了個彎。其實我們只要詳讀此篇,就可以直接用新版的格式直接開始仿製。
  • <Ref4> 一步一步教你搞定仿冒声卡【针对新手】- serco76 - http://bbs.pcbeta.com/viewthread-953645-1-1.html
    serco76 給新手提供了一個很好的邏輯思維,對於整個仿製 AppleHDA 的過程上,我個人覺得它是屬於上乘心法,初讀很容易不知其所以然,一旦有實作經驗過後的再讀,更能體會箇中精妙。
真心建議閱讀本篇的讀者,都至少瞄過上述四篇大著,我的一些論述都是建基於此,紫米那篇更要讀通,其他三篇是做衍生與補充,其實能看懂這四篇的人,我這篇看不看都無所謂,充其量就是整理和一點小註解。

【修改對象】

  • ConfigData ---> AppleHDA.kext/Contents/PlugIns/AppleHardwareConfigDriver.kext/Contents/Info.plist
  • Layout ---> AppleHDA.kext/Contents/Resources/layout269.xml(layoutXXX.xml 是與 LayoutID 相對應)
  • PathMap ---> AppleHDA.kext/Contents/Resources/Platforms.xml
這是自 Snow Leopard 後期,到 Lion 之後,新版 AppleHDA 應該修改的架構,更詳盡的說明請參閱 <Ref3> jianyili 的文章,此處就簡單結論如上。

ConfigData

根據紫米的教學,我從 openSUSE 12.3 Milestone 1 取得的 Codec.txt 概略如下:# cat /proc/asound/card0/codec#X > ~/Desktop/Codec.txt 可以先透過檔案瀏覽器(e.g., Dolphin) 先到 /proc/asound/card0/ 查看,X 基本上可能為 0, 1, 2,確認過後再輸入上面指令

Codec: Realtek ALC269 Address: 0 Vendor Id: 0x10ec0269 0x11 0x411111f0 [N/A] Speaker at Ext Rear Black 0x12 0x411111f0 [N/A] Speaker at Ext Rear Black 0x14 0x99138110 [Fixed] Speaker at Int ATAPI Purple 0x15 0x0321441f [Jack] HP Out at Ext Left Green 0x16 0x411111f0 [N/A] Speaker at Ext Rear Black 0x18 0x03a19c20 [Jack] Mic at Ext Left Pink VREF_80 0x19 0x99a3092f [Fixed] Mic at Int ATAPI Unknown VREF_80 0x1a 0x411111f0 [N/A] Speaker at Ext Rear Black VREF_HIZ 0x1b 0x411111f0 [N/A] Speaker at Ext Rear Black VREF_HIZ 0x1d 0x4015812d [N/A] Speaker at Ext N/A Purple 0x1e 0x411111f0 [N/A] Speaker at Ext Rear Black 這裡使用顏色作為區分以方便識別,主要是兩組輸入、輸出,紫色底色的 0x1d 用途不明,不像主要作用的 pin,暫時先標記起來。

[Note]我的 Pin Default 組數不是 12 !!!


是的!ALC269 根據 Codec.txt 的資訊只有 11 組。Pin Default 的數目是與晶片有關,不同的晶片自然有著不同的數目,ConfigData 需填入的 data 並非一個固定大小。初學時看著紫米的範例,想說完蛋少了一組,直到發現 nksmiles 對於 ALC269 的設定(同為 11 組),才肯定了我的猜測。進一步的說,AppleHDA 並不在意有多少組 Pin Default,而是你在 ConfigData 內填入多少資料,它據此做多少事。假設,我只描述輸出相關設備,那麼會工作的就僅可能是輸出設備,沒描述的輸入設備自然不會工作,也不會去干擾輸出設備(serco76 的教學就是這樣做,一開始只先專著在輸出設備,稍候再完備輸入設備)

經過 Little-Endian 排序整理之後如下:
11 f0 11 11 41 [N/A] Speaker Black 12 f0 11 11 41 [N/A] Speaker Black 14 10 81 13 99 [Fixed] Speaker Purple 15 1f 44 21 03 [Jack] HP Out Green 16 f0 11 11 41 [N/A] Speaker Black 18 20 9c a1 03 [Jack] Mic Pink VREF_80 19 2f 09 a3 99 [Fixed] Mic Unknown VREF_80 1a f0 11 11 41 [N/A] Speaker Black VREF_HIZ 1b f0 11 11 41 [N/A] Speaker Black VREF_HIZ 1d 2d 81 15 40 [N/A] Speaker Purple 1e f0 11 11 41 [N/A] Speaker Black
仿 Apple 化後: Node c d e f Config =========================================================== 11 f0 00 00 40 01171cf0 01171d00 01171e00 01171f40 12 f0 00 00 40 01271cf0 01271d00 01271e00 01271f40 14 40 81 10 90 01471c40 01471d81 01471e10 01471f90 15 50 40 21 01 01571c50 01571d40 01571e21 01571f01 16 f0 00 00 40 01671cf0 01671d00 01671e00 01671f40 18 70 90 a1 01 01871c70 01871d90 01871ea1 01871f01 19 10 01 a0 90 01971c10 01971d01 01971ea0 01971f90 1a f0 00 00 40 01a71cf0 01a71d00 01a71e00 01a71f40 1b f0 00 00 40 01b71cf0 01b71d00 01b71e00 01b71f40 1d f0 00 00 40 01d71cf0 01d71d00 01d71e00 01d71f40 1e f0 00 00 40 01e71cf0 01e71d00 01e71e00 01e71f40 其實就是做 Pin Dedault 數值的修正,讓它更貼近 Apple 原生的值,請參考紫米所提供 Mac 機型的設定值修改,此處我給幾個 comment
  • 對於紫米在第一位置 Default Association 所給的定義我有些質疑,他說 No. 6 = Line Out, No. 7 = SPIDF Out, No. 8 = ExtMic, 但對照他給的 Mac 參考範例,ExtMic 所在 pin 腳所設的值皆為 7,而 SPIDF Out 所在 pin 腳皆設為 6,合理的懷疑,正確值為 No. 6 = SPIDF Out, No. 7 = ExtMic。因此,我自己就如此實驗,在 System Profiler 顯示也沒錯。
  • nksmiles 提到為了讓內建 Mic 工作,必須將 ExtMic 的第五位設為 8(Line In) 來規避,但我看 Mac 確實都將內、外接 Mic 的第五位設成 a。自己試著實驗,發現並無問題,推測原因應該是與第一位有關,nksmiles 選擇將第一位設為 2,但我仿照 Mac 將第一位設成 7。
  • 作用不明的 Node 1d,請果斷將它屏蔽

Final Config: Address + Node + 71c +【12】 Address + Node + 71d +【34】 Address + Node + 71e +【56】 Address + Node + 71f +【78】 因此得到 ConfigData 為: <01171cf0 01171d00 01171e00 01171f40 01271cf0 01271d00 01271e00 01271f40 01471c40 01471d81 01471e10 01471f90 01571c50 01571d40 01571e21 01571f01 01671cf0 01671d00 01671e00 01671f40 01871c70 01871d90 01871ea1 01871f01 01971c10 01971d01 01971ea0 01971f90 01a71cf0 01a71d00 01a71e00 01a71f40 01b71cf0 01b71d00 01b71e00 01b71f40 01d71cf0 01d71d00 01d71e00 01d71f40 01e71cf0 01e71d00 01e71e00 01e71f40 01470c02> 因為在 Codex.txt 裡 Node 14 曾經出現過 EAPD,所以必須在結尾多加上 01470c02,這是為了讓揚聲器正常發聲;如果不加,耳機正常工作,揚聲器無聲。原理請見威廉第三大師的論述(http://bbs.pcbeta.com/forum.php?mod=viewthread&tid=623626&page=3#pid13444785)

<ConfigData 設定>


CodecID = 283,902,569(= 0x10EC0269)
ConfigData --> 將剛才算出的 ConfigData 填入(angle brackets 不需要,僅數值就好,共 180 bytes[(4 * 11 + 1) * 4])
LayoutID = 269, 待會在 layout269.xml 也要對應設定

Layout

MuteGPIO

MuteGPIO = VREF(Hex) + 0100 + NodeID When VREF_HIZ appears, MuteGPIO = 0 Node 18 = 50(VREF 80) + 0100 + 18 = 0x50010018 = 1342242840 Node 19 = 50(VREF 80) + 0100 + 19 = 0x50010019 = 1342242841

<Overview>


CodecID = 283,902,569, LayoutID = 269 皆與 ConfigData 處相對應;
PathMapID = 269 則需與 Platforms.xml 對應

<Layout 設定>


MuteGPIO 對應填入,
SignalProcessing 就保留 legacyHDA 模板的設定值,為音效增益的部份,就算沒加應該也是不影響功能。

[Trick] 讓聲音更清晰


參考 rals2007 修改的 1.8.7 裡之設定會發現,他在 Headphone 和 IntSpeaker 處,除 MaximumBootBeepValue 外,其他什麼也沒有,AmpPostDelay, AmpPreDelay, Headset_dBV 皆沒設。我個人試用後,感覺揚聲器的聲音似乎比較清晰,而所測試的音樂為動漫歌曲,多為女聲高音,推測是去掉 AmpPostDelayAmpPreDelay 的關係。如果加上去的話,清晰度似乎會降低,因為很少聽重金屬搖滾之類的歌曲,沒有測試對其影響,如對低音部有興趣者,可自行比較,我個人是拿掉不用。

PathMap

[Fixed] Mic 0x07 > 0x24 > 0x19 => 7 > 36 > 25 [Jack] Mic 0x07 > 0x24 > 0x18 => 7 > 36 > 24 [Fixed] Speaker 0x14 > 0x0c > 0x02 => 20 > 12 > 2 [Jack] HP Out 0x15 > 0x0d > 0x03 => 21 > 13 > 3 看了很多人他們設置 PathMap 的路徑,雖然配法並非唯一,只要符合 connection 的關係,但是我發現到各個 Path 都是絕對獨立的,它們不會去共用節點,那到底能不能共用呢?紫米提供的 MacBook Pro 5,2 範例,給了一個很有趣的回答:它的內、外接 Mic 的走法一開始都是 7 > 36 > 然後才是各自的節點。顯然在 Mac 共用節點並不違法,我試著仿效,結果看來是沒問題的。至於是不是有任何副作用,我不知道,有疑慮的話,使用多數教學所採用的獨立路徑;這個方式有沒有比較好,我亦不知道,但它提供一條新的道路來讓人折騰嘗試。


此處 PathMapID 與 layout269.xml 裡面的 PathMapID 必須相同,才能被正確的載入


Item 0 是輸入裝置
  • Item 0: 內建麥克風
  • Item 1: 外接麥克風
Item 1 是輸出裝置
  • Item 0: 揚聲器
  • Item 1: 耳機(Headphone)

我在此處讓輸入、輸出裝置能夠自動切換,因此每個 Item 恰都有兩個子項;如需改成手動切換,請自行將裝置獨立,意即有兩個輸入(出)裝置,底下僅各只有一個裝置。

<輸入裝置 NodeID 的設定>


Boost 我直接沿用 rals2007 在其 1.8.7 所設定的值(內建麥克風 = 3, 外接麥克風 = 1)

<輸入裝置 Amp 的設定>


內建、外接麥克風皆在第一個節點上添加 Amp,底下的 4 個項目都設為 Yes

<輸出裝置 NodeID 的設定>


紫米的教學裡談到,Amp 僅需加在第二個節點處就好,這樣做在我的 S10 上會產生 sound assertion error messages, 並且使整個 AppleHDA 不 work。參考 rals2007 在 v1.8.7 的配法,他不選第二個,而是在第三個節點處加上 Amp,功能正常,但我卻無法在系統偏好設定下勾選靜音。偶然間找到一個 based on Lion 10.7.0(11a494) 版本號為 2.1.1 AppleHDA,依稀記得是在遠景上找的,詳細位置已不記得,同樣是 patch for ALC269,一試之下,喇叭有聲音,系統偏好設定可靜音,打開它的 Platforms.xml 來看,他居然在所有輸出裝置三個節點上都加上 Amp,因此我推薦仿照其配置,將 Amp 設給所有輸出裝置的節點。

<輸出裝置 Amp 的設定>


三個節點都要添加 Amp,且除 VolumeInputAmp = No 外,其餘三項都設為 Yes

Binary Patch

# perl -pi -e 's|\x62\x02\xec\x10|\x69\x02\xec\x10|g' AppleHDA.kext/Contents/MacOS/AppleHDA
這是將 AppleHDA 原生支援的 ALC262 換成我們的 ALC269,當然也可以用 hexedit tool(e.g., 0xED),但我沒用過不熟。此外,我是有點疑問,Apple 原生支援的晶片組(e.g., ALC885, ...etc)也不少,我們一定要用 ALC262 當作被取代對象嗎?不能換成其他的嗎?有興趣的人可朝這方面研究一下。

DSDT

首先將 DTGP method 加入 DSDT
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) }
放在 DSDT 的最開頭處即可

然後在 Device (HDEF) 下加入以下 method
Method (_DSM, 4, NotSerialized) { Store (Package (0x0A) { "codec-id", Buffer (0x04) { 0x69, 0x02, 0xEC, 0x10 }, "layout-id", Buffer (0x04) { 0x0D, 0x01, 0x00, 0x00 }, "device-type", Buffer (0x0F) { "Realtek ALC269" }, "hda-gfx", Buffer (0x0A) { "onboard-1" }, "PinConfigurations", Buffer (Zero) {} }, Local0) DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) }
如果你一路跟隨至此,並將所有步驟執行完成,且沒有遺漏,那麼恭喜!你的 AppleHDA 已經製作完成,可以將它扔進 S/L/E(別忘記修復權限),之後重新開機,看看你的揚聲器是否可以發聲了呢!沒有意外,就盡情享受 AppleHDA 帶來的原生支援唄!^^

Postfix

Sound assertion "0 == hdaGfxCandidate" failed in AppleHDAController at line 1082 goto Exit

這個錯誤訊息會在載入 AppleHDA 出現一次。起因於 Injection 的不完整,造成 kernel log 出現錯誤訊息,目前看來並不影響仿製 AppleHDA 的功能。

Solution: 需在 DSDT 中的 Device (GFX0) 加入 "hda-gfx" 的資訊

Method (_DSM, 4, NotSerialized) { Store (Package (0x02) { "hda-gfx", Buffer (0x0A) { "onboard-1" } }, Local0) DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) }
這個錯誤似乎牽涉到 HDMI,參考 Acer 4750G 修正過的 DSDT([acer] 地平线:MAC记-------4750G黑苹果之新手必看(安装贴、驱动贴,引导贴,镜像制作贴)- http://benyouhui.it168.com/thread-1884141-1-1.html) 我發現有進行 hda-gfx Injection 的地方,除 Device (HDEF)Device (GFX0),尚有 Device (PEGP)[[教程] DSDT+AppleHDA修改(修复HDMI引起的sound assertion)(CX20561为例)- http://bbs.pcbeta.com/viewthread-756597-1-1.html]Device (HDAU)。因為 S10 的 DSDT 只有 HDEF 和 GFX0 這兩個 Device, 只要補上後就沒有 error message。如果在其他 PC 上想要修正這個錯誤,當在 GFX0 添加上段 code 而無法修正錯誤時,請查看是否有 Device (PEGP) 和 Device (HDAU),並為其加上上面的 code(如果你的 Device 底下已有 Method (_DSM, ...) 那就只要加入 "hda-gfx" 藍色這部分,然後在 Package 的數量上 +2[Hex])

Un-fix

Sound assertion "0 != fProvider->startPowerManagementTimerForEngine ( this, true )" failed in AppleHDAEngine at line 5635 goto handler


這個似乎與休眠回來後,音效消失相關的錯誤訊息,修正方式有二,沒有完美的解決方案:
  1. # kextunload /System/Library/Extensions/AppleHDA.kext
    # kextload /System/Library/Extensions/AppleHDA.kext
    Refer by "No sound after waking up from sleep mode" - http://www.insanelymac.com/forum/topic/212145-no-sound-after-waking-up-from-sleep-mode/#entry1425310
  2. 把耳機插入,音效自動恢復;耳機拔出,揚聲器正常!
    且經過測試,休眠前已插入耳機,經過休眠,系統恢復後,耳機能正常播音,意即耳機的 pin 腳完全不受休眠的影響。據此推測,揚聲器會因休眠後沒有音效,即有可能來自於 EAPD 開關沒有開啓。