文章目录
- 报错内容
- 报错代码
- 报错原因
- 解决
报错内容
[ 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_RGB565,.pixelformat = V4L2_PIX_FMT_RGB565,.mbus_code = MEDIA_BUS_FMT_RGB565_2X8_BE,.bpp = 2,}
};