Danh mục
Phần 1: Chuẩn bị:
B1: 1 Cái USB 8GB.
B2: 1 File ISO Linux (khuyến khích dùng Ubuntu hoăc có thể dùng WSL).
B3: Xcode.
B4: Tải Pin Configuration và giải nén.
B5: Tải layout và platform.
B6: Tải graphviz.pkg.
B7: Tải CodecGraph và giải nén.
B8: Tải ProperTree.
B9: Tải AppleALP Repo và Lilu.kext.
Phần 2: Dump Codec
B1: Các bạn Boot qua Linux (có thể sử dụng Dualboot hoặc Live trên USB hoặc WSL).
B2: Mở Terminal (ấn Ctrl + T) và gõ các lệnh sau:
cat /proc/asound/card0/codec#1 > ~/Desktop/codec_dump.txt
Hoặc:
cat /proc/asound/card0/codec#0 > ~/Desktop/codec_dump.txt
Hoặc:
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 đó các bạn copy file codecdump.zip
sang macOS.
Phần 3: Chuẩn bị sơ đồ Path Map và Verbs
B1: Cài graphviz.pkg
B2: Giải nén file codec dump.zip và copy file ccodec_dump.txt
vào folder CodecGraph (folder này nên đặt ngoài Desktop).
B3: Gõ lệnh sau vào Terminal:
cd ~/Desktop/codecgraph
// và sau đó gõ tiếp lệnh dưới
kéo thả file script patch codec vào rồi enter
B4: Chúng ta sẽ Copy 2 file codec_dump_dec.txt.svg
và finalverbs.txt
ra một nơi khác.
Phần 4: Xác định Verb Data
Ở đây các bạn mở file finalverbs.txt lên sẽ có dạng:
Verbs from Linux Codec Dump File: codec_dump.txt
Codec: Realtek ALC269VC Address: 0 DevID: 283902569 (0x10ec0269)
Jack Color Description Node PinDefault Original Verbs
--------------------------------------------------------------------------------------------------------
Digital Unknown Mic at Int N/A 18 0x12 0x90a60930 01271c30 01271d09 01271ea6 01271f90
Speaker at Int N/A 0x14 0x14 2417426704 01471c10 01471d01 01471e17 01471f90
HP Out at Ext Left 0x15 0x15 52498463 01571c1f 01571d10 01571e21 01571f03
1/8 Black Speaker at Ext Rear 23 0x17 0x411111f0 01771cf0 01771d11 01771e11 01771f41
Mic at Ext Left 0x18 0x18 60905504 01871c20 01871d58 01871ea1 01871f03
1/8 Black Speaker at Ext Rear 25 0x19 0x411111f0 01971cf0 01971d11 01971e11 01971f41
1/8 Black Speaker at Ext Rear 26 0x1a 0x411111f0 01a71cf0 01a71d11 01a71e11 01a71f41
1/8 Black Speaker at Ext Rear 27 0x1b 0x411111f0 01b71cf0 01b71d11 01b71e11 01b71f41
ATAPI Purple Speaker at Ext N/A 29 0x1d 0x40138205 01d71c05 01d71d82 01d71e13 01d71f40
1/8 Black Speaker at Ext Rear 30 0x1e 0x411111f0 01e71cf0 01e71d11 01e71e11 01e71f41
--------------------------------------------------------------------------------------------------------
Jack Color Description Node PinDefault Modified Verbs
--------------------------------------------------------------------------------------------------------
Digital Unknown Mic at Int N/A 18 0x12 0x90a60930 01271c30 01271d00 01271ea6 01271f90
Speaker at Int N/A 0x14 0x14 2417426704 01471c10 01471d00 01471e17 01471f90
HP Out at Ext Left 0x15 0x15 52498463 01571c40 01571d10 01571e21 01571f00
Mic at Ext Left 0x18 0x18 60905504 01871c20 01871d50 01871ea1 01871f00
ATAPI Purple Speaker at Ext N/A 29 0x1d 0x40138205 01d71c50 01d71d80 01d71e13 01d71f40
--------------------------------------------------------------------------------------------------------
Ở đây 2 có 2 mục cần quan tâm mục đầu tiên là devid (sẽ dùng ở phần dưới) mục thứ 2 là Modified Verbs (ta sẽ làm việc với mục này)
Ta có dòng đầu tiên được chia thành 4 nhóm hãy cùng tìm hiểu chức năng và ý nghĩa các nhóm nhưng trước hết ta sẽ hiểu định nghĩa chung.
01271c30 01271d00 01271ea6 01271f90
Ta có 0 12 71c 30
có nghĩa là:
0 : Codec address.
12: Node id.
71c : Verb command (sẽ tuần theo 1uy tắt nhóm đầu sẽ là 71c nhóm 2 là 71d nhóm 3 là 71 e nhóm 4 là 71f và 70c EAPD)
30: Verb data (đây là phần quan trọng nhất)
Phần 5: Patch Verb Data
B1: Các bạn copy Modified Verbs ra 1 text riêng sao đó sao chép vào bộ nhớ tạm (Command + C | node 1d là 1 node không cần thiết nên các bạn xóa đi)



Các bạn sẽ cần chú ý kỹ vào ảnh trên ta thấy 12 và node 18 đều là micin nhưng 18 lại là external nên ta cần file chuyển 18 về line in như thế này:

Vậy quy tắc chuyển như thế nào thì các bạn xem phần dưới nhé:
Bây giờ mình sẽ lấy node 18 làm ví dụ chuyển:
Đầu tiên là nhóm 1:
01871c20 01871d50 01871e81 01871f00
20 là verb data ( như đã nói ở trên ) ở đây mình sẽ gọi verb data là xy sẽ có dạng:
01871cXY
- X: Là thông tin port (ở đây các thông tin port không được trùng nhau vd như 50, 50, 20 ta có 2 lần giá trị 5 xuất hiện ở X thì các bạn phải đổi 1 giá trị thành 1 giá trị khác bất kì miễn là không trùng lặp vd ở đây ta có 50, 30, 20).
- Y: là thông tin kênh (các bạn chỉnh hết về 0).
Tiếp tục ta chuyển đến nhóm thứ 2:
01871c20 01871d50 01871e81 01871f00
Cũng như ở trên mình gọi verbs data là X và Y ta có:
01871dXY
- X là màu của jack (dựa vào bảng dưới để xác định màu).
Tùy chỉnh theo bảng sau:
Unknown 0 Black 1 Grey 2 Blue 3 Green 4 Red 5 Orange 6 Yellow 7 Purple 8 Pink 9 Reserved A-D White E Other F
- Y là thông tin jack cắm (external là 0 và internal là 1).
Tiếp theo là nhóm thứ 3:
01871c20 01871d50 01871e81 01871f00
01871eXY
- X là thiết bị âm thanh (xem bảng dưới để xác định).
Line Out: 0 Speaker: 1 HP Out: 2 CD: 3 SPDIF Out: 4 Digital Other Out: 5 Modem Line Side: 6 Modem Handset Side: 7 Line In: 8 AUX: 9 Mic In: A Telephony: B SPDIF In: C Digital Other In: D Reserved: E Other: F
- Y là cổng kết nối âm thanh (xem bảng dưới để xác định).
Unknown: 0 1/8" stereo/mono: 1 1/4" stereo/mono: 2 ATAPI internal: 3 RCA: 4 Optical: 5 Other Digital: 6 Other Analog: 7 Multichannel Analog (DIN): 8 XLR/Professional: 9 RJ-11 (Modem): A Combination: B Other: F
Cặp thứ 4
01871c20 01871d50 01871e81 01871f00
01871fXY
- X là Port Connectivity (giúp ứng dụng biết đang kết nói vói speaker, hp hay line in).
- Y là vị trí port.
//*
ta lấy xy chuyển về dạng nhị phân ( dùng hackintool )
sau đó thêm các số 0 vào trước dãy số đến khi nào đủ 8 chữ số trong dãy số
tiếp theo bạn tách dãy số từ trái sang phải theo quy tắt 2-2-4
Sau đó thay X và Y lần lượt theo bảng sau
Ví dụ:
01011001 --> 01 01 1001
*//
Port Connectivity bits 7:6
-----------------------------------------------------------
00 - Port is connected to a Jack
01 - No External Port -or- No physical connection for Port
10 - Fixed Function/Built In Device (integrated speaker, mic, etc)
11 - Jack and Internal device are attached
Location Part 1 - bits 5:4
-----------------------------------------------------------
00 - External on primary chassis
01 - Internal
10 - Separate chassis
11 - Other
Location Part 2 - bits 3:0
-----------------------------------------------------------
The meaning depends on Location Part 1
00 0000 N/A
00 0001 Rear
00 0010 Front
00 0011 Left
00 0100 Right
00 0101 Top
00 0110 Bottom
00 0111 Special (Rear panel)
00 1000 Special (Drive bay)
01 0000 N/A
01 0111 Special (Riser)
01 1000 HDMI
01 1001 ATAPI
10 0000 N/A
10 0001 Rear
10 0010 Front
10 0011 Left
10 0100 Right
10 0101 Top
10 0110 Bottom
11 0000 N/A
11 0110 ?
11 0111 Inside Mobile Lid (example: mic)
11 1000 Outside Mobile Lid
Bits
Hex 76 54 3210
-------------------
71cf01 = 00 00 0001 - Port has a jack - It is External - Rear Location
71cf02 = 00 00 0010 - Port has a jack - It is External - Front Panel Location
71cf59 = 01 01 1001 - No External Port - ATAPI
71cf18 = 00 01 1000 - Port has a jack - External - HDMI
71cf90 = 10 01 0000 - Built In Device - Internal - N/A
| | ||||
| | |--------- Location part 2
| |------------ Location part 1
|--------------- Port Connectivity
Nếu bạn sử dụng jack combo thì chắc bạn sẽ cần EAPD thì thêm verb 0XY70c02 thêm nó vào sau cùng và thay XY là node id của speaker.
Phần 6: Xác định Path Map
Đây là lúc bạn dùng đến file codec_dump_dec.txt.svg
được dump từ Terminal ở Phần 3.
Các bạn mở lên và sẽ xuất hiện như sau:

Nhìn khá rối đúng không nào nhưng các bạn đừng vội nản vì nó thật sự rất dễ và dễ hơn cách thủ công nhiều.
Trước hết ta cần tìm hiểu các kí hiệu trong sơ đồ sau:

Và đây là thứ tự đọc của Output:

Thứ tự của Input:

Tiếp theo các bạn hãy chú ý đến các node nào có chữ [N/A] đằng trước tức đây là các node ảo các bạn có thể bỏ qua các node này.
- Bây giờ ta sẽ xác định các node của audio output:

Nhưng nhìn vào mục số 3 ( node 24 ) đây là Mic nhưng chúng ta đang Patch Output tức là chỉ qua tâm đến Speaker và Headphone nên ta có mục 2 và mục 1 là 2 mục cần quan tâm.

Ta thấy đc liên kết với node 33 là 2 audio mixer 12, 13 nhưng ta thấy node 13 liên kết với node 33 bằng đường không ưu tiên nên ta sẽ loại node 13 đi ta tiếp tục nhìn vào node 12 có 2 đường ưu tiên đc nối đến node 12 nhưng chỉcó 1 audio output đc nối với node 12 nên ta sẽ loại đường kia đi vậy ta có headphone là 33-12-2 tương tự ta có speaker là 20-13-3.
- Input

Ở đây thì tương dối dễ xác định hơn ta có node 25 có 2 luồng kết nối 1 luồn kết nối đến audio mixer 11 và audio mixer 35 nhưng đường nối đến audio mixer 35 là luồng ưu tiên nên ta loại audio mixer 11 đi và audio mixer đc nối đến audio input 8 nên ta có path map mic in như sau 8-35-25 tương tự ta có path map line in như sau 9-34-24.
Phần 7: Patch Platforms.xml và layout#.xml
B1: Mở file layout#.xml đã tải ở Phần 1
Và chỉnh những nội dung sau:

- LayoutID: Bạn thay đổi hoặc giữ nguyên hoặc đổi đây mình sẽ thay thành 15.
- CodecID: Phần này các bạn đã sửa ở Phần 3.
- Inputs: Tuỳ vào codec của bạn có LineIn hay không, nếu không có thì xoá đi.
- PatchMapID: Bạn cho vào đây 1 số ngẫu nhiên.
B2: Mở file Platforms.xml lên:

Bạn điền Path Map đã xác định Phần 7 vào đây:
- PathMaps -> 0 -> PathMap -> 0 -> 0 là Mic.
- PathMaps -> 0 -> PathMap -> 0 -> 1 là LineIn (mic gắn ngoài do macos không hỗ trợ nên phải khai báo là linein).
- PathMaps -> 0 -> PathMap -> 1 -> 0 là HP (Headphone).
- PathMaps -> 0 -> PathMap -> 1 -> 1 là Speaker.
- PathMaps -> 0 -> PathMap -> PathMapID: ở đây bạn cần điền số giống với PathMapID ở layout#.xml
Nếu trường hợp không có Audio Mixer/Selector thì bạn xoá đi key 1, chỉ điền vào key 0 và key 2 thôi nhé!
Phần 8: Build Kext
B1: Bỏ Kext Lilu vào folder AppleALC.
B2: Vào Resource xóa hết Codec thừa và chừa lại Codec của bạn.
B3: Bỏ 2 file layoutid# và platformid# và folder tên Codec (nên Rename lại theo layout-id bạn đã set)

B4: Mở AppleALC.xcodeproj –> PinConfigs –> Info.plist –> IOKitPersonalities –> HDA Hardware Config Resource –> HDAConfigDefault bằng Xcode bạn có thể tự tạo hoặc edit 1 cái có sẳn.

Các bạn sửa lại như sau:
- Codec: thay đổi tuỳ thích.
- CodecID: thay bằng Vendor Id của codec ở hệ decimal đã chuẩn bị trên.
- ConfigData: bạn copy codec verb đã chuẩn bị đưa vào đây.
- LayoutID: nhập layout-id bạn đã chọn để patch ở trên.
B5: Mở AppleALC.xcodeproj –> Resources –> (tên codec bạn đang patch) –> Info.plist –> Information Property List –> Files.
Và chỉnh những thứ sau:
- Codec id: id codec của các bạn.
- Codec name: tên codec của các bạn.
- layout -> 0 -> comment: điền tên bạn muốn đặt.
- layout -> 0 -> id: điền id của bạn đã đặt ở Phần 8.
- layout -> 0 -> path: điền path của file layout#.xml vào đây.
- platforms -> 0 -> comment: điền tên bạn muốn đặt.
- platforms -> 0 -> id: điền id của bạn đã đặt ở Phần 8.
- platforms -> 0 -> path: điền path của file layout#.xml vào đây.

B6: Các bạn ấn Build Kext.
Phần 9: Load Kext AppleALC
B1: Bỏ Kext vừa Build vào EFI–> OC –> Kext và snapshot lại hoặc bỏ vào EFI –> Clover –> kext –> Other.
B2: Add vào boot-arg alcid=#
(thay #
thành layout id bạn đã đặt ở trên như của mình là alcid=15
)
Lưu ý: Source tham khảo Patch AppleHDA cho các laptop chạy Hackintosh – Hackintosh Vietnam – Chuyên trang cung cấp hướng dẫn cài hackintosh | How to patch AppleHDA – Guides and Tutorials – Olarila | [Hướng dẫn] Patch AppleHDA cho các laptop chạy Hackintosh – Sharing Is Caring (trungnguyenblogs.blogspot.com)