#include "os_types.h" #include "os_mem.h" #include "dbg_io.h" #include "iot_diag.h" #include "iot_io.h" #include "ddr_reg_rf.h" #include "dmc_reg_rf.h" #include "hw_reg_api.h" #include "ahb.h" #if 0 #include "input.h" #include "ref.h" #endif #include "ahb_rf.h" #include "dvp_rf.h" #include "k3d_reg.h" #include "ai_glb_reg.h" // ############################################################################ // common define #define REG32(a) (*((volatile uint32_t *)(a))) // common define end // ############################################################################ // ############################################################################ // ddr define #define MODE_REGISTER_WRITE 0xc0 #define MODE_REGISTER_READ 0x40 #define DDR_BASE 0x55228000 #define DDR_POERATION_INT_MEM3_ADDR (DDR_BASE + 0x11c) #define DDR_RST_CFG_ADDR (DDR_BASE + 0x4) typedef enum ddr_dev_x8_x16_mode { DEV_X8_MODE = 0, DEV_X16_MODE = 1, }ddr_dev_x8_x16_mode_t; // ddr define end // ############################################################################ // ############################################################################ // ai define #define AI_INNER_RAM0_ADDR 0x73000000 #define AI_INNER_RAM1_ADDR 0x73020000 #define AI_INNER_RAM_START_ADDR 0x10000 #define AI_INNER_RAM_END_ADDR 0x12000 #define AI_DDR_START_ADDR 0x0 #define K3D_SUB_P 1 #define K3D_CACHE_PRIME_ADDR 0x20000000 #define DVP_CACHE_START0_ADDR 0x400000 #define DVP_CACHE_START3_ADDR 0x600000 enum { DVP_MODE_RAW = 0, DVP_MODE_BINA = 1, } dvp_mode_t; typedef struct _dvp_crop { uint8_t ena; uint16_t x0; uint16_t y0; uint16_t x1; uint16_t y1; } dvp_crop_t; typedef struct _dvp_reg_cfg { uint8_t mode; dvp_crop_t crop; } dvp_reg_cfg_t; // ############################################################################ void dvp_module_crop_cfg(dvp_crop_t *crop) { uint32_t tmp; if (crop->ena) { tmp = DVP_RF0_READ_REG(CFG_CROP_CFG0_ADDR); REG_FIELD_SET(CROP_X0_SHD, tmp, crop->x0); REG_FIELD_SET(CROP_Y0_SHD, tmp, crop->y0); DVP_RF0_WRITE_REG(CFG_CROP_CFG0_ADDR, tmp); tmp = DVP_RF0_READ_REG(CFG_CROP_CFG1_ADDR); REG_FIELD_SET(CROP_X1_SHD, tmp, crop->x1); REG_FIELD_SET(CROP_Y1_SHD, tmp, crop->y1); DVP_RF0_WRITE_REG(CFG_CROP_CFG1_ADDR, tmp); tmp = DVP_RF0_READ_REG(CFG_DCAM_CTRL_ADDR); REG_FIELD_SET(CROP_EN_SHD, tmp, 1); // crop enable DVP_RF0_WRITE_REG(CFG_BINA_AEC_ADDR, tmp); } else { tmp = DVP_RF0_READ_REG(CFG_DCAM_CTRL_ADDR); REG_FIELD_SET(CROP_EN_SHD, tmp, 0); // crop enable DVP_RF0_WRITE_REG(CFG_BINA_AEC_ADDR, tmp); } } void dvp_module_cfg(dvp_reg_cfg_t *cfg) { uint32_t tmp; // source config tmp = DVP_RF0_READ_REG(CFG_SOURCE_CFG_ADDR); REG_FIELD_SET(DTYPE, tmp, 0x4); REG_FIELD_SET(DVP_SLOW_MODE, tmp, 1); REG_FIELD_SET(DWIDTH, tmp, 0); REG_FIELD_SET(SOURCE_EDIAN, tmp, 1); REG_FIELD_SET(BIT_EDIAN, tmp, 1); REG_FIELD_SET(SRC_SEL, tmp, 1); REG_FIELD_SET(FRAME_SRC_MODE, tmp, 0); REG_FIELD_SET(CFG_BIN_RAM_FULL, tmp, 1); DVP_RF0_WRITE_REG(CFG_SOURCE_CFG_ADDR, tmp); // des cfg tmp = DVP_RF0_READ_REG(CFG_DES_CFG_ADDR); REG_FIELD_SET(DES_CFG_SHD, tmp, 0x1); // 0: REGB888 1: Y 2: YUV422 DVP_RF0_WRITE_REG(CFG_DES_CFG_ADDR, tmp); // crop config dvp_module_crop_cfg(&(cfg->crop)); if (cfg->mode == DVP_MODE_BINA) { // set start ddr address tmp = DVP_RF0_READ_REG(CFG_START_ADDR0_ADDR); REG_FIELD_SET(START_ADDR0, tmp, 0); DVP_RF0_WRITE_REG(CFG_START_ADDR0_ADDR, tmp); tmp = DVP_RF0_READ_REG(CFG_START_ADDR3_ADDR); REG_FIELD_SET(START_ADDR3, tmp, 0); DVP_RF0_WRITE_REG(CFG_START_ADDR3_ADDR, tmp); // row col cnt for dvp tmp = DVP_RF0_READ_REG(CFG_RAW_ROW_CNT_ADDR); REG_FIELD_SET(RAW_ROW_CNT_SHD, tmp, 720); DVP_RF0_WRITE_REG(CFG_RAW_ROW_CNT_ADDR, tmp); tmp = DVP_RF0_READ_REG(CFG_RAW_COL_CNT_ADDR); REG_FIELD_SET(RAW_COL_CNT_SHD, tmp, 1024); DVP_RF0_WRITE_REG(CFG_RAW_COL_CNT_ADDR, tmp); // bina config tmp = DVP_RF0_READ_REG(CFG_BINA_CTRL_ADDR); REG_FIELD_SET(BINA_EN_SHD, tmp, 0x1); // bina en shd REG_FIELD_SET(BINA_STORE_EN, tmp, 0x0); // 0: ram 1: ram & psram REG_FIELD_SET(BINA_BLOCK_SEL_SHD, tmp, 1); // 0: 7X7 1: 9X9 DVP_RF0_WRITE_REG(CFG_BINA_CTRL_ADDR, tmp); // bina factor tmp = DVP_RF0_READ_REG(CFG_BINA_FACTOR_ADDR); REG_FIELD_SET(BINA_THOSD_SHD, tmp, 0x5); REG_FIELD_SET(BINA_C1_SHD, tmp, 0x21); REG_FIELD_SET(BINA_C2_SHD, tmp, 0x7); DVP_RF0_WRITE_REG(CFG_BINA_FACTOR_ADDR, tmp); // bina frame addr tmp = DVP_RF0_READ_REG(CFG_BINA_FRAME_ADDR_ADDR); REG_FIELD_SET(FRAME_END_ADDR_RF, tmp, 0x72FF); REG_FIELD_SET(FRAME_ADDR_SW, tmp, 0); DVP_RF0_WRITE_REG(CFG_BINA_FRAME_ADDR_ADDR, tmp); // bina aec tmp = DVP_RF0_READ_REG(CFG_BINA_AEC_ADDR); REG_FIELD_SET(BINA_AEC_EN_RF, tmp, 1); DVP_RF0_WRITE_REG(CFG_BINA_AEC_ADDR, tmp); // dcam ctrl tmp = DVP_RF0_READ_REG(CFG_DCAM_CTRL_ADDR); REG_FIELD_SET(DVP_EN_SHD, tmp, 1); REG_FIELD_SET(CROP_EN_SHD, tmp, 1); // crop enable REG_FIELD_SET(RAW_Y_EN_SHD, tmp, 0); // raw y disable REG_FIELD_SET(FRAME_EN_RF_SHD, tmp, 1); // rx frame enable REG_FIELD_SET(BURST_LEN_SHD, tmp, 0x1f); // burst len 0-63, unit is byte DVP_RF0_WRITE_REG(CFG_DCAM_CTRL_ADDR, tmp); } else if (cfg->mode == DVP_MODE_RAW) { // ena int tmp = DVP_RF0_READ_REG(CFG_DVP_INT_ENA_ADDR); REG_FIELD_SET(DCAM_FRM_DONE_ENA, tmp, 1); DVP_RF0_WRITE_REG(CFG_DVP_INT_ENA_ADDR, tmp); // set start ddr address tmp = DVP_RF0_READ_REG(CFG_START_ADDR0_ADDR); REG_FIELD_SET(START_ADDR0, tmp, DVP_CACHE_START0_ADDR);// offset : 4M DVP_RF0_WRITE_REG(CFG_START_ADDR0_ADDR, tmp); tmp = DVP_RF0_READ_REG(CFG_START_ADDR3_ADDR); REG_FIELD_SET(START_ADDR3, tmp, DVP_CACHE_START3_ADDR); // offset : 6M DVP_RF0_WRITE_REG(CFG_START_ADDR3_ADDR, tmp); // row col cnt for dvp tmp = DVP_RF0_READ_REG(CFG_RAW_ROW_CNT_ADDR); REG_FIELD_SET(RAW_ROW_CNT_SHD, tmp, 720); DVP_RF0_WRITE_REG(CFG_RAW_ROW_CNT_ADDR, tmp); tmp = DVP_RF0_READ_REG(CFG_RAW_COL_CNT_ADDR); REG_FIELD_SET(RAW_COL_CNT_SHD, tmp, 1280); DVP_RF0_WRITE_REG(CFG_RAW_COL_CNT_ADDR, tmp); // disable bina en tmp = DVP_RF0_READ_REG(CFG_BINA_CTRL_ADDR); REG_FIELD_SET(BINA_EN_SHD, tmp, 0x0); // bina en shd DVP_RF0_WRITE_REG(CFG_BINA_CTRL_ADDR, tmp); // dest vitual width tmp = DVP_RF0_READ_REG(CFG_DS_CFG_ADDR); REG_FIELD_SET(DST_VIRTUAL_WIDTH, tmp, 1024); // virtual width DVP_RF0_WRITE_REG(CFG_DS_CFG_ADDR, tmp); // dcam ctrl tmp = DVP_RF0_READ_REG(CFG_DCAM_CTRL_ADDR); REG_FIELD_SET(DVP_EN_SHD, tmp, 1); REG_FIELD_SET(CROP_EN_SHD, tmp, 1); // crop enable REG_FIELD_SET(RAW_Y_EN_SHD, tmp, 1); // raw y en REG_FIELD_SET(FRAME_EN_RF_SHD, tmp, 1); // rx frame enable REG_FIELD_SET(BURST_LEN_SHD, tmp, 0x1f); // burst len 0-63, unit is byte DVP_RF0_WRITE_REG(CFG_DCAM_CTRL_ADDR, tmp); } else { return; } return; } void ai_ref_pic_capture() { // capture a picture for reference uint32_t tmp; tmp = AI_GLB_READ_REG(CFG_AI_GLB_CFG0_ADDR); REG_FIELD_SET(REF_PIC_CAPTURE, tmp, 1); AI_GLB_WRITE_REG(CFG_AI_GLB_CFG0_ADDR, tmp); } #if 0 void ai_depth_ref_test() { uint32_t tmp; uint32_t x_pixel, y_pixel; uint32_t ai_trans_len; // prepare org data, and put it in the first ai ram #if 0 uint8_t *input = (uint8_t *) AI_INNER_RAM0_ADDR; os_mem_cpy(input, input_bin, input_bin_len); uint8_t *ref = (uint8_t *) AI_INNER_RAM1_ADDR; os_mem_cpy(ref, ref_bin, ref_bin_len); #else volatile uint8_t *reg = (volatile uint8_t *) AI_INNER_RAM0_ADDR; volatile uint8_t *reg1 = (volatile uint8_t *) AI_INNER_RAM1_ADDR; for(uint32_t i = 0; i < 1024; i++) { *(reg + i) = i; } for(uint32_t i = 0; i < 1024; i++) { *(reg1 + i) = i + 1; } #endif // prepare ref data, and put it in the second ai ram // k3d config // k3d enable // k3d enable && reset tmp = AHB_RF_READ_REG(CFG_AHB_REG1_ADDR); tmp |= 0x80; tmp |= 0x800; AHB_RF_WRITE_REG(CFG_AHB_REG1_ADDR, tmp); tmp = AHB_RF_READ_REG(CFG_AHB_REG0_ADDR); tmp |= 0x80; tmp |= 0x800; AHB_RF_WRITE_REG(CFG_AHB_REG0_ADDR, tmp); tmp = AHB_RF_READ_REG(CFG_AHB_REG0_ADDR); tmp &= ~0x80; tmp &= ~0x800; AHB_RF_WRITE_REG(CFG_AHB_REG0_ADDR, tmp); tmp = AI_GLB_READ_REG(CFG_AI_GLB_CFG0_ADDR); REG_FIELD_SET(K3D_ENA, tmp, 1); REG_FIELD_SET(REF_PIC_CAPTURE, tmp, 1); // set this to 1, for cratch ref AI_GLB_WRITE_REG(CFG_AI_GLB_CFG0_ADDR, tmp); // set img 640*720 x_pixel = 1024; y_pixel = 720; tmp = K3D_READ_REG(CFG_K3D_FRM_CFG_ADDR); REG_FIELD_SET(FRM_Y_MAX, tmp, y_pixel); REG_FIELD_SET(FRM_X_MAX, tmp, x_pixel); K3D_WRITE_REG(CFG_K3D_FRM_CFG_ADDR, tmp); // k3d frame config tmp = K3D_READ_REG(CFG_K3D_RFRM_INI_ADDR); REG_FIELD_SET(RFRM_Y_INI, tmp, 0xFF3); REG_FIELD_SET(RFRM_X_INI, tmp, 0xFFE); K3D_WRITE_REG(CFG_K3D_RFRM_INI_ADDR, tmp); tmp = K3D_READ_REG(CFG_K3D_RBLK_CFG_ADDR); REG_FIELD_SET(RFRM_X_EXD, tmp, 2); REG_FIELD_SET(RBLK_US_MAX, tmp, 3); REG_FIELD_SET(RBLK_LS_MAX, tmp, 105); REG_FIELD_SET(RBLK_Y_MAX, tmp, 42); K3D_WRITE_REG(CFG_K3D_RBLK_CFG_ADDR, tmp); tmp = K3D_READ_REG(CFG_K3D_CBLK_CFG_ADDR); REG_FIELD_SET(CFRM_Y_INI, tmp, 0xFF4); REG_FIELD_SET(CBLK_Y_MAX, tmp, 40); K3D_WRITE_REG(CFG_K3D_CBLK_CFG_ADDR, tmp); tmp = K3D_READ_REG(CFG_K3D_MISC_CFG_ADDR); REG_FIELD_SET(BLK_CHK_ENA, tmp, 1); #if K3D_SUB_P REG_FIELD_SET(BLK_SUBP_ENA, tmp, 1); #else REG_FIELD_SET(BLK_SUBP_ENA, tmp, 0); #endif REG_FIELD_SET(BLK_START_Y, tmp, 0xF); REG_FIELD_SET(BLK_START_X, tmp, 0xCC); K3D_WRITE_REG(CFG_K3D_MISC_CFG_ADDR, tmp); tmp = K3D_READ_REG(CFG_K3D_OUT_CFG_ADDR); REG_FIELD_SET(BLK_VLD_TH, tmp, 0xFF); REG_FIELD_SET(BLK_SUM_CFG, tmp, 0xFF); REG_FIELD_SET(BLK_VEC_CFG, tmp, 0x0740); K3D_WRITE_REG(CFG_K3D_OUT_CFG_ADDR, tmp); tmp = K3D_READ_REG(CFG_K3D_DONE_ST_ADDR); //REG_FIELD_SET(K3D_INT_ENA, tmp, 0); REG_FIELD_SET(K3D_DONE, tmp, 0); K3D_WRITE_REG(CFG_K3D_DONE_ST_ADDR, tmp); // ai global register config ai_trans_len = x_pixel * y_pixel * 2 / 4; // dword tmp = AI_GLB_READ_REG(CFG_AI_MST_CFG1_ADDR); REG_FIELD_SET(AI_MST_TRANS_LEN, tmp, ai_trans_len); AI_GLB_WRITE_REG(CFG_AI_MST_CFG1_ADDR, tmp); uint32_t ai_k3d_16l_len; ai_k3d_16l_len = x_pixel * 16 * 2 / 4; // dword tmp = AI_GLB_READ_REG(CFG_AI_MST_CFG2_ADDR); REG_FIELD_SET(AI_K3D_16L_LEN, tmp, ai_k3d_16l_len); AI_GLB_WRITE_REG(CFG_AI_MST_CFG2_ADDR, tmp); // ram offset, unit is word tmp = AI_GLB_READ_REG(CFG_AI_RAM_SADDR_ADDR); REG_FIELD_SET(AI_MST_RAM_SADDR, tmp, AI_INNER_RAM_START_ADDR); AI_GLB_WRITE_REG(CFG_AI_RAM_SADDR_ADDR, tmp); // ram offset, unit is word tmp = AI_GLB_READ_REG(CFG_AI_RAM_EADDR_ADDR); REG_FIELD_SET(AI_MST_RAM_EADDR, tmp, AI_INNER_RAM_END_ADDR); AI_GLB_WRITE_REG(CFG_AI_RAM_EADDR_ADDR, tmp); // ddr offset, unit is word tmp = AI_GLB_READ_REG(CFG_AI_DMC_SADDR_ADDR); REG_FIELD_SET(AI_MST_DMC_SADDR, tmp, AI_DDR_START_ADDR); AI_GLB_WRITE_REG(CFG_AI_DMC_SADDR0_ADDR, tmp); tmp = AI_GLB_READ_REG(CFG_AI_MST_ST_ADDR); REG_FIELD_SET(K3D_OUT_RAM_EMP, tmp, 0); REG_FIELD_SET(K3D_OUT_RAM_FULL, tmp, 0); REG_FIELD_SET(K3D_OUT_RAM_RPTR, tmp, 0); REG_FIELD_SET(K3D_OUT_RAM_WPTR, tmp, 0); REG_FIELD_SET(DCAM_BIN_RAM_FORCE_DONE, tmp, 0); REG_FIELD_SET(DCAM_BIN_RAM_EMP, tmp, 0); REG_FIELD_SET(DCAM_BIN_RAM_FULL, tmp, 0); REG_FIELD_SET(DCAM_BIN_RAM_RPTR, tmp, 0); REG_FIELD_SET(DCAM_BIN_RAM_WPTR, tmp, 0); REG_FIELD_SET(AI_MST_DONE, tmp, 0); AI_GLB_WRITE_REG(CFG_AI_MST_ST_ADDR, tmp); tmp = AI_GLB_READ_REG(CFG_AI_MST_CFG0_ADDR); REG_FIELD_SET(AI_MST_BURST_LEN, tmp, 64); REG_FIELD_SET(AI_MST_K3D_MODE, tmp, 1); REG_FIELD_SET(AI_MST_RW, tmp, 0); REG_FIELD_SET(AI_MST_ENA, tmp, 1); AI_GLB_WRITE_REG(CFG_AI_MST_CFG0_ADDR, tmp); tmp = K3D_READ_REG(CFG_K3D_CTRL_ADDR); REG_FIELD_SET(K3D_OUT_SW_MAX, tmp, 0x45); REG_FIELD_SET(K3D_MODE, tmp, 0x3); REG_FIELD_SET(K3D_AUTO_ENA, tmp, 0); REG_FIELD_SET(K3D_SUM_OUT_ENA, tmp, 0); REG_FIELD_SET(K3D_FORCE_START, tmp, 1); K3D_WRITE_REG(CFG_K3D_CTRL_ADDR, tmp); // dvp bina mode, and with crop dvp_reg_cfg_t dvp_cfg = {0}; dvp_cfg.mode = DVP_MODE_BINA; dvp_cfg.crop.ena = 1; dvp_cfg.crop.x0 = 0xff; dvp_cfg.crop.y0 = 0x0; dvp_cfg.crop.x1 = 0x4ff; dvp_cfg.crop.y1 = 0x2d0; dvp_module_cfg(&dvp_cfg); while(1) { tmp = K3D_READ_REG(CFG_K3D_DONE_ST_ADDR); if (tmp & 0x1) { iot_printf("k3d done\n"); break; } } // todo dump data from ddr while(1) { } } #endif void ai_ram_auto_mode_cfg() { uint32_t tmp; // dvp enable, ai disable tmp = AHB_RF_READ_REG(CFG_AHB_REG1_ADDR); REG_FIELD_SET(AI_EB, tmp, 0); REG_FIELD_SET(DVP0_EB, tmp, 1); AHB_RF_WRITE_REG(CFG_AHB_REG1_ADDR, tmp); tmp = AHB_RF_READ_REG(CFG_AHB_REG0_ADDR); REG_FIELD_SET(AI_SOFT_RST, tmp, 1); REG_FIELD_SET(DVP0_SOFT_RST, tmp, 1); AHB_RF_WRITE_REG(CFG_AHB_REG0_ADDR, tmp); tmp = AHB_RF_READ_REG(CFG_AHB_REG0_ADDR); REG_FIELD_SET(DVP0_SOFT_RST, tmp, 0); AHB_RF_WRITE_REG(CFG_AHB_REG0_ADDR, tmp); dvp_reg_cfg_t dvp_cfg = {0}; dvp_cfg.mode = DVP_MODE_RAW; dvp_cfg.crop.ena = 1; dvp_cfg.crop.x0 = 0x1; dvp_cfg.crop.y0 = 0x0; dvp_cfg.crop.x1 = 0x400; dvp_cfg.crop.y1 = 0x2cf; dvp_module_cfg(&dvp_cfg); } // auto mode: ddr output address : 0x0, size: 1024 * 720 * 2 void ai_depth_auto_mode_cfg() { uint32_t tmp; uint32_t x_pixel, y_pixel; uint32_t ai_trans_len; // k3d config // ai dvp enable && reset tmp = AHB_RF_READ_REG(CFG_AHB_REG1_ADDR); REG_FIELD_SET(AI_EB, tmp, 1); REG_FIELD_SET(DVP0_EB, tmp, 1); AHB_RF_WRITE_REG(CFG_AHB_REG1_ADDR, tmp); tmp = AHB_RF_READ_REG(CFG_AHB_REG0_ADDR); REG_FIELD_SET(AI_SOFT_RST, tmp, 1); REG_FIELD_SET(DVP0_SOFT_RST, tmp, 1); AHB_RF_WRITE_REG(CFG_AHB_REG0_ADDR, tmp); tmp = AHB_RF_READ_REG(CFG_AHB_REG0_ADDR); REG_FIELD_SET(AI_SOFT_RST, tmp, 0); REG_FIELD_SET(DVP0_SOFT_RST, tmp, 0); AHB_RF_WRITE_REG(CFG_AHB_REG0_ADDR, tmp); tmp = AI_GLB_READ_REG(CFG_AI_GLB_CFG0_ADDR); REG_FIELD_SET(K3D_ENA, tmp, 1); AI_GLB_WRITE_REG(CFG_AI_GLB_CFG0_ADDR, tmp); // set img 640*720 x_pixel = 1024; y_pixel = 720; tmp = K3D_READ_REG(CFG_K3D_FRM_CFG_ADDR); REG_FIELD_SET(FRM_Y_MAX, tmp, y_pixel); REG_FIELD_SET(FRM_X_MAX, tmp, x_pixel); K3D_WRITE_REG(CFG_K3D_FRM_CFG_ADDR, tmp); // k3d frame config tmp = K3D_READ_REG(CFG_K3D_RFRM_INI_ADDR); REG_FIELD_SET(RFRM_Y_INI, tmp, 0xFF3); REG_FIELD_SET(RFRM_X_INI, tmp, 0xFFE); K3D_WRITE_REG(CFG_K3D_RFRM_INI_ADDR, tmp); tmp = K3D_READ_REG(CFG_K3D_RBLK_CFG_ADDR); REG_FIELD_SET(RFRM_X_EXD, tmp, 2); REG_FIELD_SET(RBLK_US_MAX, tmp, 3); REG_FIELD_SET(RBLK_LS_MAX, tmp, 105); REG_FIELD_SET(RBLK_Y_MAX, tmp, 42); K3D_WRITE_REG(CFG_K3D_RBLK_CFG_ADDR, tmp); tmp = K3D_READ_REG(CFG_K3D_CBLK_CFG_ADDR); REG_FIELD_SET(CFRM_Y_INI, tmp, 0xFF4); REG_FIELD_SET(CBLK_Y_MAX, tmp, 40); K3D_WRITE_REG(CFG_K3D_CBLK_CFG_ADDR, tmp); tmp = K3D_READ_REG(CFG_K3D_MISC_CFG_ADDR); REG_FIELD_SET(BLK_CHK_ENA, tmp, 1); #if K3D_SUB_P REG_FIELD_SET(BLK_SUBP_ENA, tmp, 1); #else REG_FIELD_SET(BLK_SUBP_ENA, tmp, 0); #endif REG_FIELD_SET(BLK_START_Y, tmp, 0xF); REG_FIELD_SET(BLK_START_X, tmp, 0xCC); K3D_WRITE_REG(CFG_K3D_MISC_CFG_ADDR, tmp); tmp = K3D_READ_REG(CFG_K3D_OUT_CFG_ADDR); REG_FIELD_SET(BLK_VLD_TH, tmp, 0xFF); REG_FIELD_SET(BLK_SUM_CFG, tmp, 0xFF); REG_FIELD_SET(BLK_VEC_CFG, tmp, 0x0740); K3D_WRITE_REG(CFG_K3D_OUT_CFG_ADDR, tmp); tmp = K3D_READ_REG(CFG_K3D_DONE_ST_ADDR); REG_FIELD_SET(K3D_DONE, tmp, 0); K3D_WRITE_REG(CFG_K3D_DONE_ST_ADDR, tmp); // ai global register config ai_trans_len = x_pixel * y_pixel * 2 / 4; // dword tmp = AI_GLB_READ_REG(CFG_AI_MST_CFG1_ADDR); REG_FIELD_SET(AI_MST_TRANS_LEN, tmp, ai_trans_len); AI_GLB_WRITE_REG(CFG_AI_MST_CFG1_ADDR, tmp); uint32_t ai_k3d_16l_len; ai_k3d_16l_len = x_pixel * 16 * 2 / 4; // dword tmp = AI_GLB_READ_REG(CFG_AI_MST_CFG2_ADDR); REG_FIELD_SET(AI_K3D_16L_LEN, tmp, ai_k3d_16l_len); AI_GLB_WRITE_REG(CFG_AI_MST_CFG2_ADDR, tmp); // ram offset, unit is word tmp = AI_GLB_READ_REG(CFG_AI_RAM_SADDR_ADDR); REG_FIELD_SET(AI_MST_RAM_SADDR, tmp, AI_INNER_RAM_START_ADDR); AI_GLB_WRITE_REG(CFG_AI_RAM_SADDR_ADDR, tmp); // ram offset, unit is word tmp = AI_GLB_READ_REG(CFG_AI_RAM_EADDR_ADDR); REG_FIELD_SET(AI_MST_RAM_EADDR, tmp, AI_INNER_RAM_END_ADDR); AI_GLB_WRITE_REG(CFG_AI_RAM_EADDR_ADDR, tmp); // ddr offset, unit is word tmp = AI_GLB_READ_REG(CFG_AI_DMC_SADDR0_ADDR); REG_FIELD_SET(AI_MST_DMC_SADDR0, tmp, AI_DDR_START_ADDR); AI_GLB_WRITE_REG(CFG_AI_DMC_SADDR0_ADDR, tmp); tmp = AI_GLB_READ_REG(CFG_AI_MST_ST_ADDR); REG_FIELD_SET(K3D_OUT_RAM_EMP, tmp, 0); REG_FIELD_SET(K3D_OUT_RAM_FULL, tmp, 0); REG_FIELD_SET(K3D_OUT_RAM_RPTR, tmp, 0); REG_FIELD_SET(K3D_OUT_RAM_WPTR, tmp, 0); REG_FIELD_SET(DCAM_FRM_FORCE_DONE, tmp, 0); REG_FIELD_SET(DCAM_BIN_RAM_EMP, tmp, 0); REG_FIELD_SET(DCAM_BIN_RAM_FULL, tmp, 0); REG_FIELD_SET(DCAM_BIN_RAM_RPTR, tmp, 0); REG_FIELD_SET(DCAM_BIN_RAM_WPTR, tmp, 0); REG_FIELD_SET(AI_MST_DONE, tmp, 0); AI_GLB_WRITE_REG(CFG_AI_MST_ST_ADDR, tmp); tmp = AI_GLB_READ_REG(CFG_AI_MST_CFG0_ADDR); REG_FIELD_SET(AI_MST_BURST_LEN, tmp, 64); REG_FIELD_SET(AI_MST_K3D_MODE, tmp, 1); REG_FIELD_SET(AI_MST_RW, tmp, 0); REG_FIELD_SET(AI_MST_ENA, tmp, 1); AI_GLB_WRITE_REG(CFG_AI_MST_CFG0_ADDR, tmp); tmp = K3D_READ_REG(CFG_K3D_CTRL_ADDR); REG_FIELD_SET(K3D_OUT_SW_MAX, tmp, 0x45); REG_FIELD_SET(K3D_MODE, tmp, 0x3); REG_FIELD_SET(K3D_AUTO_ENA, tmp, 1); //REG_FIELD_SET(K3D_AUTO_ENA, tmp, 0); REG_FIELD_SET(K3D_SUM_OUT_ENA, tmp, 0); REG_FIELD_SET(K3D_FORCE_START, tmp, 0); //REG_FIELD_SET(K3D_FORCE_START, tmp, 1); K3D_WRITE_REG(CFG_K3D_CTRL_ADDR, tmp); dvp_reg_cfg_t dvp_cfg = {0}; dvp_cfg.mode = DVP_MODE_BINA; dvp_cfg.crop.ena = 1; dvp_cfg.crop.x0 = 0xff; dvp_cfg.crop.y0 = 0x0; dvp_cfg.crop.x1 = 0x4ff; dvp_cfg.crop.y1 = 0x2d0; dvp_module_cfg(&dvp_cfg); #if 0 // test case: when ai master done, uint32_t g_cnt = 0; while(1) { while(1) { tmp = AI_GLB_READ_REG(CFG_AI_MST_ST_ADDR); if (tmp & 0x1) { iot_printf("ai master done: %d\n", g_cnt); g_cnt++; // debug: auto ena disable tmp = K3D_READ_REG(CFG_K3D_CTRL_ADDR); REG_FIELD_SET(K3D_AUTO_ENA, tmp, 0); K3D_WRITE_REG(CFG_K3D_CTRL_ADDR, tmp); // todo: data transfer // debug: auto ena enable tmp = K3D_READ_REG(CFG_K3D_CTRL_ADDR); REG_FIELD_SET(K3D_AUTO_ENA, tmp, 1); K3D_WRITE_REG(CFG_K3D_CTRL_ADDR, tmp); break; } } // clear master done tmp = AI_GLB_READ_REG(CFG_AI_MST_ST_ADDR); tmp &= ~0x1; AI_GLB_WRITE_REG(CFG_AI_MST_ST_ADDR, tmp); // clear k3d done tmp = K3D_READ_REG(CFG_K3D_DONE_ST_ADDR); tmp &= ~0x1; K3D_WRITE_REG(CFG_K3D_DONE_ST_ADDR, tmp); // enable ai master or k3d force enable tmp = AI_GLB_READ_REG(CFG_AI_MST_CFG0_ADDR); tmp |= 0x1; AI_GLB_WRITE_REG(CFG_AI_MST_CFG0_ADDR, tmp); } #endif } void ai_poll_done() { uint32_t tmp; uint32_t g_cnt = 0; while(1) { while(1) { tmp = AI_GLB_READ_REG(CFG_AI_MST_ST_ADDR); if (tmp & 0x1) { iot_printf("ai master done: %d\n", g_cnt); g_cnt++; // debug: auto ena disable tmp = K3D_READ_REG(CFG_K3D_CTRL_ADDR); REG_FIELD_SET(K3D_AUTO_ENA, tmp, 0); K3D_WRITE_REG(CFG_K3D_CTRL_ADDR, tmp); // clear master done tmp = AI_GLB_READ_REG(CFG_AI_MST_ST_ADDR); tmp &= ~0x1; AI_GLB_WRITE_REG(CFG_AI_MST_ST_ADDR, tmp); // clear k3d done tmp = K3D_READ_REG(CFG_K3D_DONE_ST_ADDR); tmp &= ~0x1; AI_GLB_WRITE_REG(CFG_K3D_DONE_ST_ADDR, tmp); // todo: data transfer // debug: auto ena enable tmp = K3D_READ_REG(CFG_K3D_CTRL_ADDR); REG_FIELD_SET(K3D_AUTO_ENA, tmp, 1); K3D_WRITE_REG(CFG_K3D_CTRL_ADDR, tmp); // break; } } // ai master enable tmp = AI_GLB_READ_REG(CFG_AI_MST_CFG0_ADDR); REG_FIELD_SET(AI_MST_ENA, tmp, 1); AI_GLB_WRITE_REG(CFG_AI_MST_CFG0_ADDR, tmp); } } uint32_t dvp_get_frame_address() { return 0x18000000; } uint32_t dvp_check_frame_done() { #if 1 uint32_t tmp; tmp = DVP_RF0_READ_REG(CFG_DVP_INT_RAW_ADDR); return REG_FIELD_GET(TX_FRAME_OVER_RAW, tmp); #endif } void dvp_clear_frame_done() { uint32_t tmp; tmp = DVP_RF0_READ_REG(CFG_DVP_INT_CLR_ADDR); REG_FIELD_SET(TX_FRAME_OVER_CLR, tmp, 1); DVP_RF0_WRITE_REG(CFG_DVP_INT_CLR_ADDR, tmp); } void dvp_disable_ram_auto() { uint32_t tmp; //tmp = DVP_RF0_READ_REG(CFG_DCAM_CTRL_ADDR); tmp = 0; DVP_RF0_WRITE_REG(CFG_DCAM_CTRL_ADDR, tmp); } void dvp_enable_ram_auto() { uint32_t tmp; // dcam ctrl tmp = DVP_RF0_READ_REG(CFG_DCAM_CTRL_ADDR); REG_FIELD_SET(DVP_EN_SHD, tmp, 1); REG_FIELD_SET(CROP_EN_SHD, tmp, 1); // crop enable REG_FIELD_SET(RAW_Y_EN_SHD, tmp, 1); // raw y disable REG_FIELD_SET(FRAME_EN_RF_SHD, tmp, 1); // rx frame enable REG_FIELD_SET(BURST_LEN_SHD, tmp, 0x1f); // burst len 0-63, unit is byte DVP_RF0_WRITE_REG(CFG_DCAM_CTRL_ADDR, tmp); } uint32_t dvp_get_idle_frame_addr() { uint32_t tmp; tmp = DVP_RF0_READ_REG(CFG_DES_CFG_ADDR); if(REG_FIELD_GET(EMC_ADDR_FLAG, tmp) == 1) { tmp = DVP_RF0_READ_REG(CFG_START_ADDR3_ADDR); return (REG_FIELD_GET(START_ADDR3, tmp) + K3D_CACHE_PRIME_ADDR); } else { tmp = DVP_RF0_READ_REG(CFG_START_ADDR0_ADDR); return (REG_FIELD_GET(START_ADDR0, tmp) + K3D_CACHE_PRIME_ADDR); } } uint32_t ai_get_frame_address() { return K3D_CACHE_PRIME_ADDR; } uint32_t ai_check_master_done() { uint32_t tmp; tmp = AI_GLB_READ_REG(CFG_AI_MST_ST_ADDR); return REG_FIELD_GET(AI_MST_DONE, tmp); } void ai_disable_auto() { uint32_t tmp; tmp = K3D_READ_REG(CFG_K3D_CTRL_ADDR); REG_FIELD_SET(K3D_AUTO_ENA, tmp, 0); K3D_WRITE_REG(CFG_K3D_CTRL_ADDR, tmp); } void ai_enable_auto() { uint32_t tmp; tmp = K3D_READ_REG(CFG_K3D_CTRL_ADDR); REG_FIELD_SET(K3D_AUTO_ENA, tmp, 1); K3D_WRITE_REG(CFG_K3D_CTRL_ADDR, tmp); } void ai_clear_master_done() { uint32_t tmp; // clear master done tmp = AI_GLB_READ_REG(CFG_AI_MST_ST_ADDR); tmp &= ~0x1; AI_GLB_WRITE_REG(CFG_AI_MST_ST_ADDR, tmp); // clear k3d done tmp = K3D_READ_REG(CFG_K3D_DONE_ST_ADDR); tmp &= ~0x1; K3D_WRITE_REG(CFG_K3D_DONE_ST_ADDR, tmp); } void ai_enable_master() { uint32_t tmp; tmp = AI_GLB_READ_REG(CFG_AI_MST_CFG0_ADDR); REG_FIELD_SET(AI_MST_ENA, tmp, 1); AI_GLB_WRITE_REG(CFG_AI_MST_CFG0_ADDR, tmp); }