Re: Sony IMX290/462 image sensors I2C xfer peculiarity

Krzysztof Hałasa
2023-10-10T09:46:38Z

Hi,

I'm back to IMX290 and IMX462 sensors running on i.MX8MP (and not on
some nonexistent sort of i.MX6 as I previously wrote). The timeout thing
happens at circa 2^18 + 8 or + 9 master clocks after the regular START
(not repeated START). With MCLK = 37.125 MHz this amounts to ca. 7 ms.

Using imx290.c and the i2c-imx.c I2C driver (NXP's version 5.15, but it
doesn't seem to differ significantly from mainstream):

wait_queue_head_t queue;

i2c_imx_trx_complete()
wait_event_timeout(queue, ..., HZ / 10);

i2c_imx_master_isr()
wake_up(&queue);

Sensor register write example, I've added a couple of obvious printk()
calls in the interrupt handler.

First adding some load to each CPU core:
for n in 1 2 3 4; do while :; do :; done & done

Then the actual sensor register write:
Sending I2C DEVSEL byte:
[86.968267] <i2c_imx_write> write slave address: addr=0x34

Completed:
[86.968306] <i2c_imx_isr> 0xA2 0xF8 <<<<<< ACK
[86.968311] <i2c_imx_master_isr> 0xA2
[86.980361] <i2c_imx_trx_complete> TRX complete

It took 12 ms to wake up, way too long for IMX462 to remain on the I2C
bus, so the following byte TX fails.

The question is: what can be done about it?
- should I make the camera control thread real time?
- or maybe the I2C driver should be modified?
- or maybe imx290 register accesses should be somehow atomic?