VoodooSMBus / VoodooRMI

Synaptic Trackpad driver over SMBus/I2C for macOS
GNU General Public License v2.0
235 stars 18 forks source link
i2c macos smbus synaptic synaptic-trackpad

VoodooRMI

Gitter

A port for macOS of Synaptic's RMI Trackpad driver from Linux. This works for both I2C HID trackpads from Synaptic as well as Synaptic's SMBus trackpads. When following the instructions below, make sure you only select I2C or SMBus depending on your trackpad's capabilities.

Supported Features

Compatibility

Synaptic trackpads generally work over SMBus or I2C, though not both. Pay close attention to which bus it works over.

SMBus

macOS (Requires Acidanthera's VoodooPS2 version 2.3.6 or above):

Windows:

Linux:

I2C

macOS:

Windows:

Linux:

Requirements

SMBus

I2C

Name Main function
SYN1B7F F12
SYNA0000 F11
SYNA1202 F12
SYNA2393 unknown
SYNA2B2C F12
SYNA2B31 F12
SYNA2B33 F11
SYNA2B5A F12
SYNA2B61 F11
SYNA2B34 unknown
SYN3054 F11
SYNA3083 F12
SYNA3105 unknown
SYNA328B F12
SYNA328E F12
SYNA3602 unknown
SYNA7500 unknown
SYNA7501 unknown
SYNA7DAB F12
SYNA7DB5 F12

Installation

1) Add the required kexts to your bootloader 2) Make sure VoodooPS2 is configured as below:

There is no support for this kext being loaded into Library/Extensions or System/Library/Extensions. This likely won't break loading it, but test with injection first before sending in a bug report.

Configuration

The values below can be configured through either ioio or ACPI. An example SSDT can be found under the ACPI examples folder. Note that using non-integer value causes undefined behaviour which may prevent the kext from loading

Value Default Description
ForceTouchType 1 Controls how force touch emulation behaves. 0 = Disabled, 1 = Clickpad press with size threshold, 2 = size threshold only
ForceTouchMinPressure 90 Minimum z value to trigger Force touch when clickpad is clicked
DisableWhileTypingTimeout 250 Milliseconds after typing in which to reject trackpad packets
DisableWhileTrackpointTimeout 250 Milliseconds after using the trackpoint in which to reject trackpad packets
TrackpointMultiplier 20 Multiplier used on trackpoint inputs (other than scrolling). This is divided by 20, so the default value of 20 will not change the output value at all
TrackpointScrollMultiplierX 20 Multiplier used on the x axis when middle button is held down for scrolling. This is divided by 20.
TrackpointScrollMultiplierY 20 Same as the above, except applied to the Y axis
TrackpointDeadzone 1 Minimum value at which trackpoint reports will be accepted. This is subtracted from the input of the trackpoint, so setting this extremely high will reduce trackpoint resolution
MinYDiffThumbDetection 200 Minimum distance between the second lowest and lowest finger in which Minimum Y logic is used to detect the thumb rather than using the z value from the trackpad. Setting this higher means that the thumb must be farther from the other fingers before the y coordinate is used to detect the thumb, rather than using finger area. Keeping this smaller is preferable as finger area logic seems to only be useful when all 4 fingers are grouped together closely, where the thumb is more likely to be pressing down more
PalmRejectionMaxObjWidth 255 Max contact width before contact is considered accidental. This value can be acquired by experimentation using Rehabman's ioio.
PalmRejectionMaxObjHeight 255 Max contact height before contact is considered accidental. This value can be acquired by experimentation using Rehabman's ioio.
PalmRejectionWidth 10 Percent (out of 100) width of trackpad which is used as a low confidence zone on the left and right side of the trackpad
PalmRejectionWidth 60 Percent (out of 100) height of trackpad which is used as a low confidence zone on the left and right side of the trackpad (starting from the top)
PalmRejectionTrackpointHeight 20 Percent (out of 100) height of trackpad which is used as a low confidence zone across the top of the trackpad

Note that you can use Rehabman's ioio to set properties temporarily (until the next reboot).
ioio -s RMIBus ForceTouchType 0
ioio -s RMIBus PalmRejectionMaxObjWidth 5
ioio -s RMIBus PalmRejectionMaxObjHeight 6

Building

1) git submodule update --init --recursive 2) git clone --depth 1 https://github.com/acidanthera/MacKernelSDK 2) Build within XCode using the play button in the top left

Loading/Unloading

For loading, you may need to put RMII2C/RMISMBus's dependencies into the kextload command. Note that RMISMBus/RMII2C depend on VoodooRMI.

The below examples assume VoodooSMBus/VoodooI2C are in the same folder as VoodooRMI. If they are not, you will need to give the path to those kexts. When manually loading from within macOS, keep in mind that csrutil needs to be partially disabled to allow unsigned kexts, and the kexts need to be owned by Root.

Changing owner of kext

// Note that this changes the owner of every kext in the directory your in
sudo chown -R root:wheel *.kext

Manually loading kext

Example for SMBus:

cd path/to/unziped-VoodooRMI_Debug
sudo kextutil -vvvv -d VoodooRMI.kext -d VoodooSMBus.kext VoodooRMI.kext/Contents/PlugIns/RMISMBus.kext

Example for I2C:

sudo kextutil -vvvv -d VoodooRMI.kext -d VoodooI2C.kext VoodooRMI.kext/Contents/PlugIns/RMII2C.kext

For unloading, you can use the bundle ids. This should unload cleanly, though you may need to unload twice in a row to get it to cooperate.

sudo kextunload -vvvv -b com.1Revenger1.RMISMBus -b com.1Revenger1.VoodooRMI

Troubleshooting

Before creating an issue, please check the below: 1) Make sure VoodooSMBus/VoodooI2C is loading and attaching

If the above are loading, next place to check is within the IORegistry and within VoodooRMI logs: 1) Use IORegistryExplorer to check what is attaching and loading.

When creating an issue, you will need to provide log files (IORegs not required but helpful)!