Sensor配置
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”,对照如下端口复用表格
可以看到
reg_sr00_mipi_mode = 1
且reg_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类似,端口复用模式为:
汇总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条数为n
,csi_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”,对照如下端口复用表格
当
reg_sr00_mipi_mode = 2
且reg_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”,对照如下端口复用表格
当
reg_sr001_mipi_mode = 1
且reg_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条数为n
,csi_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
在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>; };