9. 完善其它功能¶
9.1. Sensor初始化流程¶
除了AE/ISP之外,Sensor驱动也使用其他callbacks完善初始化流程。
Sensor callbacks中一些参数设定可能会互相影响,须注意呼叫的顺序。
建议的呼叫流程如下:

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时可参考以下流程:

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同步流程:

Firmware呼叫sensor callbacks pfn_cmos_gains_update与pfn_cmos_inttime_update更新AE设定。
Firmware在固定周期呼叫sensor callbacks pfn_cmos_get_sns_reg_info得到sensor/ISP/Mipi-Rx的设定。
Firmware将sensor/ISP/CIF设定经由ISP ioctl 传递给ISP驱动内的同步处理机制。
当需要更新sensor设定时,ISP driver呼叫在cv18xx_vip.ko内的I2C介面更新sensor缓存器。
当需要更新Mipi-Rx的设定时,ISP driver呼叫在cvi_mipi_rx.ko内的Mipi-Rx驱动。