Skip to content

Releases: maximevince/VoodooI2CPCI

More PCI identifiers; sleep support; longer timeout

07 Jul 07:58
Compare
Choose a tag to compare
  • More PCI identifiers supported:
    • pci8086,9d60
    • pci8086,9d61
    • pci8086,a160
    • pci8086,a161
  • Sleep support
  • Longer initial timeout (needed for some laptops)

Binary kext attached.

As before:

  • Make sure AppleIntelLpssI2C.kext is disabled
  • Try the kext, before installing it:
$> sudo cp -R ~/Downloads/VoodooI2C.kext /tmp
$> sudo kextutil -v /tmp/VoodooI2C.kext

First working Skylake release

29 Jun 09:01
Compare
Choose a tag to compare

VoodooI2C driver that works on my Skylake ASUS UX305CA, with ELAN1000 touchpad.

First, you need to make sure the Apple I2C driver does not load:

sudo mv /System/Library/Extensions/AppleIntelLpssI2C.kext /System/Library/Extensions/AppleIntelLpssI2C.kext.old

(you can check with kextstat)

Then, you might need to patch your DSDT to get the devices recognised correctly in your IORegistry.
You can use mine below as a reference, but copy-pasting will probably not help!

The I2C controller: (I removed an IF-condition splitting the body of this block)

    Scope (_SB.PCI0)
    {
        Device (I2C0)
        {
            Name (LINK, "\\_SB.PCI0.I2C0")
            Name (_HID, "INT3442")  // _HID: Hardware ID
            Method (_HRV, 0, NotSerialized)  // _HRV: Hardware Revision
            {
                Return (LHRV (SB10))
            }

            Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
            {
                Return (LCRS (SMD0, SB00, SIR0))
            }

            Method (_PSC, 0, NotSerialized)  // _PSC: Power State Current
            {
                GETD (SB10)
            }

            Method (_PS0, 0, NotSerialized)  // _PS0: Power State 0
            {
                LPD0 (SB10)
            }

            Method (_PS3, 0, NotSerialized)  // _PS3: Power State 3
            {
                LPD3 (SB10)
            }

            Method (_STA, 0, NotSerialized)  // _STA: Status
            {
                Return (LSTA (SMD0))
            }

            Name (_ADR, 0x00150000)  // _ADR: Address
            Method (XDSM, 4, Serialized)
            {
                If (PCIC (Arg0))
                {
                    Return (PCID (Arg0, Arg1, Arg2, Arg3))
                }

                Return (Zero)
            }
        }
    }

and the I2C touchpad itself:

    Scope (_SB.PCI0.I2C0)
    {
        Device (ETPD)
        {
            Name (_ADR, One)  // _ADR: Address
            Method (_HID, 0, NotSerialized)  // _HID: Hardware ID
            {
                If (ELAN)
                {
                    Return ("ELAN1000")
                }

                If (FOLT)
                {
                    Return ("FTE1001")
                }

                Return ("ELAN1010")
            }

            Name (_CID, "PNP0C50")  // _CID: Compatible ID
            Name (_UID, One)  // _UID: Unique ID
            Name (_S0W, 0x03)  // _S0W: S0 Device Wake State
            Method (_S3W, 0, NotSerialized)  // _S3W: S3 Device Wake State
            {
                If (LEqual (S0ID, Zero))
                {
                    Return (0x03)
                }
                Else
                {
                    Return (Zero)
                }
            }

            Method (_DSM, 4, NotSerialized)
            {
                If (LEqual (Arg0, ToUUID ("3cdff6f7-4267-4555-ad05-b30a3d8938de") /* HID I2C Device */))
                {
                    If (LEqual (Arg2, Zero))
                    {
                        If (LEqual (Arg1, One))
                        {
                            Return (Buffer (One)
                            {
                                 0x03                                           
                            })
                        }
                        Else
                        {
                            Return (Buffer (One)
                            {
                                 0x00                                           
                            })
                        }
                    }

                    If (LEqual (Arg2, One))
                    {
                        Return (One)
                    }
                }
                Else
                {
                    Return (Buffer (One)
                    {
                         0x00                                           
                    })
                }
            }

            Method (_STA, 0, NotSerialized)  // _STA: Status
            {
                If (LEqual (TPIF, Zero))
                {
                    Return (Zero)
                }

                If (And (DSYN, One))
                {
                    Return (Zero)
                }

                Return (0x0F)
            }

            Method (_CRS, 0, Serialized)  // _CRS: Current Resource Settings
            {
                Name (SBFI, ResourceTemplate ()
                {
                    I2cSerialBusV2 (0x0015, ControllerInitiated, 0x00061A80,
                        AddressingMode7Bit, "\\_SB.PCI0.I2C0",
                        0x00, ResourceConsumer, , Exclusive,
                        )
                    Interrupt (ResourceConsumer, Level, ActiveLow, Shared, ,, )
                    {
                        0x0000006D,
                    }
                })
                Return (SBFI)
            }
        }
    }

Try the KEXT manually, before installing it!

$> sudo cp -R ~/Downloads/VoodooI2C.kext /tmp
$> sudo kextutil -v /tmp/VoodooI2C.kext

If that works, you can install it using your favourite KEXT Installer.