Fix trackpad
Last updated
Last updated
Vẫn có một số máy gen 8 dùng ps2, ở trên chỉ mang tính chất khái quát
Các bạn hãy patch pin trước khi làm bất cứ điều gì theo guide này
B1: Download kext VoodooPS2controller.kext
theo link sau: Releases
B2: Download kext VoodooRMI.kext
theo link sau: Releases
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
B4: Dùng ProperTree để mở config.plist và chọn OC Snapshot
B5: Kéo xuống phần Kernel
để tìm và Enable
VoodooInput
của VoodooRMI.kext
và RMI SMBus
Có thể xóa
VoodooRMI I2C
nếu các bạn không cầnNếu là Synaptics I2C thì không cần xoá
B6: Khởi động lại máy.
B1: Tải xuống kext từ nguồn tại đây
B2: Snaphot config bằng ProperTree
B3: Restart máy
Hầu hết các giao thức khác bạn chỉ việc patch cho hiển thị phần trăm pin và thêm kext voodoops2 là sẽ lên được
Gắp GPI0
Gắn ACPI ID
Pin List
À còn 1 phần nữa đó chế độ chạy của i2c gồm 2 chế độ:
Polling mode
: loại sử dụng về phần cứng nên nó sẽ ăn tài nguyên nhiều hơn
Interrupt mode
: loại sử dụng về phần cứng nên nó ăn tài nguyên ít hơn
Nhiều hackintosher thích interrupt hơn polling nên ở cuối bài viết mình sẽ hướng dẫn cách chuyển từ polling mode sang Interrupt mode các bạn kiên nhẫn đọc hết bài từ trên xuống dưới để hiểu hết nội dung nhé.
Tiếp đó là Satelite type
của i2c bao gồm các loại:
Synaptics
HID
FTE
ELAN
AtmelMXT
Trong đó HID là loại phổ biến nhất. Bạn cần xác định Satelite type chính xác để sử dụng kext voodooi2c thích hợp
GPI0
B1: Tải ioreg
tại đây
B2: Mở Ioreg lên và tiến hành Search GPIO
Như này là
GPIO
đã được gắn
Nếu
GPIO
chưa được gắn các bạn sẽ tiến hành làm như sau
B2: Dump DSDT
theo hướng dẫn tại đây
B3: Search Device (GPI0)
Ở đây mình sẽ chia làm 2 mục nhỏ là đối với những bạn hot patch và static patch
Static Patch
các bạn sẽ tiến hành apply patch sau
HotPatch
B1: các bạn sẽ cần quan sát method _sta
ở device GPIO
trong DSDT
Ở đây ta sẽ thấy có 2 method là
GPEN
VÀSBGR
ta chỉ cần sửa giá trị của 1 trong 2 method này thì Method_Sta
sẽ hoạt động. Bởi ta cần Method_sta
trả về giá trị là 0x0f nhưng nhìn vào đoạn ví dụ trên ta sẽ thấy
Nếu SBRG=zero
thì method _Sta
sẽ trả về giá trị là zero
Nếu GPEN=zero
thì method _Sta
sẽ trả về giá trị là Zero
Do đó để Method
_Sta
trả về0x0f
thì ta phải chỉnh sửa giá trị của methodSBRG
vàGPEN
Tuy nhiên để đảm bảoGPIO
hoạt động bình thường ta sẽ không nên đụng chạm vàoSBRG
vậy ta sẽ tiến hành chỉnh sửa giá trị củaGPEN
cụ thể ở đây là ta sẽ chỉnh cho giá trịGPEN
thành 1 thì method_sta
sẽ trả về là0x0f
Nhưng không phải máy nào cũng vậy. Để cho các bạn hình dung rõ hơn mình sẽ cho thêm 1 ví dụ nữa
Ở đây ta sẽ thấy sự khác biệt
Nếu method GPHD
trả về giá trị là 1 thì method _sta
sẽ trả về là 0x03 nhưng giá trị để enable là 0x0f
Vậy ta sẽ cần chỉnh method GPHD
về zero
thì method _sta
sẽ trả về là 0x0f
B2: Ta sẽ edit SSDT-GPIO
Ở đây ta sẽ cần phải chỉnh mục này
Nếu như method _sta call qua 1 method khác không phải GPEN
thì các bạn sẽ tiến hành đổi tên thành method đấy
Tiếp theo các bạn sẽ cần đọc DSDT để chỉnh giá trị tương ứng
như ở ví dụ 1 ta sẽ set là one
Ví dụ 2 sẽ set là zero
B3: Thông thường các thiết bị i2c sẽ kiểm tra chúng có đang chạy trong Windows hay không trước khi tự kích hoạt. Tương tự như GPIO ở đây chúng ta cũng sẽ làm việc trên method _sta
Còn 1 các nữa là
Create OSYS Variable Under I2C Scope
nhưng mình thấy không cần thiết nên mình sẽ không hướng dẫn cách này
1 lưu ý nữa là nếu các bạn đã làm đúng mà GPIO vẫn ko được gắn thì các bạn có thể thử add boot-arg sau vào
-vi2c-force-polling
nhằm force polling mode khi dùng arg này bạn sẽ không thể chuyển quanInterrupt mode
B2: Tải voodooi2c tại đây
B3: Các bạn sẽ tiến hành thêm kext những kext sau vào EFI ==> OC ==> Kext
và snapshot
Hoặc
EFI ==> Clover ==> Kext ==> Other
VoodooI2C.kext
VoodooI2cSatelite.kext
Những kext voodoo i2c có tên trùng với Satelite type của bạn
B4: reboot
Các bạn sẽ cần boot vào win tìm đến mục Device Manager ==> Human Interfaces Device ==> I2C HID
device để xác định ACPI ID
Ở đây ta có ACPI ID là TPL0
Các bạn mở DSDT ra tìm đến ACPI ID i2c device của các bạn và chú ý vào method _sta
chúng ta sẽ tiến hành xoá các dòng if
để method _sta
luôn trả về 0x0f
tức là luôn bật
Thông thường khi làm như trên các bạn đã có thể gắn ACPI ID nếu vẫn chưa gắn được ACPI ID thì các bạn bắt buộc phải tự đọc DSDT và tự tìm hiểu
Cách ở trên là
Static Patch
đểHot Patch
được cách này các bạn có thể theo hướng dẫn tại đây
i2c mode
Như đã nói ở trên i2c có 2 loại là Polling và Interrupt vậy làm sao đê biết thiết bị của bạn đang ở loại nào
Ioreg
B1: Mở ioreg
ra
B2: Tìm đến ACPI ID i2c device đã xác định ở trên
B3: Chú ý vào mục interupt mode và để ý giá trị của nó bạn sẽ xác định được trackpad mình đang ở loại nào
B1 Tải app Gen i2c tại đây
B2: mở app ra và chú ý vào mục mode
Phần này rất hiếm người cần dùng đến. Tuy nhiên nếu bạn cần dùng thì hãy đọc thật chậm và kỹ lưỡng nhé
Nếu bạn đọc phần này tức là thiết bị của bạn đang là interrupt
B1: Check xem Pin Number
của bạn. Mở ioreg và tìm đến ACPI-ID của các bạn, chú ý vào dòng IOInterruptSpecifiers
. Nếu như không có dòng đó hoặc giá trị nhỏ hơn 0X2F
(47) thì không cần làm gì nữa
Như ở đây ta có
Pin number
là0x33
. Tại sao là0x33
vì ta chỉ lấy hai chữ số đầu của dãy số.0x33
lớn hơn0x27
nên tả sẽ phải tiến hành patch pin list cho nó.
Việc đầu tiên cần làm là xác định name SBFX
mà như hình là SBFG
ta có 2 loại pin 1 là pin crs
hai là pin root
:
Pin root
: name SBFX
được tìm thấy ở ngay ACPI-ID
Pin CRS
: name SBFX
được tìm thấy ở method crs
Ở đây ta sẽ chú ý vào dòng note //pin list
nếu giá trị khác 0x0000
thì thiết bị của bạn đang được pin tốt. Tuy nhiên nếu là 0x0000
thì đừng vội lo lắng bạn hãy tiến hành kiểm tra dòng return của method crs nếu nó có call tới method crs thì thiết bị của bạn vẫn đang được pin tốt ở đây ta có
2 dòng return ta có:
SBFG
có nghĩa là interrupt mode
SBFI
có nghĩa là polling mode
Mà GPIO
pin patch đòi hỏi bạn phải ở interrupt mode
ta sẽ tieén hành edit method crs để cho nó luôn trả về là interrupt mode
Ở đây ta có
//pin list
nếu là0x00000
thì các bạn làm như vầy để cho nó trở thành pin tốt nếu khác0x0000
thì các bạn cũng cần làm bước này để cho nó luôn trả vềinterrupt
Nhưng nếu bạn không tìm thấy
name SBFX
ở cả ACPI ID i2c device và methodcrs
thì có nghĩa là i2c device của bạn chưa được pin. Nếu như vậy bạn sẽ cần phải tiến hành gắn pin thủ công xem ở bước 2
B2: Các bạn sẽ tiến hành add Name SBFX
vào ACPI id i2c device (đây gọi là gắn pin thủ công chỉ khi thiết bị của bạn không được pịn mới cần làm)
B3: các bạn sẽ cần mở ioreg lên và search GPIO
Ta có thể thấy ở đây là CannonLakeH
, tiến hành tra nó theo bảng sau
text 1
text 2
CannonLakeH
có thể dùng củaCannon Point-H
B4: mở file text bên text 1 và search Pin number
đã xác định được ở ioreg
Ở đây ta sẽ copy mục name và search bên text 2
Ta sẽ copy giá trị nhận được là 43 và dùng hackintool
convert decimal to hex
Ta có
GPIO number
ở đây là 0x2B
Ta tiến hành edit DSDT như sau
Ngoài ra khi
Pin number
của bạn có nhiều giá trị chân GPIO bạn sẽ cần phải thử từng cái một
Đối với các dòng
Cannon Point
trở lên có sự không khớp giữaGPIO Pin number
vàhardware pin number
. Nếu bạn sử dụng loại phần cúng này thì bạn sẽ cần converthardware pin number
thànhGPIO number
Nếu bạn không biết mình có đang sử dụng phần cứng này không thì bạn cứ thử từng cái thử cách bình thường trước
B1: mở file text1 ra và search Pin number nhận được ở ioreg sau đó copy phần name tương ứng như hướng dẫn ở trên
B2: mở file text 2′ lên và xem phần tôi khoanh đỏ
Ở đây ta có thể sẽ thấy được ý nghĩa các dòng trong file text
B3: search name đã lấy được ở file 1 trong text 2′
B4: ta sẽ lấy Pin number
lấy được ở ioreg (ở decimal) trừ đi cho base
cộng cho gpio_base
B5: convert GPIO number
vừa nhận được thành hex
B6: edit DSDT theo hướng dẫn ở trên
Chú ý vị trị nằm của r s e g
Đối với các máy ở chế độ polling mode mà không native thì các bạn có thể tiến hành force polling mode
B1: Mở DSDT lên và tìm đến mục ACPI ID ở DSDT sau đó chú ý vào method crs
ta có:
SBFI
: là polling mode
SBFG
: là interrupt
Do đó việc bạn cần làm chỉ đơn giản là xoá return của SBFG
đi và chỉ để lại return của SBFI
Lưu ý ngoài name
SBFI
ra thì bạn cũng có thể sử dụng nameSBFB
Khi dòng return có name khác đứng cùng name
SBFI
thì sẽ tiến hành rename nó thànhSBFB
B1: mở config
B2: thêm boot-arg -vi2c-force-polling
B3: save lại và reboot
B1: Các bạn tìm ACPI-id của các bạn trong DSDT sau đó kéo lên mục scope
bạn sẽ có thể thấy name SBFB
và một name SBFX
nào đó theo sau nó như hình
B2: Chúng ta sẽ cần xem name SBFX
đó có dòng nào đại loại như
Thì tiến hành xoá cả phần đó đi
Ngoài ra có trường hợp bạn sẽ không tìm thấy name
SBFB
mà sẽ tìm thấy 1 nameSPFX
đại loại như là
B3: các bạn cần chuyển SBFX to SBFB
B4: xóa dòng này đi nếu có
B5: Nếu bạn đang ở polling mode
muốn force sang interrupt mode
thì các bạn cần xem DSDT đã có pin chưa và nếu đã có pin thì chú ý vào name của pin đó nếu là SBFB
hoặc SBFG
thì bỏ qua nếu là SBFI
hoặc các SBFX
khác thì rename nó sang SBFG
B6: Các bạn sẽ tiến hành chỉnh method CRS
. xoá hết các dòng return đi chỉ chừa lại dòng có name SBFG
. Nếu name khai báo cùng SBFG
không phải SBFB
thì bạn sẽ cần rename nó là SBFB
I2C
Đối với các thiết bị laptop dell hoặc HP khi patch trackpad nếu bị giật lag hãy thêm kext AlpsHID.kext vào nhé
Chú ý rằng khi force từ
polling mode
sanginterrupt mode
thì bạn có thể sẽ cần phải pin list nếu như không tìm thấy nameSBFX
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 | Fixing Trackpads: Manual | Getting Started With ACPI (dortania.github.io) | Polling Mode (voodooi2c.github.io)
Thanks you
B1: Các bạn cần xác định xem i2c của bạn đang thuộc Satelite type
nào xem hướng dẫn chi tiết
,