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 開關沒有開啓。

2012年6月10日 星期日

openSUSE 12.2 Beta 1 + Windows 8 RP 雙系統 - grub2 篇

Situation:

Before
sda: [sda1: System Reserve] [sda2: Windows 8] [sda3: Extended] < (sda5: Data 1) (sda6: Windows 8 ISO) (sda7: Data 2) (sda8: openSUSE 12.2 Beta 1) > [sda4: /Home]

上圖是我 S10 灌完 Windows 8 RP + openSUSE 12.2 Beta 1 之後的硬碟狀況,因為 DVD-RW 片讀不到(應該是壞了),只好透過 NTT HDD Installer 用硬碟來灌 Windows 8 RP,如今灌好之後,想說要回收這劃規出來當 Disc 的磁區,如有需要下次重灌(應該等 RTM 了吧!^^)前再重分割就好,當下也沒多想,用 Windows 裡的 Disk Management 砍了 sda6 收工。

結果一會兒後開機時就囧了,grub 居然跟我說:「找不到 partition」,壞去!這次我把 openSUSE 裝在 Extended partition 裡,而非 primary,一直感覺不出不把 system 放在主分割區有什麼差?這下自食惡果,因為刪了 sda6 導致後面磁區的代號變動(sda7→sda6, sda8→sda7),如果是放在 sda4 還不受影響,但不巧的是,openSUSE 被我放在 sda8,結果就讓 grub rescue> 跑出來(這也間接證明 grub.cfg 有用到 sdaX 來做設定)


Solution:

這裡 grub rescue 應該是 grub2 的,現行在 openSUSE 裡談 grub2 的文章並不多,多數是 grub,有談到 grub2 的幾乎都是 Ubuntu,雖然是東拼西湊,總算找到方法進入 openSUSE:

ls
> (hd0), (hd0,msdos1), (hd0,msdos2), ..., (hd0,msdos9)
ls 跟 linux 底下的一樣,可列出資料夾下的明細,我的 S10 硬碟裡有這幾個 parts, 並非所有 msdosY 可以對應到 sdaX, 其間是有未分割區、Linux Swap 的存在,X, Y 不盡然相等,前後查看[ls (hd0,msdosY)]一下內容應該就可以找出 openSUSE 的磁區,我的是 (hd0,msdos9)

set prefix=(hd0,msdos9)/boot/grub2

insmod (hd0,msdos9)/boot/grub2/linux.mod

load 完 linux module 後,字體顏色會從淡灰色變白

set root=(hd0,msdos9)

linux /boot/vmlinuz root=/dev/sda7
(或 linux /boot/vmlinuz-3.4.0-2-default root=/dev/sda7)
因為 vmlinuz 是 symbolic link 指向 vmlinuz-3.4.0-2-default

initrd /boot/initrd
同理 initrd 亦是 symbolic link

boot
之後就會照著正常開機程序進入 openSUSE

本來是想用 Ubuntu 底下常用的 grub-install 來重新安裝,
(# grub-install /dev/sda --no-floppy)
但 openSUSE 底下 grub-install 不允許接參數,而 # grub-install 會直接使用 YaST 裡的 Boot Loader 來運作,以下分成兩種狀況探討:


<Note> su fdisk -l 
可查看磁碟的相關資訊(開機磁區, 磁柱分配, 磁區格式, ...)
  1. Type GRUB2:
    Boot Loader Location - Custom Boot Partition [/dev/sda] 需要手動輸入沒得選
    這樣設定我不確知是否可正常修正 grub2,理論上應該沒問題,但當初因為不知道要選 Custom Boot Partition,我的樣本是先透過 grub 修正再轉成 grub2,這點是有待確認的
  2. Type GRUB:
    Boot Loader Location - Custom Boot Partition [/dev/sda] 可用下拉式選單選取
    確實可修正回 grub, 但 Windows 的分區需用 chainloader 來添加,可供設定的細項比較多
總之,原則上就是透過 grub rescue> 下指令先能進入 openSUSE,然後再用 YaST 的 Boot Loader 做修復


Reference

Grub Rescue
Grub Knowledge
  1. GRUB 2 bootloader - Full tutorial - http://www.dedoimedo.com/computers/grub-2.html
  2. Grub2/Installing - https://help.ubuntu.com/community/Grub2/Installing
    Reinstall Grub2 in Ubuntu
<Note> if "grub.cfg" lost, # grub-update need to be used to recreate "grub.cfg"

2012年5月16日 星期三

贈書

此處我所要提的不是圖書館 or 一些公共場所,不論政令宣導、公益贊助的那一種贈書。

一年前正當語霈姊要離職(上工屆滿)時,我想著要送她什麼東西好。一些裝飾性的小玩意,在書店、禮品店確時都有,但我並想不胡亂膚衍,那麼做並不是我的風格。想要送禮,但又想送到心坎裡,且又不失個人風格,真的是一個非常傷腦筋的問題。

放假回臺北之時,我還特地到北車附近的文具禮品店逛,那是我以前從不去做的事。兜了一個下午其實也看不到一件,我會喜歡且又別具意義的東西,想說不如別送,寧缺勿濫!沒有收獲的我回到新營後,真的是抱著姑且一試的心態,到金石堂去晃晃。沒有意外,那些所謂的禮品,沒有更好,只有更糟!

不怎麼期待的我去書店不單就為了找禮品這一個目的,而是必然應該隱含的答案 ─ 去書店若不去看書豈不本末倒置?當下就翻些新書來看看,就發現前 Google 資訊長所寫的如何善用 Google 服務的整理術,一看就覺得這個讚,語霈姐在網路工具的應用上,就我來看其實是不太足夠的,現在已經進入雲端時代,她應該多了解這些工具,有時候我來說真的欠說服力,還是交給名人來說,比較有說服力。

由此為一個出發點,後來又看了《那啊那啊~神去村》、《雨樹之國》真些好作品,也它們轉贈給語霈姐,也很榮幸的從語霈姐手中收到兩本書 ── 高木直子的《一個人去旅行》一、二年級生,確實相當符合我對語霈姐的形象。

但我真的一直沒有時間去看,誰叫我大學期間所欠的債有一大堆,我必須先將那些資工相關的書籍讀完之後,才能來讀它們。對不起!並不是我不重視它們,因為我這人有這種本末倒置、金屋藏嬌的習慣,雖然說我也覺得這樣不太好就是,但在我變更我的觀念之前,還望妳能理解......

2012年4月11日 星期三

Change

每次有新的改變真的都令我感到疲憊,
也許我是個很古板的人;
但一覺醒來之後,我卻不向改變低頭,
也許昨日是遍體鱗傷,今日還是得傷,
但總不會再向之前那麼痛,
這樣的我也帶著點革新,
右非右,左非左的...

買了座檯燈和一支辦公椅,
椅子相當貼近預期,甚至超乎想像;
但檯燈帶給我的改變,有點難消受,
至少在初次使用。

對於光線我有相當程度的慣性,
加上如何應對筆電的角度真的很令人頭痛,
看人喝咖啡喝的津津有味,
真正等自己去喝的時候,才知其苦澀。

抱怨不能解決一切的問題,
但也是做適應的一種體現,
我打著這篇文章名為抱怨,
卻也是適應的一項實踐。

兄弟們,一盞茶的時間過去,
我真的可以逐漸感受你們所帶來的氛圍,
讓我們一起打拚,
在 Liszt 的「愛之夢」下,
Thanks, ほたる!

P.S. 雨又悄然的下著

2012年4月3日 星期二

亂馬

這還真的是一部頗具歷史的動畫(20 年前),比灌籃高手還久遠,根據 wiki 上的說法,它是高橋留美子的經典大作,小時候是名聞過,但也沒有去深究,大概知道亂馬會男變女,女變男。

或許這真的是經典,但錯過第一時間的我就很難去體會,就像沒受過多啦 A 夢洗禮的我,只能膚淺地發表著畫工粗糙、難以下咽的評論。

對高橋留美子印象,源自於犬夜叉,今日一窺亂馬 OP,終算是發現兩者的關連之處,珊瑚、阿籬、彌勒、犬夜叉,原來都是這樣演進過來的,尤其是冥加爺爺的相似度達到 95% 以上。

所以說如果不能循序漸進的來看時代性的作品,真的很難去了解它的經典之處,不過這也沒辦法,誰叫我小時候對於動畫一點都不開翹 :]

2012年3月31日 星期六

30 分

一直不給自己設限,剛開始似乎是一個很明智的抉擇,但日子一久之後我愈來愈覺得不妥當。因為一切皆可以不帶責任的向後拖延,這並非我預期的結果,我也不想這樣,但它就是硬生生地出現在眼前。

等待,並不會為我帶來太多的不愉快,但這個世界卻不容許我做太多的等待。

30 分,這是我給自己設下的一個壓力指標,為何這麼定,我也沒有任何依據,但我知道不設定我就不會前進,不然上一篇文章就不會是半年前的事。

這樣的時間確實是必要的,我是想表達些什麼,但不透過文字,只想借由腦波目前還太遙遠、且雜亂。我不會想要筆戰,但快速的回應是不可或缺的。

對我而言,這樣的一切都像是嬰兒學步般的難堪,當你已經不是嬰兒之際。

限制與解脫,有時可說是一體兩面的東西,適切的交替能讓一切運作的更加順利。

整理思緒,本來就是一令人頭疼的事,但此刻的我不知為何肚子疼。

估計這個 30 分 project 短時間不會產生太大的效益,但如何從這些片段中組合出有意義的言語,是我必須做的事,因為一個 programmer 不能不會這一件事。