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 the‌o 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 th‌eo 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: Snap‌hot 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 1text 2
Sunrise PointSunrise Point,
Cannon Point-LPCannon Point-LP
Cannon Point-HCannon Point-H
Ice LakeIce Lake
  • gen 9 + :
text 1text 2
Cannon Point-LPCannon Point-LP
Cannon Point-HCannon Point-H
Ice LakeIce Lake-LP
  • 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

Và ta cần chuyển thành hex như sau
Ta có 0x3A

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 )

3 thoughts on “V. Fix trackpad

  1. Pingback: SSDT recomend - Heavietnam March 2022

  2. Pingback: VI.1 Map USB - Heavietnam April 2022

  3. Pingback: Kernel issue - Heavietnam April 2022

Leave a Reply