PIM447 trackball: How to get a "clean" INT signal?


I wrote a driver for the PIM447 trackball in polling-mode, and now I’d like to rewrite it in interrupt-mode. Sadly, it turns out the INT signal toggles during I2C transactions (whatever the value of “INT_OUT” bit in REG_INT). See first capture below.

Also, even without touching the ball, the INT signal falls (which means new data are supposed to be available, which is not the case) a couple of milliseconds after registers are read, just as if the interruption was not cleared. See second capture below.

I took a look at the official driver, but despite having the “interrupt” keyword used here and there, it actually polls the INT signal; it doesn’t use it as a trigger (comments are mine):

while not trackball.get_interrupt():

def get_interrupt(self):
    if self._interrupt_pin is not None:
        return GPIO.input(self._interrupt_pin) == 0 # poll pin level
    else:                                           # or
        value = self.i2c_rdwr([REG_INT], 1)[0]      # poll register value
        return value & MSK_INT_TRIGGERED

In order to write an interrupt-mode driver I need a clean INT signal. Please, could you tell me:

  • how not to get the INT signal toggling during I2C transactions?

  • how not to get the INT signal falling even when no new data are available?

Thanks in advance,

1 Like

I’m also very interested in using the trackball with the ZMK firmware that @cdc is working on. I would love to see a response from the team!