Luckfox Pico Pi RV1106学习<3>:支持IMX415摄像头
Luckfox Pico Pi RV1106学习<3>:支持IMX415摄像头
- 1. 背景
- 2. 硬件
- 3. 修改SDK
- 3.1 修改设备树文件
- 3.2 增加内核编译支持
- 3.3 烧录与运行
1. 背景
Luckfox Pico Pi开发板默认支持 sc3336 和 mis5001 两款摄像头这两个摄像头都支持30fps帧率输出。我想DIY一个采集->编码->UDP发送的应用,类似于图传。为了降低延时,需要用一个更高帧率的摄像头。市面上第三方的RK开发板,最常见的是使用 IMX415 摄像头,因此考虑将该摄像头在RV1106上予以支持。
2. 硬件
我从Luckfox店铺购买了 IMX415 摄像头,该摄像头是用于匹配Luckfox的 Omni3576 开发板的。
上图中,左边是 Mis5001 的摄像头,右边是 IMX415 的摄像头。
开发板使用20P的CSI接口,2-Lane;IMX415 是4-Lane的,用22P的CSI接口。因此,需要做一个小转接板。下面是转接板的PCB外观和原理图。原理图中的电阻是为调试准备的,实际上端接电阻2个焊盘即可。
3. 修改SDK
主要修改两点,一是设备树文件,一个是kernel的编译配置。
3.1 修改设备树文件
首先到 project/cfg/BoardConfig_IPC 路径下,找到对应编译的mk文件。对于我的硬件和编译选项,我的mk文件是:
查询该mk文件,显示指定的设备树文件。
#!/bin/bash#################################################
# Board Config
#################################################
export LF_ORIGIN_BOARD_CONFIG=BoardConfig-EMMC-Buildroot-RV1106_Luckfox_Pico_Pi_W-IPC.mk
# Target CHIP
export RK_CHIP=rv1106# app config
export RK_APP_TYPE=RKIPC_RV1106# Config CMA size in environment
export RK_BOOTARGS_CMA_SIZE="66M"# Kernel dts
export RK_KERNEL_DTS=rv1106g-luckfox-pico-pi-w.dts#################################################
# BOOT_MEDIUM
################################################## Target boot medium
export RK_BOOT_MEDIUM=emmc
可以看到,设备树文件是 rv1106g-luckfox-pico-pi-w.dts。在我的SDK版本中,文件位于
./sysdrv/source/kernel/arch/arm/boot/dts/rv1106g-luckfox-pico-pi-w.dts
再找到这个文件并显示内容:
njl@njl-VMware-Virtual-Platform:~/rv1106_sdk/luckfox-pico$ cat ./sysdrv/source/kernel/arch/arm/boot/dts/rv1106g-luckfox-pico-pi-w.dts
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/** Copyright (c) 2022 Rockchip Electronics Co., Ltd.*//dts-v1/;
#include "rv1106.dtsi"
#include "rv1106-luckfox-pico-pi-ipc.dtsi"
#include <dt-bindings/input/input.h>
#include <dt-bindings/display/media-bus-format.h>
可以看到,该设备树文件包含了文件 rv1106-luckfox-pico-pi-ipc.dtsi。需要修改这个文件。该文件位于:
./sysdrv/source/kernel/arch/arm/boot/dts/rv1106-luckfox-pico-pi-ipc.dtsi
修改该文件。其中Luckfox已经增加了 SC3336和mis5001 的节点,照着再增加一个就好了。主要修改如下两个地方:
&csi2_dphy0 {status = "okay";ports {#address-cells = <1>;#size-cells = <0>;port@0 {reg = <0>;#address-cells = <1>;#size-cells = <0>;csi_dphy_input0: endpoint@0 {reg = <0>;remote-endpoint = <&sc3336_out>;data-lanes = <1 2>;};csi_dphy_input1: endpoint@1 {reg = <1>;remote-endpoint = <&mis5001_out>;data-lanes = <1 2>;};# 增加如下部分csi_dphy_input2: endpoint@2 {reg = <2>;remote-endpoint = <&imx415_out>;data-lanes = <1 2>;};};
&i2c4 {status = "okay";clock-frequency = <400000>;pinctrl-names = "default";//pinctrl-0 = <&i2c4m2_xfer>;sc3336: sc3336@30 {compatible = "smartsens,sc3336";status = "okay";reg = <0x30>;clocks = <&cru MCLK_REF_MIPI0>;clock-names = "xvclk";reset-gpios = <&gpio3 RK_PC5 GPIO_ACTIVE_HIGH>;pinctrl-names = "default";pinctrl-0 = <&mipi_refclk_out0>;rockchip,camera-module-index = <0>;rockchip,camera-module-facing = "back";rockchip,camera-module-name = "CMK-OT2119-PC1";rockchip,camera-module-lens-name = "30IRC-F16";port {sc3336_out: endpoint {remote-endpoint = <&csi_dphy_input0>;data-lanes = <1 2>;};};};mis5001: mis5001@31 {compatible = "imagedesign,mis5001";status = "okay";reg = <0x31>;clocks = <&cru MCLK_REF_MIPI0>;clock-names = "xvclk";reset-gpios = <&gpio3 RK_PC5 GPIO_ACTIVE_HIGH>;pinctrl-names = "default";pinctrl-0 = <&mipi_refclk_out0>;rockchip,camera-module-index = <0>;rockchip,camera-module-facing = "back";rockchip,camera-module-name = "CMK-OT2115-PC1";rockchip,camera-module-lens-name = "30IRC-F16";port {mis5001_out: endpoint {remote-endpoint = <&csi_dphy_input1>;data-lanes = <1 2>;};};};# 增加以下部分imx415: imx415@37 {compatible = "sony,imx415";status = "okay";reg = <0x37>;clocks = <&cru MCLK_REF_MIPI0>;clock-names = "xvclk";reset-gpios = <&gpio3 RK_PC5 GPIO_ACTIVE_LOW>;pinctrl-names = "default";pinctrl-0 = <&mipi_refclk_out0>; rockchip,camera-module-index = <0>;rockchip,camera-module-facing = "back";rockchip,camera-module-name = "CMK-OT2022-PX1";rockchip,camera-module-lens-name = "IR0147-36IRC-8M-F20";port {imx415_out: endpoint {remote-endpoint = <&csi_dphy_input1>;data-lanes = <1 2>;};};};
3.2 增加内核编译支持
在SDK的根目录下,运行:
./build.sh kernelconfig
然后找到 IMX415 的相关编译选项,按 M 选中保存退出。然后运行 ./build.sh执行编译。
3.3 烧录与运行
编译完成后,镜像位于 ~/rv1106_sdk/luckfox-pico/output/image 路径下。按照系列文章的第一篇的内容,烧录镜像,然后运行。
观察串口打印的启动信息。
[ 2.692018] imx415 4-0037: driver version: 00.01.08
[ 2.692056] imx415 4-0037: Get hdr mode failed! no hdr default
[ 2.692084] imx415 4-0037: detect imx415 lane 2
Starting bluetoothd: OK
[ 2.692170] imx415 4-0037: Failed to get power-gpios
[ 2.692183] imx415 4-0037: could not get default pinstate
[ 2.692191] imx415 4-0037: could not get sleep pinstate
[ 2.692213] imx415 4-0037: supply dvdd not found, using dummy regulator
Starting network: [ 2.692424] imx415 4-0037: supply dovdd not found, using dummy regulator
[ 2.692502] imx415 4-0037: supply avdd not found, using dummy regulator
[ 2.756926] imx415 4-0037: Detected imx415 id 0000e0
[root@luckfox root]# lsmod
Module Size Used by Tainted: G
aic8800_btlpm 1719 0
aic8800_fdrv 285463 0
aic8800_bsp 53767 2 aic8800_btlpm,aic8800_fdrv
aes_generic 24532 0
ccm 6847 0
ctr 2606 0
libarc4 799 0
cfg80211 168973 1 aic8800_fdrv
rve 23436 0
rockit 225880 0
rknpu 27019 0
mpp_vcodec 414257 1 rockit
rga3 90762 1 rockit
phy_rockchip_csi2_dphy 9338 0
phy_rockchip_csi2_dphy_hw 10066 0
video_rkisp 171838 1 rockit
video_rkcif 162117 1 rockit
imx415 16360 1 # ------>加载了IMX415的驱动
rk_dvbm 5941 2 mpp_vcodec,video_rkisp
可以看到,已经检测到了 IMX415 。