P1 :Tìm hiểu về các thuật ngữ và 1 số chuẩn bị
Đâu tiên ta phải biết, giao thức trackpad là gì? Giao thức trackpad chính là cách trackpad được kết nối với phần còn lại của máy tính, hiện tại có 2 giao thức chính là giao thức PS2 và giao thức I2C và Satellite.
- Giao thức PS2 thường được dùng cho các máy đời cũ từ Intel 6th gen trở xuống, patch khá đơn giản chỉ việc cài kext vào thôi.
- Giao thức I2C thường được dùng cho các máy đời mới hơn từ Intel 6th gen trở lên, hỗ trợ nhiều thao tác hơn nhưng đòi hỏi kỹ năng patch DSDT
- Tiếp theo các bạn cần xác định Satelite type của trackpad bằng AIDA64
Lưu ý: Vẫn có 1 số máy gen 8 mà dùng ps2 ở trên chỉ mang tính chất khái quát
Lưu ý 2: Trước khi tiến hành các bạn phải patch cho hiển thị phần trăm pin trước, xem hướng dẫn chi tiết tại đây
I.2 : Tiến hành
Các bạn hãy patch pin trước khi làm bất cứ điều gì theo guide này
hướng dẫn patch pin các bạn xem tại đây
Synaptics PS2 :
B1: Download kext VoodooPS2controller.kext theo link sau: Releases · acidanthera/VoodooPS2 · GitHub
B2: Download kext VoodooRMI.kext theo link sau: Releases · Voodoo SMBus/VoodooRMI · GitHub
B3: Vào folder Contents/Plugins của VoodooPS2Controller.kext, xóa VoodooPS2Mouse và xóa VoodooPS2Input, thêm kext VoodooSMBus.kext (nếu cần mới thêm, lấy theo link sau: Releases · Voodoo SMBus/Voodoo SMBus · GitHub)
B4: Dùng ProperTree để mở config.plist và chọn OC Snapshot (hoặc Clean Snapshot). (GitHub – corpnewt/ProperTree: Cross platform GUI plist editor written in python.
B5: Kéo xuống phần Kernel để tìm và Enable (bật True) VoodooInput của VoodooRMI.kext và RMI SMBus (có thể xóa VoodooRMI I2C nếu các bạn không cần).
B6: Khởi động lại máy.
Elan PS2 :
B1: Tải xuống kext từ nguồn https://github.com/BAndysc/VoodooPS2/releases/tag/elanps2.v1
B2: Snaphot config bằng ProperTree
B3: Restart máy
Lưu ý :đối với các bạn nào làm theo cách trên mà vẫn không nhận trackpad vẫn còn 1 biện pháp cho bạn đó là các bạn hãy tải kext apple ps2 smart touch pad và đặc biệt lưu ý sau khi các bạn bỏ kext vào sẽ nhận trackpad trong setting nhưng sẽ không chỉnh gì được các thao tác ( tùy máy ) do đó các bạn nên lưu ý các này chỉ dành cho các bạn nào muốn mình giống mac nhất trackpad nhận full cửa chỉ nhưng không nhận trong setting thôi ( links tải file CÁC TOOL HACKINTOSH do đây là 1 kext khá củ nên mình quên mất nguồn rồi nên mình sẽ để nó vào trong thư mục CÁC TOOL HACKINTOSH ) hãy thật sự lưu ý khi dùng nó
Lưu ý 2: các bạn phải fix cho nó hiển thị phần trăm pin trước thì nó mới nhận trackpad trong setting nha
Lưu ý 3 : đối với các giao thức ps2 khác thì các bạn hãy kiếm các kext ps2 khác nhé
Fix i2c trackpad :
thông thường các trackpad i2c đều native các bạn chỉ cần add ssdt xosi và rename xosi là là được ( xem ở phần chuẩn bị ) nếu như đã làm mà vẫn không được thì các bạn hãy làm tiếp phần tiến hành nhé
Chuẩn bị :
B1: fix pin ( xem ở mục III )
B2: xác định satelite type theo phần I.1 tiếp theo các bạn bỏ kext voodooi2c + voodooi2c “satelite type” của các bạn ( như của mình sẽ là voodooi2c + voodooi2c hid )
B3: xác định acpi-id i2c các bạn vào win chọn
Device Manager/Human Interfaces Device/I2C (satelite type)

Ở đây acpi-id sẽ là TPL0
B4: dump dsdt và biên dịch ( xem ở mục XXVI )
Tìm hiểu về loại polling và Interrupts
Ta có polling là loại sử dụng về phần cứng nên nó sẽ ăn tài nguyên nhiều hơn còn loại Interrupts sử dụng về phần cứng nên nó ăn tài nguyên ít hơn
Tiến hành :
B1: add các patch rename sau và thêm ssdt-XOSI theo đường dẫn EFI ⇒ OC ⇒ ACPI ( nhớ snaps lại và reboot ):
comment | string | change Method _OSI to XOSI
Find | data | 5F 4F 53 49
Replace | data | 58 4F 53 49
Hoặc apply các patch sau vào dsdt xem ở mục XXVII ( nếu dùng cách này bạn phải trích dsdt thành ssdt xem ở mục XXVIII và phài tiến hành rename EC xem ở mục XXVII lưu ý )
- thêm method sta device gpi0
into method label _STA parent_label GPI0 replace_content begin
Return (0x0F)
end;
- Override Method _OSI
Để giả lập win 10 thì add đoạn code sau vào
into_all method code_regex If\s+\([\\]?_OSI\s+\(\"Windows\s2015\"\)\) replace_matched begin If(LOr(_OSI("Darwin"),_OSI("Windows 2015"))) end;
Nếu mốn giả lập win 8 thì add đoạn code sau
into_all method code_regex If\s+\([\\]?_OSI\s+\(\"Windows\s2012\"\)\) replace_matched begin If(LOr(_OSI("Darwin"),_OSI("Windows 2012"))) end;
Win 8.1 thì add đoạn code sau
into_all method code_regex If\s+\([\\]?_OSI\s+\(\"Windows\s2013\"\)\) replace_matched begin If(LOr(_OSI("Darwin"),_OSI("Windows 2013"))) end;
Win 7 thì add đoạn code sau
into_all method code_regex If\s+\([\\]?_OSI\s+\(\"Windows\s2009\"\)\) replace_matched begin If(LOr(_OSI("Darwin"),_OSI("Windows 2009"))) end;
Lưu ý: nếu dùng ssdt xosi phải add đủ các mục rename không chỉ add 3 mục này thôi ( phải add đủ như hình | ssdt-xosi )
B2: tải ioreg
B3: mở ioreg lên và tìm đến đường acpi-id i2c để xác định acpi pin number nó sẽ nằm ở phần “IOInterruptSpecifiers” nếu như đã làm đúng như trên mà vẫn chưa hiện ( hãy chắc chắn rằng bạn làm đúng ) hoặc giá trị pin nhỏ hơn hoặc bằng 0X2F thì không cần lầm gì nữa chỉ việc cài kext vào và dùng nếu giá trị lớn hơn 0X2F thì xem tiếp phần dưới giá trị pin như hình là 0X33 tại sao lại là 0x33 vì ở đây cái dãy số như hình chỉ lấy là hex ở 2 số đầu

B4: Nếu các bạn không tìm thấy phần acpi-id của mình trong ioreg ( hãy chắc bạn đã làm đùng bước 1 ) thì các bạn mở dsdt ra và tìm đến mục acpi-id của thiết bị như ở đây của mình có là TBD0 các bạn lướt xuống phần sta các bạn cần remove mục if và zero để trackpad luôn được bật
B5:kiểm tra dsdt ở mục acpi-id của bạn, bạn cần xác định name (SPFX) mà như hình là name (SPG) nếu nó ở mục crs ta nói nó được pin crs nếu không ở mục crs ta nói nó được pin root bạn nhìn xuống mục pin-list nếu nó khác 0X0000 thì có nghĩa là thiết bị của bạn đang được pin tốt
Name (SBFG, ResourceTemplate ()
{
GpioInt (Level, ActiveLow, ExclusiveAndWake, PullDefault, 0x0000,
"\\_SB.PCI0.GPI0", 0x00, ResourceConsumer, ,
)
{ // Pin list
0x0000
}
})
nếu hiện “0X0000” thì bạn hãy nhìn vào method_ CRS return là SPFX ( trùng với giá trị SBFX xác định ở trên ) thì vẫn có thể là pin tốt dù giá trị pin list là “0x0000” nếu không hiện mục name SPFX thì các bạn add mục đó vào root như sau :
Name (SBFG, ResourceTemplate ()
{
GpioInt (Level, ActiveLow, ExclusiveAndWake, PullDefault, 0x0000,
"\\_SB.PCI0.GPI0", 0x00, ResourceConsumer, ,
)
{ // Pin list
0x0000
}
})
Sau khi add sẽ được như hình

B6: tiến hành gắn pin thủ công ( chỉ thực hiện nếu bạn không được pin tốt )
- mở ioreg search trên thanh tìm kiếm từ khoá sau “GPI0” sẽ hiện cụ thể là Sunrise Point, Cannon Point-LP hay Cannon Point-H v.v
- Các bạn tiến hành tra theo bản sau
- gen 9 trở xuống :
text 1 | text 2 |
Sunrise Point | Sunrise Point, |
Cannon Point-LP | Cannon Point-LP |
Cannon Point-H | Cannon Point-H |
Ice Lake | Ice Lake |
- gen 9 + :
- tiến hành lấy mã pin như hình ( áp dụng với gen 8 trở xuống )
Như ở trên ta có mã pin trong ioreg là 0x33 ta mở links trong text 1 ( ứng với tên đã xác định trong ioreg )
Và search 0x33

Ta sẽ copy mục name ứng với mã pin vừa search được ( GPP_B3 ) và mở link trong text 2

Hoặc ( gen 9 trở lên )
- B1: mở links ở text 1 ( tương ứng với mã trackpad đã tìm thấy ở ioreg )
- B2: các bạn bấm command + F và search mã pin có ở ioreg như ở trên là 0x33 ta có
Ta để ý phần mã ở đây là GPP_B3 ta sẽ được là GPP_B
B3: mở links ở text 2 lên và search GPP_B
Ta sẽ xác định được dãy ký tự ta cần quan tâm
+ B4: Các bạn mở text 2 lên và kéo lên đầu trang ta được như sau
Ở đây ta sẽ biết ý nghĩa của các chữ số
+ B5: các bạn sẽ tính gpi0 pin number như sau :
- Chuyển gpi0 pin number thành decimal

- lấy gpi0 pin number đã tìm được ở ioreg trừ đi cho base và cộng thêm cho gpi0 base
ví dụ: như ở đây ta có là
51-25+32=58


B7: ở mục cuối ta được giá trị pin là 27 ( gen 8 trở xuống, gen 9 làm tương tự ) ta cần chuyển nó về dạng hex các bạn truy cập vào trang sau Decimal to Hexadecimal Converter (rapidtables.com) gõ số mã bạn nhận được sau khi làm theo ảnh trên vào ô “Enter decimal number” sau đó nhấn enter bạn sẽ nhận được kết quả trong ô “Hex number” ( như hình giá trị cần chuyển là 27 ta sẽ được hex là 1B )
hoặc chuyển bằng hackintool
chuyển hex vừa nhận được thành GPI0 Pin number bằng cách thêm 0X vào trước Hex ta nhận được như hình ở đây ta có Pin number sẽ là 0X1B
B8: chỉnh lại mục pin-list trong dsdt theo giá trị GPI0 Pin number ( 0X1B)
B9 : save dsdt lại và snapshot
B10: restart và tận hưởng thành quả
chuyển từ Polling to Interrupts
B1: tải app gen i2c tại đây
Nếu nó hiện mục mode là Polling thì các bạn làm theo các bước sau đây còn nếu hiện là Interrupts rồi thì thôi
B2: các bạn cần chuyển SBFX to SBFB ( method crs | nếu nó là SBFG thì không cần rename )
B3: xóa dòng này đi nếu có
Interrupt (ResourceConsumer, Level, ActiveLow, Exclusive, ,, )
{
0x0000006D,
}
B4: tìm method csr và xóa hết các dòng return đi chỉ chừa lại dòng Return (ConcatenateResTemplate (SBFB, SBFG)) không có thì add thêm vào
Lưu ý: khi edit file dsdt các bạn cần chuyển nó về dạng file .dsl các chuyển xem ở phần chuẩn bị sau khi edit xong các bạn cần chuyển nó về dạng file .aml để sử dụng
Lưu ý 2: các nguồn tham khảo Trackpad on Hackintosh với giao thức I2C | [Guide] Patching LAPTOP DSDT/SSDTs | tonymacx86.com | HowToHackintosh | GPIO Pinning (voodooi2c.github.io)
Lưu ý 3: nếu các bạn thêm kext mà không hoạt động vào plugin của voodoops2 xoá các plugin chừa lại voodoops2 keyboard
Lưu ý 5: sau khi các bạn patch xong nếu update bios sẽ bị mất tác dụng và phải patch lại cách giải quyết là các bạn dùng app geni2c để generate ra ssdt hoặc các bạn sẽ trích dsdt thành ssdt xem ở mục XXVIII các bạn có thể trích hết nguyên cái device cũng đc nhưng mà mình khuyên các bạn chỉ nên trích 2 method crs với sta thôi là được rồi sau khi trích xong sẽ được như hình ( nếu như các bạn dùng cách apply patch vào dsdt thì phải trích luôn mục sta ở device GPI0
hoặc
Lưu ý 6: nếu các bạn đang dùng synaptics i2c thì các bạn không cần patch làm gì cho mệt bạn cứ bỏ voodoormi vào là được các bạn down kext tại đây
Lưu ý 7: Nếu như các bạn đã thử những cách trên nhưng vẫn không nhận IOInterruptSpecifiers trong ioreg thì các bạn hãy thử kext voodooi2c version cũ hơn (version 2020)
Source tham khảo GPIO Pinning (voodooi2c.github.io) | Trackpad on Hackintosh với giao thức I2C – Hackintosh Vietnam – Chuyên trang cung cấp hướng dẫn cài hackintosh ( thanks you )
Pingback: SSDT recomend - Heavietnam March 2022
Pingback: VI.1 Map USB - Heavietnam April 2022
Pingback: Kernel issue - Heavietnam April 2022