Lý do sinh ra guide này : hiện nay các dòng laptop đời mới sử dụng bàn di chuột cảm ứng với giao thức I2C cũng khá là mới, so với các kiến trúc cũ như ELAN, Synaptic, ALPS thì nó vượt trội hơn hẳn về thao tác đa điểm và cảm ứng song để kích hoạt được I2C trên hệ thống hackintosh thì không phải là dễ. Thật may khi đã có VoodooI2C
Mở đầu: VoodooI2C là gì ?
- VoodooI2C là một dự án phát triển Kernel extension cho MacOS để hỗ trợ cho thiết bị I2C Bus, bao gồm 2 nhóm: kext lõi (core kext) và phần bổ trợ là 'satelite kext'
- Core kext ? : Kext lõi VoodooI2C.kext cần thiết cho mọi bộ điều khiển I2C controller
- Satelite kext : Kext bổ trợ điề khiển, tùy vào loại I2C mà sử dụng đúng bao gồm I2C-Synaptic, ELAN-I2C, I2C-HID hay FTE-I2C
- Tình trạng support của kext :
- Hiện tại VoodooI2C hỗ trợ các hệ thống và list device ID hỗ trợ bao gồm :
-
INT33C2
and INT33C3
- Haswell era INT3432
and INT3433
- Broadwell erapci8086,9d60
, pci8086,9d61
, pci8086,9d62
and pci8086,9d63
- Skylake erapci8086,a160
and pci8086,a161
- Kaby Lake erapci8086,9de8
and pci8086,9de9
- Cannon Lake/Whiskey Lake erapci8086,a368
, pci8086,a369
, pci8086,a36a
and pci8086,a36b
- Coffee Lake erapci8086,2e8
and pci8086,2e9
- Comet Lake era - Với 3 loại thiết bị đc hỗ trợ đầy đủ : I2C-HID devices, ELAN devices, FTE devices
Chú ý : một vài trường hợp có sự trùng lặp giữa các thiết bị I2C : ví dụ một vài thiết bị ELAN cũng có tên I2C-HID
Để kích hoạt trackpad multi gesture với giao thức I2C cần kĩ năng patch DSDT, các công đoạn bao gồm :
- Xác định chế độ chạy của I2C : bao gồm Polling mode và Interrupt mode
- Patch gắn GPI0
- Xác định tình trang load của kext
- Tối ưu hóa thiết bị I2C
- XÁC ĐỊNH ACPI ID I2C : làm trên windows
- các tên phổ biến bao gồm :
1. Touchpads - TPDX, ELAN, SYNA, CYPR
2. Touchscreen - TPLX, ELAN, ETPD, SYNA, ATML
3. Sensor Hubs - SHUB
- Tiến hành kiểm tra trong ví dụ : Device Manager/Human Interfaces Device/I2C HID device
- Trên hình ACPI ID của thiết bị I2C là TPD0
A: Xác định chế độ chạy của I2C : bao gồm Polling mode và Interrupt mode
- Công cụ cần có bao gồm :
- MaciASL, IO Registry Explorer app
- ACPI đã được biên dịch sang .dsl file và sửa hết lỗi
- Tiến hành add repo patch DSDT I2C vào MaciASL
- GenI2C : https://github.com/williambj1/GenI2C/releases Một công cụ mới được phát triển bởi tác giả @williambj giúp hỗ trợ cho quá trình patch I2C.
Sau khi đã xác định đúng ACPI ID name, tiến hành chọn bộ đôi kext phù hợp VoodooI2C & VoodooI2C satelite kext cho vào CKO (Bối rối quá không biết loaị nào thì cho hết cả cụm kext I2C vào cũng được :v )
B: Tiến hành Apply các gói patch sau hoặc hotpatch kèm chỉnh sửa Config.plist :
Cách 1
into_all method code_regex If\s+\([\\]?_OSI\s+\(\"Windows\s2015\"\)\) replace_matched begin If(LOr(_OSI("Darwin"),_OSI("Windows 2015"))) end; |
- Patch sửa Method _STA device GPI0 :
into method label _STA parent_label GPI0 replace_content begin |
| |
| Return (0x0F) |
| |
| end; |
- Sau khi đã Apply 2 gói patch trên tiến hành save DSDT và bỏ vào Clover/ACPI/Patched
Cách 2 (nên chọn cách này)
- Hotpatch style : tiến hành cho 2 SSDT-XOSI.aml và SSDT-GPI0.aml vào Clover/ACPI/Patched và thêm patch rename trong config.plist như sau (Config.plist/ACPI/Patches)
// In config ACPI, GPI0:_STA to XSTA |
| // Find: 5F 53 54 41 |
| // Replace: 58 53 54 41 |
| // TgtBridge:47 50 49 30 |
// In config ACPI, change Method _OSI to XOSI |
| // Find: 5F 4F 53 49 |
| // Replace: 58 4F 53 49 |
// In config ACPI, change Method _DSM to XDSM |
| // Find: 5F 44 53 4D |
| // Replace: 58 44 53 4D |
Một số trường hợp khi unload toàn bộ _DSM mô tả thiết bị trong ACPI, I2C sẽ không hoạt động chú ý khi sử dụng patch rename này (Tuỳ chọn)
- Disable Apple's I2C Kext to patch by adding Coolstar
- Tiến hành add 2 patch sau vào config.plist/KetToPatch :
// comment : Prevent Apple I2C kexts from attaching to I2C controllers, credit CoolStar | |
| // Find : 494F4B69 74 |
| // Replace : 494F4B69 73 |
Name | com.apple.driver.AppleIntelLpssI2C |
InfoPlistPatch | Yes |
// comment : Prevent Apple I2C kexts from attaching to I2C controllers, credit CoolStar | |
| // Find : 494F4B69 74 |
| // Replace : 494F4B69 73 |
Name | com.apple.driver.AppleIntelLpssI2CController |
InfoPlistPatch | Yes |
- Sau khi đã hoàn thành A và B tiến hành khởi động lại và qua bước C
C: Xác định Polling mode/ Interrupt Mode & GPI0 Pinning (gắn GPI0)
Tiến hành mở IO Registry Explorer: tới đường dẫn của ACPI ID I2C để xác định được APCI pin number. Như hình nó nằm ở thiết bị TPD1 IOInterruptSpecifiers với định dạng hex là 0x33 (demical is 51)
- Hãy chắc chắn rằng mấy chế đã làm đúng các bước A và B để thấy được APCI pin number, nếu làm đúng mà không hiện IOInterruptSpecifiers hoặc giá trị pin 0xZZ (0x33) nhỏ hơn hoặc bằng 0x2F (47) thì cứ việc cài kext vô dùng thôi khỏi cần patch nữa
- Nếu giá trị APCI pin lớn hơn 0x2F (47) thì làm tiếp các bước sau
- Mở GenI2C lên kiểm tra xem tình trangh load kext I2C và tình trạng mode đang chạy cuả kext
- Nếu thấy như hình thì xem lại các chế chọn kext satelite đã đúng hay chưa, và nó đang chạy ở chế độ Polling với APCI pin number là 0x50
- Tiến hành chọn lại đúng satelite kext và bắt đầu quá trình patch
D: Patch gắn GPI0 và sửa lại Method _CRS của thiết bị ACPI ID I2C (như trên hướng dẫn là TPD1)
- Hãy chắc chắn rằng I2C Serial Bus
Name
(\\_SB.PCI0.I2C0) được hiển thị đúng trong Name (SBFX) device trùng với thông tin trên IO Registry Explorer, mà như ở trong hình là SBFI (nó có thể là SBFB, SBFI, SBFG, hoặc bất cứ tên nào dạng SBFX)
Name (SBFI, ResourceTemplate ()
{
I2cSerialBusV2 (0x0015, ControllerInitiated, 0x00061A80,
AddressingMode7Bit, "\\_SB.PCI0.I2C0",
0x00, ResourceConsumer, , Exclusive,
)
Interrupt (ResourceConsumer, Level, ActiveLow, Exclusive, ,, )
{
0x0000006D,
}
})
Return (SBFI)
- Kiểm tra xem thiết bị I2C đã được gắn GPI0 hay chưa (GPI0-pinned)
- Tìm thuộc tính có cấu trúc như sau trong thiết bị TPD0 :
Name (SBFG, ResourceTemplate ()
{
GpioInt (Level, ActiveLow, ExclusiveAndWake, PullDefault, 0x0000,
"\\_SB.PCI0.GPI0", 0x00, ResourceConsumer, ,
)
{ // Pin list
0x0000
}
})
- Thuộc tính Name (SBFG) có thể nằm ở địa chỉ thiết bị gốc của TPD0 như trong hình (root pinned) hoặc nằm trong Method _CRS của TPD0 device (CRS pinned).
- Nếu // Pin list trong thiết bị SBFG có giá trị khác Zero (0x0000) thì ta nói thiết bị gốc được pin tốt hay well-root pinned / CRS pin tốt (well-CRS pinned) > tiến hành bước E.
- Nếu giá trị // Pin list là zero thì ta nói thiết bị Pin chưa tốt tiến hành bước F
- Nếu không tìm thấy Name (SBFG) ta nói thiết bị chưa được pin (unpinned) > tiến hành bước G . kaka
E: Hãy chắc chắn rằng hàm Return () trong Method _CRS trả về giá trị SBFG như hình
F: Nếu // Pin list là zero thì thiết bị vẫn có thể là pin tốt (Well-pinned or well CRS-pinned) nếu kiểm tra hàm Return () trong Method _CRS của thiết bị TPD0 trả về giá trị SBFG ta cũng nói thiết bị được Pin tốt
Return (ConcatenateResTemplate (SBFB, SBFG))
G: Tiến hành edit chèn giá trị SBFG nếu trong trường hợp không tìm thấy trong DSDT hoặc sửa lại như sau
Name (SBFG, ResourceTemplate ()
{
GpioInt (Level, ActiveLow, ExclusiveAndWake, PullDefault, 0x0000,
"\\_SB.PCI0.GPI0", 0x00, ResourceConsumer, ,
)
{ // Pin list
0x0000
}
})
- Chý ý : chèn sau các thiết bị SBFX khác như hình
- Tiến hành gắn pin thiết bị thủ công
- Tra theo bảo sau
- Sử dụng APCI pin number đã tra ở trong IO Registry Explorer hoặc GenI2C rea theo hàng từ trái qua phải của bảng
- Giá trị cuối cùng sau khi tra được qua bảng gọi là GPI0 Pin number (như hình là 0x1B)
- Sau khi tra được chính xác GPI0 pin number tiến hành edit // Pin list và save lại DSDT
- Restart lại và tận hưởng thành quả :v
Debug : còn tiếp !
Contribute :