前言
环境介绍:
1.编译环境
Ubuntu 18.04.5 LTS
2.SDK
orangepi Linux 5.4 SDK
3.uboot
v2020.04
4.gcc
gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf
5.单板
orangepi pc plus
一、问题
继上一篇成功加载gc2035.ko文件之后,理论上就会在/dev/下生成vedio0文件,但实际是并没有正常。
二、问题分析
通过添加打印信息确定gc2035_probe函数已经正常执行完成,gc2035.ko所需要的依赖项也成功加载。能想到的问题如下:
1、根文件系统太简陋,我是通过busybox编译生成的,可能有依赖项未添加;
2、内核还有其他依赖项未添加;
三、问题排查
3.1 根文件系统验证
既然busybox不行就改用成熟的系统,幸好之前通过通过orangepi SDK生成了Debian,直接nfs启动即可,但最终还是没有生成vedio0文件;
3.2 内核验证
把板子emmc自带的内核替换我生成的内核,上电验证发现还是不行
四、曙光
验证了两个方法还是不行,就在一筹莫展没有头绪的时候,想到板子自带的emmc文件系统是不是可以。
上电emmc的文件系统,没有加载gc2035.ko,发现默认/dev/下面是有vedio0文件的,通过lsmod发现默认加载了好多.ko,其中默认的ov5640也有。这里试过编译内核的时候把ov5640驱动去掉也会有ov5640的驱动加载。这就奇怪了,内核都去掉了,为啥还能加载,难道根文件系统里面有?查找了默认的根文件系统,发现在下面文件夹里面存放着很多驱动的.ko文件,其中就包括了ov5640.ko。
/lib/modules/5.4.65-sunxi/kernel/drivers
通过lsmod查看加载的驱动文件,有比较多是跟视频相关的,如下有删减。
ov5640 28672 0
sun6i_csi 32768 0
sunxi_cedrus 32768 0
v4l2_fwnode 24576 2 ov5640,sun6i_csi
v4l2_mem2mem 20480 1 sunxi_cedrus
videobuf2_dma_contig 20480 2 sunxi_cedrus,sun6i_csi
videobuf2_memops 20480 1 videobuf2_dma_contig
videobuf2_v4l2 20480 3 sunxi_cedrus,sun6i_csi,v4l2_mem2mem
videobuf2_common 36864 4 sunxi_cedrus,sun6i_csi,v4l2_mem2mem,videobuf2_v4l2
videodev 151552 7 ov5640,v4l2_fwnode,sunxi_cedrus,videobuf2_common,sun6i_csi,v4l2_mem2mem,videobuf2_v4l2
mc 36864 7 ov5640,sunxi_cedrus,videobuf2_common,videodev,sun6i_csi,v4l2_mem2mem,videobuf2_v4l2
对比发现少了videobuf2这类驱动文件,查找kernel源文件,发现这类驱动文件在下面这路径,并且没有编译到内核中。
/home/zfeng/orangepi/orangepi-build/kernel/orange-pi-5.4/drivers/media/common/videobuf2/
通过分析依赖关系,按照如下顺序重新加载驱动文件之后成功生成vedio0文件。
cd /lib/modules/5.4.65-sunxi
modprobe mc.ko
modprobe videodev.ko
modprobe videobuf2_common.ko
modprobe videobuf2_v4l2.ko
modprobe videobuf2_memops.ko
modprobe videobuf2_dma_contig.ko
modprobe v4l2-fwnode.ko
modprobe v4l2-mem2mem.ko
modprobe videobuf-core.ko
modprobe sun6i-csi.ko
modprobe gc2035.ko
至于kernel配置默认添加videobuf2的配置后面再说,先这样用着。