Camera 通路配置指南
前言
概述
本指南主要介绍 V861/V838/V881 平台 Camera 通路结构,说明典型工作场景的通路配置(board.dts)。
读者对象
本文档(本指南)主要适用于以下工程师:
- 技术支持工程师
- 软件开发工程师
适用范围
适用的SOC平台:
- 适用于 V861/V838/V881平台
- SDK版本:V861_TINA
芯片规格描述
MIPI 规格描述
- 支持 3 路 MIPI
- 支持 2 路 MIPI + 1 路 DVP
- 最大支持 1 路 MIPI(4 Lane)或者 2 路 MIPI 各 1/2 Lane 或者 3 路 MIPI 1 Lane,即 MIPI0_4Lane 或者 MIPI0(1/2 Lane)+ MIPI1(1/2 Lane)或者 MIPI0(1 Lane)+ MIPI1(1 Lane)+ MIPI2(1 Lane)
ISP 规格描述
- 支持2F-WDR
- 一个ISP实体,在线模式可以处理1路线性或者1路2F-WDR,
- 在线模式最大处理能力6M@30fps,最大分辨率3264x4244
- 离线模式可分时复用为四个虚体,可以支持处理4路线性、2F-WDR+2路线性、2F-WDR + 2F-WDR。
- 离线模式最大处理能力8M@30fps,最大分辨率5592x4244
TDM 规格描述
- TDM 为 ISP 数据输入端,控制 ISP 处理数据的分时复用。
- 支持四路TDM_RX,分别对应四路ISP虚体,即4路线性:TDM_RX0连接ISP00、TDM_RX1连接ISP01、TDM_RX2连接ISP02、TDM_RX3连接ISP03。
- 2F-WDR + 2路线性:TDM_RX0连接ISP00、TDM_RX2连接ISP02、TDM_RX3连接ISP03。
- 2F-WDR + 2F-WDR:TDM_RX0连接ISP00、TDM_RX2连接ISP02。
VIPP 和 DMA 规格描述
- 在线模式: 共有四个VIPP和DMA实体,VIPP0无法缩放, 只有VIPP0/1支持LBC2.0,支持YUV422转420
- VIPP1-支持自定义缩小算法,缩放倍数 1 ~ 1/256 宽高各(1 ~ 1/8),支持YUV422转420,VIPP2-支持自定义缩小算法 缩放倍数 1 ~ 1/256 宽高各(1 ~ 1/8),支持最邻近和线性插值算法 缩放倍数 1 ~ 1/4096 宽高各(1 ~ 1/64),支持YUV422转420,VIPP3-支持自定义缩小算法 缩放倍数 1 ~ 1/4096 宽高各(1 ~ 1/64)
- 离线模式: 每个VIPP和DMA可分时复用为4个VIPP和DMA虚拟体,四个VIPP和DMA实体相互独立,在线模式和离线模式开关也是相互独立的。
- VIPP和DMA的分时复用(离线模式)与ISP和TDM的分时复用(离线模式)是绑定关系,即TDM和ISP开启了离线模式,VIPP和DMA的输入端如果是ISP,那么VIPP和DMA也需要开启离线模式。
离线模式下,通路连接关系:
- ISP00固定连接VIPP00、VIPP10、VIPP20和VIPP30
- ISP01固定连接VIPP01、VIPP11、VIPP21和VIPP31
- ISP02固定连接VIPP02、VIPP12、VIPP22和VIPP32
- ISP03固定连接VIPP03、VIPP13、VIPP23和VIPP33

离线模式分时复用说明:
- 离线模式下,实体VIPP0可分时复用为VIPP00、VIPP01、VIPP02、VIPP03 ,实体DMA0可分时复用为DMA00、DMA01、DMA02、DMA03,分别对应 video0、video1、video2和video3;在线模式下,VIPP0和DMA0对应video0可用,video1、video2和video3不可用。
- 离线模式下,实体VIPP1可分时复用为VIPP10、VIPP11、VIPP12、VIPP13,实体DMA1可分时复用为DMA10、DMA11、DMA12、DMA13,分别对应 video4、video5、video6和video7;在线模式下,VIPP1和DMA1对应video4可用,video5、video6和video7不可用。
- 离线模式下,实体VIPP2可分时复用为VIPP20、VIPP21、VIPP22、VIPP23,实体DMA2可分时复用为DMA20、DMA21、DMA22、DMA23,分别对应 video8、video9、video10和video11;在线模式下,VIPP2和DMA2对应video8可用,video9、video10和video11不可用。
- 离线模式下,实体VIPP3可分时复用为VIPP30、VIPP31、VIPP32、VIPP33,实体DMA3可分时复用为DMA30、DMA31、DMA32、DMA33,分别对应 video12、video13、video14和video15;在线模式下,VIPP3和DMA3对应video12可用,video13、video14和video15不可用。
特殊场景输出 RAW 数据:
- 只有实体节点可以出raw,其他分时复用的节点均无法出raw数据,即只有video0、video4、video8、video12 可以输出 RAW 数据。
- 如果工作场景中需要 Sensor 同时输出 YUV 数据和 RAW 数据的的话,那么需要使用到 ISP4(ISP4 为空的 ISP)来输出 RAW 数据,这一路需要占用一个实体 VIPP 和 DMA,且需要配置为在线模式(参考下文的典型场景)。
使用注意:
由于 video1、video2、video3、video5、video6、video7、video9、video10、video11、video13、video14、video15都是分时复用来的,开启它们的前提是一一对应的实体(video0、video4、video8、video12)已经开启。
板级配置概要
板级配置目录
board.dts:位于 device/config/chips/xxx(芯片型号)/configs/xxx(板型)/board.dts,
以 V861 bga-perf 板级为例,board.dts 目录如下:
device/config/chips/v861/configs/bga_perf1/board.dts
Vind (Camera) 节点描述
&vind0 {
csi_top = <300000000>;
status = "okay";
csi2: csi@5822000 {
pinctrl-names = "default","sleep";
pinctrl-0 = <&ncsi_8bit_pins_a>;
pinctrl-1 = <&ncsi_8bit_pins_b>;
status = "disabled";
};
tdm0: tdm@5908000 { // TDM工作模式配置,0:在线模式,1:离线模式,以下同理
work_mode = <0x0>;
delay_init = <0>;
};
isp00:isp@5900000 { // ISP工作模式配置
work_mode = <0x0>;
delay_init = <0>;
};
isp01:isp@58ffffc {
status = "disabled";
delay_init = <0>;
};
isp02:isp@58ffff8 {
status = "disabled";
delay_init = <0>;
};
isp03:isp@58ffff4 {
status = "disabled";
delay_init = <0>;
};
isp10:isp@4 {
status = "disabled";
};
isp20:isp@5 {
status = "disabled";
};
isp30:isp@6 {
status = "disabled";
};
tdm0: tdm@5908000 { // TDM工作模式配置,0:在线模式,1:离线模式,以下同理
work_mode = <0>;
};
scaler00:scaler@5910000 {
work_mode = <0x0>;
status = "okay";
delay_init = <0>;
};
scaler01:scaler@590fffc {
status = "disabled";
delay_init = <0>;
};
scaler02:scaler@590fff8 {
status = "disabled";
delay_init = <0>;
};
scaler03:scaler@590fff4 {
status = "disabled";
delay_init = <0>;
};
scaler10:scaler@5910400 {
work_mode = <0x0>;
status = "okay";
delay_init = <0>;
};
scaler11:scaler@59103fc {
status = "disabled";
delay_init = <0>;
};
scaler12:scaler@59103f8 {
status = "disabled";
delay_init = <0>;
};
scaler13:scaler@59103f4 {
status = "disabled";
delay_init = <0>;
};
scaler20:scaler@5910800 {
work_mode = <0x0>;
status = "okay";
delay_init = <0>;
};
scaler21:scaler@59107fc {
status = "disabled";
delay_init = <0>;
};
scaler22:scaler@59107f8 {
status = "disabled";
delay_init = <0>;
};
scaler23:scaler@59107f4 {
status = "disabled";
delay_init = <0>;
};
scaler30:scaler@5910c00 {
work_mode = <0x0>;
status = "okay";
delay_init = <0>;
};
scaler31:scaler@5910bfc {
status = "disabled";
delay_init = <0>;
};
scaler32:scaler@5910bf8 {
status = "disabled";
delay_init = <0>;
};
scaler33:scaler@5910bf4 {
status = "disabled";
delay_init = <0>;
};
sensor0: sensor@5812000 { // Sensor0节点配置
device_type = "sensor0";
sensor0_mname = "gc4663_mipi"; // Sensor驱动ko命名
sensor0_twi_cci_id = <1>; // 连接的TWI组号,比如使用的是 TWI1,那么填1
sensor0_twi_addr = <0x52>; // IIC地址
sensor0_mclk_id = <0>; // 连接的MCLK组号,比如使用的是 MCLK0,那么填0
sensor0_pos = "rear"; // 标志“后置摄像头”
sensor0_isp_used = <1>; // 开启ISP,RAW Sensor 需要,YUV Sensor 不需要,
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 = <®_axp333_aldo1>; // 电源参考原理图配置
sensor0_avdd_vol = <2800000>; // 电压标准参考规格书
sensor0_dvdd-supply = <>; // 电源参考原理图配置
sensor0_dvdd_vol = <>; // 电压标准参考规格书
sensor0_power_en = <>; // POWER_EN 引脚,除非硬件设计上有用到,否则不需要配置
sensor0_reset = <&pio PA 18 GPIO_ACTIVE_LOW>; // GPIO引脚参考原理图配置
sensor0_pwdn = <&pio PH 9 GPIO_ACTIVE_LOW>; // GPIO引脚参考原理图配置
sensor0_sm_hs = <>; // DVP HSYNC 引脚,引脚连接与 SOC 公版有差异才需要配置
sensor0_sm_vs = <>; // DVP VSYNC 引脚,引脚连接与 SOC 公版有差异才需要配置
status = "okay"; // Sensor节点使能开关
};
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 = <®_axp333_aldo1>;
sensor1_avdd_vol = <2800000>;
sensor1_dvdd-supply = <>;
sensor1_dvdd_vol = <>;
sensor1_power_en = <>;
sensor1_reset = <&pio PE 1 GPIO_ACTIVE_LOW>;
sensor1_pwdn = <>;
status = "disabled";
};
sensor2: sensor@5812020 {
device_type = "sensor2";
sensor2_mname = "gc1084_mipi_3";
sensor2_twi_cci_id = <0>;
sensor2_twi_addr = <0x7e>;
sensor2_mclk_id = <1>;
sensor2_pos = "front";
sensor2_isp_used = <1>;
sensor2_fmt = <1>;
sensor2_stby_mode = <0>;
sensor2_vflip = <0>;
sensor2_hflip = <0>;
sensor2_iovdd-supply = <>;
sensor2_iovdd_vol = <>;
sensor2_avdd-supply = <>;
sensor2_avdd_vol = <>;
sensor2_dvdd-supply = <>;
sensor2_dvdd_vol = <>;
sensor2_power_en = <>;
sensor2_reset = <&pio PD 13 GPIO_ACTIVE_LOW>;
sensor2_pwdn = <>;
status = "disabled";
};
/* 一个 vinc 代表一个 /dev/video 设备:video0 - vinc@0 */
vinc00:vinc@5830000 { // 对应软件上的 video0 结点
vinc0_csi_sel = <0>; // 代表选择的 csi 接口,MIPI0 - 0,MIPI1 - 1,MIPI2 - 2, DVP - 2
vinc0_mipi_sel = <0>; // 代表选择的 mipi 接口,V861 有 MIPI0 - 0 ,MIPI1 - 1,MIPI2 - 2, DVP 接口则配置 0xff
vinc0_isp_sel = <0>; // ISP通道号【0,4】,【0-3】分别为 Sensor 输入 RAW 数据的场景,当 Sensor 输入 YUV 数据时,需要配置为4
vinc0_isp_tx_ch = <0>; // 表示 ISP 的通道数,MIPI接口只需要配置为0
vinc0_tdm_rx_sel = <0>; // TDM_RX 通道,与 isp_sel 保持一致即可,如果 Sensor 输入 YUV 数据,则配置 0xff
vinc0_rear_sensor_sel = <0>; // 选择哪个sensor接收图像,如上述的 sensor0、sensor1、sensor2
vinc0_front_sensor_sel = <0>; // 选择哪个sensor接收图像,如上述的 sensor0、sensor1、sensor2
vinc0_sensor_list = <0>; // sensor list自适应功能使能开关
vinc0_vipp_sel = <0>;
work_mode = <0x0>; // DMA工作模式,0:在线,1:离线,需要与上述 TDM 、VIPP、ISP 保持一致,只有 vinc@00、 vinc@10、 vinc@20、 vinc@30 可以配置,其它均不需要配置
status = "okay";
};
}
TDM & WDR 驱动配置
TDM 驱动内核配置
配置离线模式时,不仅 board.dts 的 tdm@0、isp@0,scaler@0/1/2/3 等节点需要配置,TDM 驱动的内核配置也需要使能。
执行 m kernel_menuconfig
选中
Allwinner BSP →
Device Drivers →
VIN (camera) Drivers →
use isp for time sharing multiplex

WDR 驱动内核配置
运行WDR模式时,需要同时打开 TDM 驱动配置(同上)。
执行 m kernel_menuconfig
选中
Allwinner BSP →
Device Drivers →
VIN (camera) Drivers →
use isp for time sharing multiplex

WDR LBC 压缩模式 (可选)
for time sharing multiplex
选中
Allwinner BSP →
Device Drivers →
VIN (camera) Drivers →
ISP WDR module →
ISP WDR reduces buf size by compression

Pipeline 典型场景
在线模式
线性/WDR 单路输入 4 路输出
此模式为典型IPC场景,1路MIPI输入(RAW)4路输出,其中 TDM 关闭、ISP0、VIPP0 和 DMA0、VIPP1 和 DMA1、VIPP2 和 DMA2、VIPP3 和 DMA3,都配置在线模式,其中只有 video0 可支持在线编码模式,video4、video8、video12 只能支持离线编码。
Sensor0 → MIPI0 → PARSER0 → ISP00:video0、video4、video8、video12
-0c33abfd762a78a867889cdf6cfaa796-0c33abfd762a78a867889cdf6cfaa796.png)
VINC 配置示例(仅展示需要配置的结点,没有展示的默认关闭)
同路摄像头输入的 vinc 结点配置都是一致的,如当前单目输入(在线模式),则对应可以使用 video0/4/8/12,对应 vinc@00/10/20/30,每个vinc配置一致;
tdm0: tdm@5908000 { // TDM工作模式配置:在线模式
work_mode = <0>;
};
isp00:isp@5900000 { // ISP工作模式配置:在线模式
work_mode = <0>;
};
scaler00:scaler@5910000 { // VIPP0工作模式配置:在线模式
work_mode = <0>;
};
scaler10:scaler@5910400 { // VIPP1工作模式配置:在线模式
work_mode = <0>;
};
scaler20:scaler@5910800 { // VIPP2工作模式配置:在线模式
work_mode = <0>;
};
scaler30:scaler@5910c00 { // VIPP3工作模式配置:在线模式
work_mode = <0>;
};
vinc00:vinc@5830000 { // 对应软件上的 video0 结点,vinc@00/10/20/30 配置一致
vinc0_csi_sel = <0>; // 配置 CSI0 通道
vinc0_mipi_sel = <0>; // 配置 MIPI0 通道
vinc0_isp_sel = <0>; // 选择 ISP0 通道
vinc0_isp_tx_ch = <0>; // 表示 ISP 的通道数,MIPI接口只需要配置为0
vinc0_tdm_rx_sel = <0xff>; // 关闭 TDM 配置
vinc0_rear_sensor_sel = <0>; // 选择 Sensor0 作为数据来源
vinc0_front_sensor_sel = <0>; // 选择 Sensor0 作为数据来源
vinc0_sensor_list = <0>;
work_mode = <0x0>; // 配置在线模式
status = "okay";
};
vinc10:vinc@5831000 { // 对应软件上的 video4 结点
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 = <0x0>;
status = "okay";
};
vinc20:vinc@5832000 { // 对应软件上的 video8 结点
vinc8_csi_sel = <0>;
vinc8_mipi_sel = <0x0>;
vinc8_isp_sel = <0>;
vinc8_isp_tx_ch = <0>;
vinc8_tdm_rx_sel = <0>;
vinc8_rear_sensor_sel = <0>;
vinc8_front_sensor_sel = <0>;
vinc8_sensor_list = <0>;
work_mode = <0x0>;
status = "okay";
};
vinc30:vinc@5833000 { // 对应软件上的 video12 结点
vinc12_csi_sel = <0>;
vinc12_mipi_sel = <0x0>;
vinc12_isp_sel = <0>;
vinc12_isp_tx_ch = <0>;
vinc12_tdm_rx_sel = <0>;
vinc12_rear_sensor_sel = <0>;
vinc12_front_sensor_sel = <0>;
vinc12_sensor_list = <0>;
work_mode = <0x0>;
status = "okay";
};