[sw][matcha] Fix cam_i2c_test failure * Select frame end bit * Trim the frame in 320x240 mode Bug: 310074028 Change-Id: I9b1e51ccdafd3683b4c55e32d3e179e071cd0900
diff --git a/sw/device/lib/dif/dif_isp_wrapper.c b/sw/device/lib/dif/dif_isp_wrapper.c index 280b0a7..8768533 100644 --- a/sw/device/lib/dif/dif_isp_wrapper.c +++ b/sw/device/lib/dif/dif_isp_wrapper.c
@@ -197,8 +197,9 @@ // ISP confituration: live, raw and bypass modes // Input arguments are frame weight, frame height and Y,Cb,Cr written addresses. dif_result_t _dif_isp_wrapper_set_raw_byp_en( - const dif_isp_wrapper_t *isp_wrapper, const uint32_t frame_width, - uint32_t frame_height, + const dif_isp_wrapper_t *isp_wrapper, const uint32_t frame_h_size, + const uint32_t frame_v_size, const uint32_t frame_h_offs, + const uint32_t frame_v_offs, // TODO(ykwang): put these variables into a config variable. const uint32_t y_base_ad_init_addr, const uint32_t cb_base_ad_init_addr, const uint32_t cr_base_ad_init_addr, const uint32_t y_base_ad_init2_addr, @@ -212,10 +213,10 @@ mmio_region_write32(isp_wrapper->base_addr, VI_CCL, 0x00000002); mmio_region_write32(isp_wrapper->base_addr, VI_ICCL, 0x00000059); mmio_region_write32(isp_wrapper->base_addr, VI_IRCL, 0x00000000); - mmio_region_write32(isp_wrapper->base_addr, ISP_ACQ_H_OFFS, 0x00000000); - mmio_region_write32(isp_wrapper->base_addr, ISP_ACQ_V_OFFS, 0x00000000); - mmio_region_write32(isp_wrapper->base_addr, ISP_ACQ_H_SIZE, frame_width); - mmio_region_write32(isp_wrapper->base_addr, ISP_ACQ_V_SIZE, frame_height); + mmio_region_write32(isp_wrapper->base_addr, ISP_ACQ_H_OFFS, frame_h_offs); + mmio_region_write32(isp_wrapper->base_addr, ISP_ACQ_V_OFFS, frame_v_offs); + mmio_region_write32(isp_wrapper->base_addr, ISP_ACQ_H_SIZE, frame_h_size); + mmio_region_write32(isp_wrapper->base_addr, ISP_ACQ_V_SIZE, frame_v_size); mmio_region_write32(isp_wrapper->base_addr, ISP_TPG_TOTAL_IN, 0x011d8518); mmio_region_write32(isp_wrapper->base_addr, ISP_TPG_ACT_IN, 0x00a001e0); mmio_region_write32(isp_wrapper->base_addr, ISP_TPG_FP_IN, 0x001c8126); @@ -227,8 +228,8 @@ mmio_region_write32(isp_wrapper->base_addr, ISP_TPG_FRAME_NUM, 0x00000003); mmio_region_write32(isp_wrapper->base_addr, ISP_OUT_H_OFFS, 0x00000000); mmio_region_write32(isp_wrapper->base_addr, ISP_OUT_V_OFFS, 0x00000000); - mmio_region_write32(isp_wrapper->base_addr, ISP_OUT_H_SIZE, frame_width); - mmio_region_write32(isp_wrapper->base_addr, ISP_OUT_V_SIZE, frame_height); + mmio_region_write32(isp_wrapper->base_addr, ISP_OUT_H_SIZE, frame_h_size); + mmio_region_write32(isp_wrapper->base_addr, ISP_OUT_V_SIZE, frame_v_size); mmio_region_write32(isp_wrapper->base_addr, ISP_BLS_CTRL, 0x00000000); mmio_region_write32(isp_wrapper->base_addr, ISP_BLS_A_FIXED, 0x00000000); mmio_region_write32(isp_wrapper->base_addr, ISP_BLS_B_FIXED, 0x00000000); @@ -313,7 +314,7 @@ mmio_region_write32(isp_wrapper->base_addr, MI_MP_Y_BASE_AD_INIT, y_base_ad_init_addr); mmio_region_write32(isp_wrapper->base_addr, MI_MP_Y_SIZE_INIT, - frame_width * frame_height); + frame_h_size * frame_v_size); mmio_region_write32(isp_wrapper->base_addr, MI_MP_Y_OFFS_CNT_INIT, 0x00000000); mmio_region_write32(isp_wrapper->base_addr, MI_MP_Y_IRQ_OFFS_INIT, 0x00000000); mmio_region_write32(isp_wrapper->base_addr, MI_MP_CB_BASE_AD_INIT, @@ -332,14 +333,14 @@ cb_base_ad_init2_addr); mmio_region_write32(isp_wrapper->base_addr, MI_MP_CR_BASE_AD_INIT2, cr_base_ad_init2_addr); - mmio_region_write32(isp_wrapper->base_addr, MI_MP_Y_LLENGTH, frame_width); + mmio_region_write32(isp_wrapper->base_addr, MI_MP_Y_LLENGTH, frame_h_size); mmio_region_write32(isp_wrapper->base_addr, MI_OUTPUT_ALIGN_FORMAT, 0x00000401); mmio_region_write32(isp_wrapper->base_addr, MI_MP_OUTPUT_FIFO_SIZE, 0x00000000); - mmio_region_write32(isp_wrapper->base_addr, MI_MP_Y_PIC_WIDTH, frame_width); - mmio_region_write32(isp_wrapper->base_addr, MI_MP_Y_PIC_HEIGHT, frame_height); + mmio_region_write32(isp_wrapper->base_addr, MI_MP_Y_PIC_WIDTH, frame_h_size); + mmio_region_write32(isp_wrapper->base_addr, MI_MP_Y_PIC_HEIGHT, frame_v_size); mmio_region_write32(isp_wrapper->base_addr, MI_MP_Y_PIC_SIZE, - frame_width * frame_height); + frame_h_size * frame_v_size); mmio_region_write32(isp_wrapper->base_addr, SRSZ_CTRL, 0x000001c0); mmio_region_write32(isp_wrapper->base_addr, SRSZ_SCALE_HY, 0x0000546d); mmio_region_write32(isp_wrapper->base_addr, SRSZ_SCALE_HCB, 0x0000db23); @@ -389,27 +390,27 @@ // raw:320x240, byp:320x240 dif_result_t dif_isp_wrapper_set_raw_320x240_byp_320x240_en( const dif_isp_wrapper_t *isp_wrapper) { - return _dif_isp_wrapper_set_raw_byp_en(isp_wrapper, 0x140, 0xf0, 0x5a000000, - 0x5a01a000, 0x5a01a000, 0x5a020000, - 0x5a03a000, 0x5a03a000); + return _dif_isp_wrapper_set_raw_byp_en(isp_wrapper, 0x140, 0xf0, 0x2, 0x2, + 0x5a000000, 0x5a01a000, 0x5a01a000, + 0x5a020000, 0x5a03a000, 0x5a03a000); } // ISP configuration: // raw:320x240, byp:320x240, hps image address: 0x00300000 dif_result_t dif_isp_wrapper_set_ml_mem_byp_320x240_en( const dif_isp_wrapper_t *isp_wrapper) { - return _dif_isp_wrapper_set_raw_byp_en(isp_wrapper, 0x140, 0xf0, 0x5a300000, - 0x5a320000, 0x5a320000, 0x5a340000, - 0x5a360000, 0x5a360000); + return _dif_isp_wrapper_set_raw_byp_en(isp_wrapper, 0x140, 0xf0, 0x2, 0x2, + 0x5a300000, 0x5a320000, 0x5a320000, + 0x5a340000, 0x5a360000, 0x5a360000); } // ISP configuration: // raw:324x324, byp:324x324 dif_result_t dif_isp_wrapper_set_raw_324x324_byp_324x324_en( const dif_isp_wrapper_t *isp_wrapper) { - return _dif_isp_wrapper_set_raw_byp_en(isp_wrapper, 0x144, 0x144, 0x5a000000, - 0x5a01a000, 0x5a01a000, 0x5a034000, - 0x5a04e000, 0x5a04e000); + return _dif_isp_wrapper_set_raw_byp_en(isp_wrapper, 0x144, 0x144, 0x0, 0x0, + 0x5a000000, 0x5a01a000, 0x5a01a000, + 0x5a034000, 0x5a04e000, 0x5a04e000); } dif_result_t dif_isp_wrapper_clear_en(const dif_isp_wrapper_t *isp_wrapper) {
diff --git a/sw/device/tests/smc/smc_cam_i2c_test.c b/sw/device/tests/smc/smc_cam_i2c_test.c index 64d27d2..e31bcb8 100644 --- a/sw/device/tests/smc/smc_cam_i2c_test.c +++ b/sw/device/tests/smc/smc_cam_i2c_test.c
@@ -40,6 +40,27 @@ static volatile bool isp_frame_done_irq_seen = false; +static void handle_isp_wrapper_isrs(const dif_rv_plic_irq_id_t interrupt_id) { + // NOTE: This initialization is superfluous, since the `default` case below + // is effectively noreturn, but the compiler is unable to prove this. + const uint32_t mp_frame_end_mask = 0x1; + uint32_t mi_mis; + switch (interrupt_id) { + case kTopMatchaPlicIrqIdIspWrapperIsp: + CHECK_DIF_OK(dif_isp_wrapper_isp_irq_done(&isp_wrapper)); + break; + case kTopMatchaPlicIrqIdIspWrapperMi: + CHECK_DIF_OK(dif_isp_wrapper_read_mi_mis(&isp_wrapper, &mi_mis)); + if (mi_mis & mp_frame_end_mask) { + isp_frame_done_irq_seen = true; + } + CHECK_DIF_OK(dif_isp_wrapper_mi_irq_done(&isp_wrapper)); + break; + default: + LOG_FATAL("ISR is not implemented!"); + } +} + void ottf_external_isr(void) { dif_rv_plic_irq_id_t interrupt_id; CHECK_DIF_OK(dif_rv_plic_irq_claim(&plic, kTopMatchaPlicTargetIbex0Smc, @@ -56,17 +77,7 @@ break; } case kTopMatchaPlicPeripheralIspWrapper: { - uint32_t mi_mis, isp_mis; - CHECK_DIF_OK(dif_isp_wrapper_read_mi_mis(&isp_wrapper, &mi_mis)); - CHECK_DIF_OK(dif_isp_wrapper_read_isp_mis(&isp_wrapper, &isp_mis)); - CHECK_DIF_OK(dif_isp_wrapper_write_isp_icr(&isp_wrapper, isp_mis)); - CHECK_DIF_OK(dif_isp_wrapper_write_mi_icr(&isp_wrapper, mi_mis)); - CHECK_DIF_OK(dif_isp_wrapper_irq_acknowledge_all(&isp_wrapper)); - - if (isp_mis & (1 << 5)) { - isp_frame_done_irq_seen = true; - } - + handle_isp_wrapper_isrs(interrupt_id); break; } default: @@ -91,16 +102,18 @@ // Configure interrupts for camera and ISP. CHECK_DIF_OK(camera_hm01b0_irq_init(&plic, kTopMatchaPlicTargetIbex0Smc)); + CHECK_DIF_OK(dif_rv_plic_irq_set_priority( + &plic, kTopMatchaPlicIrqIdIspWrapperIsp, kDifRvPlicMaxPriority)); + CHECK_DIF_OK(dif_rv_plic_irq_set_priority( + &plic, kTopMatchaPlicIrqIdIspWrapperMi, kDifRvPlicMaxPriority)); + CHECK_DIF_OK(dif_rv_plic_target_set_threshold( + &plic, kTopMatchaPlicTargetIbex0Smc, kDifRvPlicMinPriority)); CHECK_DIF_OK(dif_rv_plic_irq_set_enabled( &plic, kTopMatchaPlicIrqIdIspWrapperIsp, kTopMatchaPlicTargetIbex0Smc, kDifToggleEnabled)); CHECK_DIF_OK(dif_rv_plic_irq_set_enabled( &plic, kTopMatchaPlicIrqIdIspWrapperMi, kTopMatchaPlicTargetIbex0Smc, kDifToggleEnabled)); - CHECK_DIF_OK(dif_rv_plic_irq_set_priority( - &plic, kTopMatchaPlicIrqIdIspWrapperIsp, kDifRvPlicMaxPriority)); - CHECK_DIF_OK(dif_rv_plic_irq_set_priority( - &plic, kTopMatchaPlicIrqIdIspWrapperMi, kDifRvPlicMaxPriority)); irq_global_ctrl(true); irq_external_ctrl(true);