MIPI CSI - 视频输入
-
视频输入组成:
- 接口部分(CSI/MIPI): 负责从图像传感器中接收视频数据,并将其传输到后续处理单元。
- 图像处理单元(ISP/VIPP): 对接收到的视频数据进行处理和加工。
-
CSI/MIPI部分功能:
- 主要用于视频数据的捕捉,即从图像传感器获取原始图像数据并传输到后续处理单元。
-
ISP功能:
- 处理sensor raw data数据,包括:
- 镜头补偿(lens compensation):对图像进行修正,以消除由于镜头畸变引起的失真。
- 坏点修复(bad pixel correction):识别并修复传感器中可能存在的坏点或瑕疵像素。
- 增益(gain)和伽马校正(gamma correction):调整图像的亮度和对比度。
- 去马赛克(de-mosaic):将单色传感器采集的数据转换为彩色图像。
- 去噪(de-noise):消除图像中的噪声,提高图像质量。
- 色彩矩阵(color matrix)等校正:校正图像的色彩偏差。
- 处理sensor raw data数据,包括:
-
VIPP功能:
- 可以对图像进行缩小和打水印处理。
- 缩小(downscaling):降低图像分辨率,以适应特定显示或存储要求。
- 水印处理(watermarking):在图像上添加标识、文字或图形等信息。
- 支持对bayer raw data经过ISP处理后再进行缩小,也支持对一般的YUV格式的sensor图像直接进行缩小处理。
模块框架
V驱动可以分为Kernel层、Video Input Framework、Device Driver层。
这是有关嵌入式 Linux 内核视频驱动层、Video Input Framework 层和设备驱动层的描述。以下是针对这些内容的一些简要解释:
Kernel层
- Linux内核视频驱动第二版(Video for Linux Two)是用于嵌入式 Linux 系统的视频设备驱动框架。
- 该框架适用于管理收音机、视频编解码、视频捕获以及视频输出设备的驱动。
- 通过提供/dev/videoX节点,应用程序可以对视频流和设备进行控制操作。
- Media Device Framework是用于多媒体设备的管理框架。
- 该框架用于管理设备拓扑结构,并提供/dev/mediaX节点,以便应用程序可以获取媒体设备拓扑结构,并通过 API 控制子设备间的数据流向。
Video Input Framework层
- Video Control处理视频命令(例如分辨率协商、数据格式处理和缓冲区管理)。
- Runtime Handle进行运行时管理,包括管道管理、系统资源管理和中断调度等。
- Event Process管理事件,包括上层调用和中断等事件的接收与分发。
- Config Handle进行配置管理,包括硬件拓扑结构和模组自适应列表等。
Device Driver层
- Camera Modules是指图像传感器、对焦电机、闪光灯等驱动。
- Camera Interface是指MIPI、Sub-Lvds、HiSpi、Bt656、Bt601、Bt1120、DC等接口驱动。
- Image Signal Processor是指图像处理器驱动,包括基本处理模块驱动和3A统计驱动。
- Video Input Post Processor是指视频输入后处理,包括缩放器、OSD等。
模块配置
驱动配置
Linux 内核模块配置
Device Drivers ->
{*} Multimedia support --->
Video4Linux options --->
[*] V4L2 sub-device userspace API
VIN 模块配置
VIN (camera) Drivers ->
<M> sunxi video input (camera csi/mipi isp vipp) driver
< > sensor power in front of vin
<M> v4l2 new driver for SUNXI
[ ] select sensor flip to replace vipp flip
[*] special function for vin
< > use cci function
< > use flash module
< > use actuator module
< > sensor list for adaptive
[ ] buf addr update for hardware
[ ] use pipeline reset when timeout
[ ] multi-frame interrupt mode
[ ] use isp for time sharing multiplex
select rgb mode (vipp yuv to rgb) --->
(X) vipp yuv to rgb
( ) sensor output rgb
[ ] multi-frame image merge interrupt
[ ] use one buffer for delay display
[*] use IOMMU for memery alloc
[*] ISP 3D denoise module
[ ] ISP 3D denoise long time frame
[ ] ISP 3D denoise reduces buf size by compression
select d3d mode (use d3d pkg mode) --->
(X) use d3d pkg mode
( ) use d3d lbc mode
[ ] ISP WDR module
[ ] sensor same i2c addr
[ ] use vin sdram dfs
[ ] use ISP server from melis
[ ] vin and isp init in melis
sensor driver select --->
< > use rn6854m driver
<M> use nvp6158c driver
< > use gc02m1b driver
< > use gc02m1 driver
< > use gc030a driver
...
这段代码是Linux内核中针对VIN(视频输入)驱动的配置选项,主要用于配置与摄像头相关的驱动和功能。
VIN (camera) Drivers
: VIN(视频输入)驱动程序配置<M> sunxi video input (camera csi/mipi isp vipp) driver
: 启用sunxi视频输入驱动,支持摄像头的CSI/MIPI接口以及ISP/VIPP功能。< > sensor power in front of vin
: 关闭VIN前端的传感器供电。<M> v4l2 new driver for SUNXI
: 启用SUNXI的v4l2新驱动程序,用于视频采集设备的通用接口。[ ] select sensor flip to replace vipp flip
: 未选择使用传感器翻转来替代VIPP翻转功能。[*] special function for vin
: 启用VIN的特殊功能。< > use cci function
: 不使用CCI(Camera Control Interface) 功能。< > use flash module
: 不使用闪光灯模块。< > use actuator module
: 不使用驱动模块。< > sensor list for adaptive
: 未选择传感器列表自适应功能。[ ] buf addr update for hardware
: 不更新硬件的缓冲区地址。[ ] use pipeline reset when timeout
: 在超时时不使用管道复位。[ ] multi-frame interrupt mode
: 未启用多帧中断模式。[ ] use isp for time sharing multiplex
: 不使用ISP进行时间共享复用。- 选择RGB模式(vipp yuv to rgb) --->
(X) vipp yuv to rgb
: 使用VIPP将YUV转换为RGB模式。( ) sensor output rgb
: 传感器直接输出RGB模式。
[ ] multi-frame image merge interrupt
: 未启用多帧图像合并中断。[ ] use one buffer for delay display
: 未使用单个缓冲区进行延迟显示。[*] use IOMMU for memery alloc
: 使用IOMMU进行内存分配。[*] ISP 3D denoise module
: 启用ISP 3D降噪模块。[ ] ISP 3D denoise long time frame
: 未启用ISP 3D降噪长时间帧功能。[ ] ISP 3D denoise reduces buf size by compression
: 未启用ISP 3D降噪通过压缩减小缓冲区大小功能。
- 选择D3D模式(use d3d pkg mode) --->
(X) use d3d pkg mode
: 使用D3D包模式。( ) use d3d lbc mode
: 不使用D3D LBC模式。
[ ] ISP WDR module
: 未启用ISP WDR模块。[ ] sensor same i2c addr
: 未选择传感器具有相同的I2C地址。[ ] use vin sdram dfs
: 不使用VIN的SDRAM DFS功能。[ ] use ISP server from melis
: 不使用来自melis的ISP服务器。[ ] vin and isp init in melis
: VIN和ISP在melis中未初始化。- 传感器驱动程序选择 --->
< > use rn6854m driver
: 未选择使用rn6854m驱动程序。<M> use nvp6158c driver
: 选择使用nvp6158c驱动程序。< > use gc02m1b driver
: 未选择使用gc02m1b驱动程序。< > use gc02m1 driver
: 未选择使用gc02m1驱动程序。< > use gc030a driver
: 未选择使用gc030a驱动程序。
设备树配置
这里以 T527 的配置举例:
在 SoC 的 dtsi
文件中提炼了内存基地址、中断控制、时钟等共性信息,是该类芯片所有平台的模块配置,这部分配置默认即可不需要修改。
vind0: vind@5800800 {
compatible = "allwinner,sunxi-vin-media", "simple-bus";
#address-cells = <2>;
#size-cells = <2>;
ranges;
device_id = <0>;
csi_top = <336000000>;
csi_isp = <327000000>;
reg = <0x0 0x05800800 0x0 0x200>,
<0x0 0x05800000 0x0 0x800>,
<0x0 0x05810000 0x0 0x100>;
interrupts = <GIC_SPI 139 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&ccu CLK_CSI>, <&ccu CLK_PLL_VIDEO3_4X>,
<&ccu CLK_CSI_MASTER0>, <&dcxo24M>, <&ccu CLK_PLL_VIDEO3_4X>,
<&ccu CLK_CSI_MASTER1>, <&dcxo24M>, <&ccu CLK_PLL_VIDEO3_4X>,
<&ccu CLK_CSI_MASTER2>, <&dcxo24M>, <&ccu CLK_PLL_VIDEO3_4X>,
<&ccu CLK_CSI_MASTER3>, <&dcxo24M>, <&ccu CLK_PLL_VIDEO3_4X>,
<&ccu CLK_ISP>, <&ccu CLK_PLL_VIDEO2_4X>,
<&ccu CLK_BUS_CSI>, <&ccu CLK_CSI_MBUS_GATE>, <&ccu CLK_ISP_MBUS_GATE>;
clock-names = "csi_top", "csi_top_src",
"csi_mclk0", "csi_mclk0_24m", "csi_mclk0_pll",
"csi_mclk1", "csi_mclk1_24m", "csi_mclk1_pll",
"csi_mclk2", "csi_mclk2_24m", "csi_mclk2_pll",
"csi_mclk3", "csi_mclk3_24m", "csi_mclk3_pll",
"csi_isp", "csi_isp_src",
"csi_bus", "csi_mbus", "csi_isp_mbus";
resets = <&ccu RST_BUS_CSI>, <&ccu RST_BUS_ISP>;
reset-names = "csi_ret", "isp_ret";
pinctrl-names = "mclk0-default", "mclk0-sleep", "mclk1-default", "mclk1-sleep",
"mclk2-default", "mclk2-sleep", "mclk3-default", "mclk3-sleep";
pinctrl-0 = <&csi_mclk0_pins_a>;
pinctrl-1 = <&csi_mclk0_pins_b>;
pinctrl-2 = <&csi_mclk1_pins_a>;
pinctrl-3 = <&csi_mclk1_pins_b>;
pinctrl-4 = <&csi_mclk2_pins_a>;
pinctrl-5 = <&csi_mclk2_pins_b>;
pinctrl-6 = <&csi_mclk3_pins_a>;
pinctrl-7 = <&csi_mclk3_pins_b>;
power-domains = <&pd1 A523_PCK_VI>;
dram_dfs_time = <150>;
status = "okay";
csi0: csi@5820000 {
compatible = "allwinner,sunxi-csi";
reg = <0x0 0x05820000 0x0 0x1000>;
interrupts = <GIC_SPI 130 IRQ_TYPE_LEVEL_HIGH>;
device_id = <0>;
status = "okay";
};
csi1: csi@5821000 {
compatible = "allwinner,sunxi-csi";
reg = <0x0 0x05821000 0x0 0x1000>;
interrupts = <GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>;
device_id = <1>;
status = "okay";
};
csi2: csi@5822000 {
compatible = "allwinner,sunxi-csi";
reg = <0x0 0x05822000 0x0 0x1000>;
interrupts = <GIC_SPI 132 IRQ_TYPE_LEVEL_HIGH>;
device_id = <2>;
status = "okay";
};
csi3: csi@5823000 {
compatible = "allwinner,sunxi-csi";
reg = <0x0 0x05823000 0x0 0x1000>;
interrupts = <GIC_SPI 147 IRQ_TYPE_LEVEL_HIGH>;
pinctrl-names = "default","sleep";
pinctrl-0 = <&ncsi_bt656_pins_a>;
pinctrl-1 = <&ncsi_bt656_pins_b>;
device_id = <3>;
status = "okay";
};
mipi0: mipi@5810100 {
compatible = "allwinner,sunxi-mipi";
reg = <0x0 0x05810100 0x0 0x100>,
<0x0 0x05811000 0x0 0x400>;
interrupts = <GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>;
pinctrl-names = "mipi0-default","mipi0-sleep",
"mipi1-4lane-default","mipi1-4lane-sleep";
pinctrl-0 = <&mipia_pins_a>;
pinctrl-1 = <&mipia_pins_b>;
pinctrl-2 = <&mipib_4lane_pins_a>;
pinctrl-3 = <&mipib_4lane_pins_b>;
device_id = <0>;
status = "okay";
};
mipi1: mipi@5810200 {
compatible = "allwinner,sunxi-mipi";
reg = <0x0 0x05810200 0x0 0x100>,
<0x0 0x05811400 0x0 0x400>;
pinctrl-names = "mipi1-default","mipi1-sleep";
pinctrl-0 = <&mipib_pins_a>;
pinctrl-1 = <&mipib_pins_b>;
device_id = <1>;
status = "okay";
};
mipi2: mipi@5810300 {
compatible = "allwinner,sunxi-mipi";
reg = <0x0 0x05810300 0x0 0x100>,
<0x0 0x05811800 0x0 0x400>;
pinctrl-names = "mipi2-default","mipi2-sleep",
"mipi3-4lane-default","mipi3-4lane-sleep";
pinctrl-0 = <&mipic_pins_a>;
pinctrl-1 = <&mipic_pins_b>;
pinctrl-2 = <&mipid_4lane_pins_a>;
pinctrl-3 = <&mipid_4lane_pins_b>;
device_id = <2>;
status = "okay";
};
mipi3: mipi@5810400 {
compatible = "allwinner,sunxi-mipi";
reg = <0x0 0x05810400 0x0 0x100>,
<0x0 0x05811C00 0x0 0x400>;
pinctrl-names = "mipi3-default","mipi3-sleep";
pinctrl-0 = <&mipid_pins_a>;
pinctrl-1 = <&mipid_pins_b>;
device_id = <3>;
status = "okay";
};
tdm0: tdm@5908000 {
compatible = "allwinner,sunxi-tdm";
reg = <0x0 0x05908000 0x0 0x300>;
interrupts = <GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>;
work_mode = <0x0>;
device_id = <0>;
iommus = <&mmu_aw 0 0>;
status = "okay";
};
isp00:isp@5900000 {
compatible = "allwinner,sunxi-isp";
reg = <0x0 0x05900000 0x0 0x1300>;
interrupts = <GIC_SPI 133 IRQ_TYPE_LEVEL_HIGH>;
work_mode = <0x0>;
device_id = <0>;
iommus = <&mmu_aw 0 0>;
status = "okay";
};
isp01:isp@58ffffc {
compatible = "allwinner,sunxi-isp";
reg = <0x0 0x058ffffc 0x0 0x1304>;
interrupts = <GIC_SPI 134 IRQ_TYPE_LEVEL_HIGH>;
work_mode = <0xff>;
device_id = <1>;
iommus = <&mmu_aw 0 0>;
status = "okay";
};
isp02:isp@58ffff8 {
compatible = "allwinner,sunxi-isp";
reg = <0x0 0x058ffff8 0x0 0x1308>;
interrupts = <GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>;
work_mode = <0xff>;
device_id = <2>;
iommus = <&mmu_aw 0 0>;
status = "okay";
};
isp03:isp@58ffff4 {
compatible = "allwinner,sunxi-isp";
reg = <0x0 0x058ffff4 0x0 0x130c>;
interrupts = <GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>;
work_mode = <0xff>;
device_id = <3>;
iommus = <&mmu_aw 0 0>;
status = "okay";
};
isp10:isp@4 {
compatible = "allwinner,sunxi-isp";
device_id = <4>;
iommus = <&mmu_aw 0 0>;
status = "okay";
};
isp20:isp@5 {
compatible = "allwinner,sunxi-isp";
device_id = <5>;
iommus = <&mmu_aw 0 0>;
status = "okay";
};
isp30:isp@6 {
compatible = "allwinner,sunxi-isp";
device_id = <6>;
iommus = <&mmu_aw 0 0>;
status = "okay";
};
scaler00:scaler@5910000 {
compatible = "allwinner,sunxi-scaler";
reg = <0x0 0x05910000 0x0 0x400>;
interrupts = <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>;
work_mode = <0x0>;
device_id = <0>;
iommus = <&mmu_aw 1 0>;
status = "okay";
};
scaler01:scaler@590fffc {
compatible = "allwinner,sunxi-scaler";
reg = <0x0 0x0590fffc 0x0 0x404>;
work_mode = <0xff>;
device_id = <1>;
iommus = <&mmu_aw 1 0>;
status = "okay";
};
scaler02:scaler@590fff8 {
compatible = "allwinner,sunxi-scaler";
reg = <0x0 0x0590fff8 0x0 0x408>;
work_mode = <0xff>;
device_id = <2>;
iommus = <&mmu_aw 1 0>;
status = "okay";
};
scaler03:scaler@590fff4 {
compatible = "allwinner,sunxi-scaler";
reg = <0x0 0x0590fff4 0x0 0x40c>;
work_mode = <0xff>;
device_id = <3>;
iommus = <&mmu_aw 1 0>;
status = "okay";
};
scaler10:scaler@5910400 {
compatible = "allwinner,sunxi-scaler";
reg = <0x0 0x05910400 0x0 0x400>;
interrupts = <GIC_SPI 127 IRQ_TYPE_LEVEL_HIGH>;
work_mode = <0x0>;
device_id = <4>;
iommus = <&mmu_aw 1 0>;
status = "okay";
};
scaler11:scaler@59103fc {
compatible = "allwinner,sunxi-scaler";
reg = <0x0 0x059103fc 0x0 0x404>;
work_mode = <0xff>;
device_id = <5>;
iommus = <&mmu_aw 1 0>;
status = "okay";
};
scaler12:scaler@59103f8 {
compatible = "allwinner,sunxi-scaler";
reg = <0x0 0x059103f8 0x0 0x408>;
work_mode = <0xff>;
device_id = <6>;
iommus = <&mmu_aw 1 0>;
status = "okay";
};
scaler13:scaler@59103f4 {
compatible = "allwinner,sunxi-scaler";
reg = <0x0 0x059103f4 0x0 0x40c>;
work_mode = <0xff>;
device_id = <7>;
iommus = <&mmu_aw 1 0>;
status = "okay";
};
scaler20:scaler@5910800 {
compatible = "allwinner,sunxi-scaler";
reg = <0x0 0x05910800 0x0 0x400>;
interrupts = <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>;
work_mode = <0x0>;
device_id = <8>;
iommus = <&mmu_aw 1 0>;
status = "okay";
};
scaler21:scaler@59107fc {
compatible = "allwinner,sunxi-scaler";
reg = <0x0 0x059107fc 0x0 0x404>;
work_mode = <0xff>;
device_id = <9>;
iommus = <&mmu_aw 1 0>;
status = "okay";
};
scaler22:scaler@59107f8 {
compatible = "allwinner,sunxi-scaler";
reg = <0x0 0x059107f8 0x0 0x408>;
work_mode = <0xff>;
device_id = <10>;
iommus = <&mmu_aw 1 0>;
status = "okay";
};
scaler23:scaler@59107f4 {
compatible = "allwinner,sunxi-scaler";
reg = <0x0 0x059107f4 0x0 0x40c>;
work_mode = <0xff>;
device_id = <11>;
iommus = <&mmu_aw 1 0>;
status = "okay";
};
scaler30:scaler@5910c00 {
compatible = "allwinner,sunxi-scaler";
reg = <0x0 0x05910c00 0x0 0x400>;
interrupts = <GIC_SPI 129 IRQ_TYPE_LEVEL_HIGH>;
work_mode = <0x0>;
device_id = <12>;
iommus = <&mmu_aw 1 0>;
status = "okay";
};
scaler31:scaler@5910bfc {
compatible = "allwinner,sunxi-scaler";
reg = <0x0 0x05910bfc 0x0 0x404>;
work_mode = <0xff>;
device_id = <13>;
iommus = <&mmu_aw 1 0>;
status = "okay";
};
scaler32:scaler@5910bf8 {
compatible = "allwinner,sunxi-scaler";
reg = <0x0 0x05910bf8 0x0 0x408>;
work_mode = <0xff>;
device_id = <14>;
iommus = <&mmu_aw 1 0>;
status = "okay";
};
scaler33:scaler@5910bf4 {
compatible = "allwinner,sunxi-scaler";
reg = <0x0 0x05910bf4 0x0 0x40c>;
work_mode = <0xff>;
device_id = <15>;
iommus = <&mmu_aw 1 0>;
status = "okay";
};
scaler40:scaler@16 {
compatible = "allwinner,sunxi-scaler";
device_id = <16>;
iommus = <&mmu_aw 1 0>;
status = "okay";
};
scaler50:scaler@17 {
compatible = "allwinner,sunxi-scaler";
device_id = <17>;
iommus = <&mmu_aw 1 0>;
status = "okay";
};
actuator0: actuator@2108180 {
compatible = "allwinner,sunxi-actuator";
device_type = "actuator0";
reg = <0x0 0x02108180 0x0 0x10>;
actuator0_name = "ad5820_act";
actuator0_slave = <0x18>;
actuator0_af_pwdn = <>;
actuator0_afvdd = "afvcc-csi";
actuator0_afvdd_vol = <2800000>;
status = "disabled";
};
flash0: flash@2108190 {
device_type = "flash0";
compatible = "allwinner,sunxi-flash";
reg = <0x0 0x02108190 0x0 0x10>;
flash0_type = <2>;
flash0_en = <>;
flash0_mode = <>;
flash0_flvdd = "";
flash0_flvdd_vol = <>;
device_id = <0>;
status = "disabled";
};
sensor0: sensor@5812000 {
reg = <0x0 0x05812000 0x0 0x10>;
device_type = "sensor0";
compatible = "allwinner,sunxi-sensor";
sensor0_mname = "ov5640";
sensor0_twi_cci_id = <2>;
sensor0_twi_addr = <0x78>;
sensor0_mclk_id = <0>;
sensor0_pos = "rear";
sensor0_isp_used = <0>;
sensor0_fmt = <0>;
sensor0_stby_mode = <0>;
sensor0_vflip = <0>;
sensor0_hflip = <0>;
sensor0_iovdd-supply = <>;
sensor0_iovdd_vol = <>;
sensor0_avdd-supply = <>;
sensor0_avdd_vol = <>;
sensor0_dvdd-supply = <>;
sensor0_dvdd_vol = <>;
sensor0_power_en = <>;
sensor0_reset = <>;
sensor0_pwdn = <>;
sensor0_sm_vs = <>;
flash_handle = <&flash0>;
act_handle = <&actuator0>;
device_id = <0>;
status = "disabled";
};
sensor1: sensor@5812010 {
reg = <0x0 0x05812010 0x0 0x10>;
device_type = "sensor1";
compatible = "allwinner,sunxi-sensor";
sensor1_mname = "ov5647";
sensor1_twi_cci_id = <3>;
sensor1_twi_addr = <0x6c>;
sensor1_mclk_id = <1>;
sensor1_pos = "front";
sensor1_isp_used = <0>;
sensor1_fmt = <0>;
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 = <>;
sensor1_pwdn = <>;
sensor1_sm_vs = <>;
flash_handle = <>;
act_handle = <>;
device_id = <1>;
status = "disabled";
};
sensor2: sensor@5812020 {
reg = <0x0 0x05812020 0x0 0x10>;
device_type = "sensor2";
compatible = "allwinner,sunxi-sensor";
sensor2_mname = "imx386_mipi";
sensor2_twi_cci_id = <3>;
sensor2_twi_addr = <0x6c>;
sensor2_mclk_id = <1>;
sensor2_pos = "rear";
sensor2_isp_used = <0>;
sensor2_fmt = <0>;
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 = <>;
sensor2_pwdn = <>;
sensor2_sm_vs = <>;
flash_handle = <>;
act_handle = <>;
device_id = <2>;
status= "disabled";
};
sensor3: sensor@5812030 {
reg = <0x0 0x05812030 0x0 0x10>;
device_type = "sensor3";
compatible = "allwinner,sunxi-sensor";
sensor3_mname = "imx317_mipi";
sensor3_twi_cci_id = <3>;
sensor3_twi_addr = <0x6c>;
sensor3_mclk_id = <1>;
sensor3_pos = "rear";
sensor3_isp_used = <0>;
sensor3_fmt = <0>;
sensor3_stby_mode = <0>;
sensor3_vflip = <0>;
sensor3_hflip = <0>;
sensor3_iovdd-supply = <>;
sensor3_iovdd_vol = <>;
sensor3_avdd-supply = <>;
sensor3_avdd_vol = <>;
sensor3_dvdd-supply = <>;
sensor3_dvdd_vol = <>;
sensor3_power_en = <>;
sensor3_reset = <>;
sensor3_pwdn = <>;
sensor3_sm_vs = <>;
flash_handle = <>;
act_handle = <>;
device_id = <2>;
status= "disabled";
};
sensor_list0:sensor_list@5812040 {
reg = <0x0 0x05812040 0x0 0x10>;
device_type = "sensor_list0";
compatible = "allwinner,sunxi-sensor-list";
csi_sel = <0>;
sensor00_mname = "ov5675_mipi_b";
sensor00_twi_addr = <0x60>;
sensor00_type = <1>;
sensor00_hflip = <1>;
sensor00_vflip = <0>;
sensor00_act_used = <1>;
sensor00_act_name = "dw9714_act";
sensor00_act_twi_addr = <0x18>;
sensor01_mname = "gc05a2_mipi_b";
sensor01_twi_addr = <0x62>;
sensor01_type = <1>;
sensor01_hflip = <0>;
sensor01_vflip = <0>;
sensor01_act_used = <1>;
sensor01_act_name = "d9714_act";
sensor01_act_twi_addr = <0x18>;
sensor02_mname = "gc5035_mipi_b";
sensor02_twi_addr = <0x64>;
sensor02_type = <1>;
sensor02_hflip = <0>;
sensor02_vflip = <0>;
sensor02_act_used = <1>;
sensor02_act_name = "dw9714_act";
sensor02_act_twi_addr = <0x18>;
device_id = <0>;
status = "disabled";
};
sensor_list1:sensor_list@5812050 {
reg = <0x0 0x05812050 0x0 0x10>;
device_type = "sensor_list1";
compatible = "allwinner,sunxi-sensor-list";
csi_sel = <0>;
sensor10_mname = "ov02a10_mipi_f";
sensor10_twi_addr = <0x70>;
sensor10_type = <1>;
sensor10_hflip = <1>;
sensor10_vflip = <0>;
sensor10_act_used = <0>;
sensor10_act_name = "";
sensor10_act_twi_addr = <>;
sensor11_mname = "gc02m1_mipi_f";
sensor11_twi_addr = <0x72>;
sensor11_type = <1>;
sensor11_hflip = <1>;
sensor11_vflip = <0>;
sensor11_act_used = <0>;
sensor11_act_name = "";
sensor11_act_twi_addr = <>;
sensor12_mname = "gc02m2_mipi_f";
sensor12_twi_addr = <0x74>;
sensor12_type = <1>;
sensor12_hflip = <0>;
sensor12_vflip = <0>;
sensor12_act_used = <0>;
sensor12_act_name = "";
sensor12_act_twi_addr = <>;
device_id = <1>;
status = "disabled";
};
vinc00:vinc@5830000 {
device_type = "vinc0";
compatible = "allwinner,sunxi-vin-core";
reg = <0x0 0x05830000 0x0 0x1000>;
interrupts = <GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>;
vinc0_csi_sel = <3>;
vinc0_mipi_sel = <0xff>;
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>;
device_id = <0>;
work_mode = <0x0>;
iommus = <&mmu_aw 1 0>;
status = "okay";
};
vinc01:vinc@582fffc {
device_type = "vinc1";
compatible = "allwinner,sunxi-vin-core";
reg = <0x0 0x0582fffc 0x0 0x1004>;
vinc1_csi_sel = <2>;
vinc1_mipi_sel = <0xff>;
vinc1_isp_sel = <1>;
vinc1_isp_tx_ch = <1>;
vinc1_tdm_rx_sel = <1>;
vinc1_rear_sensor_sel = <0>;
vinc1_front_sensor_sel = <0>;
vinc1_sensor_list = <0>;
device_id = <1>;
work_mode = <0xff>;
iommus = <&mmu_aw 1 0>;
status = "disabled";
};
vinc02:vinc@582fff8 {
device_type = "vinc2";
compatible = "allwinner,sunxi-vin-core";
reg = <0x0 0x0582fff8 0x0 0x1008>;
vinc2_csi_sel = <2>;
vinc2_mipi_sel = <0xff>;
vinc2_isp_sel = <2>;
vinc2_isp_tx_ch = <2>;
vinc2_tdm_rx_sel = <2>;
vinc2_rear_sensor_sel = <0>;
vinc2_front_sensor_sel = <0>;
vinc2_sensor_list = <0>;
device_id = <2>;
work_mode = <0xff>;
iommus = <&mmu_aw 1 0>;
status = "disabled";
};
vinc03:vinc@582fff4 {
device_type = "vinc3";
compatible = "allwinner,sunxi-vin-core";
reg = <0x0 0x0582fff4 0x0 0x100c>;
vinc3_csi_sel = <0>;
vinc3_mipi_sel = <0xff>;
vinc3_isp_sel = <0>;
vinc3_isp_tx_ch = <0>;
vinc3_tdm_rx_sel = <0>;
vinc3_rear_sensor_sel = <1>;
vinc3_front_sensor_sel = <1>;
vinc3_sensor_list = <0>;
device_id = <3>;
work_mode = <0xff>;
iommus = <&mmu_aw 1 0>;
status = "disabled";
};
vinc10:vinc@5831000 {
device_type = "vinc4";
compatible = "allwinner,sunxi-vin-core";
reg = <0x0 0x05831000 0x0 0x1000>;
interrupts = <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>;
vinc4_csi_sel = <3>;
vinc4_mipi_sel = <0xff>;
vinc4_isp_sel = <0>;
vinc4_isp_tx_ch = <0>;
vinc4_tdm_rx_sel = <1>;
vinc4_rear_sensor_sel = <0>;
vinc4_front_sensor_sel = <0>;
vinc4_sensor_list = <0>;
device_id = <4>;
work_mode = <0x0>;
iommus = <&mmu_aw 1 0>;
status = "disabled";
};
vinc11:vinc@5830ffc {
device_type = "vinc5";
compatible = "allwinner,sunxi-vin-core";
reg = <0x0 0x05830ffc 0x0 0x1004>;
vinc5_csi_sel = <2>;
vinc5_mipi_sel = <0xff>;
vinc5_isp_sel = <1>;
vinc5_isp_tx_ch = <1>;
vinc5_tdm_rx_sel = <1>;
vinc5_rear_sensor_sel = <0>;
vinc5_front_sensor_sel = <0>;
vinc5_sensor_list = <0>;
device_id = <5>;
work_mode = <0xff>;
iommus = <&mmu_aw 1 0>;
status = "disabled";
};
vinc12:vinc@5830ff8 {
device_type = "vinc6";
compatible = "allwinner,sunxi-vin-core";
reg = <0x0 0x05830ff8 0x0 0x1008>;
vinc6_csi_sel = <2>;
vinc6_mipi_sel = <0xff>;
vinc6_isp_sel = <0>;
vinc6_isp_tx_ch = <0>;
vinc6_tdm_rx_sel = <0>;
vinc6_rear_sensor_sel = <0>;
vinc6_front_sensor_sel = <0>;
vinc6_sensor_list = <0>;
device_id = <6>;
work_mode = <0xff>;
iommus = <&mmu_aw 1 0>;
status = "disabled";
};
vinc13:vinc@5830ff4 {
device_type = "vinc7";
compatible = "allwinner,sunxi-vin-core";
reg = <0x0 0x05830ff4 0x0 0x100c>;
vinc7_csi_sel = <2>;
vinc7_mipi_sel = <0xff>;
vinc7_isp_sel = <0>;
vinc7_isp_tx_ch = <0>;
vinc7_tdm_rx_sel = <0>;
vinc7_rear_sensor_sel = <0>;
vinc7_front_sensor_sel = <0>;
vinc7_sensor_list = <0>;
device_id = <7>;
work_mode = <0xff>;
iommus = <&mmu_aw 1 0>;
status = "disabled";
};
vinc20:vinc@5832000 {
device_type = "vinc8";
compatible = "allwinner,sunxi-vin-core";
reg = <0x0 0x05832000 0x0 0x1000>;
interrupts = <GIC_SPI 124 IRQ_TYPE_LEVEL_HIGH>;
vinc8_csi_sel = <2>;
vinc8_mipi_sel = <0xff>;
vinc8_isp_sel = <4>;
vinc8_isp_tx_ch = <3>;
vinc8_tdm_rx_sel = <3>;
vinc8_rear_sensor_sel = <0>;
vinc8_front_sensor_sel = <0>;
vinc8_sensor_list = <0>;
device_id = <8>;
work_mode = <0x0>;
iommus = <&mmu_aw 1 0>;
status = "disabled";
};
vinc21:vinc@5831ffc {
device_type = "vinc9";
compatible = "allwinner,sunxi-vin-core";
reg = <0x0 0x05831ffc 0x0 0x1004>;
vinc9_csi_sel = <2>;
vinc9_mipi_sel = <0xff>;
vinc9_isp_sel = <0>;
vinc9_isp_tx_ch = <0>;
vinc9_tdm_rx_sel = <0>;
vinc9_rear_sensor_sel = <0>;
vinc9_front_sensor_sel = <0>;
vinc9_sensor_list = <0>;
device_id = <9>;
work_mode = <0xff>;
iommus = <&mmu_aw 1 0>;
status = "disabled";
};
vinc22:vinc@5831ff8 {
device_type = "vinc10";
compatible = "allwinner,sunxi-vin-core";
reg = <0x0 0x05831ff8 0x0 0x1008>;
vinc10_csi_sel = <2>;
vinc10_mipi_sel = <0xff>;
vinc10_isp_sel = <0>;
vinc10_isp_tx_ch = <0>;
vinc10_tdm_rx_sel = <0>;
vinc10_rear_sensor_sel = <0>;
vinc10_front_sensor_sel = <0>;
vinc10_sensor_list = <0>;
device_id = <10>;
work_mode = <0xff>;
iommus = <&mmu_aw 1 0>;
status = "disabled";
};
vinc23:vinc@5831ff4 {
device_type = "vinc11";
compatible = "allwinner,sunxi-vin-core";
reg = <0x0 0x05831ff4 0x0 0x100c>;
vinc11_csi_sel = <2>;
vinc11_mipi_sel = <0xff>;
vinc11_isp_sel = <0>;
vinc11_isp_tx_ch = <0>;
vinc11_tdm_rx_sel = <0>;
vinc11_rear_sensor_sel = <0>;
vinc11_front_sensor_sel = <0>;
vinc11_sensor_list = <0>;
device_id = <11>;
work_mode = <0xff>;
iommus = <&mmu_aw 1 0>;
status = "disabled";
};
vinc30:vinc@5833000 {
device_type = "vinc12";
compatible = "allwinner,sunxi-vin-core";
reg = <0x0 0x05833000 0x0 0x1000>;
interrupts = <GIC_SPI 125 IRQ_TYPE_LEVEL_HIGH>;
vinc12_csi_sel = <2>;
vinc12_mipi_sel = <0xff>;
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>;
device_id = <12>;
work_mode = <0x0>;
iommus = <&mmu_aw 1 0>;
status = "disabled";
};
vinc31:vinc@5832ffc {
device_type = "vinc13";
compatible = "allwinner,sunxi-vin-core";
reg = <0x0 0x05832ffc 0x0 0x1004>;
vinc13_csi_sel = <2>;
vinc13_mipi_sel = <0xff>;
vinc13_isp_sel = <0>;
vinc13_isp_tx_ch = <0>;
vinc13_tdm_rx_sel = <0>;
vinc13_rear_sensor_sel = <0>;
vinc13_front_sensor_sel = <0>;
vinc13_sensor_list = <0>;
device_id = <13>;
work_mode = <0xff>;
iommus = <&mmu_aw 1 0>;
status = "disabled";
};
vinc32:vinc@5832ff8 {
device_type = "vinc14";
compatible = "allwinner,sunxi-vin-core";
reg = <0x0 0x05832ff8 0x0 0x1008>;
vinc14_csi_sel = <2>;
vinc14_mipi_sel = <0xff>;
vinc14_isp_sel = <0>;
vinc14_isp_tx_ch = <0>;
vinc14_tdm_rx_sel = <0>;
vinc14_rear_sensor_sel = <0>;
vinc14_front_sensor_sel = <0>;
vinc14_sensor_list = <0>;
device_id = <14>;
work_mode = <0xff>;
iommus = <&mmu_aw 1 0>;
status = "disabled";
};
vinc33:vinc@5832ff4 {
device_type = "vinc15";
compatible = "allwinner,sunxi-vin-core";
reg = <0x0 0x05832ff4 0x0 0x100c>;
vinc15_csi_sel = <2>;
vinc15_mipi_sel = <0xff>;
vinc15_isp_sel = <0>;
vinc15_isp_tx_ch = <0>;
vinc15_tdm_rx_sel = <0>;
vinc15_rear_sensor_sel = <0>;
vinc15_front_sensor_sel = <0>;
vinc15_sensor_list = <0>;
device_id = <15>;
work_mode = <0xff>;
iommus = <&mmu_aw 1 0>;
status = "disabled";
};
vinc40:vinc@5834000 {
device_type = "vinc16";
compatible = "allwinner,sunxi-vin-core";
reg = <0x0 0x05834000 0x0 0x1000>;
interrupts = <GIC_SPI 145 IRQ_TYPE_LEVEL_HIGH>;
vinc16_csi_sel = <2>;
vinc16_mipi_sel = <0xff>;
vinc16_isp_sel = <0>;
vinc16_isp_tx_ch = <0>;
vinc16_tdm_rx_sel = <0>;
vinc16_rear_sensor_sel = <0>;
vinc16_front_sensor_sel = <0>;
vinc16_sensor_list = <0>;
device_id = <16>;
work_mode = <0x0>;
iommus = <&mmu_aw 1 0>;
status = "disabled";
};
vinc50:vinc@5835000 {
device_type = "vinc17";
compatible = "allwinner,sunxi-vin-core";
reg = <0x0 0x05835000 0x0 0x1000>;
interrupts = <GIC_SPI 146 IRQ_TYPE_LEVEL_HIGH>;
vinc17_csi_sel = <2>;
vinc17_mipi_sel = <0xff>;
vinc17_isp_sel = <0>;
vinc17_isp_tx_ch = <0>;
vinc17_tdm_rx_sel = <0>;
vinc17_rear_sensor_sel = <0>;
vinc17_front_sensor_sel = <0>;
vinc17_sensor_list = <0>;
device_id = <17>;
work_mode = <0x0>;
iommus = <&mmu_aw 1 0>;
status = "disabled";
};
};
以上内容为 dtsi
的默认配置,对于各类板子,配置如下。
&csi_mclk3_pins_a {
pins = "PK13";
function = "ncsi";
};
&csi_mclk3_pins_b {
pins = "PK13";
};
&mipib_4lane_pins_a {
pins = "PK6", "PK7", "PK8", "PK9";
};
&mipib_4lane_pins_b {
pins = "PK6", "PK7", "PK8", "PK9";
};
&vind0 {
csi_top = <360000000>;
csi_isp = <300000000>;
vind_mclkpin-supply = <®_bldo3>; /* vcc-pe */
vind_mclkpin_vol = <1800000>;
vind_mcsipin-supply = <®_bldo3>; /* vcc-pk */
vind_mcsipin_vol = <1800000>;
vind_mipipin-supply = <®_bldo3>; /* vcc-mcsi */
vind_mipipin_vol = <1800000>;
status = "okay";
csi3:csi@5823000 {
pinctrl-names = "default","sleep";
pinctrl-0 = <&ncsi_bt1120_pins_a>;
pinctrl-1 = <&ncsi_bt1120_pins_b>;
status = "okay";
};
tdm0:tdm@5908000 {
work_mode = <0>;
};
isp00:isp@5900000 {
work_mode = <0>;
};
isp01:isp@58ffffc {
status = "disabled";
};
isp02:isp@58ffff8 {
status = "disabled";
};
isp03:isp@58ffff4 {
status = "disabled";
};
isp10:isp@4 {
status = "okay";
};
isp20:isp@5 {
status = "okay";
};
scaler00:scaler@5910000 {
work_mode = <0>;
};
scaler01:scaler@590fffc {
status = "disabled";
};
scaler02:scaler@590fff8 {
status = "disabled";
};
scaler03:scaler@590fff4 {
status = "disabled";
};
scaler10:scaler@5910400 {
work_mode = <0>;
};
scaler11:scaler@59103fc {
status = "disabled";
};
scaler12:scaler@59103f8 {
status = "disabled";
};
scaler13:scaler@59103f4 {
status = "disabled";
};
scaler20:scaler@5910800 {
work_mode = <0>;
};
scaler21:scaler@59107fc {
status = "disabled";
};
scaler22:scaler@59107f8 {
status = "disabled";
};
scaler23:scaler@59107f4 {
status = "disabled";
};
scaler30:scaler@5910c00 {
work_mode = <0>;
};
scaler31:scaler@5910bfc {
status = "disabled";
};
scaler32:scaler@5910bf8 {
status = "disabled";
};
scaler33:scaler@5910bf4 {
status = "disabled";
};
scaler40:scaler@16 {
status = "okay";
};
scaler50:scaler@17 {
status = "okay";
};
actuator0: actuator@2108180 {
device_type = "actuator0";
actuator0_name = "dw9714_act";
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 = <&r_pio PL 11 GPIO_ACTIVE_LOW>;
flash0_mode = <>;
flash0_flvdd = "";
flash0_flvdd_vol = <>;
device_id = <0>;
status = "disabled";
};
sensor0:sensor@5812000 {
device_type = "sensor0";
sensor0_mname = "tp2815_mipi";
sensor0_twi_cci_id = <2>;
sensor0_twi_addr = <0x88>;
sensor0_mclk_id = <0>;
sensor0_pos = "rear";
sensor0_isp_used = <0>;
sensor0_fmt = <0>;
sensor0_stby_mode = <0>;
sensor0_vflip = <0>;
sensor0_hflip = <0>;
sensor0_cameravdd-supply = <>;
sensor0_cameravdd_vol = <>;
sensor0_iovdd-supply = <>;
sensor0_iovdd_vol = <>;
sensor0_avdd-supply = <>;
sensor0_avdd_vol = <>;
sensor0_dvdd-supply = <>;
sensor0_dvdd_vol = <>;
sensor0_power_en = <>;
sensor0_reset = <&pio PK 11 GPIO_ACTIVE_LOW>;
sensor0_pwdn = <>;
status = "okay";
};
sensor1:sensor@5812010 {
device_type = "sensor1";
sensor1_mname = "nvp6158";
sensor1_twi_cci_id = <3>;
sensor1_twi_addr = <0x64>;
sensor1_mclk_id = <3>;
sensor1_pos = "front";
sensor1_isp_used = <0>;
sensor1_fmt = <0>;
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 PK 10 GPIO_ACTIVE_LOW>;
sensor1_pwdn = <>;
status = "okay";
};
vinc00:vinc@5830000 {
vinc0_csi_sel = <0>;
vinc0_mipi_sel = <0>;
vinc0_isp_sel = <4>;
vinc0_isp_tx_ch = <0>;
vinc0_tdm_rx_sel = <0>;
vinc0_rear_sensor_sel = <0>;
vinc0_front_sensor_sel = <0>;
vinc0_sensor_list = <0>;
device_id = <0>;
work_mode = <0x0>;
status = "okay";
};
vinc01:vinc@582fffc {
vinc1_csi_sel = <1>;
vinc1_mipi_sel = <2>;
vinc1_isp_sel = <1>;
vinc1_isp_tx_ch = <0>;
vinc1_tdm_rx_sel = <1>;
vinc1_rear_sensor_sel = <1>;
vinc1_front_sensor_sel = <1>;
vinc1_sensor_list = <0>;
device_id = <1>;
status = "disabled";
};
vinc02:vinc@582fff8 {
vinc2_csi_sel = <2>;
vinc2_mipi_sel = <0xff>;
vinc2_isp_sel = <2>;
vinc2_isp_tx_ch = <2>;
vinc2_tdm_rx_sel = <2>;
vinc2_rear_sensor_sel = <0>;
vinc2_front_sensor_sel = <0>;
vinc2_sensor_list = <0>;
device_id = <2>;
status = "disabled";
};
vinc03:vinc@582fff4 {
vinc3_csi_sel = <0>;
vinc3_mipi_sel = <0xff>;
vinc3_isp_sel = <0>;
vinc3_isp_tx_ch = <0>;
vinc3_tdm_rx_sel = <0>;
vinc3_rear_sensor_sel = <1>;
vinc3_front_sensor_sel = <1>;
vinc3_sensor_list = <0>;
device_id = <3>;
status = "disabled";
};
vinc10:vinc@5831000 {
vinc4_csi_sel = <0>;
vinc4_mipi_sel = <0>;
vinc4_isp_sel = <4>;
vinc4_isp_tx_ch = <1>;
vinc4_tdm_rx_sel = <0>;
vinc4_rear_sensor_sel = <0>;
vinc4_front_sensor_sel = <0>;
vinc4_sensor_list = <0>;
device_id = <4>;
work_mode = <0x0>;
status = "okay";
};
vinc11:vinc@5830ffc {
vinc5_csi_sel = <2>;
vinc5_mipi_sel = <0xff>;
vinc5_isp_sel = <1>;
vinc5_isp_tx_ch = <1>;
vinc5_tdm_rx_sel = <1>;
vinc5_rear_sensor_sel = <0>;
vinc5_front_sensor_sel = <0>;
vinc5_sensor_list = <0>;
device_id = <5>;
status = "disabled";
};
vinc12:vinc@5830ff8 {
vinc6_csi_sel = <2>;
vinc6_mipi_sel = <0xff>;
vinc6_isp_sel = <0>;
vinc6_isp_tx_ch = <0>;
vinc6_tdm_rx_sel = <0>;
vinc6_rear_sensor_sel = <0>;
vinc6_front_sensor_sel = <0>;
vinc6_sensor_list = <0>;
device_id = <6>;
status = "disabled";
};
vinc13:vinc@5830ff4 {
vinc7_csi_sel = <2>;
vinc7_mipi_sel = <0xff>;
vinc7_isp_sel = <0>;
vinc7_isp_tx_ch = <0>;
vinc7_tdm_rx_sel = <0>;
vinc7_rear_sensor_sel = <0>;
vinc7_front_sensor_sel = <0>;
vinc7_sensor_list = <0>;
device_id = <7>;
status = "disabled";
};
vinc20:vinc@5832000 {
vinc8_csi_sel = <0>;
vinc8_mipi_sel = <0>;
vinc8_isp_sel = <4>;
vinc8_isp_tx_ch = <2>;
vinc8_tdm_rx_sel = <0>;
vinc8_rear_sensor_sel = <0>;
vinc8_front_sensor_sel = <0>;
vinc8_sensor_list = <0>;
device_id = <8>;
work_mode = <0x0>;
status = "okay";
};
vinc21:vinc@5831ffc {
vinc9_csi_sel = <2>;
vinc9_mipi_sel = <0xff>;
vinc9_isp_sel = <0>;
vinc9_isp_tx_ch = <0>;
vinc9_tdm_rx_sel = <0>;
vinc9_rear_sensor_sel = <0>;
vinc9_front_sensor_sel = <0>;
vinc9_sensor_list = <0>;
device_id = <9>;
status = "disabled";
};
vinc22:vinc@5831ff8 {
vinc10_csi_sel = <2>;
vinc10_mipi_sel = <0xff>;
vinc10_isp_sel = <0>;
vinc10_isp_tx_ch = <0>;
vinc10_tdm_rx_sel = <0>;
vinc10_rear_sensor_sel = <0>;
vinc10_front_sensor_sel = <0>;
vinc10_sensor_list = <0>;
device_id = <10>;
status = "disabled";
};
vinc23:vinc@5831ff4 {
vinc11_csi_sel = <2>;
vinc11_mipi_sel = <0xff>;
vinc11_isp_sel = <0>;
vinc11_isp_tx_ch = <0>;
vinc11_tdm_rx_sel = <0>;
vinc11_rear_sensor_sel = <0>;
vinc11_front_sensor_sel = <0>;
vinc11_sensor_list = <0>;
device_id = <11>;
status = "disabled";
};
vinc30:vinc@5833000 {
vinc12_csi_sel = <0>;
vinc12_mipi_sel = <0>;
vinc12_isp_sel = <4>;
vinc12_isp_tx_ch = <3>;
vinc12_tdm_rx_sel = <0>;
vinc12_rear_sensor_sel = <0>;
vinc12_front_sensor_sel = <0>;
vinc12_sensor_list = <0>;
device_id = <12>;
work_mode = <0x0>;
status = "okay";
};
vinc31:vinc@5832ffc {
vinc13_csi_sel = <2>;
vinc13_mipi_sel = <0xff>;
vinc13_isp_sel = <0>;
vinc13_isp_tx_ch = <0>;
vinc13_tdm_rx_sel = <0>;
vinc13_rear_sensor_sel = <0>;
vinc13_front_sensor_sel = <0>;
vinc13_sensor_list = <0>;
device_id = <13>;
status = "disabled";
};
vinc32:vinc@5832ff8 {
vinc14_csi_sel = <2>;
vinc14_mipi_sel = <0xff>;
vinc14_isp_sel = <0>;
vinc14_isp_tx_ch = <0>;
vinc14_tdm_rx_sel = <0>;
vinc14_rear_sensor_sel = <0>;
vinc14_front_sensor_sel = <0>;
vinc14_sensor_list = <0>;
device_id = <14>;
status = "disabled";
};
vinc33:vinc@5832ff4 {
vinc15_csi_sel = <2>;
vinc15_mipi_sel = <0xff>;
vinc15_isp_sel = <0>;
vinc15_isp_tx_ch = <0>;
vinc15_tdm_rx_sel = <0>;
vinc15_rear_sensor_sel = <0>;
vinc15_front_sensor_sel = <0>;
vinc15_sensor_list = <0>;
device_id = <15>;
status = "disabled";
};
vinc40:vinc@5834000 {
vinc16_csi_sel = <3>;
vinc16_mipi_sel = <0xff>;
vinc16_isp_sel = <5>;
vinc16_isp_tx_ch = <0>;
vinc16_tdm_rx_sel = <0>;
vinc16_rear_sensor_sel = <1>;
vinc16_front_sensor_sel = <1>;
vinc16_sensor_list = <0>;
device_id = <16>;
status = "okay";
};
vinc50:vinc@5835000 {
vinc17_csi_sel = <3>;
vinc17_mipi_sel = <0xff>;
vinc17_isp_sel = <5>;
vinc17_isp_tx_ch = <1>;
vinc17_tdm_rx_sel = <0>;
vinc17_rear_sensor_sel = <1>;
vinc17_front_sensor_sel = <1>;
vinc17_sensor_list = <0>;
device_id = <17>;
status = "okay";
};
};
VIN驱动配置:
status
:VIN驱动的总开关,对应媒体设备。使用VIN时必须设置为"okay"。
时钟配置:
-
csi_top
:VIN模块的时钟,可根据传感器帧率和分辨率进行调整。 -
csi_isp
:ISP模块的时钟,可根据传感器帧率和分辨率进行调整。 -
csi_top
:公式为帧率 x VTS x HTS x 位宽 x 1(WDR则为2) / 8 / 1(双像素则为2) / 1000000,向上取整,单位为MHz。 -
csi_isp
:公式为帧率 x 宽 x 高 x 1.2 / 1000000,向上取整,单位为MHz。 -
一些 IC 没有
isp_clk
。csi_clk
和isp_clk
都设置在csi_top
中。因此,将csi_top
设置为csi_clk
和isp_clk
中的最大值。
工作模式:
work_mode
:0表示在线模式,1表示离线模式。根据使用需求进行配置。
闪光灯配置:
flash0_type
:闪光灯类型(0:相关闪光灯,1:独立使能闪光灯,2:电源驱动闪光灯)。flash0_en
:闪光灯使能GPIO(类型为0或1)。flash0_mode
:闪光灯模式GPIO(类型为0或1)。flash0_flvdd
:闪光灯模块I/O电源处理字符串,PMU电源供应(类型为2)。flash0_flvdd_vol
:闪光灯模块I/O电源电压,PMU电源供应(类型为2)。status
:表示是否启用闪光灯。"disable"表示关闭,"okay"表示开启。
对焦器配置:
actuator0_name
:对焦器名称。actuator0_slave
:对焦器的IIC从设备地址。actuator0_af_pwdn
:对焦器的电源关闭GPIO。actuator0_afvdd
:对焦器的电源句柄字符串,PMU电源供应。actuator0_afvdd_vol
:对焦器的电源电压,PMU电源供应。status
:表示是否使用对焦器。"disable"代表关闭,"okay"代 表开启。
传感器配置:
device_type
:传感器类型。sensor0_mname
:传感器名称。sensor0_twi_cci_id
:传感器使用的TWI或者CCI ID。sensor0_twi_addr
:传感器的TWI地址。sensor0_mclk_id
:传感器使用的MCLK ID。sensor0_pos
:传感器的位置,前置或后置。sensor0_isp_used
:是否使用ISP。sensor0_fmt
:传感器数据格式。sensor0_stby_mode
:待机模式下是否关闭电源。sensor0_vflip
:垂直翻转设置。sensor0_hflip
:水平翻转设置。sensor0_iovdd-supply
:摄像头模块IO电源处理字符串,PMU电源供应。sensor0_iovdd_vol
:摄像头模块IO电源电压,PMU电源供应。sensor0_avdd-supply
:摄像头模块模拟电源处理字符串,PMU电源供应。sensor0_avdd_vol
:摄像头模块模拟电源电压,PMU电源供应。sensor0_dvdd-supply
:摄像头模块核心电源处理字符串,PMU电源供应。sensor0_dvdd_vol
:摄像头模块核心电源电压,PMU电源供应。sensor0_power_en
:摄像头模块电源使能GPIO。sensor0_reset
:摄像头模块复位GPIO。sensor0_pwdn
:摄像头模块PWDN GPIO。sensor0_sm_hs
:摄像头模块SM_HS GPIO。sensor0_sm_vs
:摄像头模块SM_VS GPIO。status
:打开或关闭传感器设备。
以上配置需要根据具体的方案原理图和外设数据手册进行设置。
VIPP配置:
vinc0_csi_sel
:表示pipeline上parser的id,必须为有效id。vinc0_mipi_sel
:表示pipeline上mipi(sublvds/hispi)的id,如果不使用时配置为0xff。vinc0_isp_sel
:表示pipeline上isp的id,必须配置。当isp为空时,这个isp只是表示路由不做isp的效果处理。vinc0_isp_tx_ch
:表示pipeline上isp的ch,必须配置,默认为0。当sensor是bt656多通道或者WDR出RAW时,该ch可以配置为0~3的值。vinc0_tdm_rx_sel
:表示pipeline上tdm rx的ch,必须配置,默认为0。当不使用tdm功能时,配置为0xff。vinc0_rear_sensor_sel
:表示使用的后置sensor的id。vinc0_front_sensor_sel
:表示使用的前置sensor的id。vinc0_sensor_list
:表示是否使用sensor_list来适配不同的模组,1表示使用,0表示不使用。work_mode
:工作模式,0代表在线模式,1代表离线模式,根据使用需求进行配置;只有vinc0/4/8/12可以配置。status
:vipp的使能开关,"okay"表示开启,"disable"表示关闭。
模块驱动
驱动的源代码位于BSP独立仓库的 drivers/vin
目录下,具体的路径如下所示:
.
├── Kconfig
├── Makefile
├── modules
│ ├── actuator
│ │ ├── actuator.c ;vcm driver的一般行为
│ │ ├── actuator.h ;vcm driver的头文件
│ │ ├── ad5820_act.c ;具体vcm driver型号实现
│ │ ├── an41908a_act.c ;具体vcm driver型号实现
│ │ ├── dw9714_act.c ;具体vcm driver型号实现
│ │ ├── Makefile ;编译文件
│ ├── flash
│ │ ├── flash.c ;led补光灯控制实现
│ │ ├── flash.h ;led补光灯驱动头文件
│ └── sensor
│ ├── ar0238.c ;具体的sensor驱动
│ ├── camera_cfg.h ;camera ioctl扩展命令头文件
│ ├── camera.h ;camera公用结构体头文件
│ ├── gc030a_mipi.c ;具体的sensor驱动
│ ├── gc0310_mipi.c ;具体的sensor驱动
│ ├── gc5024_mipi.c ;具体的sensor驱动
│ ├── imx179_mipi.c ;具体的sensor驱动
│ ├── imx214.c ;具体的sensor驱动
│ ├── imx219.c ;具体的sensor驱动
│ ├── imx317_mipi.c ;具体的sensor驱动
│ ├── Makefile ;驱动的编译文件
│ ├── nvp6134 ;具体的dvp sensor驱动
│ │ ├── acp.c
│ │ ├── acp_firmup.c
│ │ ├── acp_firmup.h
│ │ ├── acp.h
│ │ ├── common.h
│ │ ├── csi_dev_nvp6134.c
│ │ ├── csi_dev_nvp6134.h
│ │ ├── eq.c
│ │ ├── eq_common.c
│ │ ├── eq_common.h
│ │ ├── eq.h
│ │ ├── eq_recovery.c
│ │ ├── eq_recovery.h
│ │ ├── Makefile
│ │ ├── nvp6134c.c ;具体的sensor驱动实现
│ │ ├── type.h
│ │ ├── video.c
│ │ └── video.h
│ ├── nvp6158 ;具体的dvp sensor驱动
│ │ ├── audio.c ;音频部分实现
│ │ ├── audio.h ;音频部分头文件接口
│ │ ├── coax_protocol.c
│ │ ├── coax_protocol.h
│ │ ├── coax_table.h
│ │ ├── common.h
│ │ ├── Makefile
│ │ ├── modules.builtin
│ │ ├── modules.order
│ │ ├── motion.c
│ │ ├── motion.h
│ │ ├── nvp6158c.c ;具体的sensor驱动实现
│ │ ├── nvp6158_drv.c
│ │ ├── nvp6158_drv.h
│ │ ├── nvp6168_eq_table.h
│ │ ├── video_auto_detect.c
│ │ ├── video_auto_detect.h
│ │ ├── video.c
│ │ ├── video_eq.c
│ │ ├── video_eq.h
│ │ ├── video_eq_table.h
│ │ ├── video.h
│ ├── rn6854m_mipi.c ;具体的sensor驱动实现
│ ├── sensor-compat-ioctl32.c
│ ├── sensor_helper.c ;驱动函数接口的实现
│ ├── sensor_helper.h ;驱动函数接口的定义
├── modules.builtin
├── modules.order
├── platform
│ ├── platform_cfg.h ;vin平台配置文件
│ ├── sun50iw10p1_vin_cfg.h ;不同平台配置文件
│ ├── sun50iw3p1_vin_cfg.h ;不同平台配置文件
│ ├── sun50iw6p1_vin_cfg.h ;不同平台配置文件
│ ├── sun50iw9p1_vin_cfg.h ;不同平台配置文件
│ ├── sun8iw12p1_vin_cfg.h ;不同平台配置文件
│ ├── sun8iw15p1_vin_cfg.h ;不同平台配置文件
│ ├── sun8iw16p1_vin_cfg.h ;不同平台配置文件
│ └── sun8iw19p1_vin_cfg.h ;不同平台配置文件
├── top_reg.c
├── top_reg.h
├── top_reg_i.h
├── top_reg.o
├── utility
│ ├── bsp_common.c
│ ├── bsp_common.h
│ ├── bsp_common.o
│ ├── cfg_op.c ;读取ini文件的实现函数
│ ├── cfg_op.h ;读取ini文件的实现函数
│ ├── config.c ;sensor电压、通道选择、twi地址等信息读取函数
│ ├── config.h ;sensor电压、通道选择、twi地址等信息读取函数头文件
│ ├── vin_io.h ;vin模块寄存器操作头文件
│ ├── vin_os.c
│ ├── vin_os.h
│ ├── vin_supply.c
│ ├── vin_supply.h
├── vin.c
├── vin-cci
│ ├── bsp_cci.c ;底层cci bsp函数
│ ├── bsp_cci.h ;底层cci bsp函数头文件
│ ├── cci_helper.c ;cci 帮助函数,供sensor驱动调用
│ ├── cci_helper.h ;cci 帮助函数头文件
│ ├── csi_cci_reg.c ;cci硬件底层实现
│ ├── csi_cci_reg.h ;cci硬件底层实现头文件
│ ├── csi_cci_reg_i.h ;cci 寄存器资源头文件
│ ├── Kconfig
│ ├── sunxi_cci.c ;cci 平台驱动源文件
│ ├── sunxi_cci.h ;cci 平台驱动头文件
├── vin-csi
│ ├── parser_reg.c ;CSI控制函数
│ ├── parser_reg.h ;CSI控制函数头文件
│ ├── parser_reg_i.h ;CSI 寄存器值
│ ├── sunxi_csi.c ;csi 子模块驱动原文件
│ ├── sunxi_csi.h ;csi 子模块驱动头文件
├── vin.h
├── vin-isp
│ ├── isp500
│ │ ├── isp500_reg_cfg.c
│ │ ├── isp500_reg_cfg.h
│ │ ├── isp500_reg_cfg.o
│ │ └── isp500_reg.h
│ ├── isp520
│ │ ├── isp520_reg_cfg.c
│ │ ├── isp520_reg_cfg.h
│ │ └── isp520_reg.h
│ ├── isp521
│ │ ├── isp521_reg_cfg.c
│ │ ├── isp521_reg_cfg.h
│ │ └── isp521_reg.h
│ ├─ ─ isp522
│ │ ├── isp522_reg_cfg.c
│ │ ├── isp522_reg_cfg.h
│ │ └── isp522_reg.h
│ ├── isp_default_tbl.h
│ ├── sunxi_isp.c
│ ├── sunxi_isp.h
│ └── sunxi_isp.o
├── vin-mipi
│ ├── bsp_mipi_csi.c ;底层mipi bsp函数
│ ├── bsp_mipi_csi.h ;底层mipi bsp函数头文件
│ ├── bsp_mipi_csi_null.c ;底层mipi bsp空函数
│ ├── bsp_mipi_csi_v1.c ;底层mipi bsp函数--v1
│ ├── combo_common.h
│ ├── combo_csi
│ │ ├── combo_csi_reg.c
│ │ ├── combo_csi_reg.h
│ │ └── combo_csi_reg_i.h
│ ├── combo_rx
│ │ ├── combo_rx_reg.c
│ │ ├── combo_rx_reg.h
│ │ ├── combo_rx_reg_i.h
│ │ └── combo_rx_reg_null.c
│ ├── dphy
│ │ ├── dphy.h ;mipi dphy头文件
│ │ ├── dphy_reg.c ;mipi dphy底层实现函数
│ │ ├── dphy_reg.h ;mipi dphy底层实现函数头文件
│ │ └── dphy_reg_i.h ;mipi dphy 寄存器资源头文件
│ ├── protocol
│ │ ├── protocol.h ;mipi协议层头文件
│ │ ├── protocol_reg.c ;mipi协议层底层实现
│ │ ├── protocol_reg.h ;mipi协议层底层实现头文件
│ │ └── protocol_reg_i.h
│ ├── protocol.h
│ ├── sunxi_mipi.c
│ ├── sunxi_mipi.h
├── vin-stat
│ ├── vin_h3a.c ;3A控制接口函数
│ ├── vin_h3a.h ;3A控制接口函数头文件
├── vin-tdm
│ ├── tdm_reg.c ;TDM寄存器控制函数
│ ├── tdm_reg.h
│ ├── tdm_reg_i.h
│ ├── vin_tdm.c
│ └── vin_tdm.h
├── vin_test
│ ├── mplane_image
│ │ ├── csi_test_mplane.c ;camera抓图测试用例
│ │ └── Makefile ;测试用例编译文件
│ ├── sunxi_camera_v2.h
│ └── sunxi_display2.h
├── vin-video
│ ├── dma_reg.c ;csi dma寄存器控制函数
│ ├── dma_reg.h ;csi dma寄存器控制函数
│ ├── dma_reg_i.h ;csi dma 寄存器值定义头文件
│ ├── vin_core.c ;vin模块核心
│ ├── vin_core.h ;vin模块核心头文件
│ ├── vin_video.c ; 数据格式处理、pipe通道选择、Buffer管理等函数
│ ├── vin_video.h ;数据格式处理、pipe通道选择、Buffer管理等函数头文件
└── vin-vipp
├── sunxi_scaler.c ;图像压缩处理函数
├── sunxi_scaler.h ;图像压缩处理函数头文件
├── vipp_reg.c ;vipp寄存器控制函数
├── vipp_reg.h ;vipp寄存器控制函数头文件
├── vipp_reg_i.h ;vipp寄存器具体描述头文件
V4L2接口描述
VIDIOC_QUERYCAP
参数
struct v4l2_capability {
__u8 driver[16]; /* 驱动程序名称,例如 "bttv" */
__u8 card[32]; /* 设备名称,例如 "Hauppauge WinTV" */
__u8 bus_info[32]; /* 总线信息,例如 "PCI:" + pci_name(pci_dev) */
__u32 version; /* 驱动程序版本,应使用 KERNEL_VERSION() */
__u32 capabilities; /* 设备能力 */
__u32 reserved[4];
};
返回值
成功:0;失败:失败代码
描述
获取CSI驱动的名称、版本、支持的功能等信息,如V4L2_CAP_STREAMIN、V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE等。
VIDIOC_ENUM_INPUT
参数
struct v4l2_input {
__u32 index; /* 输入的索引 */
__u8 name[32]; /* 标签 */
__u32 type; /* 输入类型 */
__u32 audioset; /* 关联的音频设备(位字段) */
__u32 tuner; /* 关联的调谐器 */
v4l2_std_id std;
__u32 status;
__u32 capabilities;
__u32 reserved[3];
};
返回值
成功:0;失败:失败代码