跳转至

SENSOR 使用参考


REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 11/19/2025

    1. 概述

    sensor padmux 用于配置sensor相关引脚的复用模式以支持不同硬件电路和mipi lane 数量。根据硬件原理图和引脚复用表选取和配置正确的sensor引脚复用模式是能够正常点亮sensor的第一步也是至关重要的一步。

    2. 关键字说明

    • sensor pad : Sensor 硬件插口位置。

    3. 功能描述

    sensor padmux设置可以为sensor 上下电提供需要的reset 和power down引脚电压,并按照sensor需要的上下电时序进行变化。同时也提供了主从设备之间i2c引脚的配置,用于读写sensor端的寄存器。sensor padmux 提供了多组mipi mode 设定,通过修改使用的mode可以使用对应引脚将数据传到IC内部。

    • 不同chip支持的mclk频率存在差异,iford 支持的mclk如下

      mclk支持配置时钟类型

    4. 硬件连接介绍

    4.1. 硬件接口确认

    如下图 BGA11 EVB板上支持MIPI0 (4lane) 或者 MIPI00 + MIPI01 (2+2 lane)

    图4-1 BGA11_EVB板_硬件原理图
    图4-2 BGA11_EVB板_mipi pinmux图

    通过上面的硬件原理图和引脚复用表可以确认BGA11 EVB板的两种sensor padmux配置如下

    Panmux mode type 4Lane 2+2Lane
    Pad num snr0 snr0 & snr2
    mipi_rx_mode mode1 mode1 & mode1
    mclk_mode mode1 mode1 & mode1
    rst_mode mode1 mode1 & mode1
    pdn_mode mode0 mode0 & mode0
    I2C_mode I2C1 mode1 I2C1 mode1 & I2C2 mode1

    PS: 1.BGA11 只有MIPI0 4lane snr0或者 拆成 MIPI00 2lane(snr0) + MIPI01 2lane(snr2), 所以目前设置 2+2 驱动上要注意 配置是snr0 和snr2

    snr0 对应 snr00、srn2对应snr01。 iford 最高规格支持MIPI0(4lane)。MIPI0 可以拆分为MIPI00和MIPI01 --snr00和snr01。

    4.2. MIPI 接口线序匹配

    csi_sr0_lane_select里面5个位置分别对应 MIPI CSI rx aphy的\< CLK, DataLane0, DataLane1, DataLane2, DataLane3>

    如BGA11 sensor端线序,sensor mipi tx对应MIPI CSI rx aphy。clk 对应CH2位置,DataLane0 对应CH1位置,DataLane1对应CH3位置,DataLane2对应CH0位置,DataLane3对应CH4位置,所以csi_sr0_lane_select = <2 1 3 0 4>

    如果mipi data lane pn 接反, 则需要设置, csi_sr0_lane_pn_swap = <1 1 1 1 1>;

    图4-3 MIPI0 4lane mapping

    csi_sr0_lane_select里面5个位置分别对应 MIPI CSI rx aphy的\< CLK, DataLane0, DataLane1, DataLane2, DataLane3>

    csi_sr2_lane_select里面3个位置分别对应 MIPI CSI rx aphy的\< CLK, DataLane0, DataLane1>

    如下图 BGA11 MIPI00 2lane(snr0) + MIPI01 2lane(snr2)线序。 MIPI00 2lane(snr0) clk 对应CH2位置,DataLane0 对应CH1位置,DataLane1对应CH0位置 所以csi_sr0_lane_select = <2 1 0 3 4>,如果mipi data lane pn 接反, 则需要设置, csi_sr0_lane_pn_swap = <1 1 1 1 1>;

    MIPI01 2lane(snr2) clk 对应CH2位置,DataLane0 对应CH1位置,DataLane1对应CH0位置 所以csi_sr2_lane_select = <2 1 0>,如果mipi data lane pn 接反, 则需要设置, csi_sr2_lane_pn_swap = <1 1 1>;

    图4-4 MIPI0 2lane mapping
        lane 顺序修改
        ./riu_r 0x1538 0x6 0xA 0xE 0x22 0x25 的bit[12:15] 来看顺序是否有生效
        0x1538 为sensor0
        0x153c 为sensor2
    

    PS:由于修改sensor 线序需要替换kernel,较为麻烦, 可以先用以下方式快速确认线序

    通过加载 insmod /config/modules/5.10/mi_sensor.ko gp_sntExternalConfig=/customer/sensorpad0_2lane.json 加载json来配置

    例如:

    imx307 2lane线序 1 0 2:

        {
            "SensorIF": [
                {
                    "sensorPad": 0,
                    "hwClass": "mipi",
                    "content": {
                        "lane_number": 2,
                        "hdr_lane_number": 2,
                        "lane_select": "1,0,2",
                        "lane_swap": "0,0,0"
                    }
                }
            ]
        }
    

    5. kernel用法介绍

    5.1. dts 配置

    4lane:

        csi: csi {
                    compatible = "sgs,csi";
                    io_phy_addr = <0x1f000000>;
                    banks = <0x153C>,<0x153D>,<0x153E>,<0x1538>,<0x153A>,<0x153B>;
                    atop_banks = <0x153F>;
                    clkgen_banks = <0x1038>;
                    interrupts=  <GIC_SPI INT_IRQ_MIPI_CSI2 IRQ_TYPE_LEVEL_HIGH>;
                    clocks = <&CLK_csi0_mac_lptx_top_i>,<&CLK_csi0_mac_top_i>,<&CLK_csi0_ns_top_i>,<&CLK_csi1_mac_lptx_top_i>,<&CLK_csi1_mac_top_i>,<&CLK_csi1_ns_top_i>;
                    status = "ok";
                    /* Config max lane number */
                    csi_sr0_lane_num = <4>;
                    /* Config lane selection */
                    csi_sr0_lane_select = <2 1 3 0 4>;
                    /* Config lane P/N swap */
                    csi_sr0_lane_pn_swap = <0 0 0 0 0>;
                };
        sensorif: sensorif {
                    compatible = "sgs,sensorif";
                    status = "ok";
                    clocks = <&CLK_sr00_mclk>, <&CLK_sr01_mclk>;
    
                    /* Config sensor 0 pad mux */
                    snr_sr0_mipi_mode         = <1>;
                    snr_sr0_mipi_rst_mode     = <1>;
                    snr_sr0_mipi_pdn_mode     = <0>;
                    snr_sr0_mipi_mclk_mode    = <1>;
                    snr_sr0_rst_gpio          = <-1>;
                    snr_sr0_pdn_gpio          = <-1>;
    
                    /* Config mclk 37.125MHz supported */
                    snr_sr0_mclk_37p125 = <1>;
    
                    /* Config i2c for sensor pad */
                    snr0_mipi_i2c = <1>;
                };
    

    2+2lane:

        csi: csi {
                    compatible = "sgs,csi";
                    io_phy_addr = <0x1f000000>;
                    banks = <0x153C>,<0x153D>,<0x153E>,<0x1538>,<0x153A>,<0x153B>;
                    atop_banks = <0x153F>;
                    clkgen_banks = <0x1038>;
                    interrupts=  <GIC_SPI INT_IRQ_MIPI_CSI2 IRQ_TYPE_LEVEL_HIGH>;
                    clocks = <&CLK_csi0_mac_lptx_top_i>,<&CLK_csi0_mac_top_i>,<&CLK_csi0_ns_top_i>,<&CLK_csi1_mac_lptx_top_i>,<&CLK_csi1_mac_top_i>,<&CLK_csi1_ns_top_i>;
                    status = "ok";
                    /* Config max lane number */
                    csi_sr0_lane_num = <2>;
                    csi_sr2_lane_num = <2>;
                    /* Config lane selection */
                    csi_sr0_lane_select = <2 1 0 3 4>;
                    csi_sr2_lane_select = <2 1 0>;
                    /* Config lane P/N swap */
                    csi_sr0_lane_pn_swap = <0 0 0 0 0>;
                    csi_sr2_lane_pn_swap = <0 0 0>;
                };
        sensorif: sensorif {
                    compatible = "sgs,sensorif";
                    status = "ok";
                    clocks = <&CLK_sr00_mclk>, <&CLK_sr01_mclk>;
    
                    /* Config sensor 0 pad mux */
                    snr_sr0_mipi_mode         = <1>;
                    snr_sr0_mipi_rst_mode     = <1>;
                    snr_sr0_mipi_pdn_mode     = <0>;
                    snr_sr0_mipi_mclk_mode    = <1>;
                    snr_sr0_rst_gpio          = <-1>;
                    snr_sr0_pdn_gpio          = <-1>;
    
                    /* Config sensor 2 pad mux */
                    snr_sr2_mipi_mode         = <1>;
                    snr_sr2_mipi_rst_mode     = <1>;
                    snr_sr2_mipi_pdn_mode     = <0>;
                    snr_sr2_mipi_mclk_mode    = <1>;
                    snr_sr2_rst_gpio          = <-1>;
                    snr_sr2_pdn_gpio          = <-1>;
    
                    /* Config mclk 37.125MHz supported */
                    snr_sr0_mclk_37p125 = <1>;
                    snr_sr2_mclk_37p125 = <1>;
    
                    /* Config i2c for sensor pad */
                    snr0_mipi_i2c = <1>;
                    snr2_mipi_i2c = <2>;
                };
    

    csi部分释义如下:

    参数 释义 备注
    interrupts mipi rx csi中断 不需要修改
    clocks mipi rx csi时钟源 不需要修改
    csi_sr0_lane_num sensor pad0 的mipi信号线数量 需要根据实际使用的mipi sensor 信号线数量进行配置,参考2.3
    csi_sr0_lane_select 配置sensor pad0的mipi信号线线序 需要根据板端和sensor模组实际的mipi信号线线序进行修改参考2.3
    csi_sr0_lane_pn_swap 配置sensor pad0的mipi信号线电源极性 配置为1时代表一组mipi信号的电源极性做互换参考2.3
    csi_sr2_lane_select 配置sensor pad2的mipi信号线线序 需要根据板端和sensor模组实际的mipi信号线线序进行修改参考2.3
    csi_sr2_lane_num sensor pad2 的mipi信号线数量 需要根据实际使用的mipi sensor 信号线数量进行配置参考2.3
    csi_sr2_lane_pn_swap 配置sensor pad2的mipi信号线电源极性 配置为1时代表一组mipi信号的电源极性做互换参考2.3

    sensorif部分释义如下:

    参数 释义 备注
    clocks sensor mclk时钟源 需要按照pad0 pad2的顺序配置
    snr_sr0_mipi_mode mipi sensor pad0 的mipi mode 参考第1节
    snr_sr0_mipi_rst_mode mipi sensor pad0 的reset mode 参考第1节
    snr_sr0_mipi_pdn_mode mipi sensor pad0 的pdn mode 参考第1节
    snr_sr0_mipi_mclk_mode mipi sensor pad0 的mclk mode 参考第1节
    snr_sr0_rst_gpio mipi sensor pad0 的reset gpio 引脚设置 同时配置rst mode和rst gpio的话优先使用gpio的设定
    snr_sr0_pdn_gpio mipi sensor pad0 的pdn gpio 引脚设置 同时配置pdn mode和pdn gpio的话优先使用gpio的设定
    snr_sr0_mclk_37p125 配置sensor pad0 支持37.125MHz mclk
    snr0_mipi_i2c 配置mipi sensor pad0 使用的i2c bus id 需要根据实际使用的i2c bus进行配置

    5.2. IIC 配置

    如上节所示: 4lane 情况下snr0 绑定 i2c1 mode1, 2+2情况下snr00 和 snr01 绑定i2c1 mode1 和 i2c2 mode1

        snr0_mipi_i2c = <1>;
        snr2_mipi_i2c = <2>;
    

    snr0 代表MIPI sensor 0

    <1> 代表使用I2C bus 1

    I2C padmux 在对应kernel\arch\arm64\boot\dts\sgs下面对应padmux的dtsi中配置:

        //I2C1 Mode1,sensorif_mipi_grp1_i2c
                <PAD_GPIOB_00            PINMUX_FOR_I2C0_MODE_1           MDRV_PUSE_I2C1_SCL>,
                <PAD_GPIOB_01            PINMUX_FOR_I2C0_MODE_1           MDRV_PUSE_I2C1_SDA>,
        //I2C2 Mode1,sensorif_mipi_grp0_i2c
                <PAD_GPIOB_04            PINMUX_FOR_I2C1_MODE_1           MDRV_PUSE_I2C2_SCL>,
                <PAD_GPIOB_05            PINMUX_FOR_I2C1_MODE_1           MDRV_PUSE_I2C2_SDA>,
    

    I2c1: /customer/riu_r 0x103c 53 //bit[0:1]是否为对应mode的值

    I2c2: trust zone 設置

    5.3. 默认sensor驱动加载

    5.3.1. sensor driver配置

        insmod /config/modules/5.10/imx307_MIPI.ko chmap=1
        chmap 代表用 bit map 的形式配置
        sensor 0 bit[0]----> chmap=1
        sensor 2 bit[2]----> chmap=4
    

    可以通过menuconfig修改image默认支持的sensor drvier和预安装的sensor driver

    1. 进入alkaid project根目录,make menuconfig

    2. 回车键进入Sensor子选项

    3. 回车键进入Sensor List子选项,写上需要的sensor driver名称

    4. 编辑完成后退出,再回车键进入Sensor0子选项,写上需要预insmod的sensor driver名称

    5. 编辑完成后退出,再回车键进入Sensor0 Opt子选项,写上需要预insmod sensor0后面需要配置的参数。

    编译完成将在/config/modules/5.10 下生成Sensor List中选择的sensor driver,同时在/customer/demo.sh中会看到预先insmod sensor0的命令。

    5.3.2. sensor IQ文件配置

    可以通过menuconfig修改image默认支持的sensor IQ文件

    1. 进入alkaid project根目录,make menuconfig

    2. 回车键进入Sensor子选项

    3. 回车键进入IQ0子选项,写上需要使用的iq file名称。IQ后的序号对应不同sensor pad,例如IQ0对应sensor0。

    编译完成将在/config/modules/iqfile 下生成IQ0中选择的iq file。

    5.4. sensor driver 部分函数介绍

    mipi Sensor接口注册列表的handle

    参数 释义 备注
    handle->interface_attr.attr_mipi.mipi_lane_num 注册设置 MIPI 通道数 默认值:4
    handle->interface_attr.attr_mipi.mipi_data_format 注册设置MIPI数据格式 CUS_SEN_INPUT_FORMAT_YUV422,
    CUS_SEN_INPUT_FORMAT_RGB,
    handle->interface_attr.attr_mipi.mipi_yuv_order 注册设置MIPI yuv 顺序 仅适用于 yuv Sensor
    handle->interface_attr.attr_mipi.mipi_hdr_mode 注册设置MIPI HDR 模式 CUS_HDR_MODE_NONE
    /无 HDR/
    CUS_HDR_MODE_SONY_DOL
    /索尼标准线信息输出/
    CUS_HDR_MODE_DCG
    /双增益 HDR/
    CUS_HDR_MODE_EMBEEDED_RAW8
    /嵌入式 8bit HDR/
    CUS_HDR_MODE_EMBEEDED_RAW10
    /嵌入式 10bit HDR/
    CUS_HDR_MODE_EMBEEDED_RAW12
    /嵌入式 12bit HDR/
    CUS_HDR_MODE_EMBEEDED_RAW14
    /嵌入式 14bit HDR/
    CUS_HDR_MODE_EMBEEDED_RAW16
    /嵌入式 16bit HDR/
    CUS_HDR_MODE_COMP
    /压缩 HDR/
    CUS_HDR_MODE_LI
    /行交错 HDR/
    CUS_HDR_MODE_COMP_VS
    /压缩 HDR + very short/
    CUS_HDR_MODE_VC
    /虚拟通道模式/
    CUS_HDR_MODE_MAX
    注意:
    在旧版的CUS_HDR_MODE_DCG 代表通过虚拟通道传输的HDR,在新版的架构下更名为CUS_HDR_MODE_VC。
    handle->interface_attr.attr_mipi.mipi_hdr_virtual_channel_num 注册设置HDR虚拟通道数根据各个sensor VC模式头文件定义 例如imx415:
    长曝光帧数: 0
    短曝光帧数: 1
    handle->interface_attr.attr_mipi.mipi_hdr_fusion_type 注册设置 HDR 融合类型 CUS_HDR_FUSION_TYPE_NONE,(默认)
    CUS_HDR_FUSION_TYPE_2T1,
    CUS_HDR_FUSION_TYPE_3T1,

    mipi csi回调函数列表

    参数 释义 备注
    sensor_if->SetCSI_Clk (u32 idx, CUS_CSI_CLK clk) 参数:
    idx:Sensor Pad
    CUS_CSI_CLK:Mipi clk
    设置 MIPI 接口 MAC CLK
    回调至 CSI 驱动程序
    sensor_if->SetCSI_Lane(u32 idx, u16 num_lane, u8 bon_off) 参数:
    idx:Sensor Pad
    num_lane:Mipi 通道号
    bon_off:启用或禁用
    设置 MIPI 接口数据通道
    回调至 CSI 驱动程序
    sensor_if->SetCSI_hdr_mode(idx, CUS_HDR_MODE hdr_mode, u8 bon_off) 参数:
    idx:Sensor Pad
    hdr_mode:
    bon_off:启用或禁用
    设置 HDR 数据格式
    回调到 CSI 驱动程序
    CUS_HDR_MODE_NONE
    /无 HDR/
    CUS_HDR_MODE_SONY_DOL
    /Sony 标准线信息输出/
    CUS_HDR_MODE_DCG
    /双增益 HDR/
    /嵌入式 16 位 HDR/
    CUS_HDR_MODE_COMP
    /压缩 HDR/
    CUS_HDR_MODE_LI
    /线交错 HDR/
    CUS_HDR_MODE_COMP_VS
    /压缩 HDR + very short/
    CUS_HDR_MODE_VC
    /虚拟通道模式/
    CUS_HDR_MODE_MAX
    sensor_if->SetCSI_LongPacketType(u32 idx, u16 dt0_15, u16 dt16_31, u16 u32_47) 参数:
    idx:Sensor Pad
    类型[15:0],[31:16],[47:32]
    设置 MIPI 长数据包类型启用
    回调至 CSI 驱动程序长数据包类型启用
    [0]: Null
    [1]: blinking
    [2]: embedded
    [14]: YUV422_8B
    [26]: RAW8
    [27]: RAW10
    [28]: RAW12
    [29]: RAW14
    [30]: RAW16
    [32]: UD1
    [33]: UD2
    [34]: UD3
    [35]: UD4
    [36]: UD5
    [37]: UD6
    [38]: UD7
    [39]: UD8
    Sensor_if->SetCSI_yuv_order_swap(u32 idx, u8 swap) 参数:
    idx:Sensor Pad
    swap:启用或禁用
    设置 MIPI 输入 YUV422 数据顺序交换
    回调至 CSI 驱动程序

    sensorif回调函数列表的handle

    参数 释义 备注
    sensor_if->PowerOff(u32 idx, CUS_CLK_POL pol); 参数:
    idx:Sensor Pad
    CUS_CLK_POL:拉高或拉低
    设置 Sensor-IF PowerDown 是否拉高。
    回调至 VIF司机
    sensor_if->Reset(u32 idx, CUS_CLK_POL pol); 参数:
    idx:Sensor Pad
    CUS_CLK_POL:拉高或拉低
    设置 Sensor-IF SW RESET 是否拉高。
    回调至VIF 驱动程序
    sensor_if->MCLK(u32 idx , u8 bon_off, CUS_MCLK_FREQ mclk); 参数:
    idx:Sensor Pad
    bon_off:启用或禁用
    CUS_MCLK_FREQ:Sensor clk
    注册设置 VIF 模块输出 MCLK 到Sensor用于 MI 查询!!
    主芯片支持 MCLK 列表为:
    CUS_CMU_CLK_27MHZ,
    CUS_CMU_CLK_21P6MHZ,
    CUS_CMU_CLK_12MHZ,
    CUS_CMU_CLK_5P4MHZ,
    CUS_CMU_CLK_36MHZ,
    CUS_CMU_CLK_54MHZ,
    CUS_CMU_CLK_43P2MHZ,
    CUS_CMU_CLK_61P7MHZ,
    CU S_CMU_CLK_72MHZ,
    CUS_CMU_CLK_48MHZ,
    CUS_CMU_CLK_24MHZ,
    CUS_CMU_CLK_37P125MHZ,
    CUS_CMU_CLK_LPLL_DIV1,
    CUS_CMU_CLK_LPLL_DIV2,
    CUS_CMU_CLK_LPLL_DIV4,
    CUS_CMU_CLK_LPLL_DIV8,
    sensor_if->SetIOPad (u32 idx, CUS_SENIF_BUS ulSnrType, NULL) 参数:
    idx:Sensor Pad
    CUS_SENIF_BUS:Sensor接口
    用于 SENSOR-IF I/O 总线模式
    回调至 VIF 驱动程序
    sensor_if->SetSkipFrame(u32 idx, u16 skip_num, u8 bon_off) 参数:
    idx:Sensor Pad
    skip_num:跳过帧cnt
    bon_off:启用或禁用
    跳过vif输出帧
    回调至VIF驱动程序

    更多请参考Sensor_Porting_Guide

    5.5. sensor驱动开发

    不同接口类型的sensor 驱动实现基本一样,具体请参考Sensor_Guide

    5.6. SAMPLE CODE

    snr vif 初始化函数

        MI_S32 ST_VifInit(ST_Stream_Attr_T *pStreamAttr)
        {
            /************************************************
            Step1:  Init Sensor
            *************************************************/
            MI_SNR_PADInfo_t stSnrPadInfo;
            MI_SNR_PlaneInfo_t stSnrPlaneInfo;
    
    
            MI_SNR_PADID snrPadId = pStreamAttr->u32SnrId;
            MI_U32 u32ResCount = 0;
    
            memset(&stSnrPadInfo, 0x0, sizeof(MI_SNR_PADInfo_t));
            memset(&stSnrPlaneInfo, 0x0, sizeof(MI_SNR_PlaneInfo_t));
    
            ExecFunc(MI_SNR_SetPlaneMode(snrPadId, FALSE), DRM_SUCCESS);
            ExecFunc(MI_SNR_QueryResCount(snrPadId, &u32ResCount), DRM_SUCCESS);
    
            if(pStreamAttr->u32SnrChoiceRes > u32ResCount-1){
                printf("MI_SNR_QueryResCount :%d\n", u32ResCount);
                return -1;
            }
    
            ExecFunc(MI_SNR_SetRes(snrPadId, pStreamAttr->u32SnrChoiceRes), DRM_SUCCESS);
            ExecFunc(MI_SNR_Enable(snrPadId), DRM_SUCCESS);
    
            /************************************************
            Step2:  Init Vif
            *************************************************/
            MI_VIF_GROUP VifGroupId = 0;
            MI_VIF_DEV VifDevId = 0;
            MI_VIF_DEV VifChnId = pStreamAttr->VifChnId;
            MI_VIF_PORT VifPortId = pStreamAttr->VifPortId;
            MI_VIF_GroupAttr_t stVifGroupAttr;
            MI_VIF_DevAttr_t stVifDevAttr;
            MI_VIF_OutputPortAttr_t stVifPortAttr;
    
            get_vif_from_snrpad(snrPadId, &VifGroupId, &VifDevId);
    
    
            memset(&stVifGroupAttr, 0x0, sizeof(MI_VIF_GroupAttr_t));
            memset(&stVifDevAttr, 0x0, sizeof(MI_VIF_DevAttr_t));
            memset(&stVifPortAttr, 0x0, sizeof(MI_VIF_OutputPortAttr_t));
    
            ExecFunc(MI_SNR_GetPadInfo(snrPadId, &stSnrPadInfo), DRM_SUCCESS);
            ExecFunc(MI_SNR_GetPlaneInfo(snrPadId, 0, &stSnrPlaneInfo), DRM_SUCCESS);
            printf(
                        "MI_SNR_GetPlaneInfo %d, outputsize(%d, %d, %d, %d)\n",
                        snrPadId,stSnrPlaneInfo.stCapRect.u16X,stSnrPlaneInfo.stCapRect.u16Y,
                        stSnrPlaneInfo.stCapRect.u16Width,stSnrPlaneInfo.stCapRect.u16Height);
    
            stVifGroupAttr.eIntfMode = E_MI_VIF_MODE_MIPI;
            stVifGroupAttr.eWorkMode = E_MI_VIF_WORK_MODE_1MULTIPLEX;
            stVifGroupAttr.eHDRType = E_MI_VIF_HDR_TYPE_OFF;
            if (stVifGroupAttr.eIntfMode == E_MI_VIF_MODE_BT656) {
                stVifGroupAttr.eClkEdge = (MI_VIF_ClkEdge_e)stSnrPadInfo.unIntfAttr.stBt656Attr.eClkEdge;
            } else {
                stVifGroupAttr.eClkEdge = E_MI_VIF_CLK_EDGE_DOUBLE;
            }
    
            ExecFunc(MI_VIF_CreateDevGroup(VifGroupId, &stVifGroupAttr), DRM_SUCCESS);
            stVifDevAttr.stInputRect.u16X = stSnrPlaneInfo.stCapRect.u16X;
            stVifDevAttr.stInputRect.u16Y = stSnrPlaneInfo.stCapRect.u16Y;
            stVifDevAttr.stInputRect.u16Width = stSnrPlaneInfo.stCapRect.u16Width;
            stVifDevAttr.stInputRect.u16Height = stSnrPlaneInfo.stCapRect.u16Height;
            if (stSnrPlaneInfo.eBayerId >= E_MI_SYS_PIXEL_BAYERID_MAX) {
                stVifDevAttr.eInputPixel = stSnrPlaneInfo.ePixel;
            } else {
                stVifDevAttr.eInputPixel = (MI_SYS_PixelFormat_e)RGB_BAYER_PIXEL(
                        stSnrPlaneInfo.ePixPrecision, stSnrPlaneInfo.eBayerId);
            }
            ExecFunc(MI_VIF_SetDevAttr(VifDevId, &stVifDevAttr), DRM_SUCCESS);
            ExecFunc(MI_VIF_EnableDev(VifDevId), DRM_SUCCESS);
            stVifPortAttr.stCapRect.u16X = stSnrPlaneInfo.stCapRect.u16X;
            stVifPortAttr.stCapRect.u16Y = stSnrPlaneInfo.stCapRect.u16Y;
            stVifPortAttr.stCapRect.u16Width = stSnrPlaneInfo.stCapRect.u16Width;
            stVifPortAttr.stCapRect.u16Height = stSnrPlaneInfo.stCapRect.u16Height;
            stVifPortAttr.stDestSize.u16Width = stSnrPlaneInfo.stCapRect.u16Width;
            stVifPortAttr.stDestSize.u16Height = stSnrPlaneInfo.stCapRect.u16Height;
            stVifPortAttr.eFrameRate = E_MI_VIF_FRAMERATE_FULL;
            if (stSnrPlaneInfo.eBayerId >= E_MI_SYS_PIXEL_BAYERID_MAX) {
                stVifPortAttr.ePixFormat = stSnrPlaneInfo.ePixel;
            } else {
                stVifPortAttr.ePixFormat = (MI_SYS_PixelFormat_e)RGB_BAYER_PIXEL(
                        stSnrPlaneInfo.ePixPrecision, stSnrPlaneInfo.eBayerId);
            }
            ExecFunc(MI_VIF_SetOutputPortAttr(VifDevId, VifPortId, &stVifPortAttr), DRM_SUCCESS);
    
    
            return 0;
        }
    

    6. SENSOR SUPPORT LIST

    6.1 MIPI Interface Camera Sensor Support list

    在芯片验证阶段,验证的MIPI 接口的sensor 如下表所示:

    接口类型 Lane 数 种类 关键指标 数据格式 Souffle Iford
    MIPI 4Lane IMX415 3840x2160@30FPS, 3F HDR, 4lane Bayer Pass Pass
    SC450AI 2688x1520@60FPS, 4lane Bayer Pass Pass
    SC830AI 3840x2160@30FPS, 4lane Bayer Pass None
    OS08A10 3840x2160@60FPS, 4lane Bayer Pass None
    OS12D40 4512x2512@30fps, 4lane Bayer Pass None
    OS04C10 2560x1440@30fps, 4lane Bayer Pass None
    IMX675 2592x1944@30fps, HDR, 4lane Bayer Pass None
    IMX485 3840x2160@30FPSs, HDR, 4lane Bayer Pass None
    AR0830 3848x2168@30FPSs, HDR, 4lane Bayer Pass None
    OS05A10 2592x1944@30FPSs, 4lane Bayer Pass None
    2lane/4lane IMX307 1920x1080@30FPS, 2F HDR, 2/4lane Bayer Pass Pass
    OS04A10 2688x1520@30FPS, 2lane/4lane Bayer Pass None
    1 lane OG0VA1B 1920x1080@30FPS, 1lane Bayer Pass None

    7. FAQ

    Q1:如何查看sensor出图

    echo dumptaskfile 0 2 /mnt/pcm > /proc/mi_modules/mi_isp/mi_isp0

    echo dumptaskfile 0 2 /mnt/pcm > /proc/mi_modules/mi_scl/mi_scl0

    /mnt/pcm :存图路径
    2:抓2张图
    0: chnNum
    

    Q2:如何进一步确认sensor 中断信息

    请参考MI VIF API 章节5.PROCFS介绍