imx8m mini mipi csi采图异常

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

imx8m mini mipi csi采图异常

13,373 Views
chinaman
Fresh Out Contributor

Dear all:

   本人现在使用imx8m mini mipi csi接口采集图像,sensor是 sony imx334,它的配置是 891Mbps,4 lanes, 3824x2176,30fps,10bits raw data。使用的bsp是4.14.98,由于内核不支持10bits raw data,我们做了如下修改:

mx6s_capture.c作如下添加修改

static struct mx6s_fmt formats[] = {
{
.name = "UYVY-16",
.fourcc = V4L2_PIX_FMT_UYVY,
.pixelformat = V4L2_PIX_FMT_UYVY,
.mbus_code = MEDIA_BUS_FMT_UYVY8_2X8,
.bpp = 2,
}, {
.name = "YUYV-16",
.fourcc = V4L2_PIX_FMT_YUYV,
.pixelformat = V4L2_PIX_FMT_YUYV,
.mbus_code = MEDIA_BUS_FMT_YUYV8_2X8,
.bpp = 2,
}, {
.name = "YUV32 (X-Y-U-V)",
.fourcc = V4L2_PIX_FMT_YUV32,
.pixelformat = V4L2_PIX_FMT_YUV32,
.mbus_code = MEDIA_BUS_FMT_AYUV8_1X32,
.bpp = 4,
}, {
.name = "RAWRGB8 (SBGGR8)",
.fourcc = V4L2_PIX_FMT_SBGGR8,
.pixelformat = V4L2_PIX_FMT_SBGGR8,
.mbus_code = MEDIA_BUS_FMT_SBGGR8_1X8,
.bpp = 1,
}, {
.name = "RAWRGB10 (SBGGR10)",
.fourcc = V4L2_PIX_FMT_SBGGR10,
.pixelformat = V4L2_PIX_FMT_SBGGR10,
.mbus_code = MEDIA_BUS_FMT_SBGGR10_1X10,
.bpp = 2,
}
};

static int mx6s_configure_csi(struct mx6s_csi_dev *csi_dev)
{
struct v4l2_pix_format *pix = &csi_dev->pix;
u32 cr1, cr18;
u32 width;

if (pix->field == V4L2_FIELD_INTERLACED) {
csi_deinterlace_enable(csi_dev, true);
csi_buf_stride_set(csi_dev, csi_dev->pix.width);
csi_deinterlace_mode(csi_dev, csi_dev->std);
} else {
csi_deinterlace_enable(csi_dev, false);
csi_buf_stride_set(csi_dev, 0);
}

switch (csi_dev->fmt->pixelformat) {
case V4L2_PIX_FMT_YUV32:
case V4L2_PIX_FMT_SBGGR8:
width = pix->width;
break;
case V4L2_PIX_FMT_SBGGR10:
case V4L2_PIX_FMT_UYVY:
case V4L2_PIX_FMT_YUYV:
if (csi_dev->csi_mipi_mode == true)
width = pix->width;
else
/* For parallel 8-bit sensor input */
width = pix->width * 2;
break;
default:
pr_debug(" case not supported\n");
return -EINVAL;
}
csi_set_imagpara(csi_dev, width, pix->height);

if (csi_dev->csi_mipi_mode == true) {
cr1 = csi_read(csi_dev, CSI_CSICR1);
cr1 &= ~BIT_GCLK_MODE;
csi_write(csi_dev, cr1, CSI_CSICR1);

cr18 = csi_read(csi_dev, CSI_CSICR18);
cr18 &= ~BIT_MIPI_DATA_FORMAT_MASK;
cr18 |= BIT_DATA_FROM_MIPI;

switch (csi_dev->fmt->pixelformat) {
case V4L2_PIX_FMT_UYVY:
case V4L2_PIX_FMT_YUYV:
cr18 |= BIT_MIPI_DATA_FORMAT_YUV422_8B;
break;
case V4L2_PIX_FMT_SBGGR8:
cr18 |= BIT_MIPI_DATA_FORMAT_RAW8;
break;
case V4L2_PIX_FMT_SBGGR10:
cr18 |= BIT_MIPI_DATA_FORMAT_RAW10;
break;
default:
pr_debug(" fmt not supported\n");
return -EINVAL;
}

csi_write(csi_dev, cr18, CSI_CSICR18);
}
return 0;
}

mxc_mipi_csi.c做如下修改:

static const struct csis_pix_format mipi_csis_formats[] = {
{
.code = MEDIA_BUS_FMT_YUYV8_2X8,
.fmt_reg = MIPI_CSIS_ISPCFG_FMT_YCBCR422_8BIT,
.data_alignment = 16,
}, {
.code = MEDIA_BUS_FMT_VYUY8_2X8,
.fmt_reg = MIPI_CSIS_ISPCFG_FMT_YCBCR422_8BIT,
.data_alignment = 16,
}, {
.code = MEDIA_BUS_FMT_SBGGR8_1X8,
.fmt_reg = MIPI_CSIS_ISPCFG_FMT_RAW8,
.data_alignment = 8,
}, {
.code = MEDIA_BUS_FMT_SBGGR10_1X10,
.fmt_reg = MIPI_CSIS_ISPCFG_FMT_RAW10,
.data_alignment = 16,
}
};

fsl-imx8mm-evk.dts作如下修改

&mipi_csi_1 {
#address-cells = <1>;
#size-cells = <0>;
status = "okay";
port {
mipi1_sensor_ep: endpoint1 {
remote-endpoint = <&ov5640_mipi1_ep>;
data-lanes = <4>;
csis-hs-settle = <16>;
csis-clk-settle = <0>;
csis-wclk;
};

csi1_mipi_ep: endpoint2 {
remote-endpoint = <&csi1_ep>;
};
};
};

还有一些imx334的驱动文件添加,经过上面的修改编译烧写镜像后,抓图软件是能采集到图像,但是图像是错位的花屏的,错误图像在附件。

请大家帮我看看哪里出错了啊。

谢谢~~~

手动阀
Labels (1)
0 Kudos
25 Replies

10,949 Views
pengduanhuan
Contributor II

你好,有问题请教,方便留个联系方式交流不?

0 Kudos

10,970 Views
pengduanhuan
Contributor II

Dear songrui2008,

 这边现在有个项目是用IMX8M MINI + AR0144 (MIPI-CSI接口)的方案去实现图像的采集,目前已经用示波器在IMX8M MINI芯片的MIPI端测试到有MIPI信号波形产生,也就是硬件上实现了数据收发,但是不清楚IMX8M MINI如何通过内部 诸如SDK函数调用或者软件设置把MIPI接口的数据调到芯片内部给算法同事处理?  是否按照你这边贴出来的几部分代码可以实现MIPI接口数据的调用(mx6s_capture.c,mxc_mipi_csi.c,fsl-imx8mm-evk.dts)?如果是的话,能否把相关例程做适当解释?如果不是的话,你那边是否有关于IMX8M MINI MIPI接口的SDK包?   

个人邮箱:pengduanhuan@eiorobot.com

联系方式:qq1158860995

期待回复!

0 Kudos

11,583 Views
weidong_sun
NXP TechSupport
NXP TechSupport

Hi songrui,

1. 按照你目前的描述,数据已经被MIPI CSI-2接收到了。否则,不会有花屏图像的。

2. 图像不正常的原因

I.MX8MM 不支持内部ISP和Formatter,所以您接收到的RAW data无法直接显示的。如果要直接显示,你的camera数据格式必须要YUV或者RGB才行。

【注】我们有一个基于OpenCL的softISP,可以在I.MX8MQ/I.MX8QM/I.MX8X系列上使用,但是I.MX8MM上也不支持这个ISP。

如果你不想修改硬件,想要解决这个问题,需要您自己做RAW data to YUV的软件工作,才能正常显示图像。

Hope above information is helpful to you !

Have a nice day!

B.R,

Weidong

0 Kudos

2,093 Views
knowible
Contributor I

你好 请问I.MX8MM 接收到的RAW data是经过mipi压缩的吗?比如在raw10的情况下,mipi压缩后的4个像素存储在五个字节,正常的raw10是存储在两个字节的,imx8mm接收后的是什么类型呢?

0 Kudos

10,948 Views
pengduanhuan
Contributor II

你好,这边有问题请教,方便留个联系方式交流吗?

0 Kudos

10,981 Views
pengduanhuan
Contributor II

另外补充一下:

 AR0144输出的是原始数据,即12bits的RAW DATA,求助帮忙一下!

邮箱:pengduanhuan@eiorobot.com

0 Kudos

10,989 Views
pengduanhuan
Contributor II

Dear Wigros:

   这边现在正在使用IMX8M MINI主控MIPI-CSI接口的lane0/lane1双通道跟onsemi的AR0144 sensor芯片对接,目前用示波器在IMX8M的MIPI接口引脚端测试到了MIPI信号波形,但是不清楚IMX8M MINI的MIPI接口是如何把这些数据捕捉到并传递到芯片内部给算法使用(是否需要MIPI接口的SDK函数调用MIPI物理接口上的数据)?  如果是的话,是否有例程可借鉴一下?如果不是的话,你那边是否有关于IMX8M MINI MIPI接口的SDK包?麻烦告知下IMX8M MINI如何将MIPI接口端的数据采集调用!!

另外补充一下:

 AR0144输出的是原始数据,即12bits的RAW DATA,求助,多谢!

邮箱:pengduanhuan@eiorobot.com

个人联系方式:QQ1158860995

期待回复!!!

0 Kudos

11,583 Views
chinaman
Fresh Out Contributor

Dear Wigros:

首先感谢您的回复,我们的问题不是imx8mm不支持内核ISP或Formatter问题,我们除了使用imx334还有ov5640,

ov5640的 10bits raw data是能在imx8mm上使用mipi采图的并且使用软件算法能够正常显示图像的,就是imx334不管怎样调试图像就是花屏,我们看了一下,ov5640与imx334最大的区别就是imx334的mipi clock达到了890Mhz。

所以是不是imx8mm不能支持这么高的mipi clock啊,或者是不是哪里需要调整才能适应这么高的速率呢?

期待您的回复

手动阀
0 Kudos

11,583 Views
weidong_sun
NXP TechSupport
NXP TechSupport

Hello Songri,

  MIPI_CLK最大可以接收1.5Gbps的时钟,890MHz对MIPI来说还可以啊。 肯定不是这个问题。如果你的软件能处理转换,你可以把帧率放慢、分辨率降低看看。

Weidong

0 Kudos

11,583 Views
chinaman
Fresh Out Contributor

Dear Wigros:

   我们原始配置imx334是 30fps,891Mbps, 4 lanes, 3824x2176,这样采到图的花屏很厉害的,几乎看不到图像是什么样子的,而且帧率也不对,这个时候大概能接收到15fps左右,少了将近一半;如果我把帧率放低到10fps,这个时候图像稍微好些,能看到图像大概样子,但是图像是移动的,一直在漂移。这个时候再怎么降低帧率或者分辨率效果都是一样的。

  如果MIPI phy部分没问题,那 csi bridge、或mipi phy与csi birdge衔接部分是不是有问题啊,这个问题已经有半个月了毫无头绪啊。

 再次期待您的回复

手动阀
0 Kudos

11,583 Views
weidong_sun
NXP TechSupport
NXP TechSupport

Hello Songri,

一、咱们算一下数据量

pixel clock:   3824x2176x30 = 249630720Hz
1 Lane MIPI CLK:     249630720Hz * 24bit = 5991137280Hz = 6000MHz  (这是bit clock)
4 Lane MIPI CLK :    6000MHz / 4 = 1.5Gbps

这个已经是最小的计算了。因为是直接用 3824x2176 计算的,没有算上那些非Active的参数,否则还要小。
如果算上的话,恐怕至少要到2Gbps才能差不多。

显然,你使用891MHz MIPI CLOCK传30 Frame,是做不到的。从camera端,就无法传过来的。传15帧Frame过来,这个clock是可以的。


二,软件ISP,能搞定这么大的数据量吗?
其实这是个未知数,debug的时候,建议你逐步降低分辨率,降低帧率,直到正常显示。这个时候,再来看30Fbps的时候,能传多大的分辨率。

Hope above advice is helpful to you.

Have  a nice day!

B.R,

Weidong

0 Kudos

11,583 Views
chinaman
Fresh Out Contributor

Dear  Wigros

    降帧率或降分辨率我们都试过了,还是分屏的;这个891Mbps 4 lanes  3824x2176配置是没问题的,同样的sensor配置在另一个平台上(rk3399)是能完美运行的。所以问题不在sensor端,还是在处理器这边。

手动阀
0 Kudos

11,583 Views
weidong_sun
NXP TechSupport
NXP TechSupport

Hello Songri,

你的camera传过来的数据是多少位的? 24bit吗?

weidong

0 Kudos

11,583 Views
chinaman
Fresh Out Contributor

Dear Wigros:

    是10bit raw data,我们的sensor配置是 10bits raw data,4 data lanes,3824x2176, 891Mbps,30fps。

手动阀
0 Kudos

11,583 Views
weidong_sun
NXP TechSupport
NXP TechSupport

OK, 收到。

10bit RAW,有没有用16bit方式接收一下,试试?

伟东

0 Kudos

11,583 Views
chinaman
Fresh Out Contributor

Dear Wigros:

您是指在fsl-imx8mm-evk.dts文件中对应的加上“fsl,two-8bit-sensor-mode”吗?

手动阀
0 Kudos

11,582 Views
weidong_sun
NXP TechSupport
NXP TechSupport

再次核对了一下您帖子里的代码,您试试这样修改一下:

+ {
+.name = "RAWRGB10 (SBGGR10)",
+.fourcc = V4L2_PIX_FMT_SBGGR10,
+.pixelformat = V4L2_PIX_FMT_SBGGR10,
+.mbus_code = MEDIA_BUS_FMT_SBGGR10_1X10,
+.bpp = 1,
+}


case V4L2_PIX_FMT_YUV32:
case V4L2_PIX_FMT_SBGGR8:
+case V4L2_PIX_FMT_SBGGR10:
width = pix->width;
break;

然后看看行不行。

Weidong

0 Kudos

11,582 Views
chinaman
Fresh Out Contributor

Dear Wigros:

      使用新配置后,拍摄静止图像时相较于之前,分屏图像移动的速度慢些,但是图像上会有一些规律性排列的小正方形灰点。这样的配置是有什么依据吗,我的疑问是是不是需要在哪里某个位置将clock rate设置大些,才能配的上imx334的891Mbps。

           Best Regards

手动阀
0 Kudos

11,582 Views
weidong_sun
NXP TechSupport
NXP TechSupport

有客户用这个配置成功处理了RAW12,所以,我请你试试类似代码,这个是RAW12的:

+  .name  = "RAWRGB12 (SGRBG12)",

+  .fourcc  = V4L2_PIX_FMT_SGRBG12,

+  .pixelformat = V4L2_PIX_FMT_SGRBG12,

+  .mbus_code = MEDIA_BUS_FMT_SRGGB12_1X12,

+  .bpp  = 1,

 

 switch (csi_dev->fmt->pixelformat) {

  case V4L2_PIX_FMT_YUV32:

  case V4L2_PIX_FMT_SBGGR8:

+ case V4L2_PIX_FMT_SGRBG12:

   width = pix->width;

   break;

另外,图像情况怎么样,要不你贴一张看看。

weidong

0 Kudos

11,582 Views
chinaman
Fresh Out Contributor

pastedImage_1.png

像这个样子的

手动阀
0 Kudos