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的驱动文件添加,经过上面的修改编译烧写镜像后,抓图软件是能采集到图像,但是图像是错位的花屏的,错误图像在附件。
请大家帮我看看哪里出错了啊。
谢谢~~~
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
期待回复!
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
另外补充一下:
AR0144输出的是原始数据,即12bits的RAW DATA,求助帮忙一下!
邮箱:pengduanhuan@eiorobot.com
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
期待回复!!!
Dear Wigros:
首先感谢您的回复,我们的问题不是imx8mm不支持内核ISP或Formatter问题,我们除了使用imx334还有ov5640,
ov5640的 10bits raw data是能在imx8mm上使用mipi采图的并且使用软件算法能够正常显示图像的,就是imx334不管怎样调试图像就是花屏,我们看了一下,ov5640与imx334最大的区别就是imx334的mipi clock达到了890Mhz。
所以是不是imx8mm不能支持这么高的mipi clock啊,或者是不是哪里需要调整才能适应这么高的速率呢?
期待您的回复
Hello Songri,
MIPI_CLK最大可以接收1.5Gbps的时钟,890MHz对MIPI来说还可以啊。 肯定不是这个问题。如果你的软件能处理转换,你可以把帧率放慢、分辨率降低看看。
Weidong
Dear Wigros:
我们原始配置imx334是 30fps,891Mbps, 4 lanes, 3824x2176,这样采到图的花屏很厉害的,几乎看不到图像是什么样子的,而且帧率也不对,这个时候大概能接收到15fps左右,少了将近一半;如果我把帧率放低到10fps,这个时候图像稍微好些,能看到图像大概样子,但是图像是移动的,一直在漂移。这个时候再怎么降低帧率或者分辨率效果都是一样的。
如果MIPI phy部分没问题,那 csi bridge、或mipi phy与csi birdge衔接部分是不是有问题啊,这个问题已经有半个月了毫无头绪啊。
再次期待您的回复
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
Hello Songri,
你的camera传过来的数据是多少位的? 24bit吗?
weidong
再次核对了一下您帖子里的代码,您试试这样修改一下:
+ {
+.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
有客户用这个配置成功处理了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