778 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			778 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
 | |
| #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);
 | |
| }
 | |
| 
 | |
| 
 |