Sensor配置

Version 1.0


1. 概述

为满足不同的需求场景,我们可以通过修改kernel dts将Sensor IO口配置为不同的功能。其中并口sensor只需要配置IO口的工作模式即可,而mipi sensor还需要配置每条lane的属性。

根据端口复用表配置DTS时需要注意,端口复用表格中的定义与DTS的对应关系如下:

端口复用 DTS 例子
reg_sr00_* sr0 如:reg_sr00_mipi_mode对应dts中的vif_sr0_mipi_mode
reg_sr10_* sr1 如:reg_sr10_mipi_mode对应dts中的vif_sr1_mipi_mode
reg_sr01_* sr2 如:reg_sr01_mipi_mode对应dts中的vif_sr2_mipi_mode
reg_sr11_* sr3 如:reg_sr11_mipi_mode对应dts中的vif_sr3_mipi_mode

下面我们基于黑色这块开发板,分别描述接入双sensor、三sensor以及BT1120时的dts配置。


2. 双mipi sensor(4lane + 4lane)


2.1. 配置IO工作模式

  • 对照原理图可以看到sensor 0的5条(1 clk + 4 data)mipi lane使用了“PAD_SR0_IO02~PAD_SR0_IO11”,PDN、RST、MCLK依次为“PAD_SR0_IO15、PAD_SR0_IO16、PAD_SR0_IO17”,对照如下端口复用表格

    pic

    可以看到reg_sr00_mipi_mode = 1reg_sr00_ctrl_mode = 1时端口工作模式与硬件设计一致,因此在kernel的dts中应配置

    vif: vif {
        vif_sr0_mipi_mode         = <1>;
        vif_sr0_mipi_ctrl_mode    = <1>;
        /* 上面的ctrl_mode配置过后已确定了rst、pdn及mclk脚,因此下面三个参数设置为0 */
        vif_sr0_mipi_rst_mode     = <0>;
        vif_sr0_mipi_pdn_mode     = <0>;
        vif_sr0_mipi_mclk_mode    = <0>;
    #if 0   /* 查看端口复用表可以知道控制引脚按如下配置也是类似的效果 */
        vif_sr0_mipi_ctrl_mode    = <0>;
        vif_sr0_mipi_rst_mode     = <1>;
        vif_sr0_mipi_pdn_mode     = <2>;
        vif_sr0_mipi_mclk_mode    = <1>;
    #endif
    };
    
  • sensor 1与sensor 0类似,端口复用模式为:

    pic

    汇总sensor 0跟1之后的dts配置为:

    vif: vif {
        /* Config sensor 0 pad mux */
        vif_sr0_mipi_mode         = <1>;
        vif_sr0_mipi_ctrl_mode    = <1>;
        /* 上面的ctrl_mode配置过后已确定了rst、pdn及mclk脚,因此下面三个参数设置为0 */
        vif_sr0_mipi_rst_mode     = <0>;
        vif_sr0_mipi_pdn_mode     = <0>;
        vif_sr0_mipi_mclk_mode    = <0>;
    
        /* Config sensor 1 pad mux */
        vif_sr1_mipi_mode         = <1>;
        vif_sr1_mipi_ctrl_mode    = <1>;
        /* 上面的ctrl_mode配置过后已确定了rst、pdn及mclk脚,因此下面三个参数设置为0 */
        vif_sr1_mipi_rst_mode     = <0>;
        vif_sr1_mipi_pdn_mode     = <0>;
        vif_sr1_mipi_mclk_mode    = <0>;
    };
    

2.2. 配置每条mipi lane的属性

  • sensor 0的5条mipi lane使用的IO:PAD_SR0_IO02~PAD_SR0_IO11配置为mipi口时各个IO与mipi通道的对应关系如下:

    Pad name <Lane define Sensor lane
    PAD_SR0_IO02 MIPI0_CH4N SR0_D3P
    PAD_SR0_IO03 MIPI0_CH4P SR0_D3N
    PAD_SR0_IO04 MIPI0_CH3N SR0_D2P
    PAD_SR0_IO05 MIPI0_CH3P SR0_D2N
    PAD_SR0_IO06 MIPI0_CH2N SR0_CKP
    PAD_SR0_IO07 MIPI0_CH2P SR0_CKN
    PAD_SR0_IO08 MIPI0_CH1N SR0_D0P
    PAD_SR0_IO09 MIPI0_CH1P SR0_D0N
    PAD_SR0_IO010 MIPI0_CH0N SR0_D1P
    PAD_SR0_IO011 MIPI0_CH0P SR0_D1N

    在dts中csi_sr0_lane_num = <n>;定义了lane条数为ncsi_sr0_lane_select = <clk lane0 lane1 lane2 lane3>;指定了clock lane及每条data lane所使用的mipi channel,csi_sr0_lane_pn_swap = <1 1 1 1 1>;用于指定各条lane是否需要交换NP。根据以上表格可以在dts中配置sensor 0的每条lane属性为:

    csi: csi {
        /* Config max lane number */
        csi_sr0_lane_num = <4>;
        /* Config lane selection */
        csi_sr0_lane_select = <2 1 0 3 4>;
        /* Config lane P/N swap */
        csi_sr0_lane_pn_swap = <1 1 1 1 1>;
    };
    
  • sensor 1的5条mipi lane使用的IO:PAD_SR1_IO02~PAD_SR1_IO11配置为mipi口时各个IO与mipi通道的对应关系如下:

    Pad name Lane define Sensor lane
    PAD_SR1_IO02 MIPI1_CH4N SR1_D3P
    PAD_SR1_IO03 MIPI1_CH4P SR1_D3N
    PAD_SR1_IO04 MIPI1_CH3N SR1_D1P
    PAD_SR1_IO05 MIPI1_CH3P SR1_D1N
    PAD_SR1_IO06 MIPI1_CH2N SR1_CKP
    PAD_SR1_IO07 MIPI1_CH2P SR1_CKN
    PAD_SR1_IO08 MIPI1_CH1N SR1_D0P
    PAD_SR1_IO09 MIPI1_CH1P SR1_D0N
    PAD_SR1_IO010 MIPI1_CH0N SR1_D2P
    PAD_SR1_IO011 MIPI1_CH0P SR1_D2N

    汇总sensor 0跟1之后的dts配置为:

    csi: csi {
        /* Config max lane number */
        csi_sr0_lane_num = <4>;
        csi_sr1_lane_num = <4>;
        /* Config lane selection */
        csi_sr0_lane_select = <2 1 0 3 4>;
        csi_sr1_lane_select = <2 1 3 0 4>;
        /* Config lane P/N swap */
        csi_sr0_lane_pn_swap = <1 1 1 1 1>;
        csi_sr1_lane_pn_swap = <1 1 1 1 1>;
    };
    

3. 三mipi sensor(2lane + 4lane + 2lane)

我们可以将sensor 0的4条lane拆成两个2lane来使用,与双sensor类似的,我们需要先配置IO的工作模式以及每条mipi lane的属性。


3.1. 配置IO工作模式

  • 对照板子原理图我们可以看到2lane的sensor 0使用了“PAD_SR0_IO06~PAD_SR0_IO11”,PDN、RST、MCLK依次为“PAD_SR0_IO15、PAD_SR0_IO16、PAD_SR0_IO17”,对照如下端口复用表格

    pic

    reg_sr00_mipi_mode = 2reg_sr00_ctrl_mode = 1时端口工作模式与硬件设计一致,因此在kernel的dts中应配置

    vif: vif {
        vif_sr0_mipi_mode         = <2>;
        vif_sr0_mipi_ctrl_mode    = <1>;
        /* 上面的ctrl_mode配置过后已确定了rst、pdn及mclk脚,因此下面三个参数设置为0 */
        vif_sr0_mipi_rst_mode     = <0>;
        vif_sr0_mipi_pdn_mode     = <0>;
        vif_sr0_mipi_mclk_mode    = <0>;
    #if 0   /* 控制引脚按如下配置也是类似的效果 */
        vif_sr0_mipi_ctrl_mode    = <0>;
        vif_sr0_mipi_rst_mode     = <1>;
        vif_sr0_mipi_pdn_mode     = <2>;
        vif_sr0_mipi_mclk_mode    = <1>;
    #endif
    };
    
  • 原4lane拆分成2lane之后第二个2lane sensor为sensor 2,使用了“PAD_SR0_IO00~PAD_SR0_IO05”,PDN、RST、MCLK依次为“PAD_SR0_IO12、PAD_SR0_IO13、PAD_SR0_IO14”,对照如下端口复用表格

    pic

    reg_sr001_mipi_mode = 1reg_sr01_ctrl_mode = 2时端口工作模式与硬件设计一致,因此在kernel的dts中应配置

    vif: vif {
        vif_sr2_mipi_mode         = <1>;
        vif_sr2_mipi_ctrl_mode    = <2>;
        /* 上面的ctrl_mode配置过后已确定了rst、pdn及mclk脚,因此下面三个参数设置为0 */
        vif_sr2_mipi_rst_mode     = <0>;
        vif_sr2_mipi_pdn_mode     = <0>;
        vif_sr2_mipi_mclk_mode    = <0>;
    };
    
  • 汇总sensor 0、1、2之后的dts配置

    vif: vif {
        /* Config sensor 0 pad mux */
        vif_sr0_mipi_mode         = <2>;
        vif_sr0_mipi_ctrl_mode    = <1>;
        vif_sr0_mipi_rst_mode     = <0>;
        vif_sr0_mipi_pdn_mode     = <0>;
        vif_sr0_mipi_mclk_mode    = <0>;
    
        /* Config sensor 1 pad mux */
        vif_sr1_mipi_mode         = <1>;
        vif_sr1_mipi_ctrl_mode    = <1>;
        vif_sr1_mipi_rst_mode     = <0>;
        vif_sr1_mipi_pdn_mode     = <0>;
        vif_sr1_mipi_mclk_mode    = <0>;
    
        /* Config sensor 2 pad mux */
        vif_sr2_mipi_mode         = <1>;
        vif_sr2_mipi_ctrl_mode    = <2>;
        vif_sr2_mipi_rst_mode     = <0>;
        vif_sr2_mipi_pdn_mode     = <0>;
        vif_sr2_mipi_mclk_mode    = <0>;
    };
    

3.2. 配置每条mipi lane的属性

  • sensor 0的3条mipi lane使用的IO:PAD_SR0_IO06~PAD_SR0_IO11配置为mipi口时各个IO与mipi通道的对应关系如下:

    Pad name Lane define Sensor lane
    PAD_SR0_IO06 MIPI0_CH2N SR0_CKP
    PAD_SR0_IO07 MIPI0_CH2P SR0_CKN
    PAD_SR0_IO08 MIPI0_CH1N SR0_D0P
    PAD_SR0_IO09 MIPI0_CH1P SR0_D0N
    PAD_SR0_IO010 MIPI0_CH0N SR0_D1P
    PAD_SR0_IO011 MIPI0_CH0P SR0_D1N

    在dts中csi_sr0_lane_num = <n>;定义了lane条数为ncsi_sr0_lane_select = <clk lane0 lane1>;定义每条lane的作用,csi_sr0_lane_pn_swap = <1 1 1>;用于确定各条lane是否需要交换NP。根据以上表格可以在dts中配置sensor 0的每条lane属性为:

    csi: csi {
        /* Config max lane number */
        csi_sr0_lane_num = <2>;
        /* Config lane selection */
        csi_sr0_lane_select = <2 1 0>;
        /* Config lane P/N swap */
        csi_sr0_lane_pn_swap = <1 1 1>;
    };
    
  • sensor 2的3条mipi lane使用的IO:PAD_SR1_IO00~PAD_SR1_IO05配置为mipi口时各个IO与mipi通道的对应关系如下:

    Pad name Lane define Sensor lane
    PAD_SR0_IO00 MIPI0_CH2N SR2_CKP
    PAD_SR0_IO01 MIPI0_CH2P SR2_CKN
    PAD_SR0_IO02 MIPI0_CH1N SR2_D0P
    PAD_SR0_IO03 MIPI0_CH1P SR2_D0N
    PAD_SR0_IO04 MIPI0_CH0N SR2_D1P
    PAD_SR0_IO05 MIPI0_CH0P SR2_D1N

    汇总sensor 0、1、2之后的dts配置为:

    csi: csi {
        /* Config max lane number */
        csi_sr0_lane_num = <2>;
        csi_sr1_lane_num = <4>;
        csi_sr2_lane_num = <2>;
        /* Config lane selection */
        csi_sr0_lane_select = <2 1 0>;
        csi_sr1_lane_select = <2 1 3 0 4>;
        csi_sr2_lane_select = <2 1 0>;
        /* Config lane P/N swap */
        csi_sr0_lane_pn_swap = <1 1 1>;
        csi_sr1_lane_pn_swap = <1 1 1 1 1>;
        csi_sr2_lane_pn_swap = <1 1 1>;
    };
    

4. BT1120及其他接口的sensor

  • 对照板子原理图我们可以看到开发板的sensor 1接入BT1120 sensor时使用的是PAD_SR1_IO00~PAD_SR1_IO15,对照如下端口复用表可以看到bt1120 mode应配置为1

    pic

    在dts中添加如下配置:

    vif: vif {
        vif_sr1_bt1120_mode       = <1>;
    };
    
  • 使用BT601或BT656接口的sensor时可参考如下配置,具体参数请根据实际硬件设计及端口复用表格进行设置

    vif: vif {
        /* BT601 */
        vif_sr0_par_mode          = <1>;
        vif_sr0_par_rst_mode      = <1>;
        vif_sr0_par_pdn_mode      = <2>;
        vif_sr0_par_mclk_mode     = <1>;
        /* BT656 */
        vif_sr0_bt656_mode        = <8>;
        vif_sr0_bt656_mclk_mode   = <0>;
    };