// Dummy AP #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define THIS_IS_EVB #define BOTH_MD_ON //#define CCIF_DVT //#define DEFAULT_META //#define ENABLE_MD_RESET_SPM //#define ENABLE_MD_RESET_RGU //#define IGNORE_MD_WDT #ifdef ENABLE_MD_RESET_SPM #include #endif //#define TEMP_COTSX // request by Sw Huang #define MAX_MD_NUM (2) #define MAX_IMG_NUM (8) #define PART_HEADER_MAGIC (0x58881688) #define BOOT_ARGS_ADDR (0x87F00000) #define IMG_HEADER_ADDR (0x87F00000+1024) #define GIC_PRIVATE_SIGNALS (32) #define MT_MD_WDT1_IRQ_ID (253) #define MT_MD_WDT2_IRQ_ID (261) #define MD1_BANK0_MAP0 (0x10000300) #define MD2_BANK0_MAP0 (0x10000310) #define C2K_CONFIG (0x10000330) #define C2K_STATUS (0x10000334) #define C2K_SPM_CTRL (0x10000338) #define SLEEP_CLK_CON (0x10006400) //#define TOPRGU_BASE (0x10212000) #define TOP_RGU_WDT_MODE (TOPRGU_BASE+0x0) #define TOP_RGU_WDT_SWRST (TOPRGU_BASE+0x14) #define TOP_RGU_WDT_SWSYSRST (TOPRGU_BASE+0x18) #define TOP_RGU_WDT_NONRST_REG (TOPRGU_BASE+0x20) #define C2K_CHIP_ID (0x3a00b01c) typedef enum{ DUMMY_AP_IMG = 0, MD1_IMG, MD1_RAM_DISK, MD2_IMG, MD2_RAM_DISK, MD_DSP }img_idx_t; typedef struct _map { char name[32]; img_idx_t idx; }map_t; #if 0 typedef union { struct { unsigned int magic; /* partition magic */ unsigned int dsize; /* partition data size */ char name[32]; /* partition name */ unsigned int maddr; /* partition memory address */ } info; unsigned char data[512]; } part_hdr_t; // Notice for MT6582 // Update LK BOOT_ARGUMENT structure typedef struct { unsigned int magic_number; BOOTMODE boot_mode; unsigned int e_flag; unsigned int log_port; unsigned int log_baudrate; unsigned char log_enable; unsigned char part_num; unsigned char reserved[2]; unsigned int dram_rank_num; unsigned int dram_rank_size[4]; unsigned int boot_reason; unsigned int meta_com_type; unsigned int meta_com_id; unsigned int boot_time; da_info_t da_info; SEC_LIMIT sec_limit; part_hdr_t *part_info; } BOOT_ARGUMENT; #endif extern BOOT_ARGUMENT *g_boot_arg; //static BOOT_ARGUMENT *boot_args=BOOT_ARGS_ADDR; //static unsigned int *img_header_array = (unsigned int*)IMG_HEADER_ADDR; static unsigned int img_load_flag = 0; static part_hdr_t *img_info_start = NULL; static unsigned int img_addr_tbl[MAX_IMG_NUM]; static unsigned int img_size_tbl[MAX_IMG_NUM]; static map_t map_tbl[] = { {"DUMMY_AP", DUMMY_AP_IMG}, {"MD_IMG", MD1_IMG}, {"MD_RAM_DISK", MD1_RAM_DISK}, {"MD_DSP", MD_DSP}, {"MD2_IMG", MD2_IMG}, {"MD2_RAM_DISK", MD2_RAM_DISK}, }; extern int mt_set_gpio_mode_chip(unsigned int pin, unsigned int mode); void pmic_init_sequence(void); void md_uart_config(int md_id); int parse_img_header(unsigned int *start_addr, unsigned int img_num) { unsigned int i, j; int idx; if(start_addr == NULL) { printf("parse_img_header get invalid parameters!\n"); return -1; } img_info_start = (part_hdr_t*)start_addr; for(i=0; iboot_mode != NORMAL_BOOT) boot_mode = 1; printf("Meta mode: %d, boot_mode: %d\n", boot_mode, g_boot_arg->boot_mode); return boot_mode; } static void md_gpio_get(GPIO_PIN pin, char *tag) { printf("GPIO(%X)(%s): mode=%d,dir=%d,in=%d,out=%d,pull_en=%d,pull_sel=%d,smt=%d\n", pin, tag, mt_get_gpio_mode(pin), mt_get_gpio_dir(pin), mt_get_gpio_in(pin), mt_get_gpio_out(pin), mt_get_gpio_pull_enable(pin), mt_get_gpio_pull_select(pin), mt_get_gpio_smt(pin)); } static void md_gpio_set(GPIO_PIN pin, GPIO_MODE mode, GPIO_DIR dir, GPIO_OUT out, GPIO_PULL_EN pull_en, GPIO_PULL pull, GPIO_SMT smt) { mt_set_gpio_mode(pin, mode); if(dir != GPIO_DIR_UNSUPPORTED) mt_set_gpio_dir(pin, dir); if(dir == GPIO_DIR_OUT) { mt_set_gpio_out(pin, out); } if(dir == GPIO_DIR_IN) { mt_set_gpio_smt(pin, smt); } if(pull_en != GPIO_PULL_EN_UNSUPPORTED) { mt_set_gpio_pull_enable(pin, pull_en); mt_set_gpio_pull_select(pin, pull); } md_gpio_get(pin, "-"); } static void md_gpio_config(unsigned int boot_md_id) { // init sim1 mt_set_gpio_dir(GPIO_SIM1_SCLK, GPIO_DIR_OUT); mt_set_gpio_dir(GPIO_SIM1_SRST, GPIO_DIR_OUT); mt_set_gpio_pull_enable(GPIO_SIM1_SIO, GPIO_PULL_ENABLE); mt_set_gpio_pull_select(GPIO_SIM1_SIO, GPIO_PULL_UP); mt_set_gpio_dir(GPIO_SIM1_SIO, GPIO_DIR_IN); mt_set_gpio_pull_enable(GPIO_SIM1_HOT_PLUG, GPIO_PULL_ENABLE); mt_set_gpio_pull_select(GPIO_SIM1_HOT_PLUG, GPIO_PULL_UP); mt_set_gpio_dir(GPIO_SIM1_HOT_PLUG, GPIO_DIR_IN); // init sim2 mt_set_gpio_dir(GPIO_SIM2_SCLK, GPIO_DIR_OUT); mt_set_gpio_dir(GPIO_SIM2_SRST, GPIO_DIR_OUT); mt_set_gpio_pull_enable(GPIO_SIM2_SIO, GPIO_PULL_ENABLE); mt_set_gpio_pull_select(GPIO_SIM2_SIO, GPIO_PULL_UP); mt_set_gpio_dir(GPIO_SIM2_SIO, GPIO_DIR_IN); mt_set_gpio_pull_enable(GPIO_SIM2_HOT_PLUG, GPIO_PULL_ENABLE); mt_set_gpio_pull_select(GPIO_SIM2_HOT_PLUG, GPIO_PULL_UP); mt_set_gpio_dir(GPIO_SIM2_HOT_PLUG, GPIO_DIR_IN); switch(boot_md_id) { case 0: //SIM1=> MD1 SIM1IF mt_set_gpio_mode(GPIO_SIM1_SCLK, GPIO_SIM1_SCLK_M_CLK); mt_set_gpio_mode(GPIO_SIM1_SRST, GPIO_SIM1_SRST_M_MD_SIM1_SRST); mt_set_gpio_mode(GPIO_SIM1_SIO, GPIO_SIM1_SIO_M_MD_SIM1_SDAT); mt_set_gpio_mode(GPIO_SIM1_HOT_PLUG, GPIO_SIM1_HOT_PLUG_M_MDEINT); //SIM2=> MD1 SIM2IF mt_set_gpio_mode(GPIO_SIM2_SCLK, GPIO_SIM2_SCLK_M_CLK); mt_set_gpio_mode(GPIO_SIM2_SRST, GPIO_SIM2_SRST_M_MD_SIM2_SRST); mt_set_gpio_mode(GPIO_SIM2_SIO, GPIO_SIM2_SIO_M_MD_SIM2_SDAT); mt_set_gpio_mode(GPIO_SIM2_HOT_PLUG, GPIO_SIM2_HOT_PLUG_M_MDEINT); break; case 1: //SIM1=> MD2 UIM0IF mt_set_gpio_mode(GPIO_SIM1_SCLK, GPIO_SIM1_SCLK_M_UIM0_CLK); mt_set_gpio_mode(GPIO_SIM1_SRST, GPIO_SIM1_SRST_M_UIM0_RST); mt_set_gpio_mode(GPIO_SIM1_SIO, GPIO_SIM1_SIO_M_UIM0_IO); mt_set_gpio_mode(GPIO_SIM1_HOT_PLUG, GPIO_SIM1_HOT_PLUG_M_C2K_UIM0_HOT_PLUG_IN); //SIM2=> MD2 UIM1IF mt_set_gpio_mode(GPIO_SIM2_SCLK, GPIO_SIM2_SIO_M_UIM1_IO); mt_set_gpio_mode(GPIO_SIM2_SRST, GPIO_SIM2_SRST_M_UIM1_RST); mt_set_gpio_mode(GPIO_SIM2_SIO, GPIO_SIM2_SIO_M_UIM1_IO); mt_set_gpio_mode(GPIO_SIM2_HOT_PLUG, GPIO_SIM2_HOT_PLUG_M_C2K_UIM1_HOT_PLUG_IN); break; case 2: //SIM1=> MD1 SIM1IF mt_set_gpio_mode(GPIO_SIM1_SCLK, GPIO_SIM1_SCLK_M_CLK); mt_set_gpio_mode(GPIO_SIM1_SRST, GPIO_SIM1_SRST_M_MD_SIM1_SRST); mt_set_gpio_mode(GPIO_SIM1_SIO, GPIO_SIM1_SIO_M_MD_SIM1_SDAT); mt_set_gpio_mode(GPIO_SIM1_HOT_PLUG, GPIO_SIM1_HOT_PLUG_M_MDEINT); //SIM2=> MD2 UIM0IF mt_set_gpio_mode(GPIO_SIM2_SCLK, GPIO_SIM2_SCLK_M_UIM0_CLK); mt_set_gpio_mode(GPIO_SIM2_SRST, GPIO_SIM2_SRST_M_UIM0_RST); mt_set_gpio_mode(GPIO_SIM2_SIO, GPIO_SIM2_SIO_M_UIM0_IO); mt_set_gpio_mode(GPIO_SIM2_HOT_PLUG, GPIO_SIM2_HOT_PLUG_M_C2K_UIM1_HOT_PLUG_IN); break; default: break; } md_gpio_get(GPIO_SIM1_SCLK, "sclk"); md_gpio_get(GPIO_SIM1_SRST, "srst"); md_gpio_get(GPIO_SIM1_SIO, "sio"); md_gpio_get(GPIO_SIM1_HOT_PLUG, "hp"); md_gpio_get(GPIO_SIM2_SCLK, "sclk2"); md_gpio_get(GPIO_SIM2_SRST, "srst2"); md_gpio_get(GPIO_SIM2_SIO, "sio2"); md_gpio_get(GPIO_SIM2_HOT_PLUG, "hp2"); #ifndef MACH_TYPE_MT6735M // only for D-1&3 if(boot_md_id == 1) { // BPI #ifndef BOTH_MD_ON md_gpio_set(GPIO87, GPIO_MODE_05, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO88, GPIO_MODE_05, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO89, GPIO_MODE_05, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO90, GPIO_MODE_05, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO91, GPIO_MODE_05, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO92, GPIO_MODE_05, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO93, GPIO_MODE_05, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO94, GPIO_MODE_05, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO95, GPIO_MODE_05, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO96, GPIO_MODE_05, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); #endif // ARM GPIO/GPINT md_gpio_set(GPIO3, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO2, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO1, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO0, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); // DSPM GPIO md_gpio_set(GPIO4, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); // ARM legacy JATG md_gpio_set(GPIO82, GPIO_MODE_05, GPIO_DIR_IN, GPIO_OUT_UNSUPPORTED, GPIO_PULL_ENABLE, GPIO_PULL_DOWN, GPIO_SMT_ENABLE); md_gpio_set(GPIO81, GPIO_MODE_05, GPIO_DIR_IN, GPIO_OUT_UNSUPPORTED, GPIO_PULL_ENABLE, GPIO_PULL_UP, GPIO_SMT_ENABLE); md_gpio_set(GPIO83, GPIO_MODE_05, GPIO_DIR_IN, GPIO_OUT_UNSUPPORTED, GPIO_PULL_ENABLE, GPIO_PULL_UP, GPIO_SMT_DISABLE); md_gpio_set(GPIO85, GPIO_MODE_05, GPIO_DIR_IN, GPIO_OUT_UNSUPPORTED, GPIO_PULL_ENABLE, GPIO_PULL_UP, GPIO_SMT_DISABLE); md_gpio_set(GPIO84, GPIO_MODE_05, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO86, GPIO_MODE_05, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); // DSP JTAG #ifdef THIS_IS_EVB md_gpio_set(GPIO199, GPIO_MODE_07, GPIO_DIR_IN, GPIO_OUT_UNSUPPORTED, GPIO_PULL_ENABLE, GPIO_PULL_UP, GPIO_SMT_ENABLE); md_gpio_set(GPIO198, GPIO_MODE_07, GPIO_DIR_IN, GPIO_OUT_UNSUPPORTED, GPIO_PULL_ENABLE, GPIO_PULL_UP, GPIO_SMT_DISABLE); md_gpio_set(GPIO200, GPIO_MODE_07, GPIO_DIR_IN, GPIO_OUT_UNSUPPORTED, GPIO_PULL_ENABLE, GPIO_PULL_UP, GPIO_SMT_DISABLE); md_gpio_set(GPIO201, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO202, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); #else md_gpio_set(GPIO71, GPIO_MODE_06, GPIO_DIR_IN, GPIO_OUT_UNSUPPORTED, GPIO_PULL_ENABLE, GPIO_PULL_UP, GPIO_SMT_ENABLE); md_gpio_set(GPIO70, GPIO_MODE_06, GPIO_DIR_IN, GPIO_OUT_UNSUPPORTED, GPIO_PULL_ENABLE, GPIO_PULL_UP, GPIO_SMT_DISABLE); md_gpio_set(GPIO72, GPIO_MODE_06, GPIO_DIR_IN, GPIO_OUT_UNSUPPORTED, GPIO_PULL_ENABLE, GPIO_PULL_UP, GPIO_SMT_DISABLE); md_gpio_set(GPIO73, GPIO_MODE_06, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO46, GPIO_MODE_05, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); #endif // C2K UART0 #ifdef THIS_IS_EVB // covered in uart config //md_gpio_set(GPIO75, GPIO_MODE_05, GPIO_DIR_OUT, GPIO_OUT_ONE, GPIO_PULL_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); //md_gpio_set(GPIO74, GPIO_MODE_05, GPIO_DIR_IN, GPIO_OUT_UNSUPPORTED, GPIO_PULL_ENABLE, GPIO_PULL_UP, GPIO_SMT_DISABLE); #else md_uart_config(-1); md_gpio_set(GPIO199, GPIO_MODE_03, GPIO_DIR_OUT, GPIO_OUT_ONE, GPIO_PULL_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO198, GPIO_MODE_03, GPIO_DIR_IN, GPIO_OUT_UNSUPPORTED, GPIO_PULL_ENABLE, GPIO_PULL_UP, GPIO_SMT_DISABLE); #endif // C2K DropZone assert md_gpio_set(GPIO63, GPIO_MODE_00, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); // debug port #ifdef THIS_IS_EVB md_gpio_set(GPIO13, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO14, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO15, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO16, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO17, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO18, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO19, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO20, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO21, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO42, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO43, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO44, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO45, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO57, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO58, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO59, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO60, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO61, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO62, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO63, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO64, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO65, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO66, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO67, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO68, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO78, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO79, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO80, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO120, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); md_gpio_set(GPIO10, GPIO_MODE_07, GPIO_DIR_OUT, GPIO_OUT_ZERO, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); #endif } #endif } static void md_emi_remapping(unsigned int boot_md_id) { unsigned int md_img_start_addr = 0; unsigned int md_emi_remapping_addr = 0; switch(boot_md_id) { case 0: // MD1 md_img_start_addr = img_addr_tbl[MD1_IMG] - 0x40000000; md_emi_remapping_addr = MD1_BANK0_MAP0; break; case 1: // MD2 md_img_start_addr = img_addr_tbl[MD2_IMG] - 0x40000000; md_emi_remapping_addr = MD2_BANK0_MAP0; break; default: break; } printf("---> Map 0x00000000 to 0x%x for MD%d\n", md_img_start_addr+0x40000000, boot_md_id+1); // For MDx_BANK0_MAP0 *((volatile unsigned int*)md_emi_remapping_addr) = (((md_img_start_addr >> 24) | 1) & 0xFF) \ + ((((md_img_start_addr + 0x02000000) >> 16) | 1<<8) & 0xFF00) \ + ((((md_img_start_addr + 0x04000000) >> 8) | 1<<16) & 0xFF0000) \ + ((((md_img_start_addr + 0x06000000) >> 0) | 1<<24) & 0xFF000000); // For MDx_BANK0_MAP1 *((volatile unsigned int*)(md_emi_remapping_addr + 0x4)) = ((((md_img_start_addr + 0x08000000) >> 24) | 1) & 0xFF) \ + ((((md_img_start_addr + 0x0A000000) >> 16) | 1<<8) & 0xFF00) \ + ((((md_img_start_addr + 0x0C000000) >> 8) | 1<<16) & 0xFF0000) \ + ((((md_img_start_addr + 0x0E000000) >> 0) | 1<<24) & 0xFF000000); printf("---> MD_BANK0_MAP0=0x%x, MD_BANK0_MAP1=0x%x\n", *((volatile unsigned int*)md_emi_remapping_addr), *((volatile unsigned int*)(md_emi_remapping_addr + 0x4))); } static void md_power_up_mtcmos(unsigned int boot_md_id) { volatile unsigned int loop = 10000; loop =10000; while(loop-->0); switch(boot_md_id) { case 0://MD 1 #ifdef ENABLE_MD_RESET_SPM spm_mtcmos_ctrl_mdsys1(STA_POWER_ON); #else // default on #endif break; case 1:// MD2 #ifdef ENABLE_MD_RESET_SPM spm_mtcmos_ctrl_mdsys2(STA_POWER_ON); #else // YP Lin will power it on in preloader #endif break; default: break; } } static void md_common_setting(int boot_md_id) { // Put special setting here if needed, ex. Disable WDT volatile unsigned int *md_wdt; switch(boot_md_id) { case 0: md_wdt = (volatile unsigned int*)0x20050000; printf("Disable MD1 WDT\n"); *md_wdt = 0x220E; mdelay(5); break; case 1: // C2K MD's WDT is dsiabled by default break; default: break; } } static void md_boot_up(unsigned int boot_md_id, unsigned int is_meta_mode) { unsigned int reg_value; switch(boot_md_id) { case 0:// For MD1 #ifdef TEMP_COTSX pmic_config_interface(0x0F08, 0x8040, 0xFFFF, 0x0); pmic_config_interface(0x0F0E, 0x8040, 0xFFFF, 0x0); pmic_config_interface(0x0F12, 0x0004, 0xFFFF, 0x0); #endif // step 1: enable VSRAM md_gpio_set(GPIO_LTE_VSRAM_EXT_POWER_EN_PIN, GPIO_MODE_00, GPIO_DIR_OUT, GPIO_OUT_ONE, GPIO_PULL_EN_UNSUPPORTED, GPIO_PULL_UNSUPPORTED, GPIO_SMT_UNSUPPORTED); // step 2: md1_srcclkena and md2_srcclkena in C2K_SPM_CTRL *((volatile unsigned int*)C2K_SPM_CTRL) &= ~(0xF<<2); *((volatile unsigned int*)C2K_SPM_CTRL) |= (0x9<<2); printf("C2K_SPM_CTRL = 0x%x\n", *((volatile unsigned int*)C2K_SPM_CTRL)); // MD1 will init and configure PMIC by itself // step 3: set META Register if(is_meta_mode) { *((volatile unsigned int*)0x20000010) |= 0x1; // Bit0, Meta mode flag, this need sync with MD init owner } // step 4: set boot slave *((volatile unsigned int*)0x2019379C) = 0x3567C766; // Key Register *((volatile unsigned int*)0x20190000) = 0x0; // Vector Register *((volatile unsigned int*)0x20195488) = 0xA3B66175; // Slave En Register break; case 1:// For MD2 // C2K MD does not need META mode // step 1: set C2K boot mode reg_value = *((volatile unsigned int*)C2K_CONFIG); *((volatile unsigned int*)C2K_CONFIG) = (reg_value&(~(0x7<<8)))|(0x5<<8); printf("C2K_CONFIG = 0x%x\n", *((volatile unsigned int*)C2K_CONFIG)); // step 2: config srcclkena selection mask *((volatile unsigned int*)C2K_SPM_CTRL) &= ~(0xF<<2); *((volatile unsigned int*)C2K_SPM_CTRL) |= (0x9<<2); printf("C2K_SPM_CTRL = 0x%x\n", *((volatile unsigned int*)C2K_SPM_CTRL)); *((volatile unsigned int*)SLEEP_CLK_CON) |= 0xc; *((volatile unsigned int*)SLEEP_CLK_CON) &= ~(0x1<<14); *((volatile unsigned int*)SLEEP_CLK_CON) |= (0x1<<12); *((volatile unsigned int*)SLEEP_CLK_CON) |= (0x1<<27); printf("SLEEP_CLK_CON = 0x%x\n", *((volatile unsigned int*)SLEEP_CLK_CON)); // step 3: PMIC VTCXO_1 VRF18_1 VIO18 enable pmic_init_sequence(); pmic_config_interface(0x0A02, 0xA12E, 0xFFFF, 0x0); pmic_config_interface(0x0A16, 0x8102, 0xFFFF, 0x0); pmic_config_interface(0x0A36, 0x8102, 0xFFFF, 0x0); // step 4: reset C2K reg_value = *((volatile unsigned int*)TOP_RGU_WDT_SWSYSRST); *((volatile unsigned int*)TOP_RGU_WDT_SWSYSRST) = (reg_value|0x88000000)&(~(0x1<<15)); printf("TOP_RGU_WDT_SWSYSRST = 0x%x, TOPRGU_BASE(0x%x)\n", *((volatile unsigned int*)TOP_RGU_WDT_SWSYSRST), TOPRGU_BASE); // step 5: wake up C2K *((volatile unsigned int*)C2K_SPM_CTRL) |= 0x1; while(!((*((volatile unsigned int*)C2K_STATUS)>>1)&0x1)){ printf("C2K_STATUS = 0x%x\n", *((volatile unsigned int*)C2K_STATUS)); } *((volatile unsigned int*)C2K_SPM_CTRL) &= ~0x1; printf("C2K_SPM_CTRL = 0x%x, C2K_STATUS = 0x%x\n", *((volatile unsigned int*)C2K_SPM_CTRL), *((volatile unsigned int*)C2K_STATUS)); while(*((volatile unsigned int*)C2K_CHIP_ID) != 0x020AC000) { printf("C2K_CHIP_ID = 0x%x\n", *((volatile unsigned int*)C2K_CHIP_ID)); } printf("C2K_CHIP_ID = 0x%x!!\n", *((volatile unsigned int*)C2K_CHIP_ID)); break; default: break; } } int md_jtag_config(int boot_md_id) { return 0; } int get_input(void) { return uart_getc(); } void apply_env_setting(int case_id) { printf("Apply case:%d setting for dummy AP!\n", case_id); } void md_uart_config(int type_id) { switch(type_id) { case -1: // for AP only case 0: // for AP & MD1 case 1: // for AP & MD2 case 2: // for both MD1 and MD2 printf("md_uart_config:%d, UART1->MD3, UART2->MD1, UART3->AP, UART4->disabled\n", type_id); mt_set_gpio_mode(GPIO_UART_URXD0_PIN, GPIO_UART_URXD0_PIN_M_C2K_UART0_RXD); mt_set_gpio_mode(GPIO_UART_UTXD0_PIN, GPIO_UART_UTXD0_PIN_M_C2K_UART0_TXD); mt_set_gpio_mode(GPIO_UART_URXD1_PIN, GPIO_UART_URXD1_PIN_M_MD_URXD); mt_set_gpio_mode(GPIO_UART_UTXD1_PIN, GPIO_UART_UTXD1_PIN_M_MD_UTXD); mt_set_gpio_mode(GPIO_UART_URXD2_PIN, GPIO_UART_URXD2_PIN_M_URXD); mt_set_gpio_mode(GPIO_UART_UTXD2_PIN, GPIO_UART_UTXD2_PIN_M_UTXD); mt_set_gpio_mode(GPIO_UART_URXD3_PIN, GPIO_UART_URXD3_PIN_M_GPIO); mt_set_gpio_mode(GPIO_UART_UTXD3_PIN, GPIO_UART_UTXD3_PIN_M_GPIO); break; default: break; } } static void let_md_go(int md_id) { unsigned int is_meta_mode = 0; // 1, Configure EMI remapping setting printf("Step 1: Configure EMI remapping...\n"); md_emi_remapping(md_id); // 2, Power up MD MTCMOS //printf("Step 3: Power up MD!\n"); md_power_up_mtcmos(md_id); // 3, Configure DAP for ICE to connect to MD printf("Step 2: Configure DAP for ICE to connect to MD!\n"); md_jtag_config(md_id); // 4, Check boot Mode #ifdef DEFAULT_META is_meta_mode = 1; #else is_meta_mode = meta_detection(); #endif printf("Step 3: Notify MD enter %s mode!\n", is_meta_mode ? "META" : "NORMAL"); // 5, MD register setting printf("Step 4: MD Common setting!\n"); md_common_setting(md_id); // 6, Boot up MD printf("Step 5: MD%d boot up with meta(%d)!\n", md_id+1, is_meta_mode); md_boot_up(md_id, is_meta_mode); printf("\nmd%d boot up done!\n", md_id + 1); } void md_wdt_init(void) { if(img_load_flag &(1<ap_state = AP_NOT_READY; sync_data_region->md_state = MD_NOT_READY; sync_data_region->test_case = 0; ccif_debug("AP_MD_Test_Sync_Init 99 \n"); } void Set_AP_MD_Sync_Share_Memory(unsigned int ptr) { enum {AP_IN_INIT_DONE=0x12345678, AP_WRITE_DATA_DONE}; enum {MD_IN_INIT_DONE=0x87654321, MD_GET_DATA_DONE}; ccif_debug("Check if MD init done 0x%x\n", CCIF_Get_ShareData(CCIF_RXCHDATA_OFFSET)); // 1. Notify MD that AP init done ccif_debug("Notify MD that AP init done, addr:0x%x, value:0x%x\n", CCIF_DATA,AP_IN_INIT_DONE); CCIF_Set_ShareData(CCIF_TXCHDATA_OFFSET, AP_IN_INIT_DONE); // 2. Check MD is init done ccif_debug("Check if MD init done, addr:0x%x, value:0x%x\n", (CCIF_DATA + (CCIF_RXCHDATA_OFFSET & (~0x003))), MD_IN_INIT_DONE); while(CCIF_Get_ShareData(CCIF_RXCHDATA_OFFSET)!=MD_IN_INIT_DONE); ccif_debug("Check if MD init done 0x%x\n", CCIF_Get_ShareData(CCIF_RXCHDATA_OFFSET)); // 3. MD ready, notify share memory start addr ccif_debug("AP MD share memroy start addr:%x\n", (unsigned int)ptr); ptr -= img_addr_tbl[MD2_IMG]; // FIXME, hardcode; CCIF_Set_ShareData(CCIF_TXCHDATA_OFFSET+4, (unsigned int)(ptr)); ccif_debug("Notify MD get share memroy start addr:0x%x\n",(unsigned int) ptr); CCIF_Set_ShareData(0, AP_WRITE_DATA_DONE); // 4. Wait MD get data done ccif_debug("Check if MD get data done\n"); while(CCIF_Get_ShareData(CCIF_RXCHDATA_OFFSET)!=MD_GET_DATA_DONE); // 5. Set share memory done, clear ccif shareram ccif_debug("Set_AP_MD_Sync_Share_Memory done\n"); CCIF_Set_ShareData(CCIF_TXCHDATA_OFFSET, 0); CCIF_Set_ShareData(CCIF_TXCHDATA_OFFSET+4, 0); CCIF_Set_ShareData(CCIF_RXCHDATA_OFFSET, 0); } void CCIF_Test_Env_Init(unsigned int ptr) { ccif_debug("CCIF_Test_Env_Init 1\n"); AP_MD_Test_Sync_Init(ptr); ccif_debug("CCIF_Test_Env_Init 2\n"); Set_AP_MD_Sync_Share_Memory(ptr); ccif_debug("CCIF_Test_Env_Init 3\n"); //INFRA_disable_clock(MT65XX_PDN_INFRA_CCIF0); ccif_debug("CCIF_Test_Env_Init 4\n"); AP_MD_Result_Share_Region = (unsigned int*)(ptr+sizeof(sync_flag)*2); } int ts_init_handler() { int ret_val = 0; unsigned int *ptr, *nc_ptr; memset(ccif_msg,0,sizeof(ccif_msg)); ccif_debug("TC init\n"); test_heap_ptr=(unsigned int *)malloc(1024*2); test_nc_heap_ptr=(unsigned int *)malloc(1024*2); ccif_debug("\tTC init step 3\n"); CCIF_Init(); ccif_debug("\tTC init step 4\n"); ap_md_share_heap_ptr = (void *)(img_addr_tbl[MD2_IMG]+0x100000); // FIXME, hardcode ccif_debug("\tTC init step 5\n"); //Let_MD_to_Run(); ccif_debug("\tTC init step 6\n"); CCIF_Test_Env_Init((unsigned int)ap_md_share_heap_ptr); ccif_debug("TC init done.\n"); return ret_val; } void AP_MD_test_case_sync_AP_Side(unsigned int tc) { int i =0; ccif_debug("Enter set_ccif_test_case_sync \n"); // 1. Notify MD that AP ready ccif_debug("Notify MD that AP ready, addr:0x%x, val:0x%x, disr:0x%x\n",(unsigned int)(&(sync_data_region->ap_state)), sync_data_region->ap_state, AP_READY); sync_data_region->ap_state = AP_READY; //arch_sync_cache_range(&sync_data_region, sizeof(sync_data_region)); // 2. Check MD is ready ccif_debug("Check if MD is ready, addr:0x%x, val:0x%x, disr:0x%x\n", (unsigned int)(&(sync_data_region->md_state)),sync_data_region->md_state, AP_READY); while(sync_data_region->md_state!=MD_READY) { ccif_debug("Check AP addr:0x%x, State:%x\n", &(sync_data_region->ap_state), sync_data_region->ap_state); ccif_debug("Check MD addr:0x%x, State:%x, expeted:0x%x\n", &(sync_data_region->md_state), sync_data_region->md_state, MD_READY); }; // 3. MD ready, notify MD test case ID sync_data_region->test_case = tc; ccif_debug("Notify MD test id :%x\n", tc); sync_data_region->ap_state = AP_SYNC_ID_DONE; // 4. Wait MD get tc id done ccif_debug("Check if MD ready to test\n"); while(sync_data_region->md_state!=MD_SYNC_ID_DONE){ ccif_debug("Check AP 2 addr:0x%x, State:%x\n", &(sync_data_region->ap_state), sync_data_region->ap_state); ccif_debug("Wait MD get TC id Done: addr:0x%x, State:%x, expeted:0x%x\n", &(sync_data_region->md_state), sync_data_region->md_state, MD_SYNC_ID_DONE); }; // 5. Finish sysn ccif_debug("AP_MD_test_case_sync_AP_Side done\n"); } void AP_MD_Ready_to_Test_Sync_AP_Side() { ccif_debug("Enter AP_MD_Ready_to_Test_Sync_AP_Side \n"); // 1. Notify MD that AP ready ccif_debug("Notify MD that AP ready\n"); sync_data_region->ap_state = AP_WAIT_BEGIN; // 2. Check MD is ready ccif_debug("Check if MD is ready\n"); while(sync_data_region->md_state!=MD_WAIT_BEGIN); sync_data_region->ap_state=AP_NOT_READY; sync_data_region->md_state=MD_NOT_READY; // 3. MD also ready ccif_debug("Begin to test\n"); } int AP_Get_MD_Test_Result(unsigned int buf[], unsigned int length) { int act_get = 0; unsigned int j; ccif_debug("Enter AP_Get_MD_Test_Result \n"); // 1. Notify MD that AP request test result ccif_debug("Notify MD that AP request test result\n"); sync_data_region->ap_state = AP_REQUST; // 2. Check MD is wait request ccif_debug("Check if MD is wait send result\n"); while(sync_data_region->md_state!=MD_WAIT_REQUST); sync_data_region->ap_state = AP_REQUST_ONGOING; // 3. Wait MD write result done ccif_debug("Wait MD write result done\n"); while(sync_data_region->md_state!=MD_ACK_DONE); // 4. Get Test result for(j=0; (jap_state = AP_REQUST_DONE; return j; } void Set_Isr_Work_Done(unsigned int tc) { printf("CCIF ISR done for TC%d\n", tc); isr_work_done[tc] = 1; } void Reset_Isr_Work_State(unsigned int tc) { isr_work_done[tc] = 0; } int Is_Isr_Work_Done(unsigned int tc) { return isr_work_done[tc]; } static void ccif_seq_isr_cb_for_tc02(unsigned int ch) { unsigned int data[4]; unsigned int seq = test_heap_ptr[0]; unsigned int mis_match = 0; // 1. Read Data Send from MD CCIF_Get_RxData(ch, (unsigned char*)data); // 2. Check sequence if(ch != phy_ch_seq_mode_seq[seq]) { mis_match = (1<<0); ccif_error("AP <== MD seq mode channel seq mis-match(%d!=%d), seq:%d\n",ch,phy_ch_seq_mode_seq[seq], seq); } // 3. Check rx data if( (data[0]==data[1])&&(data[1]==data[2])&&(data[2]==data[3])&& (data[3]==(data_pattern[TC_02]+ch))&&(result_unknow==test_heap_ptr[ch+1]) ) test_heap_ptr[ch+1] = result_pass; else { test_heap_ptr[ch+1] = result_fail; ccif_error("%x != %x \r\n",data[0],data_pattern[TC_02]+ch); } // 4 Update mis-match info if(mis_match){ test_heap_ptr[ch+1] += 1; mis_match = 0; } // 5. Check whether test done seq++; test_heap_ptr[0] = seq; if(test_heap_ptr[0] == CCIF_MAX_PHY) Set_Isr_Work_Done(TC_02); } static void ccif_arb_isr_for_tc04() { unsigned int ch; // 1. Get Channel ch = CCIF_Get_Rch_Num(); if (ch < 1) { ccif_debug("ch = 0, exit abr isr\r\n"); return ; } // 2. Check Rx seq if(ch!=rx_last_time_val){ // Has new data // if( (ch^rx_last_time_val)==(unsigned int)(1< MD sequence test\n"); AP_MD_test_case_sync_AP_Side(TC_01); CCIF_Set_Con(0); CCIF_Register(0); AP_MD_Ready_to_Test_Sync_AP_Side(); for (i = 0; i < CCIF_MAX_PHY; i++) { phy = phy_ch_seq_mode_seq[i]; data[0] = data[1] = data[2] = data[3] = data_pattern[TC_01]+phy; // 1. Busy bit should be zero tmp_busy = CCIF_Get_Busy(); tmp_start = CCIF_Get_Start(); if(tmp_busy&(1< MD result\n"); AP_Get_MD_Test_Result(&md_result, 1); if( (0==md_result)&&(0==error_val) ){ ccif_debug("[TC02]Test pass\n"); return 0; }else{ ccif_error("[TC02]Test fail,md_result=%d,ret=\n",md_result,error_val); return -1; } } int ccif_ap_test_case_03(void) { unsigned int irq, data[4], phy; unsigned int i; unsigned int reg_busy=0, reg_start=0; unsigned int tmp_busy, tmp_start; unsigned int ret=0,md_result = 0; unsigned int last_busy_val=0; ccif_debug("[TC03]AP ==> MD arbitration test\n"); CCIF_Set_Con(1); AP_MD_test_case_sync_AP_Side(TC_03); CCIF_Register(0); AP_MD_Ready_to_Test_Sync_AP_Side(); for (i = 0; i < CCIF_MAX_PHY; i++) { data[0] = data[1] = data[2] = data[3] = data_pattern[TC_03]+i; phy = ccif_phy_arb_mode_seq[i]; // 1. Busy bit should be zero tmp_busy = CCIF_Get_Busy(); tmp_start = CCIF_Get_Start(); if(tmp_busy&(1<part_info, (unsigned int)g_boot_arg->part_num); printf("Begin to configure MD run env!\n"); // 1, Setup special GPIO request (RF/SIM/UART ... etc) printf("Configure GPIO!\n"); if((img_load_flag&((1<