当前位置: 首页 > news >正文

报错记录3:imx6ull适配ov2640摄像头无法获取默认摄像头分辨率与格式参数

文章目录

  • 报错现象1
    • 报错原因
    • 解决方法
  • 报错现象2
    • 原因
    • 解决方法

报错现象1

应用在设备启动后首次调用ioctl(fd, VIDIOC_G_FMT, &dev->cur_fmt);获取摄像头默认参数时,获取到的值全为零

报错原因

mx6s_capture驱动中,VIDIOC_G_FMT命令对应的接口为mx6s_vidioc_g_fmt_vid_cap,此接口中,参数从csi_dev 中获取,但首次启动,在没有调用VIDIOC_S_FMT前,csi_dev 参数中关于分辨率与视频格式的参数初始为0,因此函数返回的数据都为0。

static int mx6s_vidioc_g_fmt_vid_cap(struct file *file, void *priv,struct v4l2_format *f)
{struct mx6s_csi_dev *csi_dev = video_drvdata(file);WARN_ON(priv != file->private_data);f->fmt.pix = csi_dev->pix;return 0;
}

解决方法

解决方法就是在此接口中,调用ov2640驱动中的ov2640_g_fmt接口,获取当前真实的参数信息,并将其返回给上层应用。
修改后的函数如下

static int mx6s_vidioc_g_fmt_vid_cap(struct file *file, void *priv,struct v4l2_format *f)
{struct mx6s_csi_dev *csi_dev = video_drvdata(file);struct v4l2_subdev *sd = csi_dev->sd;struct v4l2_mbus_framefmt mbus_fmt;struct mx6s_fmt *fmt;int ret;WARN_ON(priv != file->private_data);ret = v4l2_subdev_call(sd, video, g_mbus_fmt, &mbus_fmt);if (ret == 0) {csi_dev->pix.width     = mbus_fmt.width;csi_dev->pix.height    = mbus_fmt.height;csi_dev->pix.field     = mbus_fmt.field;fmt = format_by_mbus(mbus_fmt.code);if (!fmt) {dev_err(csi_dev->dev, "mbus (0x%08x) invalid.\n", mbus_fmt.code);} else {csi_dev->pix.pixelformat = fmt->pixelformat;}}f->fmt.pix = csi_dev->pix;return 0;
}

报错现象2

应用层在调用ioctl(fd, VIDIOC_G_FMT, &dev->cur_fmt);接口时,无法返回修改后的视频流格式pixelformat参数,pixelformat参数会被清零。

原因

其原因为应用层调用VIDIOC_S_FMT命令后,没有将当前的格式信息更新到csi_dev 参数中,造成VIDIOC_G_FMT命令无法获取到真实的参数信息,VIDIOC_S_FMT对应的驱动层调用接口为mx6s_vidioc_s_fmt_vid_cap, 此接口在mx6s_vidioc_try_fmt_vid_cap中,设置摄像头的分辨率与格式等参数,同时会将设置后的参数值通过实参f反出来,但是调用完成后,代码并没有将pixelformat的数据写入。

解决方法

修改mx6s_vidioc_s_fmt_vid_cap函数,将真实的格式参数更新到csi_dev 中,修改后的函数如下。

static int mx6s_vidioc_s_fmt_vid_cap(struct file *file, void *priv,struct v4l2_format *f)
{struct mx6s_csi_dev *csi_dev = video_drvdata(file);int ret;ret = mx6s_vidioc_try_fmt_vid_cap(file, csi_dev, f);if (ret < 0)return ret;csi_dev->fmt           = format_by_fourcc(f->fmt.pix.pixelformat);csi_dev->mbus_code     = csi_dev->fmt->mbus_code;csi_dev->pix.width     = f->fmt.pix.width;csi_dev->pix.height    = f->fmt.pix.height;csi_dev->pix.sizeimage = f->fmt.pix.sizeimage;csi_dev->pix.field     = f->fmt.pix.field;csi_dev->type          = f->type;dev_dbg(csi_dev->dev, "set to pixelformat '%4.6s'\n",(char *)&csi_dev->fmt->name);/* Config csi */mx6s_configure_csi(csi_dev);return 0;
}

http://www.mrgr.cn/news/17021.html

相关文章:

  • 深入探讨Java JSON解析与HTML标签清除:详解与实例
  • p2p、分布式,区块链笔记: Merkle-DAG和Merkle-Tree的区别与联系
  • 编译原理简介
  • 滑动窗口系列(不定长滑动窗口长度) 9/1
  • 据传:英特尔正考虑剥离制造代工部门
  • 实战项目:俄罗斯方块(一)
  • ubuntu架设FRPC 服务器端方法
  • 基于自适应狮群算法优化GRU神经网络进水量预测,gsclst-gru进水量预测,基于黄金正弦改进的狮群算法优化GRU进水量预测
  • 华为OD机试真题 - 字符成环找偶数O - 滑动窗口(Java/Python/JS/C/C++ 2024 E卷 100分)
  • 创建表与删除表
  • 百度飞浆目标检测PPYOLOE模型在PC端、Jetson上的部署(python)
  • Python知识点:如何使用Jenkins与Python进行CI/CD集成
  • MySQL——事务与存储过程(二)存储过程的创建(3)定义条件和处理程序
  • 信息学奥赛初赛天天练-81-NOIP2015普及组-完善程序-二分答案、二分查找、中位数、二分边界、二分时间复杂度
  • Redis(13)| 主从复制
  • MySQL——事务与存储过程(二)存储过程的创建(4)光标的使用
  • 【例003】利用MATLAB绘制有趣平面图形
  • 06:【江科大stm32】:定时器输入捕获功能
  • 【Python系列】text二进制方式写入文件
  • Spring数据类型转化