[Hướng dẫn] Patch AppleHDA cho các laptop chạy Hackintosh

Nếu bạn đã đọc đến bài này thì chắc là đã biết AppleHDA là gì và tầm quan trọng của nó đối với một hệ thống Hackintosh, vậy nên cái phần mở đầu này mình sẽ nói thật ngắn gọn thôi.

Trước tiên, các bạn hãy dành thời gian đọc bài này của mình, nếu như những giải pháp mình đưa ra trong đó không thể làm thỏa mãn đôi tai của bạn thì xin chúc mừng, bạn đã tìm đúng bài cần đọc rồi đó ^_^.

Các bạn nên biết rằng patch AppleHDA là một kỹ năng nâng cao của Hackintosh, nó đòi hỏi rất nhiều ở người patch sự kiên trì bền bỉ và tinh thần ham học hỏi. Khi viết bài này, mình đã cố gắng viết sao cho đơn giản dễ hiểu, cộng thêm với sự hỗ trợ của các công cụ hữu ích thì việc patch AppleHDA không còn quá khó khăn như trước đây nữa. Tuy nhiên, hãy luôn xác định rằng bạn có thể sẽ mất nhiều giờ, thậm chí là nhiều ngày, nhiều tháng để nắm bắt được toàn bộ quá trình patch. Một cỗ máy Hackintosh với hệ thống âm thanh hoàn hảo chẳng có gì là khó nếu những gì bạn bỏ ra là xứng đáng :D.

Các bạn có thể tham khảo guide đầy đủ, chi tiết bằng tiếng Anh ở đây:
Bài viết mang tính chất tổng hợp lại từ nhiều nguồn khác nhau, kết hợp với kinh nghiệm cá nhân. Nếu thấy có chỗ nào không đúng, hi vọng các bạn có thể bớt chút thời gian comment bên dưới để mình hoàn chỉnh bài viết hơn. Mình xin cảm ơn!

Guide này chỉ áp dụng cho các máy laptop cài Hackintosh 10.8 trở đi, với các version thấp hơn, vui lòng tham khảo bài viết bằng tiếng Anh ở trên.

Mình xin chân thành cảm ơn tác giả bài hướng dẫn gốc EMlyDinEsh cùng các bạn khác như Mirone, Bcc9, RehabMan, Pokenguyen, Danght, Tuanpekoe, El Nos... những người đã góp phần không nhỏ vào việc đơn giản hóa quá trình patch AppleHDA.


HƯỚNG DẪN PATCH APPLEHDA CHO LAPTOP CÀI HACKINTOSH


Yêu cầu:

1. Máy tính cài Mac OS X, Ubuntu (LiveUSB cũng được) và biết cách thao tác, sử dụng một số app trên hai hệ này.
2. Download bộ công cụ patch AppleHDA bao gồm:
+ Các app cần sử dụng trong quá trình patch.
+ Layout và Platform.
+ Folder Codecgraph và patch-hda.
+ Codec_dump ALC269VC mình dùng để viết hướng dẫn và các kext đã patch thành công, các bạn có thể dùng để đối chiếu.


Các bước:

1. Dump codec từ Ubuntu.
2. Chỉnh sửa codec verbs.
3. Xác định pathmap, patch layout và platform.
4. Patch binary
5. Patch DSDT.
6. Kiểm tra tình trạng kext.


Chú ý: Các bạn nên đọc qua tất cả các bước một lượt để hiểu sơ qua về quá trình rồi mới bắt tay vào làm nhé. Như thế sẽ bớt lỗi vặt hơn ^_^.

BƯỚC 1: DUMP CODEC TỪ UBUNTU OS VÀ SƠ ĐỒ HÓA CÁC KẾT NỐI.


1. Dump Codec từ Ubuntu 

Các bạn có thể dùng Ubuntu LiveUSB (Google nhé) hoặc nếu có sẵn Ubuntu trên HDD rồi thì càng tốt, copy đoạn code sau vào Terminal (Ctrl+T) rồi Enter:

cd ~/Desktop && mkdir CodecDump && for c in /proc/asound/card*/codec#*; do f="${c/\/*card/card}"; cat "$c" > CodecDump/${f//\//-}.txt; done && zip -r CodecDump.zip CodecDump

Sau khi lệnh được thực hiện, sẽ có 2 file được dump ra ngoài màn hình nền Desktop, copy file codecdump.zip ra một nơi nào đó rồi đem sang máy cài Mac làm bước tiếp theo.

2. Chạy script để sơ đồ hóa các kết nối.

- Cài graphviz-2.32.0.pkg trong bộ công cụ ở trên.
- Giải nén codecdump.zip, ta sẽ thấy có 2 file trong đó, tuy nhiên, mình sẽ chỉ sử dụng 1 file thôi. Các bạn tìm file nào có tên codec sound như hình thì xóa dòng AFG Function Id: 0x1 (unsol 1) đi và rename file đó thành codec_dump.txt.

- Copy codec_dump.txt vào thư mục codecgraph (đặt thư mục này ngoài Desktop nhé), mở Terminal và gõ lệnh như sau:

> sudo -s
Gõ mật khẩu root của máy rồi Enter, lưu ý là mật khẩu sẽ không hiển thị trên màn hình.
> cd [Kéo thả thư mục Codecgraph vào rồi Enter]
> [Kéo thả file Scrip Patch Codec by HoangThanh vào rồi Enter]

- Đợi khoảng 5 giây cho lệnh chạy xong, chúng ta sẽ copy 2 file codec_dump_dec.txt.svgfinalverbs.txt ra một nơi khác để tiện chỉnh sửa.

BƯỚC 2: CHỈNH SỬA CODEC VERBS


1. Chỉnh Verbs
- Mở finalverbs.txt vừa tạo được ở trên, trong đó có 2 nội dung sẽ sử dụng cho việc patch là DevID và Modified Verbs. Tuy nhiên, trong khuôn khổ của bước này, ta sẽ chỉ quan tâm đến Modified Verbs mà thôi. Copy 4 nhóm ký tự cuối cùng của Modified Verbs vào PinConfigurator như hình.

- Tại hình số 3, các bạn để ý các số 14h, 18h, 12h, 15h trong ngoặc, những số này tương ứng với các node của Pin Complex. Ta thấy node 1d hoàn toàn không ảnh hưởng gì đến các cổng âm thanh nên mình sẽ xóa nó đi.

- Giờ mình sẽ giải thích hình số 4.
Internal + Jack: là thiết bị built-in hay gắn trong/tích hợp (là loa và mic được thiết kế đi kèm và không thể tách rời với máy)
Jack or ATAPI, 1/8” stereo/mono: là thiết bị external hay gắn ngoài (các thiết bị tai nghe hoặc mic thu âm rời…)

Như vậy, theo như cách giải thích trên thì đúng ra các thông số của card phải là:
Nid 20 (14h): Loa tích hợp (Speaker).
Nid 24 (18h): LineIn (đúng ra nên là mic gắn ngoài nhưng vì Mac không sử dụng mic gắn ngoài nên ta sẽ chuyển nó về LineIn).
Nid 18 (12h): Mic tích hợp (Microphones).
Nid 21 (15h): Loa rời (Headphone).

Tuy nhiên, các thông số trong hình lại hiển thị khác, đặc biệt là sự xuất hiện của 2 Microphones (Nid 24-18h và Nid 18-12h) mà không thấy có LineIn thì hơi vô lý. Chính vì thế ta sẽ sửa lại các verbs bên trên để chuẩn lại cho đúng:

Modified Verbs là verb đã được chỉnh sửa lại rồi nên hầu hết các codec laptop chỉ cần sửa như trên là được. Nếu muốn hiểu sâu hơn về cách sửa verbs, các bạn có thể tham khảo bài này.

Ngoài ra, nếu muốn máy tự động chuyển qua lại giữa speaker và headphone (cắm headphone thì âm thanh tự chuyển sang tai nghe) các bạn thêm một nhóm sau vào sau cùng: 01470c02 (bạn có thể sẽ phải thay 14 bằng Nid speaker của soundcard máy bạn).

Sau khi chỉnh sửa lại, ta có verbs hoàn chỉnh:
01271c30 01271d01 01271ea0 01271f90
01471c10 01471d01 01471e17 01471f90
01571c40 01571d10 01571e21 01571f00
01871c20 01871d50 01871e81 01871f00 01470c02

Copy lại các verbs trên vào PinConfigurator, ta sẽ thấy có sự thay đổi so với ban đầu:


2. Copy các verbs vào info.plist

- Copy AppleHDA.kext gốc trong System/Library/Extensions ra Desktop để tiện chỉnh sửa.
- Dùng PlistEdit Pro để mở Info.plist tại:
AppleHDA.kext/Show Package Contents/Contents/PlugIns/AppleHDAHardwareConfigDriver.kext/AppleHDA.kext/Show Package Contents/Contents/Info.plist. 
Sau đó tìm đến key như hình:


Trong HDAConfigDefault thì thường có khoảng trên 20 keys, các bạn xem từng key một, đến key nào có đầy đủ các giá trị như hình số 2 (thường là key số 4 hoặc 5) thì giữ lại key đó và xóa tất cả các key còn lại. Mặc định khi chỉ có 1 key thì key đó sẽ được đặt tên là key 0.

Tiếp đến, các bạn chỉnh sửa như sau:

AFGFlowPowerStates: giữ nguyên.
CodecID: copy tên codec đã được chuyển từ hệ hex sang dec trong finalverbs.txt.
FuncGroup: giữ nguyên.
ConfigData: các bạn chuyển dãy verbs đã chỉnh sửa trong PinConfigurator về thành một dòng, mỗi nhóm cách nhau một khoảng trắng rồi copy vào Info.plist.
LayoutID: 28.
Update 07/04/2016: Các bạn patch kext cho 10.11.4 thì đọc thêm guide này để sửa thêm một số thông tin của info.plist nhé. 

BƯỚC 3: XÁC ĐỊNH PATHMAP, PATCH LAYOUT VÀ PLATFORM.


1. Xác định pathmap.

Giờ là lúc dùng đến file codec_dump_dec.txt.svg tạo được lúc chạy Terminal, các bạn mở nó lên sẽ thấy bên trong là một sơ đồ các kết nối âm thanh với rất nhiều các hình vẽ khác nhau. Tính chất phức tạp của sơ đồ tùy thuộc vào từng loại codec, nếu chia theo mức độ thì codec của IDT là phức tạp nhất, sau đó đến Realtek và cuối cùng là Conexant (tất nhiên là còn nhiều loại codec khác nhưng đây là 3 loại hay gặp nhất trên các laptop bây giờ).
Tuy nhiên, thông thường, dù sơ đồ có phức tạp đến đâu thì luôn chia thành 2 phần riêng biệt là Input Device và Output Device, dưới đây là hình minh họa cho codec của Realtek và Conexant. (Mình không chụp hình của IDT vì sơ đồ nó rộng quá, zoom bé lại thì chẳng nhìn thấy gì nữa cả :3)



Mình sẽ giải thích ý nghĩa của các hình vẽ trong sơ đồ:


Thứ tự kết nối của các Input Device (gồm Mic và LineIn) sẽ là:


Thứ tự kết nối của các Output Device (gồm Speaker và Headphone) sẽ là:

Giờ chúng ta sẽ đi xác định Input device trước:
Nguyên tắc khi chọn các node input là node nào có xuất hiện [N/A] đằng trước thì mình không cần quan tâm. Với Input Device, chúng ta sẽ quan tâm đến các node pin complex có dạng như [Fix] Mic at... (Microphone)[Jack] Mic at... (LineIn), đồng thời để ý các đường mũi tên có màu xanh dương nét liền - những đường này biểu thị các kết nối ưu tiên.



Ví dụ với codec ALC 269VC này thì các bạn để ý các đường kết nối từ 9 => 34 => 18 đều là các đường nét liền màu xanh dương. Node pin complex 18 là node của Microphone, như vậy Microphone sẽ có kết nối là 9 - 34 -18
Do các kết nối ưu tiên đều đã dành cho microphone rồi nên các kết nối không ưu tiên sẽ là của LineIn, nhìn trên hình ta có 8 - 35 - 25.

Chú ý:
- Một số codec của Realtek và Conexant từ đời Haswell trở đi chỉ có kết nối cho Microphone mà không có kết nối cho LineIn (điển hình là codec ALC233 sử dụng combo jack của Asus), trong trường hợp các bạn sẽ chỉ còn cách chấp nhận là máy sẽ không nhận mic ngoài.
- Một số codec của Conexant và Realtek không xuất hiện Audio Mixer/Audio Selector trong sơ đồ, trong trường hợp đó các bạn cứ xác định các kết nối chỉ có pin complex và audio input thôi.

Tiếp theo, chúng ta sẽ đi xác định các kết nối của các Output Device.

Tương tự như với Input Device, tất cả các node có xuất hiện [N/A] ở đầu ta sẽ loại bỏ, đồng thời chú ý các kết nối ưu tiên. Nếu trên vùng của Output Device có xuất hiện các node của bên Input như [Fixed] Mic... hoặc [Jack] Mic at... thì ta cũng không cần quan tâm.
Với output device, chúng ta sẽ để ý các node có dạng [Fixed] Speaker at... (speaker)[Jack] HP out... (headphone).

Như vậy nhìn vào hình, ta có thể dễ dàng xác định các kết nối như sau:
Speaker: 20 - 13 -3
Headphone: 21 - 12 -2

Chú ý: Trong các codec của Conexant không thấy sự xuất hiện của Audio Mixer trong sơ đồ, trong trường hợp đó các bạn cứ xác định các kết nối chỉ có pin complex và audio output thôi.

Như vậy, sau khi xác định tất các kết nối rồi, ta có:
Microphone: 9 - 34 - 18.
LineIn: 8 - 35 - 25.
Headphone: 21 - 12 -2.
Speaker: 20 - 13 - 3.

OK, các bạn copy mấy số này ra một chỗ riêng, chút nữa sẽ dùng chúng để patch platform ^_^.

2. Patch layout.xml và platform.xml

a) Phần này là phần dễ nhất nè, các bạn mở file layout28.xml bằng PlistEdit Pro và sửa các thông số như sau:

LayoutID: để layout trùng với layout của Info.plist, trong trường hợp này là 28.
CodecID: bên trong key này có một key con đặt tên là 0, các bạn điền tên codec của sound card dưới dạng mã dec trong finalverbs.txt vào key 0 này, CodecID này trùng với CodecID trong Info.plist.
PathmapID: điền một số bất kỳ nào đó, số này phải trùng với số pathmapid trong platform nên thường thì nó sẽ được đặt theo tên của codec, trong trường hợp này là 269.
Sau cùng nhớ save lại nhé.

b) Patch platform.xml

Tương tự, các bạn mở platform.xml bằng PlistEdit Pro, sau đó mở key Pathmaps sẽ thấy bên trong có rất nhiều các key nhỏ khác, các bạn mở key số 0 ra thấy bên trong có một key Pathmap và một key PathmapID. Key PathmapID này bạn để số trùng với số PathmapID trong layout28.xml. Tiếp đến, mở key Pathmap ra sẽ thấy có 2 key nhỏ là 0 và 1, mở tiếp 2 key này ra thì trong mỗi key này lại có 2 key nhỏ khác nữa, các key này chính là các key điều khiển các thiết bị như đã thể hiện trong layout28.xml. <== Khó hiểu quá o.O, thôi nhìn hình cho dễ hình dung nha ^0^.


Các bạn còn nhớ thứ tự các kết nối mình đã xác định ở phần trước không, giờ là lúc chúng ta sẽ dùng đến chúng, nhìn hình cho dễ hiểu nha :).


Tất nhiên, khi nào chỉnh xong rồi, các bạn nhớ save lại nhé :D.

c) Convert các file xml sang xml.zlib.
2 file layout28.xml và platform.xml nếu cứ để như vậy thì kext sẽ không đọc được, các bạn cần chuyển chúng về layout28.xml.zlibplatform.xml.zlib. Để convert file, các bạn mở app HDAWizard trong bộ công cụ về, chuyển sang tab Convert, sau đó kéo thả 2 file layout28.xml và platform.xml vào, đợi khoảng 2s ta sẽ có 2 file mới với định dạng xml.zlib.
Các bạn copy đè 2 file này vào AppleHDA.kext/Contents/Resources

BƯỚC 4: PATCH BINARY CHO KEXT

Trong bộ công cụ có folder patch-hda.zip, các bạn giải nén và copy folder đó ra ngoài Desktop, sau đó mở Terminal và gõ lệnh sau:

cd ~/desktop/patch-hda
./patch-hda.pl 10ec0269

Các bạn thay 10ec0269 bằng DevID dưới dạng mã hex của codec đang patch, DevID có thể tìm trong finalverbs.txt.


Sau đó các bạn vào System/Library/Extensions/AppleHDA.kext/Contents/MacOS sẽ thấy trong đó có 2 file binary, copy file AppleHDA trong đó chép đè lên AppleHDA.kext/Contents/MacOS của kext đang patch.

Chú ý: Lệnh này chỉ thực hiện được khi folder patch-hda được đặt ngoài Desktop và kext AppleHDA.kext gốc vẫn còn trong S/L/E, nếu thiếu 2 điều kiện này, lệnh sẽ bị lỗi.
OK, vậy là bước patch kext đã xong, chỉ còn chút xíu nữa thôi là xong rồi ^_^.

BƯỚC 5: Patch DSDT, cài kext.


1. Patch DSDT

Trên một hệ thống Mac Hack, muốn có âm thanh không phải cứ patch kext xong là có ngay. Bạn cần inject layout cho kext, hiểu đơn giản là cung cấp những thông tin cơ bản để máy nhận biết chip audio. Dưới đây, mình sẽ hướng dẫn 3 cách inject layout cho AppleHDA, trong đó, mình khuyến khích các bạn sử dụng cách thứ nhất là inject qua DSDT (sử dụng MacIASL); cách 2 và cách 3 về lý thuyết là được tuy nhiên mình chưa từng làm thử nên sẽ không thể hỗ trợ nhiều nếu các bạn sử dụng những cách này. Ngoài ra, cách 2 và cách 3 thông thường chỉ áp dụng cho những máy nào mà DSDT không có Device (HDEF).

Inject layout qua DSDT.
Trong MacIASL, thêm method _DSM vào Device (HDEF) có nội dung như sau:

Method (_DSM, 4, NotSerialized)
{
If (LEqual (Arg2, Zero))
{
Return (Buffer (One)
{
0x03
})
}

Return (Package (0x06)
{
"layout-id",
Buffer (0x04)
{
0x1C, 0x00, 0x00, 0x00
},

"hda-gfx",
Buffer (0x0A)
{
"onboard-1"
},

"PinConfigurations",
Buffer (Zero) {}
})
}

Trong đoạn code trên thì phần quan trọng nhất là layout-id (chỗ mình in đậm và bôi đỏ). Tùy thuộc vào layout của kext mà các bạn sửa cho phù hợp. Layout có thể được điền vào dưới dạng hệ thập phân (hệ cơ số 10) hoặc hệ thập lục phân (hệ cơ số 16) đều được, tuy nhiên mình thường dùng hệ thập lục phân vì nó chuẩn theo ngôn ngữ chung của DSDT. Dưới đây là các layout thường được dùng cho AppleHDA:



Chú ý: Tham khảo Guide for Newbie (phần 5) để biết thêm về cách patch DSDT. Trong nhiều trường hợp, bạn sẽ cần phải patch thêm cả HPET và IRQ thì mới lên audio.

Inject layout qua config.plist cho những ai sử dụng Clover bootloader
Mở config.plist bằng Clover Configurator, chuyển sang tab Devices và chỉnh như hình:


Inject layout qua chameleon.boot.plist cho những ai sử dụng Chameleon bootloader.
Mở org.chameleon.boot.plist bằng Chameleon Wizard và chỉnh như hình. Ngoài ra, khi cài bootloader cần chọn cài thêm module HDAEnabler nữa.


2. Cài kext và DSDT

Yêu cầu:
- Với Yosemite, config.plist hoặc chameleon.org.boot.plist bắt buộc phải có kext-dev-mode=1.
- Với El Capitan, config.plist để CsrActiveConfig là 0x03 và BooterConfig là 0x28.

Cài Kext
Dùng một trong hai app Kext Utility hoặc Kext Wizard để cài kext:
+ Kext Utility: nhập pass rồi kéo thả file kext vào rồi đợi.
+ Kext Wizard: xem hình.

Cài DSDT:
Sau khi đã add layout-id vào DSDT, các bạn lưu lại file dưới định dạng .aml vào copy như sau:
Clover: EFI\Clover\ACPI\Patched\DSDT.aml.
Chameleon: Mac Volume\Extra\DSDT.aml.



BƯỚC 6: KIỂM TRA TÌNH TRẠNG KEXT SAU CÀI ĐẶT


Việc đầu tiên sau khi cài đặt là các bạn khởi động lại máy. Sau khi khởi động lại, sẽ xảy ra một trong hai trường hợp sau:
- Máy có âm thanh: nếu như vậy thì có thể nói là bạn đã thành công phần nào. Tiếp sau đó, bạn vào System Preferences/Sound và kiểm tra tình trạng nhận các thiết bị trong thẻ Input và Output.
- Máy không có âm thanh: restart lại từ 1-2 lần nữa để máy tiếp nhận đầy đủ thông tin của kext và DSDT. Nếu sau 1-2 lần restart mà vẫn chưa có, bạn kiểm tra lại layout và tình trạng load của kext như hình dưới, trong trường hợp có vấn đề, kiểm tra lại các bước trên xem mình đã làm đúng hết chưa.



Một số trường hợp đặc biệt:

- Các bạn nào sử dụng máy từ đời Haswell trở đi có thể sẽ gặp phải tình trạng máy không nhận mic ngoài (lý do mình đã nói ở trên), mic trong có thể nhận nhưng trong một số trường hợp không thu được.
- Các bạn nào dùng máy Asus mà sound card là ALC 233 hãy xác định trước là kiều gì cũng gặp vấn đề với mic như mic ngoài không nhận được, mic trong nhận nhưng thu tiếng nhỏ hoặc xì xì không thu được tiếng. Bạn nào mà muốn dùng Skype chat với bạn thì cứ dè chừng con này nhé.

Hô hô, xong rồi, chúc các bạn thành công nhé!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~THE END~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Popular posts from this blog

[Hướng dẫn] Sử dụng Clover Configurator tạo file config.plist cho uEFI Clover Bootloader

[Guide for Newbie] Hướng dẫn patch DSDT/SSDT cho máy hackintosh (Phần 5)

[Guide for newbie] Hướng dẫn cài Mac OS X trên UEFI (Phần 3)