My setup is using a Pi compute module 4 to readout an IMX219 Pi camera. In between those two is an FPGA through which all signals are routed (I2C and MIPI).
I got the I2C module in the FPGA working, i.e.
i2cdetect -y 1 will detect an I2C device with an address 0x10 as expected.
vcgencmd get_camera returns
supported=2 detected=1. I can also readout the 0x0000 register and the answer is 0x0219 again as expected (using
i2ctransfer). I wrote a script which sets the camera parameters directly and puts it into streaming mode after which I can readout valid MIPI frames in the FPGA. So far so good.
Now I wanted to use
raspistill to capture actual frames on the Pi and what I have to assume is the camera gets stuck and doesn't reply anymore.
raspistill will timeout with:
"Camera control callback cmd=0x4f525245mmal: No data received from sensor. Check all connections, including the Sunny one on the camera board"
which also makes sense since the sensor doesn't actually get turned on. Using a scope and LA, I checked whats happening on the I2C bus: First it probes the bus for a device at 0x10 and also reads the 0x0000 register which returns 0x0219. It then probes the bus a few times for a device with address 0x71 which I'm guessing is a different camera type or just an alternative address. This returns a nack. At this point I'm guessing raspistill figured out that it's dealing with an imx219 and will start the appropriate setup. This is where the camera gets stuck.
It sends a 0x01 to reg 0x0103, telling it to do a software reset. Immediately after, it tries to write again to 0x10 but this gets NACKd. Raspistill will retry a few more times and then timeout. After this the camera wont answer to anything, i.e. i2cdetect won't detect anything at 0x10 (but a different device at 0x64 still responds, so bus is working). I can only reset the bus by running
raspi-gpio set 44 a2 && raspi-gpio set 45 a2 and I can communicate with the cam again. Writing 0x01 to 0x0103 manually (through i2ctransfer) works just fine and nothing gets stuck.
After the faulty transfer all busses are high and responsive, just the camera doesn't answer. Does anyone have an idea why this would work directly but not when tunneling through the FPGA?
Both camera and Pi have been tested in a different setup without the FPGA in between and raspistill works just fine.