【全志V821_FoxPi】6-2 IMX219 MIPI摄像头适配

【全志V821_FoxPi】6-2 IMX219 MIPI摄像头适配

  • 一、背景
  • 二、摄像头参数
    • [2-1 实物图](#2-1 实物图)
    • [2-2 模组规格书](#2-2 模组规格书)
    • [2-3 15pin 接口原理图](#2-3 15pin 接口原理图)
    • [2-4 介绍](#2-4 介绍)
    • [2-5 主要技术参数](#2-5 主要技术参数)
  • 三、设备树配置
    • [3-1 pio配置](#3-1 pio配置)
    • [3-2 twi0节点配置](#3-2 twi0节点配置)
    • [3-3 vind0节点配置](#3-3 vind0节点配置)
  • 四、内核配置
  • 五、软件包配置
  • 六、打包测试
    • [6-1 内核启动信息](#6-1 内核启动信息)
    • [6-2 查看iic节点](#6-2 查看iic节点)
    • [6-3 查看vi节点](#6-3 查看vi节点)
    • [6-4 mpp sample_virvi 采集图像帧](#6-4 mpp sample_virvi 采集图像帧)
    • [6-5 TigerISP 测试](#6-5 TigerISP 测试)
  • 七、FoxPi板+拓展板实物图

一、背景

全志V821这颗芯片的定位是IPC,所以对摄像头的支持是不会少的

在这里主要以 2lane 的MIPI作为适配

首先登场的是IMX219,这颗摄像头很多人都熟悉,在树莓派、Jetson Nano、OrangePi等开发板都有出现过,现在我们将在FoxPi开发板适配这款摄像头
注:这里使用的SDK为V1.2

二、摄像头参数

2-1 实物图

2-2 模组规格书

2-3 15pin 接口原理图

2-4 介绍

IMX219 是索尼(Sony)推出的一款 1/4 英寸 CMOS 图像传感器,主要用于移动设备和嵌入式视觉应用。其分辨率为 3280 × 2464(约 800 万像素),支持 MIPI CSI-2 接口,广泛应用于树莓派摄像头模块、无人机、安防监控等领域。

2-5 主要技术参数

  • 分辨率: 3280 × 2464(8MP)
  • 像素尺寸: 1.12 μm × 1.12 μm
  • 传感器尺寸: 1/4 英寸
  • 最大帧率:
    1080p(1920 × 1080)@ 30fps
    720p(1280 × 720)@ 60fps
  • 输出接口: MIPI CSI-2(2/4 Lane)
  • 动态范围: 约 71 dB
  • 功耗: 典型值 225 mW(工作状态)

三、设备树配置

3-1 pio配置

这里使用的是twi0,使用PA3 PA4

c 复制代码
	twi0_pins_default: twi0@0 {
		pins = "PA3", "PA4";
		function = "twi0";
		bias-pull-up;
		allwinner,drive = <0>;
	};

	twi0_pins_sleep: twi0@1 {
		pins = "PA3", "PA4";
		function = "gpio_in";
	};

使用PA2作为复位引脚

c 复制代码
	csi_rst_pins_a: csi_rst{
		allwinner,pins = "PA2"; 
	};

3-2 twi0节点配置

c 复制代码
&twi0 {
	clock-frequency = <100000>;
	pinctrl-0 = <&twi0_pins_default>;
	pinctrl-1 = <&twi0_pins_sleep>;
	pinctrl-names = "default", "sleep";
	/* For stability and backwards compatibility, we recommend setting 'twi_drv_used' to 1 */
	twi_drv_used = <1>;
	status = "okay";

};

3-3 vind0节点配置

注:imx219 器件地址是0x10,这里的twi地址要配置成0x20

c 复制代码
&vind0 {
	csi_top = <240000000>;
	vind0_clk = <250000000>;
	status = "okay";

	// csi0: csi@45820000 {
	// 	pinctrl-0 = <>;
	// 	pinctrl-1 = <>;
	// 	pinctrl-names = "csi_sm-default","csi_sm-sleep";

	// 	status = "disabled";
	// };

	csi1: csi@45821000 {
		pinctrl-names = "default","sleep";
		pinctrl-0 = <&ncsi_bt656_pins_a>;
		pinctrl-1 = <&ncsi_bt656_pins_b>;
		status = "disabled";
	};

	tdm0: tdm@45908000 {
		work_mode = <0x1>;
	};

	isp00:isp@45900000 {
		work_mode = <0x1>;
		ldci_select = <0x1>;
	};

	isp01:isp@458ffffc {
		status = "okay";
		rpbuf = <&rpbuf_controller0>;
		rpmsg-ser-name = "43030000.e907_rproc";
	};

	isp10:isp@4 {
		status = "disabled";
	};

	scaler00:scaler@45910000 {
		work_mode = <0x1>;
	};

	scaler01:scaler@4590fffc {
		work_mode = <0xff>;
		status = "okay";
		rpmsg-ser-name = "43030000.e907_rproc";
	};

	scaler10:scaler@45910400 {
		work_mode = <0x1>;
		status = "okay";
	};

	scaler11:scaler@459103fc {
		work_mode = <0xff>;
		rpmsg-ser-name = "43030000.e907_rproc";
		status = "okay";
	};

	actuator0: actuator@2108180 {
		device_type = "actuator0";
		actuator0_slave = <0x18>;
		actuator0_af_pwdn = <>;
		actuator0_afvdd = "afvcc-csi";
		actuator0_afvdd_vol = <2800000>;
		status = "disabled";
	};


	flash0: flash@2108190 {
		device_type = "flash0";
		flash0_type = <2>;
		flash0_en = <>;
		flash0_mode = <>;
		flash0_flvdd = "";
		flash0_flvdd_vol = <>;
		device_id = <0>;
		status = "disabled";
	};

	sensor0: sensor@5812000 {
		device_type = "sensor0";
		sensor0_mname = "imx219";
		sensor0_twi_cci_id = <0>;	/* 所使用的twi id号,本例中使用的是twi0,故填写为0 */
		sensor0_twi_addr = <0x20>;
		sensor0_mclk_id = <0>;		/* 所使用的mclk id号,本例中使用的是MCLK0,故填写为0 */
		sensor0_pos = "rear";
		sensor0_isp_used = <1>;		/* 所使用的sensor为raw sensor,需要过ISP处理,故填写为1 */
		sensor0_fmt = <1>;			/* sensor输出的图像格式,YUV:0,RAW:1 */
		sensor0_stby_mode = <0>;
		sensor0_vflip = <0>; 		/* VIPP 图像垂直翻转 */
		sensor0_hflip = <0>;		/* VIPP 图像水平翻转 */
		sensor0_iovdd-supply = <>;
		sensor0_iovdd_vol = <>;
		sensor0_avdd-supply = <>;
		sensor0_avdd_vol = <>;
		sensor0_dvdd-supply = <>;
		sensor0_dvdd_vol = <>;
		sensor0_power_en = <>;          
		sensor0_reset = <&pio PA 2 GPIO_ACTIVE_LOW>;
		sensor0_pwdn = <>;
		status = "okay";
	};

	sensor1: sensor@5812010 {
		device_type = "sensor1";
		sensor1_mname = "gc1084_mipi_2";
		sensor1_twi_cci_id = <0>;
		sensor1_twi_addr = <0x7e>;
		sensor1_mclk_id = <1>;
		sensor1_pos = "front";
		sensor1_isp_used = <1>;
		sensor1_fmt = <1>;
		sensor1_stby_mode = <0>;
		sensor1_vflip = <0>;
		sensor1_hflip = <0>;
		sensor1_iovdd-supply = <>;
		sensor1_iovdd_vol = <>;
		sensor1_avdd-supply = <>;
		sensor1_avdd_vol = <>;
		sensor1_dvdd-supply = <>;
		sensor1_dvdd_vol = <>;
		sensor1_power_en = <>;
		sensor1_reset = <&pio PD 13 GPIO_ACTIVE_LOW>;
		status = "disabled";
	};

	sensor_list0:sensor_list@200b820 {

		status	= "disabled";
	};

	sensor_list1:sensor_list@200b830 {

		status	= "disabled";
	};

	vinc00:vinc@45830000 {
		vinc0_csi_sel = <0>;
		vinc0_mipi_sel = <0>;
		vinc0_isp_sel = <0>;
		vinc0_isp_tx_ch = <0>;
		vinc0_tdm_rx_sel = <0>;
		vinc0_rear_sensor_sel = <0>;
		vinc0_front_sensor_sel = <0>;
		vinc0_sensor_list = <0>;
		work_mode = <0x1>;
		status = "okay";
	};

	vinc01:vinc@4582fffc {
		vinc1_csi_sel = <0>;
		vinc1_mipi_sel = <0>;
		vinc1_isp_sel = <1>;
		vinc1_isp_tx_ch = <0>;
		vinc1_tdm_rx_sel = <1>;
		vinc1_rear_sensor_sel = <0>;
		vinc1_front_sensor_sel = <0>;
		vinc1_sensor_list = <0>;
		status = "okay";
		rpmsg-ser-name = "43030000.e907_rproc";
		delay_init = <1>;
	};

	vinc10:vinc@45831000 {
		vinc4_csi_sel = <0>;
		vinc4_mipi_sel = <0>;
		vinc4_isp_sel = <0>;
		vinc4_isp_tx_ch = <0>;
		vinc4_tdm_rx_sel = <0>;
		vinc4_rear_sensor_sel = <0>;
		vinc4_front_sensor_sel = <0>;
		vinc4_sensor_list = <0>;
		work_mode = <0x1>;
		status = "okay";
	};

	vinc11:vinc@45830ffc {
		vinc5_csi_sel = <0>;
		vinc5_mipi_sel = <0>;
		vinc5_isp_sel = <1>;
		vinc5_isp_tx_ch = <0>;
		vinc5_tdm_rx_sel = <1>;
		vinc5_rear_sensor_sel = <0>;
		vinc5_front_sensor_sel = <0>;
		vinc5_sensor_list = <0>;
		status = "okay";
		rpmsg-ser-name = "43030000.e907_rproc";
		delay_init = <1>;
	};

};

四、内核配置

复制代码
	CONFIG_SUPPORT_ISP_TDM=y
	CONFIG_TDM_ONE_BUFFER=y
	CONFIG_SENSOR_IMX219=y
	CONFIG_SENSOR_IMX219_TWO_LANE_MIPI=y
	# CONFIG_SENSOR_GC1084_MIPI is not set
	# CONFIG_SENSOR_GC05A2 is not set

五、软件包配置

openwrt/target/v821/v821-foxpi_ipc/modules.mk添加:

c 复制代码
#cp sensor imx219 ko to rootfs
define KernelPackage/sensor-imx219
	SUBMENU:=$(VIDEO_MENU)
	TITLE:=Sensor imx219 support (staging)
	DEPENDS:= +kmod-vin-v4l2
	FILES+=$(CONFIG_EXTERNAL_KERNEL_TREE)/bsp/drivers/vin/modules/sensor/imx219.ko
	AUTOLOAD:=$(call AutoProbe,imx219_mipi)
endef

define KernelPackage/sensor-imx219/description
	Kernel modules for sensor-imx219 support
endef

$(eval $(call KernelPackage,sensor-imx219))

让驱动自动打包进文件系统:make menuconfig,搜索imx219,选中 *

修改驱动自动加载脚本
openwrt/target/v821/v821-foxpi_ipc/busybox-init-base-files/etc/init.d/S00mpp

添加:

c 复制代码
    [ -f $MODULES_DIR/imx219.ko ] && insmod $MODULES_DIR/imx219.ko

六、打包测试

6-1 内核启动信息

启动的时候内核成功加载了imx219驱动

6-2 查看iic节点

c 复制代码
root@TinaLinux:/mnt/extsd# i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

6-3 查看vi节点

cat /sys/kernel/debug/mpp/vi

c 复制代码
root@TinaLinux:/mnt/extsd# cat /sys/kernel/debug/mpp/vi
*****************************************************
VIN hardware feature list:
mcsi 2, ncsi 1, parser 2, isp 1, vipp 2, dma 2
CSI_VERSION: CSI300_600, ISP_VERSION: ISP603_100
CSI_CLK: 240000000, ISP_CLK: 0
*****************************************************
vi0:
imx219 => mipi0 => csi0 => tdm_rx0 => isp0 => vipp0
input => hoff: 0, voff: 0, w: 2592, h: 1944, fmt: RGGB10
output => width: 1280, height: 720, fmt: NV21
interface: MIPI, isp_mode: NORMAL, hflip: 0, vflip: 0
prs_in => x: 2592, y: 1944, hb: 1200, hs: 3597
bkuf => cnt: 3 size: 1384448 rest: 3, work_mode: offline
tdmbuf => cnt: 0 size: 0, cmp_ratio: 0
ispbuf => cnt: 4 size: 7593984/65536/65536/65536, cmp_ratio: 0
frame => cnt: 198, lost_cnt: 74, error_cnt: 0
internal => avg: 50(ms), max: 51(ms), min: 49(ms)
CSI Bandwidth: 0
*****************************************************
vi1:
(efault) => mipi0 => csi0 => tdm_rx1 => isp1 => vipp1
input => hoff: 0, voff: 0, w: 0, h: 0, fmt: NULL
output => width: 0, height: 0, fmt: NULL
interface: NULL, isp_mode: NORMAL, hflip: 0, vflip: 0
prs_in => x: 0, y: 0, hb: 0, hs: 0
bkuf => cnt: 0 size: 0 rest: 0, work_mode: offline
tdmbuf => cnt: 0 size: 0, cmp_ratio: 0
ispbuf => cnt: 4 size: 0/0/0/0, cmp_ratio: 0
frame => cnt: 0, lost_cnt: 0, error_cnt: 0
internal => avg: 0(ms), max: 0(ms), min: 0(ms)
CSI Bandwidth: 0
*****************************************************
vi4:
(efault) => mipi0 => csi0 => tdm_rx0 => isp0 => vipp4
input => hoff: 0, voff: 0, w: 0, h: 0, fmt: NULL
output => width: 0, height: 0, fmt: NULL
interface: NULL, isp_mode: NORMAL, hflip: 0, vflip: 0
prs_in => x: 0, y: 0, hb: 0, hs: 0
bkuf => cnt: 0 size: 0 rest: 0, work_mode: offline
tdmbuf => cnt: 0 size: 0, cmp_ratio: 0
ispbuf => cnt: 4 size: 7593984/65536/65536/65536, cmp_ratio: 0
frame => cnt: 0, lost_cnt: 0, error_cnt: 0
internal => avg: 0(ms), max: 0(ms), min: 0(ms)
CSI Bandwidth: 0
*****************************************************
vi5:
(efault) => mipi0 => csi0 => tdm_rx1 => isp1 => vipp5
input => hoff: 0, voff: 0, w: 0, h: 0, fmt: NULL
output => width: 0, height: 0, fmt: NULL
interface: NULL, isp_mode: NORMAL, hflip: 0, vflip: 0
prs_in => x: 0, y: 0, hb: 0, hs: 0
bkuf => cnt: 0 size: 0 rest: 0, work_mode: offline
tdmbuf => cnt: 0 size: 0, cmp_ratio: 0
ispbuf => cnt: 4 size: 0/0/0/0, cmp_ratio: 0
frame => cnt: 0, lost_cnt: 0, error_cnt: 0
internal => avg: 0(ms), max: 0(ms), min: 0(ms)
CSI Bandwidth: 0
*****************************************************
CSI Bandwidth total 0M, ISP Bandwidth total 0M
*****************************************************

6-4 mpp sample_virvi 采集图像帧

参考 https://docs.aw-ol.com/docs/soc/v821/mpp/mpp_sample_video

在/mnt/extsd 下执行
./sample_virvi -path ./sample_virvi.conf

成功生成了 test.yuv

c 复制代码
root@TinaLinux:/mnt/extsd# ls -lh
drwxr-xr-x    2 root     root       16.0K Oct  7  2025 System Volume Information
-rwxr-xr-x    1 root     root        2.2M Jul  8  2024 awTuningApp_isp603
-rwxr-xr-x    1 root     root        6.5M Jan  1  1980 coredump-awTuningApp_isp-915-11-1011
-rwxr-xr-x    1 root     root       37.7K Jan  1  1980 isp0_2592_1944_20_0_imx219_ctx_saved.bin
-rwxr-xr-x    1 root     root        4.3M Oct  7  2025 sample_virvi
-rwxr-xr-x    1 root     root        2.8K Oct  7  2025 sample_virvi.conf
-rwxr-xr-x    1 root     root       65.9M Jan  1  1980 test.yuv

6-5 TigerISP 测试

七、FoxPi板+拓展板实物图

相关推荐
杜子不疼.2 小时前
【Linux】进程的初步探险:基本概念与基本操作
linux·人工智能·ai
de之梦-御风3 小时前
【Linux】 开启关闭MediaMTX服务
linux·运维·服务器
Morphlng3 小时前
wstunnel 实现ssh跳板连接
linux·服务器·网络·ssh
星如雨落3 小时前
Linux VScode 安装PHP环境
linux·php·visual studio code
深思慎考4 小时前
Linux二进制查看工具——hexdump
linux·c++·二进制·文件查看·hexdump
云边有个稻草人5 小时前
从内核调优到集群部署:基于Linux环境下KingbaseES数据库安装指南
linux·数据库·金仓数据库管理系统
Raymond运维5 小时前
MySQL包安装 -- RHEL系列(Yum资源库安装MySQL)
linux·数据库·mysql
夜月yeyue5 小时前
ART 加速器、流水线与指令预测的关系详解
linux·服务器·c语言·单片机·嵌入式硬件·性能优化·嵌入式高阶技巧
---学无止境---5 小时前
Linux中select的实现
linux