> 文章列表 > 加载驱动之后无法在/dev/下生成vedio0

加载驱动之后无法在/dev/下生成vedio0

加载驱动之后无法在/dev/下生成vedio0

前言

环境介绍:

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_cedrusvideobuf2_dma_contig    20480  2 sunxi_cedrus,sun6i_csivideobuf2_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的配置后面再说,先这样用着。