正点原子imx6ull+ov2640+lcd显示问题汇总
正点原子官方给的ov2640设备树配置无法成功Probe显示出ID号,改成下面的设备树配置即可(注意引脚GPIO1_04和GPIO1_02不能被其他设备树节点占用)
&i2c2 {clock_frequency = <100000>;pinctrl-names = "default";pinctrl-0 = <&pinctrl_i2c2>;status = "okay";ov2640: ov2640@0x30 {compatible = "ovti,ov2640";reg = <0x30>;pinctrl-names = "default";pinctrl-0 = <&pinctrl_csi1>;clocks = <&clks IMX6UL_CLK_CSI>; clock-names = "xvclk"; pwdn-gpios = <&gpio1 4 GPIO_ACTIVE_HIGH>;resetb-gpios = <&gpio1 2 GPIO_ACTIVE_LOW>;csi_id = <0>;mclk = <24000000>;mclk_source = <0>;status = "okay";port {ov2640_ep: endpoint {remote-endpoint = <&csi1_ep>;bus-width = <8>;};};};......
更改csi
&csi {status = "okay";port {csi1_ep: endpoint {remote-endpoint = <&ov2640_ep>;};};
};
同时要注意OV2640拍摄出来LCD出现频闪,花纹等,大概率是LCD设备树配置问题,LCD这里使用的是(4.3寸 800*480分辨率)RGB888,而摄像头ov2640(支持640*480分辨率)是以RGB565方式采集,这两个问题会导致屏幕的频闪和花纹。具体修改的方式如下:
将LCD的bits-per-pixel改为16也就是(RBG565),其他设备树配置和自己的屏幕保持一致即可。
至此设备树相关配置完成
ov2640.c和mx6s_capture.c都是内核里的驱动文件,复制即可,注意mx6s_capture.c里面有一部分要修改:
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_UYVY:case V4L2_PIX_FMT_YUYV:if (csi_dev->csi_mux_mipi == 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_mux_mipi == 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;default:pr_debug(" fmt not supported\n");return -EINVAL;}csi_write(csi_dev, cr18, CSI_CSICR18);}return 0;
}
到此驱动也编写完成。
在/lib/module/4.1.15里面加载mx6s_capture.ko模块即可完成注册(ov2640默认加载),显示效果如下:
应用层的话,官方给的v4l2代码视频流解码有点问题,所有博主只是实现拍照功能。要注意要将画面裁剪成和ov2640分辨率一样的情况,否则画面就会被拉伸显示不全。但是不拉伸的话,右边又有一块区域是黑边,这个问题后面再在解决。