linux kernel 摄像头驱动 |
您所在的位置:网站首页 › 调试linux驱动 › linux kernel 摄像头驱动 |
1综合篇点我2uboot移植点我3uboot lcd驱动点我4kernel移植点我5kernel lcd驱动点我6摄像头驱动点我7ubuntu base移植点我8挂载网络文件系统点我9qt移植点我10搭建qt交叉编译点我11wifi移植点我
笔者所使用的ov5640摄像头,和Linux通信使用的是CSI和I2C协议 开发板摄像头接口原理图: 打开前面的imx6ull-user-emmc.dts文件 在i2c节点中添加 #address-cells = ; #size-cells = ; ov5640: ov5640@3c { compatible = "ovti,ov5640"; reg = ; pinctrl-names = "default"; pinctrl-0 = ; clocks = ; clock-names = "csi_mclk"; pwn-gpios = ; rst-gpios = ; csi_id = ; mclk = ; mclk_source = ; status = "okay"; port { ov5640_ep: endpoint { remote-endpoint = ; }; }; };iomuxc的pinctrl_csi1子节点内容修改为: pinctrl_csi1: csi1grp { fsl,pins = ; };csi节点使用摄像头总线 &csi { status = "okay"; port { csi1_ep: endpoint { remote-endpoint = ; }; }; };打开 v4l2-core文件下的Kconfig文件 gedit drivers/media/v4l2-core/Kconfig找到 VIDEOBUF2_DMA_CONTIG 这个配置选项,可以看到这个选项虽然tristate类型,但是却没有说明语句,导致在menuconfig无法显示出来给我们配置,我们可以手动加入说明语句让它在menuconfig显示出来,也可以在下面添加"default y"默认编译进内核中 打开menuconfig配置选项 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig将V4L platform devices 的配置修改如下 -> Device Drivers -> Multimedia support ->[ * ] V4L platform devices ---> -> MXC Video For Linux Video Output -> MXC Video For Linux Video Capture amera/V4L2 PRP Features support ---> -> OmniVision ov5640 camera support -> OmniVision ov5642 camera support -> OmniVision ov5640 camera support using mipi -> Analog Device adv7180 TV Decoder Input support -> Select Overlay Rounting (Queue ipu device for overlay library) ---> -> Pre-processor Encoder library -> IPU CSI Encoder library -> IPU v4l2 output support -> MXC PxP V4L2 driver -> CSI camera support -> OmniVision ov5640 camera support编译内核和设备树 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-编译成功 将zImage和imx6ull-user-emmc.dtb文件拷贝到挂载网络文件系统的文件夹下,设置网络文件系统可参考《挂载网络文件系统》这边文章 cp arch/arm/boot/zImage /home/work/imx6ull/rootfs/zImage/ cp arch/arm/boot/dts/imx6ull-user-emmc.dtb /home/work/imx6ull/rootfs/zImage/给开发板重新上电进入系统 可以看到/dev/下连个两个video设备 3 v4l-utils工具安装 apt install v4l-utils查看可用的视频设备,其中/dev/video0对应OV5640的物理设备 #执行命令 v4l2-ctl --list-devices查看摄像头所有参数 #执行命令 sudo v4l2-ctl -d /dev/video0 --all查看摄像头所支持的分辨率 #执行命令 v4l2-ctl --list-formats-ext -d /dev/video0可以使用gstreamer对摄像头做个简单测试,安装命令如下 apt install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools#在LCD屏幕上显示摄像头的内容 gst-launch-1.0 -v v4l2src device=/dev/video0 ! "video/x-raw, format=(string)YUY2, width=(int)640, height=(int)480, framerate=(fraction)15/1" ! videoconvert ! fbdevsink显示结果: 下载源码:https://github.com/chen3135/mjpg-streamer 在主机中下载好之后将文件拷贝到主机创建给开发板的挂载板网络文件系统中的opt下解压 解压之后得到的文件 解压之后回到网络文件系统的根目录 这里有一个主机挂载ubuntu base的脚本和退出挂载的脚本 mount.sh的内容 #/bin/bash sudo mount -t proc /proc proc sudo mount -t sysfs /sys sys sudo mount -o bind /dev dev sudo mount -o bind /dev/pts dev/pts sudo chroot ./unmount.sh的内容 #!/bin/bash echo "UNMOUNTING" sudo umount proc sudo umount sys sudo umount dev/pts sudo umount dev在主机中执行执行mount.sh挂载ubuntu base 给ubuntu base安装依赖库 apt-get install cmake libjpeg8-dev进入mjpg-streamer-master 执行make 现在主机退出挂载 现在启动开发板,在开发板中进入/opt/mjpg-streamer-master 查看 start.sh的内容 vi start.sh查看发现里面只有这个语句是有用的 ./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -u -f 50" -o "./output_hh ttp.so -w ./www"因为我的摄像头的格式是YUYV的格式,所以在我这里需要加上-y 1指定格式,否则会报错 -y 1 表示使用 V4L2_PIX_FMT_YUYV -y 2 表示使用 V4L2_PIX_FMT_YVYU -y 3 表示使用 V4L2_PIX_FMT_UYVV -y 4 表示使用 V4L2_PIX_FMT_VYUY执行start.sh脚本 我开发板的ip是192.168.4.108,在win11下用浏览器打开 http://192.168.4.108:8080/就可以查看摄像头的内容了 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |