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);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 |