question: CSI on imx8mq with (any) CSI2 camera / experience with mx6s_capture?

Laurent Pinchart laurent.pinchart at ideasonboard.com
Tue Feb 23 06:32:19 EST 2021


Hi Martin,

On Tue, Feb 23, 2021 at 10:04:44AM +0100, Martin Kepplinger wrote:
> On 22.12.20 16:55, Martin Kepplinger wrote:
> > On 22.12.20 16:35, Laurent Pinchart wrote:
> >> On Tue, Dec 22, 2020 at 03:06:28PM +0100, Martin Kepplinger wrote:
> >>> On 10.12.20 17:04, Laurent Pinchart wrote:
> >>>> On Thu, Dec 10, 2020 at 02:12:30PM +0100, Martin Kepplinger wrote:
> >>>>> On 10.12.20 13:17, Laurent Pinchart wrote:
> >>>>>> On Thu, Dec 10, 2020 at 11:24:00AM +0200, Laurent Pinchart wrote:
> >>>>>>> On Thu, Dec 10, 2020 at 09:17:48AM +0100, Martin Kepplinger wrote:
> >>>>>>>> hi,
> >>>>>>>>
> >>>>>>>> TL;DR: did you use the NXP "mx6s_capture" csi bridge driver with 
> >>>>>>>> other
> >>>>>>>> cameras?
> >>>>>>>
> >>>>>>> I've recently worked on camera support for i.MX8MM (whose camera IP
> >>>>>>> cores are, if not identical, very similar to the i.MX8MQ's). The 
> >>>>>>> least I
> >>>>>>> can say is that it was painful :-(
> >>>>>>>
> >>>>>>> I'm using an MT9M114 sensor, which can produce RAW8, RAW10 and 
> >>>>>>> YUV and
> >>>>>>> has a CSI-2 interface. My first use case is to capture RAW10, which
> >>>>>>> isn't supported by the mx6s_capture driver.
> >>>>>
> >>>>> so did you successfully use the NXP mx6s_capture driver with that 
> >>>>> sensor too?
> >>>>
> >>>> I haven't tried. The mx6s_capture driver and the mainline driver share a
> >>>> similar architecture, as they came from the same code base. They have
> >>>> diverged, with the  mainline driver receiving bug fixes and new
> >>>> features, and my large no-yet-upstreamed patch series adds lots of fixes
> >>>> that are required for the mt9m114 driver to work with the driver. For
> >>>> that reason, I've considered that porting the mt9m114 driver to the NXP
> >>>> mx6s_capture, and fixing the same issues in the mx6s_capture driver than
> >>>> were present in the mainline driver, would require lots of time for
> >>>> likely very little gain.
> >>>>
> >>>> That being said, I've compared the two drivers, and I haven't seen
> >>>> anything in mx6s_capture that would address the specific issues I'm
> >>>> facing. I've ordered yesterday an i.MX8MM EVK with an OV5640 camera
> >>>> module, and I will test those with the mainline driver. If they don't
> >>>> work, and assuming the NXP kernel driver works on that platform, I'll
> >>>> have two code bases to compare.
> >>>>
> >>>>>>>> I try to use a CSI2 camera (hi846 I'm writing a driver for) on imx8mq:
> >>>>>>>> Using NXP's CSI bridge driver
> >>>>>>>> https://source.codeaurora.org/external/imx/linux-imx/tree/drivers/media/platform/mxc/capture/mx6s_capture.c?h=imx_5.4.0_8dxlphantom_er 
> >>>>>>>>
> >>>>>>>> as well as the CSI driver itself:
> >>>>>>>> https://source.codeaurora.org/external/imx/linux-imx/tree/drivers/media/platform/imx8/mxc-mipi-csi2_yav.c?h=imx_5.4.0_8dxlphantom_er 
> >>>>>>>>
> >>>>>>>> works fine when using the ov5640 camera with this driver:
> >>>>>>>> https://source.codeaurora.org/external/imx/linux-imx/tree/drivers/media/platform/mxc/capture/ov5640_mipi_v2.c?h=imx_5.4.0_8dxlphantom_er 
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> (I realize there is a CSI bridge driver in staging, but that need more
> >>>>>>>> work to be actually used. Of course after this the goal is to fix and
> >>>>>>>> use it; and mainline a CSI phy driver too.)
> >>>>>>>
> >>>>>>> I have lots of patches for this driver, which I've developed on i.MX7D
> >>>>>>> for a separate project. I'd like to mainline them, but this is blocked
> >>>>>>> by one last issue that I haven't been able to solve yet. In a nutshell,
> >>>>>>> the CSI writes two consecutive frames in each buffer, overflowing the
> >>>>>>> allocated memory. The registers that control the buffer size seem to be
> >>>>>>> programmed correctly as far as I can tell. I've reported this issue to
> >>>>>>> NXP but haven't received any feedback yet.
> >>>>>
> >>>>> that's different from where I am. So you don't get any interrupt (EOF or
> >>>>> other) when only *one* frame is written into one buffer?
> >>>>
> >>>> I don't get any FB1_DMA_DONE or FB2_DMA_DONE interrupt at least. I
> >>>> haven't checked other interrupts. I thus get half of the frame rate. If
> >>>> I configure the CSI_CSIIMAG_PARA register with half of the actual image
> >>>> height, buffers then contain a single image and the frame rate goes to
> >>>> the expected value. That gives me a workaround, but without
> >>>> understanding the root cause, I'm worried that just halving the height
> >>>> would introduce other breakages.
> >>>
> >>> Hi Laurent,
> >>>
> >>> Thanks a lot, exchanging things this way alone is much appreciated. I'll
> >>> give you detailed feedback on the staging drivers later - I tried
> >>> running them, they probe but still a (gstreamer) stream would not start.
> >>> But most all of your addition make a lot of sense.
> >>>
> >>> Just so you know, to emphasize that once more: I'm still on the nxp
> >>> drivers (yes, they are very similar) just because the ov56 cam works
> >>> with them over here.
> >>
> >> I've recently bought an i.MX8MM EVK, with the OV5647 camera module, and
> >> when I try to capture images, with the NXP kernel, I just don't get any.
> >> *sigh* I'll have to debug that.
> > 
> > oh you have it already. very good.
> > 
> > I guess the nxp kernel directly *should* work, but I use a kernel based 
> > on v5.9.X and include the drivers like so:
> > https://source.puri.sm/Librem5/linux-next/-/commit/ed8f567432d776d21cb7160c03e3272826a5f316 
> > 
> > https://source.puri.sm/Librem5/linux-next/-/commit/8d93a2cfd485d404741560dcb2f22da548f54ebc 
> > 
> >>> The main problem I have is that, as soon as I try
> >>> to use a different pixelformat than V4L2_PIX_FMT_YUYV that basically
> >>> nothing works anymore. userspace stops to "be interested" pretty soon.
> >>>
> >>> If I do (wrongly) use that pixelformat, I do get (only) one frame (dma)
> >>> completed, the usual way.
> >>>
> >>> And when I break the ov56 by using a wrong pixelformat in mx6s_capture
> >>> (nxp bridge driver), I get equally get only one frame (dma) completed 
> >>> there.
> >>>
> >>> How can I make this thing use a different pixelformat (by setting the
> >>> media bus format in the sensor driver)?
> >>
> >> All the components have to support the format you want to capture. This
> >> includes the CSI driver, the MIPI_CSI driver, and the OV5647 driver. The
> >> pixel format only matters in the CSI driver, for the other two it's the
> >> media bus format that matters. To capture raw bayer data, you'll first
> >> need to extend the OV5640 driver to support the corresponding media bus
> >> format (and of course configure the sensor to output that format), then
> >> the MIPI_CSI driver to support that media bus format as well, and
> >> finally the CSI driver.
> > 
> > ok, the sensor I work with outputs raw bayer only, and that sounds like 
> > I should pay more attention to the mipi csi driver.
> > 
> > that links to my experiments I occasionally update:
> > https://source.puri.sm/martin.kepplinger/linux-next/-/commits/hi846
> > 
> >>> thanks again for sharing your code early. have a nice rest of the year,
> 
> hi Laurent, how are you? Am I right in that you tried to run the ov5640 
> mainline driver with the CSI bridge staging driver on imx8mq? Which mipi 
> driver would you then use?

I've run it with the staging driver on i.MX8MP, not i.MX8MQ. The MQ
seems to have the same CSI bridge, but a different CSI-2 receiver (and
PHY). It would be great if you could contribute a driver for that :-)

> Did you have progress in that area and in resolving things in order to
> push some of your changes out?

I've sent a large patch series recently, if you could review it it would
speed up integration ;-)

> I'm still struggling with the different sensor I want to use on imx8mq 
> (hi846) and I still use the nxp bsp drivers for mipi and csi bridge:
> 
> I was able to add and fix a few things and get some kind of image at 
> least, but there's still definitely some sizes or timings wrong (in 
> every resolution mode I think). 1280x720 shows it clearly as the image 
> looks "almost" normal only when I resize it to 916 pixel width. Also, it 
> "shifts" with later frames. For a few images of this, see
> 
> https://source.puri.sm/Librem5/linux-next/-/issues/43#note_143875
> 
> I just wanted to describe the above just in case you've seen something 
> like that during your experiments with sensors and can point me to 
> places to look at. I do think that the SoC side should be ok now (but 
> still now 100% sure), but many sensors are similar and maybe you have 
> ideas there too.

I've seen similar (but not identical) issues that were due to incorrect
Ths_settle values in the D-PHY. You could start by trying different
values there. This seems to be controlled on i.MX8MQ by
CSI2_1_S_PRG_RXHS_SETTLE in IOMUXC_GPR_GPR34 or CSI2_2_S_PRG_RXHS_SETTLE
in IOMUXC_GPR_GPR41, but the value of the fields are not properly
documented :-S The i.MX8MM suffered from the same issue, but a table
with register values for different clock frequencies was posted by NXP
on their support forum. Maybe the same information could be available
there for i.M8XMQ ?

> anyways, thanks for looking at this and as soon as I have a satisfying 
> image with my current setup, I'll switch to the staging csi driver. But 
> there's no driver for the mipi ("phy") in staging for imx8mq, right?

-- 
Regards,

Laurent Pinchart



More information about the linux-arm-kernel mailing list