Skip to content

Commit

Permalink
feat: camera driver supports fast switch
Browse files Browse the repository at this point in the history
  • Loading branch information
iChizer0 committed Mar 11, 2024
1 parent 9a27ca8 commit 223733e
Show file tree
Hide file tree
Showing 4 changed files with 214 additions and 98 deletions.
16 changes: 12 additions & 4 deletions porting/himax/we2/drivers/OV5647_mipi_2lane_1296x972.i
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,14 @@
{HX_CIS_I2C_Action_W, 0x3809, 0x10},
{HX_CIS_I2C_Action_W, 0x380a, 0x03},
{HX_CIS_I2C_Action_W, 0x380b, 0xcc},
{HX_CIS_I2C_Action_W, 0x380c, 0x07},
{HX_CIS_I2C_Action_W, 0x380d, 0x68},

// for 4x quant
// {HX_CIS_I2C_Action_W, 0x380c, 0x0c}, // 0x0a 4:0 12:8 H
// {HX_CIS_I2C_Action_W, 0x380d, 0x68}, // 0x8c 7:0 7:0 H

{HX_CIS_I2C_Action_W, 0x380c, 0x0a}, // 0x0a 4:0 12:8 H
{HX_CIS_I2C_Action_W, 0x380d, 0x8c}, // 0x8c 7:0 7:0 H

{HX_CIS_I2C_Action_W, 0x3811, 0x0c},
{HX_CIS_I2C_Action_W, 0x3813, 0x06},
{HX_CIS_I2C_Action_W, 0x3814, 0x31},
Expand Down Expand Up @@ -70,8 +76,10 @@
{HX_CIS_I2C_Action_W, 0x3a0a, 0x00},
{HX_CIS_I2C_Action_W, 0x3a0b, 0xf6},
{HX_CIS_I2C_Action_W, 0x3a0d, 0x08},
{HX_CIS_I2C_Action_W, 0x3a0e, 0x06},
{HX_CIS_I2C_Action_W, 0x3a0f, 0x58},

{HX_CIS_I2C_Action_W, 0x3a0e, 0x06}, // 0x07 1:0 9:8 V
{HX_CIS_I2C_Action_W, 0x3a0f, 0x58}, // 0xb0 7:0 7:0 V

{HX_CIS_I2C_Action_W, 0x3a10, 0x50},
{HX_CIS_I2C_Action_W, 0x3a1b, 0x58},
{HX_CIS_I2C_Action_W, 0x3a1e, 0x50},
Expand Down
126 changes: 89 additions & 37 deletions porting/himax/we2/drivers/drv_hm0360.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ static HX_CIS_SensorSetting_t HM0360_stream_xsleep[] = {
{HX_CIS_I2C_Action_W, 0x0100, 0x02},
};

static volatile bool _initiated_before = false;
static volatile bool _frame_ready = false;
static volatile uint32_t _frame_count = 0;
static volatile uint32_t _wdma1_baseaddr = WDMA_1_BASE_ADDR;
Expand Down Expand Up @@ -63,44 +64,54 @@ el_err_code_t drv_hm0360_init(uint16_t width, uint16_t height) {
return EL_EINVAL;
}

// pinmux
hx_drv_scu_set_SEN_INT_pinmux(SCU_SEN_INT_PINMUX_FVALID);
hx_drv_scu_set_SEN_GPIO_pinmux(SCU_SEN_GPIO_PINMUX_LVALID);
hx_drv_scu_set_SEN_XSLEEP_pinmux(SCU_SEN_XSLEEP_PINMUX_SEN_XSLEEP_0);
#if ENABLE_SENSOR_FAST_SWITCH
if (!_initiated_before) {
// BLOCK START
#endif
// clock
hx_drv_dp_set_mclk_src(DP_MCLK_SRC_INTERNAL, DP_MCLK_SRC_INT_SEL_XTAL);
// pinmux
hx_drv_scu_set_SEN_INT_pinmux(SCU_SEN_INT_PINMUX_FVALID);
hx_drv_scu_set_SEN_GPIO_pinmux(SCU_SEN_GPIO_PINMUX_LVALID);
hx_drv_scu_set_SEN_XSLEEP_pinmux(SCU_SEN_XSLEEP_PINMUX_SEN_XSLEEP_0);

// sleep control
hx_drv_cis_init(DEAULT_XHSUTDOWN_PIN, SENSORCTRL_MCLK_DIV1);
hx_drv_sensorctrl_set_xSleepCtrl(SENSORCTRL_XSLEEP_BY_CPU);
// clock
hx_drv_dp_set_mclk_src(DP_MCLK_SRC_INTERNAL, DP_MCLK_SRC_INT_SEL_XTAL);

// power on
hx_drv_sensorctrl_set_xSleep(1);
// sleep control
hx_drv_cis_init(DEAULT_XHSUTDOWN_PIN, SENSORCTRL_MCLK_DIV1);
hx_drv_sensorctrl_set_xSleepCtrl(SENSORCTRL_XSLEEP_BY_CPU);

// off stream
if (hx_drv_cis_setRegTable(HM0360_stream_off, HX_CIS_SIZE_N(HM0360_stream_off, HX_CIS_SensorSetting_t)) !=
HX_CIS_NO_ERROR) {
ret = EL_EIO;
goto err;
}
// power on
hx_drv_sensorctrl_set_xSleep(1);

// init stream
if (hx_drv_cis_setRegTable(HM0360_init_setting, HX_CIS_SIZE_N(HM0360_init_setting, HX_CIS_SensorSetting_t)) !=
HX_CIS_NO_ERROR) {
ret = EL_EIO;
goto err;
}
// off stream
if (hx_drv_cis_setRegTable(HM0360_stream_off, HX_CIS_SIZE_N(HM0360_stream_off, HX_CIS_SensorSetting_t)) !=
HX_CIS_NO_ERROR) {
ret = EL_EIO;
goto err;
}

HX_CIS_SensorSetting_t HM0360_mirror_setting[] = {
{HX_CIS_I2C_Action_W, 0x0101, 0x00},
};
// init stream
if (hx_drv_cis_setRegTable(HM0360_init_setting, HX_CIS_SIZE_N(HM0360_init_setting, HX_CIS_SensorSetting_t)) !=
HX_CIS_NO_ERROR) {
ret = EL_EIO;
goto err;
}

if (hx_drv_cis_setRegTable(HM0360_mirror_setting, HX_CIS_SIZE_N(HM0360_mirror_setting, HX_CIS_SensorSetting_t)) !=
HX_CIS_NO_ERROR) {
ret = EL_EIO;
goto err;
HX_CIS_SensorSetting_t HM0360_mirror_setting[] = {
{HX_CIS_I2C_Action_W, 0x0101, 0x00},
};

if (hx_drv_cis_setRegTable(HM0360_mirror_setting,
HX_CIS_SIZE_N(HM0360_mirror_setting, HX_CIS_SensorSetting_t)) != HX_CIS_NO_ERROR) {
ret = EL_EIO;
goto err;
}

#if ENABLE_SENSOR_FAST_SWITCH
// BLOCK END
}
#endif

res = _drv_fit_res(width, height);

Expand Down Expand Up @@ -133,8 +144,17 @@ el_err_code_t drv_hm0360_init(uint16_t width, uint16_t height) {
_wdma3_baseaddr,
_jpegsize_baseaddr);

sensordplib_set_xDMA_baseaddrbyapp(_wdma1_baseaddr, _wdma2_baseaddr, _wdma3_baseaddr);
sensordplib_set_jpegfilesize_addrbyapp(_jpegsize_baseaddr);
#if ENABLE_SENSOR_FAST_SWITCH
if (!_initiated_before) {
// BLOCK START
#endif
sensordplib_set_xDMA_baseaddrbyapp(_wdma1_baseaddr, _wdma2_baseaddr, _wdma3_baseaddr);
sensordplib_set_jpegfilesize_addrbyapp(_jpegsize_baseaddr);

#if ENABLE_SENSOR_FAST_SWITCH
// BLOCK END
}
#endif

// datapath init
if (HM0360_MAX_WIDTH / res.width == 3) {
Expand Down Expand Up @@ -181,16 +201,32 @@ el_err_code_t drv_hm0360_init(uint16_t width, uint16_t height) {
// sensordplib_set_int_hw5x5rgb_jpeg_wdma23(hw5x5_cfg, jpeg_cfg, 1, NULL);
sensordplib_set_int_hw5x5_jpeg_wdma23(hw5x5_cfg, jpeg_cfg, 1, NULL);

hx_dplib_register_cb(drv_hm0360_cb, SENSORDPLIB_CB_FUNTYPE_DP);
#if ENABLE_SENSOR_FAST_SWITCH
if (!_initiated_before) {
// BLOCK START
#endif

if (hx_drv_cis_setRegTable(HM0360_stream_on, HX_CIS_SIZE_N(HM0360_stream_on, HX_CIS_SensorSetting_t)) !=
HX_CIS_NO_ERROR) {
return EL_EIO;
hx_dplib_register_cb(drv_hm0360_cb, SENSORDPLIB_CB_FUNTYPE_DP);

if (hx_drv_cis_setRegTable(HM0360_stream_on, HX_CIS_SIZE_N(HM0360_stream_on, HX_CIS_SensorSetting_t)) !=
HX_CIS_NO_ERROR) {
return EL_EIO;
}

sensordplib_set_mclkctrl_xsleepctrl_bySCMode();

#if ENABLE_SENSOR_FAST_SWITCH
// BLOCK END
}
#endif

sensordplib_set_mclkctrl_xsleepctrl_bySCMode();
sensordplib_set_sensorctrl_start();

_frame_ready = false;
sensordplib_retrigger_capture();

_initiated_before = true;

EL_LOGD("hm0360 init success!");

return ret;
Expand All @@ -199,6 +235,17 @@ el_err_code_t drv_hm0360_init(uint16_t width, uint16_t height) {
// power off
EL_LOGD("hm0360 init failed!");

#if ENABLE_SENSOR_FAST_SWITCH
_initiated_before = false;

sensordplib_stop_capture();
sensordplib_start_swreset();
sensordplib_stop_swreset_WoSensorCtrl();

hx_drv_cis_setRegTable(HM0360_stream_off, HX_CIS_SIZE_N(HM0360_stream_off, HX_CIS_SensorSetting_t));

#endif

hx_drv_sensorctrl_set_xSleep(0);

return ret;
Expand All @@ -207,6 +254,8 @@ el_err_code_t drv_hm0360_init(uint16_t width, uint16_t height) {
el_err_code_t drv_hm0360_deinit() {
// datapath off
sensordplib_stop_capture();

#if !ENABLE_SENSOR_FAST_SWITCH
sensordplib_start_swreset();
sensordplib_stop_swreset_WoSensorCtrl();

Expand All @@ -215,10 +264,13 @@ el_err_code_t drv_hm0360_deinit() {
HX_CIS_NO_ERROR) {
return EL_EIO;
}
#endif

// power off
hx_drv_sensorctrl_set_xSleep(0);

el_sleep(3);

return EL_OK;
}

Expand Down
Loading

0 comments on commit 223733e

Please sign in to comment.