报错内容
[ 376.346236] unknown mbus:0x1007
[ 376.350166] mx6s-csi 21c4000.csi: mbus (0x00001007) invalid.
报错代码
在mx6s_capture.c文件中,找到此行报错的调用路径。
static int mx6s_vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
struct v4l2_fmtdesc *f)
/* 省略部分代码 */
fmt = format_by_mbus(code);
if (!fmt) {
dev_err(csi_dev->dev, "mbus (0x%08x) invalid.\n", code);
return -EINVAL;
}
/* 省略部分代码 */
}
struct mx6s_fmt *format_by_mbus(u32 code)
{
int i;
for (i = 0; i < NUM_FORMATS; i++) {
if (formats[i].mbus_code == code)
return formats + i;
}
pr_err("unknown mbus:0x%x\n", code);
return NULL;
}
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,
}, {
/* 省略部分代码 */
};
报错原因
unknown mbus
报错的原因是由于上层代码在调用ioctl(fd, VIDIOC_ENUM_FMT, fmtdesc)
后,
mx6s_capture驱动会调用ov2640驱动的ov2640_enum_fmt
接口,
但ov2640接口返回的格式类型在mx6s_capture中未定义。
/* ov2640支持的图像格式类型 */
static u32 ov2640_codes[] = {
MEDIA_BUS_FMT_YUYV8_2X8,
MEDIA_BUS_FMT_UYVY8_2X8,
MEDIA_BUS_FMT_RGB565_2X8_BE,
MEDIA_BUS_FMT_RGB565_2X8_LE,
};
/* mx6s_capture中定义的格式类型中没有 下面这两项*/
#define MEDIA_BUS_FMT_RGB565_2X8_BE 0x1007
#define MEDIA_BUS_FMT_RGB565_2X8_LE 0x1008
解决
在mx6s_capture.c中找到以下结构体,添加ov2640所需的两个格式类型参数。
static struct mx6s_fmt formats[] = {
/* 省略部分代码 */
{
.name = "RGB565_LE",
.fourcc = V4L2_PIX_FMT_RGB565,
.pixelformat = V4L2_PIX_FMT_RGB565,
.mbus_code = MEDIA_BUS_FMT_RGB565_2X8_LE,
.bpp = 2,
}, {
.name = "RGB565_BE",
.fourcc = V4L2_PIX_FMT_RGB565X,
.pixelformat = V4L2_PIX_FMT_RGB565X,
.mbus_code = MEDIA_BUS_FMT_RGB565_2X8_BE,
.bpp = 2,
}
};
解决RGB取流异常或取流时LCD花屏
异常现象
使用OV2640取流时,如果同时使用了LCD屏幕,则可能在取流时,LCD花屏。
原因是由于设置RGB565格式的配置时,CSI接口配置没有RGB565相关的配置,因此造成了内存分配异常,可能与LCD的显存出现重叠现象,因此取帧时,显存遭到破坏,LCD会花屏。
解决方法
找到static int mx6s_configure_csi(struct mx6s_csi_dev *csi_dev)
接口,添加两个switch的case
static int mx6s_configure_csi(struct mx6s_csi_dev *csi_dev)
{
/* 省略部分代码 */
switch (csi_dev->fmt->pixelformat) {
/* 省略部分代码 */
case V4L2_PIX_FMT_UYVY:
case V4L2_PIX_FMT_YUYV:
/* 添加下面这两行 */
case V4L2_PIX_FMT_RGB565:
case V4L2_PIX_FMT_RGB565X:
/***********************/
case V4L2_PIX_FMT_JPEG:
if (csi_dev->csi_mux_mipi == true)
width = pix->width;
else
/* For parallel 8-bit sensor input */
width = pix->width * 2;
break;
default: