【全志V821_FoxPi】6-2 IMX219 MIPI摄像头适配
【全志V821_FoxPi】6-2 IMX219 MIPI摄像头适配
- 一、背景
- 二、摄像头参数
- 2-1 实物图
- 2-2 模组规格书
- 2-3 15pin 接口原理图
- 2-4 介绍
- 2-5 主要技术参数
- 三、设备树配置
- 3-1 pio配置
- 3-2 twi0节点配置
- 3-3 vind0节点配置
- 四、内核配置
- 五、软件包配置
- 六、打包测试
- 6-1 内核启动信息
- 6-2 查看iic节点
- 6-3 查看vi节点
- 6-4 mpp sample_virvi 采集图像帧
- 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
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作为复位引脚
csi_rst_pins_a: csi_rst{allwinner,pins = "PA2"; };
3-2 twi0节点配置
&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
&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=yCONFIG_TDM_ONE_BUFFER=yCONFIG_SENSOR_IMX219=yCONFIG_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
添加:
#cp sensor imx219 ko to rootfs
define KernelPackage/sensor-imx219SUBMENU:=$(VIDEO_MENU)TITLE:=Sensor imx219 support (staging)DEPENDS:= +kmod-vin-v4l2FILES+=$(CONFIG_EXTERNAL_KERNEL_TREE)/bsp/drivers/vin/modules/sensor/imx219.koAUTOLOAD:=$(call AutoProbe,imx219_mipi)
endefdefine KernelPackage/sensor-imx219/descriptionKernel 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
添加:
[ -f $MODULES_DIR/imx219.ko ] && insmod $MODULES_DIR/imx219.ko
六、打包测试
6-1 内核启动信息
启动的时候内核成功加载了imx219驱动
6-2 查看iic节点
root@TinaLinux:/mnt/extsd# i2cdetect -y 00 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
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
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