樹(shù)莓派增加新攝像頭的驅(qū)動(dòng)

我的最終目標(biāo)是在樹(shù)莓派上運(yùn)行GC4653這個(gè)攝像頭,但是沒(méi)接觸過(guò)linux內(nèi)核和驅(qū)動(dòng)這些所以先用ov5647這個(gè)攝像頭調(diào)試下看看。

使用ov5647

因?yàn)椴皇悄J(rèn)的攝像頭,所以要先改一下設(shè)置,在sudo nano /boot/firmware/config.txt的后面增加一行dtoverlay=ov5647,然后把camera_auto_detect改成0,保存然后重啟這樣會(huì)加載新的配置,這時(shí)候 ls /dev/video*應(yīng)該會(huì)多出來(lái)幾個(gè)video設(shè)備了。


rpicam-hello -t 0調(diào)用攝像頭,應(yīng)該就可以看到畫(huà)面了。(其實(shí)直接什么都不改也行。。。。)

這時(shí)候用dmesg | grep ov5647查看可以看到有相關(guān)的初始化

設(shè)備樹(shù)和KO文件

關(guān)于設(shè)備樹(shù)和ko我的理解是這樣的,需要先更新設(shè)備樹(shù),讓linux知道我們要連一個(gè)什么樣的設(shè)備,這個(gè)設(shè)備需要用要什么東西i2c、gpio什么的。這個(gè)用來(lái)描述設(shè)備的就是設(shè)備樹(shù)文件,通常是dts和dtsi組成,編譯后得到dtso(其實(shí)就是deviceTreeSource和deviceTreeInclude,dtso對(duì)應(yīng).o文件)然后加載ko文件,ko文件是這個(gè)設(shè)備的驅(qū)動(dòng),通常是.c文件編譯得到的。
設(shè)備樹(shù)在make的時(shí)候可以選擇,如果是y的話(huà)就會(huì)編到image里面,但是這樣新增設(shè)備驅(qū)動(dòng)就會(huì)比較復(fù)雜,所以選m的話(huà)就會(huì)單獨(dú)變成dtso,然后用voerlay的方式讓系統(tǒng)加載。這也是剛剛在config.txt里面所做的事情

查看此時(shí)的設(shè)備樹(shù)和ko文件

sudo find / -name "ov5647*" 查找所有和ov5647相關(guān)的文件


lsmod 查看在運(yùn)行的module

驅(qū)動(dòng)編譯

下載內(nèi)核工程

這里下載樹(shù)莓派的內(nèi)核工程,我不想搞交叉編譯了,所以直接拷到了樹(shù)莓派的桌面上。然后執(zhí)行

KERNEL=kernel8
sudo make bcm2712_defconfig

先生成.config文件,然后sudo make -j8,這個(gè)要搞半個(gè)小時(shí)左右吧。。

注:要先安裝一些依賴(lài)

apt install tmux build-essential bc bison flex libssl-dev make libc6-dev libncurses5-dev

apt安裝太慢的話(huà)可以加參數(shù)上代理,-o Acquire::http::proxy="http://192.168.1.7:23457"KERNEL=kernel8

ko編譯

ko文件是用特定的.c文件編譯的,我們這里寫(xiě)一個(gè)hello world測(cè)試,新建一個(gè)hello.c寫(xiě)下面這些

    #include <linux/init.h>
    #include <linux/module.h>

    MODULE_LICENSE("Dual BSD/GPL");

    static int __init hello_init(void)
    {
            printk(KERN_ALERT "Hello world\n");
            return 0;
    }

    static void __exit hello_exit(void)
    {
            printk(KERN_ALERT "GoodBye! Hello world\n");
    }

    module_init(hello_init);
    module_exit(hello_exit);

然后統(tǒng)計(jì)目錄新建Makefile,寫(xiě)這些

ifeq ($(KERNELRELEASE),)

KDIR ?= ./linux
PWD := $(shell pwd)

all:
    make -C $(KDIR) M=$(PWD) modules

clean:
    rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions *.ko *.symvers *.order

.PHONY: clean

else
obj-m := hello.o
endif

然后make,這樣會(huì)生成一個(gè)hello.ko,makefile里面的KDIR路徑要填內(nèi)核工程的路徑,然后sudo insmod hello.ko就可以安裝這個(gè)ko文件,用dmesg就會(huì)看到打印的hello了,sudo rmmod hello也會(huì)看到相應(yīng)的打印。

測(cè)試I2C通信

先用rpicam-hello -t 0把設(shè)備跑起來(lái),然后用i2ctransfer -f -y 6 w2@0x36 0x38 0x08 r2讀取0x3808寄存器,因?yàn)槭?6位地址,所以不能直接用i2cdump讀取。

交叉編譯

不知道為什么樹(shù)莓派多次reboot以后會(huì)進(jìn)不去系統(tǒng),所以補(bǔ)充下WSL來(lái)交叉編譯的過(guò)程。

  1. 交叉編譯工具https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
  2. 安裝依賴(lài)apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev

然后吧交叉編譯的工具添加到路徑里,用make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2712_defconfig生成配置,用make -j8 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-生成

測(cè)試驅(qū)動(dòng)

可以用樹(shù)莓派自帶的rpicam-apps來(lái)測(cè)試,我用的rpicam-hello -t 0 --framerate 120這個(gè),默認(rèn)是跑5秒左右,-t 0可以讓他一直跑,-framerate可以讓他提高幀率,不然默認(rèn)幀率一直是30左右,可以在標(biāo)題欄左上角看到幀率
也可以用rpicam-vid --level 4.2 --framerate 120 --width 1920 --height 270 --save-pts timestamp.pts -o video.264 -t 10000 --denoise cdn_off來(lái)測(cè)試。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容