9. 完善其它功能

9.1. Sensor初始化流程

除了AE/ISP之外,Sensor驱动也使用其他callbacks完善初始化流程。

Sensor callbacks中一些参数设定可能会互相影响,须注意呼叫的顺序。

建议的呼叫流程如下:

_images/Comple004.png

Pre-Init准备Sensor驱动的环境,呼叫的callback如下:

  • pfnSetInit: 初始化sensor通用的参数。enGainMode决定sensor在WDR模式下Gain的行为。

  • pfnSetBusInfo: 设定I2C信息。

  • pfnRegisterCallback: 注册sensor ISP/AE callbacks。

  • pfn_cmos_sensor_global_init: 初始化sensor驱动内部参数。


Set Mode决定Sensor输出的主要格式,呼叫callback如下:

  • pfn_cmos_set_image_mode: 设定输出的影像格式。

  • pfn_cmos_set_wdr_mode: 设定线性或WDR模式。


Set User Default设定初始化序列的AE参数,呼叫的callback如下:

  • pfn_cmos_fps_set: 设定每秒的帧数。从callback pfn_cmos_get_ae_default得到预设的帧率f32Fps,注意新的帧率不得大于默认值。

  • pfn_cmos_inttime_update: 设定曝光时间的条数并回传给 AE,

    线性模式下的曝光条数范围可以由pfn_cmos_get_ae_default的u32MaxIntTime与u32MinIntTime。

    WDR模式下可呼叫pfn_cmos_get_inttime_max 根据曝光比率得到长短曝的曝光条数范围。

  • pfn_cmos_gains_update: 设定Sensor的AGAIN与DGAIN。

    从pfn_cmos_get_ae_default的u32MaxAgain/u32MaxDgain与u32MinAgain/u32MinDgain得到Gain范围,

    可呼叫pfn_cmos_again_calc_table/pfn_cmos_dgain_calc_table得到最接近的Gain与对应的Sensor缓存器的设定值。


Init Mipi-Rx初始化Mipi-Rx参数,Sensor开机序列(Power On Sequence)。

Linux 由ioctl呼叫kernel的Mipi-Rx驱动进行操作。

主要的程序如下:

  • 打开/dev/video0。此步骤会打开VIP相关电源与时钟。

  • 呼叫Sensor驱动的callback pfnGetRxAttr得到对应Sensor的Mipi-Rx设定。

  • CVI_MIPI_RESET_SENSOR: Mipi-Rx的ioctl。呼叫可打开定义在device tree的Sensor Reset pin。

mipi_rx: cif {
   compatible = "cvitek,cif";
   reg = <0x0 0x0a0c2000 0x0 0x2000>, <0x0 0x0300b000 0x0 0x1000>,<0x0 0x0a0c4000 0x0 0x2000>, <0x0 0x0300d000 0x0 0x1000>;
   reg-names = "csi_mac0", "csi_wrap0", "csi_mac1", "csi_wrap1";
   interrupts = <GIC_SPI 155 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 156IRQ_TYPE_LEVEL_HIGH>;
   interrupt-names = "csi0", "csi1";
   snsr-reset = <&portd 7 GPIO_ACTIVE_LOW>, <&portd 7GPIO_ACTIVE_LOW>;
   resets = <&rst RST_CSIPHY0>, <&rst RST_CSIPHY1>,<&rst RST_CSIPHY0RST_APB>, <&rst RST_CSIPHY1RST_APB>;
   reset-names = "phy0", "phy1", "phy-apb0", "phy-apb1";
};
  • CVI_MIPI_RESET_MIPI: Mipi-Rx的ioctl。呼叫可重置Mipi-Rx的设定。

  • CVI_MIPI_SET_DEV_ATTR: Mipi-Rx的ioctl。呼叫可设定Mipi-Rx属性。

  • CVI_MIPI_ENABLE_SENSOR_CLOCK: Mipi-Rx的ioctl。呼叫可打开Sensor时钟。频率由CVI_MIPI_SET_DEV_ATTR的mclk属性决定。

  • CVI_MIPI_UNRESET_SENSOR: Mipi-Rx的ioctl。呼叫可关闭定义在device tree的Sensor Reset pin。


Alios 则通过配置custom_viparam.c文件来设定reset pin的属性

PARAM_CLASSDEFINE(PARAM_SNS_CFG_S,SENSORCFG,CTX,Sensor)[] = {
{
   .enSnsType = CONFIG_SNS0_TYPE,
   .s32I2cAddr = 0x10,
   .s8I2cDev = 2,
   .u32Rst_port_idx = 2,//GPIOC_16
   .u32Rst_pin = 16,
   .u32Rst_pol = OF_GPIO_ACTIVE_LOW,
   /* config dev attr(reference sensor driver) */
   .bSetDevAttr = 1,
   .u8MclkCam = 0,
   .s16MacClk = RX_MAC_CLK_200M,
   .u8MclkFreq = CAMPLL_FREQ_27M,
   .bHwSync = CVI_FALSE,
   .s32Framerate = 30,
}

Sensor Init呼叫Sensor驱动的callback pfn_cmos_sensor_init启动Sensor的初始序列。

9.2. Sensor关闭流程

关闭Sensor时可参考以下流程:

_images/Comple002.png
  • Disable ISP: 关闭近端ISP接口。

  • Disable Sensor: 呼叫sensor驱动callback pfn_cmos_sensor_exit关闭sensor码流与I2C接口。呼叫pfnUnRegisterCallback卸除Sensor驱动。

  • Linux 呼叫Mipi-Rx ioctl CVI_MIPI_RESET_SENSOR打开Sensor reset pin。呼叫CVI_MIPI_DISABLE_SENSOR_CLOCK关闭Sensor时钟。呼叫CVI_MIPI_RESET_MIPI重置Mipi-Rx设定。

Alios呼叫cif_reset_snsr_gpio打开Sensor reset pin ,呼叫cif_reset_mipi重置mipi-rx设定。

9.3. Sensor AE同步流程

Sensor曝光与增益设定后可能反应在不同的帧上,因此需要有机制同步Sensor与ISP的设定。

此外,在WDR Manual模式,调整短曝帧的曝光可能需要更新Mipi-Rx的设定。

以下是Sensor AE同步流程:

_images/Comple0031.png
  1. Firmware呼叫sensor callbacks pfn_cmos_gains_update与pfn_cmos_inttime_update更新AE设定。

  2. Firmware在固定周期呼叫sensor callbacks pfn_cmos_get_sns_reg_info得到sensor/ISP/Mipi-Rx的设定。

  3. Firmware将sensor/ISP/CIF设定经由ISP ioctl 传递给ISP驱动内的同步处理机制。

  4. 当需要更新sensor设定时,ISP driver呼叫在cv18xx_vip.ko内的I2C介面更新sensor缓存器。

  5. 当需要更新Mipi-Rx的设定时,ISP driver呼叫在cvi_mipi_rx.ko内的Mipi-Rx驱动。