The classic Kensington Expert Mouse ("trackball") has long been hailed as one of the greatest technological achievements of the 20th century. To make it work with current technology, however, may require creating a custom cable to convert its proprietary mini-DIN 8 connector to something normal. The Expert Mouse is "dual mode", that is, it can speak as either a serial or PS/2 mouse depending upon the cable used. The table below shows the pinout of the connectors needed to make a cable or verify that one is wired correctly.
Male plug of cable that goes to Kensington Expert Mouse.
Serial port connector that plugs into computer.
PS/2 connector that plugs into computer
While a PS/2 mouse connector "just works", a serial mouse may need a driver. Linux's HID will automatically detect a serial mouse if one is connected at the time a USB serial adapter is plugged in.
Under GNU/Linux, one can use an Expert Mouse on the serial port by running the command:
inputattach --microsoft /dev/ttyUSB0
(Where ttyUSB0 is the name of your serial port. Other choices might be ttyS0 or ttyS1.)
The serial port protocol is a standard 2-button Microsoft mouse (1200 baud), unless J3 is cut. See the Protocol section below.
My guess is that the Expert Mouse changes personality based upon which pin it sees voltage on when plugged in. If there is voltage on pin 3, then it should act like a PS/2 mouse. If not, then it should give output as a serial mouse.
For unfathomable reasons Kensington chose a Mini DIN 8 plug which could be accidentally crammed into a PS/2 socket, do not try it as it will not work and could destroy your hardware.
The Mini DIN 8 connector was used by different companies with wildly different ideas of what signals should be on the pins. Despite being physically identical and looking so tempting, do not plug the Expert Mouse into an Apple //gs or early Macintosh serial port as it is not compatible. I have not checked NeXT or Sun workstations, but I suspect that their Mini DIN 8 mouse ports are also wired differently.
Motorola MC68HC705P6ACP microcontroller.
Sticker says:
910200001330
C16#E A(T6)
28 Pin DIP
Pin 28 is +V (Mini DIN-8 pin 3)
Pin 14 is Gnd (Mini DIN-8 pin 5)
Pins 15 through 22 appear to be IO that are shorted to GND or Vcc
SW4, southeast, grounds pin 3 (PA7) when pressed
SW3, southwest, grounds pin 13 (PB7)
SW2, northeast, grounds pin 4 (PA6)
SW1, northwest, grounds pin 5 (PA5)
X roller: Pin 25 (PD7/TCAP)?
Y roller: Pin 23 (PD5)?
X IR detector phase: ?
Y IR detector phase: Pins 16 to 19 (AD0 to AD3)
Motorola 68HC705P6ACP
The four different buttons are wired separately and can be used independently by jumper settings. Holding down a button while plugging in the mouse does not appear to do anything, in PS/2 or serial mode. Looking at the circuit board, it has silkscreened on it locations on the microcontroller where jumpers could have been.
J2: Pin 7 (PA3) → Gnd
J3: Pin 6 (PA4) → Gnd
J4: Pin 15 (PC7/Vrefh) → Vcc
J5: Pin 20 (PC2) is a jumper to Vcc (not shorted)
J6: Pin 21 (PC1) is a jumper to Vcc (not shorted)
J7: Pin 22 (PC0) → Gnd.
Cutting jumper J2 is useful! It causes the northwest and northeast button to act as locking toggles for left and right mouse buttons. The first click sends a button press event and the second click releases it. This makes dragging much easier! (Though, how often do you need to drag with the right mouse button?
Cutting jumper J3 is even more useful! It causes the northwest button to send a middle click and the northeast button acts as a locking toggle for the left mouse button.
If button is locked down via the northeast button, it can also be released by clicking the southwest button.
Note that if J2 is also cut, then the northeast button does nothing.
Cutting jumper J4 does not have any known useful effect.
Cutting J2 as well as J4 causes the mouse to not work at all.
Cutting J3 as well as J4 acts the same as if only J3 was cut.
Connecting J5 (Pin 20 → Vcc) does not appear to do anything. PS/2 and serial work the same as before.
(Grounding J5 appears to cause only mouse clicks to be sent over serial, but PS/2 works fine.)
Connecting J6 (Pin 21 → Vcc) causes only mouse clicks to be sent over PS/2 and serial, no mouse movement.
(Grounding J6 appears to break serial, but PS/2 works.)
Cutting jumper J7 disables the northwest and northeast buttons.
Jumper settings are only read when the mouse is first powered on.
Previous versions of the Expert Mouse documented dip switches that allowed many different things, some of which would be very useful. How do I enable those options?
MouseSystems mode
More rapid pointer acceleration
Left-handed mode
Different baud rate
When button lock is enabled (J2 or J3 cut) and in PS/2 (not serial) mode, if the mouse is unplugged when a button is locked down, it cannot be released by a different mouse device.
When in 3-button mode (J3 cut) and using the serial port (not PS/2), Kensington's Expert Mouse suffers from the middle-button drag problem.
Microsoft's 3-button serial protocol sends the exact same sequence for middle button down as up. This becomes a problem when dragging with the middle button held down as some events will be missed and the middle button state will end up reversed.
The usual solution to this is to use the "MouseSystems" protocol instead which does not have that misfeature. It is not yet clear at this time how to enable that.
Toggling DTR (gpm -o dtr) does not enable MouseSystems.
Holding down mouse buttons while plugging in the cable does nothing. (On some mouses, if a button is held down when it gets power it will switch to MouseSystems instead of Microsoft protocol).
J4, J5, J6 do not cause the serial port to speak the MouseSystems protocol.
Currently the best solution seems to be simply using PS/2 instead of serial.
The mouse movement speed of the trackball may feel slow on a high-resolution screen. One solution is to apply a transformation matrix only to the trackball (not other mouses) using `xinput` on GNU/Linux. Here's an example that triples the trackball speed:
xinput set-prop "Generic USB K/B Mouse" "Coordinate Transformation Matrix" 3 0 0 0 3 0 0 0 1
To see the possible pointer names, run `xinput` with no arguments.