Exemple #1
0
STATIC_PREFIX void debug_write_reg(int argc, char * argv[])
{
    unsigned  reg;
    unsigned  val;
    if(argc<3)
    {
        serial_puts("FAIL:Wrong write reg command\n");
        return;
    }
    if(get_dword(argv[1],&reg)||get_dword(argv[2],&val))
    {
        serial_puts("FAIL:Wrong reg addr=");
        serial_puts(argv[1]);
        serial_puts(" or val=");
        serial_puts(argv[2]);
        serial_putc('\n');
        return;
    }
    serial_puts("OK:Write ");
    serial_put_hex(reg,32);
    serial_putc('=');
    serial_put_hex(val,32);
    serial_putc('\n');
    writel(val,reg);
}
Exemple #2
0
void mmc_wakeup(void)
{
	int stat;
	stat = APB_Rd(MMC_LP_CTRL1);
	serial_put_hex(stat,32);
	f_serial_puts("MMC_LP_CTRL1\n");
	wait_uart_empty();

	stat = APB_Rd(MMC_CLK_CNTL);
	serial_put_hex(stat,32);
	f_serial_puts("MMC_CLK_CNTL\n");
	wait_uart_empty();

	do
	{
		stat = APB_Rd(UPCTL_STAT_ADDR);
		stat &= 0x7;
		if(stat == UPCTL_STAT_LOW_POWER) {
			APB_Wr(UPCTL_SCTL_ADDR, SCTL_CMD_WAKEUP);
			//while(stat != UPCTL_STAT_LOW_POWER);
		}
		else if(stat == UPCTL_STAT_INIT) {
			APB_Wr(UPCTL_SCTL_ADDR, SCTL_CMD_CONFIG);
			//while(stat != UPCTL_STAT_CONFIG);
		}
		else if(stat == UPCTL_STAT_CONFIG) {
			APB_Wr(UPCTL_SCTL_ADDR, SCTL_CMD_GO);
			//while(stat != UPCTL_STAT_ACCESS);
		}
		stat = APB_Rd(UPCTL_STAT_ADDR);
		stat &= 0x7;
	} while(stat != UPCTL_STAT_ACCESS);
}
Exemple #3
0
void mmc_set_power_pin_parameter_4760(int power_pin,u8 off_level)
{
	mmc_power_pin = power_pin;
	serial_puts("\n power_pin==0X");  serial_put_hex(mmc_power_pin);
	power_off_level = off_level;
	serial_puts("\n power_pin_level==0X");  serial_put_hex(power_off_level);
}
Exemple #4
0
unsigned int check_sdram(unsigned int saddr, unsigned int size)
{
#if 0
	 unsigned int addr,err = 0;

	serial_puts("\nCheck SDRAM ... \n");
	saddr += 0xa0000000;
	size += saddr;
	serial_put_hex(saddr);
	serial_put_hex(size);
	saddr &= 0xfffffffc;      //must word align
	for (addr = saddr; addr < size; addr += 4)
	{
		*(volatile unsigned int *)addr = addr;
		if (*(volatile unsigned int *)addr != addr)
		{
			serial_put_hex(addr);
			err = addr;
		}
	}
	if (err)
		serial_puts("Check SDRAM fail!\n");
	else
		serial_puts("Check SDRAM pass!\n");

	return err;
#endif
}
Exemple #5
0
STATIC_PREFIX void show_setting_addr(int argc, char * argv[])
{
#if 0    
    serial_puts("OK:ADDR=");
    serial_put_hex((unsigned)&__ddr_setting,32);
    serial_putc(' ');
    serial_put_hex((unsigned)&__plls,32);
    serial_putc('\n');
#endif    
}
Exemple #6
0
void print_key()
{
    unsigned reg = 0xc8100000;
    unsigned i,data;
    for (i=0;i<0x750;i+=4) {
        data = readl(reg+i);
        serial_put_hex(reg+i,32);
        f_serial_puts("=");
        serial_put_hex(data,32);
        f_serial_puts("\n");
    }
}
Exemple #7
0
static void efuse_dump(void){
	int loo = 0;
	for(loo=0; loo<512; loo++){
		if(loo % 16 == 0){
			serial_puts("\n");
			serial_put_hex(loo, 12);
			serial_puts(": ");
		}
		//efuse_read_byte(loo);
		unsigned int tmp_data = efuse_read_byte(loo);
		serial_put_hex(tmp_data, 8);
		serial_puts(" ");
	}
	serial_puts("\n");
}
Exemple #8
0
// ls
static file_header_t * get_file_header(char* buffer, int buffer_size, char* name)
{
	file_header_t * header = NULL;
	int i;
	//find first empty header & last full header
	for(i=0; i<(HEADER_SECTION_SIZE/sizeof(file_header_t)); i++)
	{
		file_header_t * header = (file_header_t *)(buffer + i * sizeof(file_header_t));
		if (strcmp(header->name, name) == 0)
		{
			serial_put_hex(header->offset); serial_put_hex(header->size);
			return header;
		}
	}
	return NULL;	
}
Exemple #9
0
STATIC_PREFIX void debug_read_reg(int argc, char * argv[])
{
    unsigned  reg;
    if(argc<2)
    {
        serial_puts("FAIL:Wrong read reg command\n");
        return;
    }
    if(get_dword(argv[1],&reg))
    {
        serial_puts("FAIL:Wrong reg addr=");
        serial_puts(argv[1]);
        serial_putc('\n');
        return;
    }
    serial_puts("OK:Read ");
    serial_put_hex(reg,32);
    serial_putc('=');
    serial_put_hex(readl(reg),32);
    serial_putc('\n');
}
void musb_platform_init(void)
{
//	int i = 0;
//       musb->b_dma_share_usb_irq = 1;
//       musb->board_set_vbus = jz_musb_set_vbus;

//        cpm_set_clock(CGU_OTGCLK, JZ_EXTAL);

#ifdef CONFIG_JZ4760 //jz4760b and jz4770 is not support this bit
	/*Clear ECS bit of CPCCR,0:clock source is EXCLK,1:clock source is EXCLK/2*/
	REG_CPM_CPCCR &= (~(CPM_CPCCR_ECS));
#endif
	/*Clear all bits of USBCDR,0:OTG clock source is pin EXCLK,PLL0 output,divider = 1,12MHZ*/
	REG_CPM_USBCDR = 0;

	/*Set CE bit of CPCCR,it means frequence is changed immediately*/
	REG_CPM_CPCCR |= CPM_CPCCR_CE;

        udelay(3);

//        cpm_start_clock(CGM_OTG);

	/*Clear OTG bit of CLKGR0,0:device can be accessed*/
	REG_CPM_CLKGR0 &= (~(CPM_CLKGR0_OTG));
#ifdef DEBUG
	serial_puts_info("**************************MUSB REG INFO*******************************\n");
	serial_puts_info("CPCCR : ");
	serial_put_hex(REG_CPM_CPCCR);
	serial_puts_info("USBCDR : ");
	serial_put_hex(REG_CPM_USBCDR);
	serial_puts_info("CPCCR : ");
	serial_put_hex(REG_CPM_CPCCR);
	serial_puts_info("CLKGR0 : ");
	serial_put_hex(REG_CPM_CLKGR0);
#endif
        jz_musb_init();

	return;
}
Exemple #11
0
static void tcu_dump_reg_hex(void)
{
	TCSM_PCHAR('G');
	serial_put_hex(tcu_readl(CH_TCSR(tcu_channel)));
	serial_put_hex(tcu_readl(CH_TCNT(tcu_channel)));
	serial_put_hex(tcu_readl(TCU_TER));
	serial_put_hex(tcu_readl(TCU_TFR));
	serial_put_hex(tcu_readl(TCU_TMR));
	serial_put_hex(tcu_readl(TCU_TSR));
	serial_put_hex(tcu_readl(TCU_TSTR));
	TCSM_PCHAR('H');
}
Exemple #12
0
int handler(void)
{
	static volatile int i;
	i++;
	TCSM_PCHAR('h');
	TCSM_PCHAR('a');
	TCSM_PCHAR('n');
	TCSM_PCHAR('d');
	TCSM_PCHAR('l');
	TCSM_PCHAR('e');
	serial_put_hex(i);
	xxx_memcopy(dst, src, 4*1024);
	return 0;
}
static inline void jz_musb_init(void)
{
        /* fil */
        REG_CPM_USBVBFIL = 0x80;

#ifdef DEBUG
	serial_puts_info("USBVBFIL : ");
	serial_put_hex(REG_CPM_USBVBFIL);
#endif
        /* rdt */
        REG_CPM_USBRDT = 0x96;

        /* rdt - filload_en */
        REG_CPM_USBRDT |= (1 << 25);

#ifdef DEBUG
	serial_puts_info("USBRDT : ");
	serial_put_hex(REG_CPM_USBRDT);
#endif
        /* TXRISETUNE & TXVREFTUNE. */
        REG_CPM_USBPCR &= ~0x3f;
        REG_CPM_USBPCR |= 0x35;

//        if (is_host_enabled(musb)) {
//                jz_musb_set_normal_mode();
//        }else
                jz_musb_set_device_only_mode();

        jz_musb_phy_reset();

#ifdef DEBUG
	serial_puts_info("USBPCR : ");
	serial_put_hex(REG_CPM_USBPCR);
#endif
        return;
}
Exemple #14
0
static int mmc_found(unsigned int msc_clkrt_val)
{
    int retries;
    u8 *resp;
    int ocr;

    serial_puts("MMC card found!\n");
    resp = mmc_cmd(1, 0x40ff8000, 0x3, MSC_CMDAT_RESPONSE_R3);
    retries = 1000;
    while (retries-- && resp && !(resp[4] & 0x80)) {
        resp = mmc_cmd(1, 0x40300000, 0x3, MSC_CMDAT_RESPONSE_R3);
        ocr = (resp[4] << 24) | (resp[3] << 16) | (resp[2] << 8) | resp[1];
        serial_puts("  ocr = ");
        serial_put_hex(ocr);
        sd_mdelay(10);
    }

    sd_mdelay(10);

    if ((resp[4] & 0x80 )== 0x80)
        serial_puts("MMC init ok\n");
    else {
        serial_puts("MMC init fail\n");
        return -1;
    }
    if((resp[4] & 0x60 ) == 0x40)
        highcap = 1;
    else
        highcap =0;
    /* try to get card id */
    resp = mmc_cmd(2, 0, 0x2, MSC_CMDAT_RESPONSE_R2);
    serial_puts("CID=");
    serial_dump_data(resp, 15);

    resp = mmc_cmd(3, 0x10, 0x1, MSC_CMDAT_RESPONSE_R1);

    REG_MSC_CLKRT = msc_clkrt_val;	/* 16/1 MHz */
    resp = mmc_cmd(7, 0x10, 0x1, MSC_CMDAT_RESPONSE_R1);

    if(BUS_WIDTH == 2) {
        resp = mmc_cmd(6, 0x3b70101, 0x441, MSC_CMDAT_RESPONSE_R1);
    }
    else if(BUS_WIDTH == 0) {
        resp = mmc_cmd(6, 0x3b30001, 0x41, MSC_CMDAT_RESPONSE_R1);
    }
    return 0;
}
Exemple #15
0
STATIC_PREFIX short retry_micron_handle(unsigned retry_cnt)
{
	serial_puts("enter retry_cnt=0x");
	serial_put_hex(retry_cnt,32);
	serial_puts("\n");
		
	writel(CE0 | CLE  | 0xef,P_NAND_CMD);
	writel(CE0 | IDLE,P_NAND_CMD);
	writel(CE0 | ALE  | 0x89,P_NAND_CMD);
	writel(CE0 | IDLE,P_NAND_CMD);
	writel(CE0 | DWR  | (retry_cnt + 1),P_NAND_CMD);
	writel(CE0 | IDLE,P_NAND_CMD);
	writel(CE0 | DWR  | 0,P_NAND_CMD);
	writel(CE0 | IDLE,P_NAND_CMD);
	writel(CE0 | DWR  | 0,P_NAND_CMD);
	writel(CE0 | IDLE,P_NAND_CMD);
	writel(CE0 | DWR  | 0,P_NAND_CMD);
	writel(CE0 | IDLE,P_NAND_CMD);
	return 0;
}
Exemple #16
0
void ddr_data_training(void) {
	int stat;
	//start trainning.
	// DDR PHY initialization
	// UPCTL enter cfg mode.
	MMC_Wr(UPCTL_SCTL_ADDR, 1); // init: 0, cfg: 1, go: 2, sleep: 3, wakeup: 4
	//while ((MMC_Rd(UPCTL_STAT_ADDR) & 0x7 ) != 3 ) {}

	MMC_Wr( PUB_DTAR_ADDR, (0xFc0 | (0xFFFF <<12) | (7 << 28))); //let training address is 0x9fffff00;

	MMC_Wr( PUB_PIR_ADDR, 0x189);
	//MMC_Wr( PUB_PIR_ADDR, 0x69); //no training

	//DDR3_SDRAM_INIT_WAIT :
	while( !(MMC_Rd(PUB_PGSR_ADDR & 1))) {}
	//check data training result
	//check ZQ calibraration status.
	stat = MMC_Rd(PUB_ZQ0SR0_ADDR);
	serial_put_hex(stat,32);
	f_serial_puts(" PUB_ZQ0SR0\n");
	stat = MMC_Rd(PUB_ZQ0SR1_ADDR);
	serial_put_hex(stat,32);
	f_serial_puts(" PUB_ZQ0SR1\n");

	//check data training result.
	stat = MMC_Rd(PUB_DX0GSR0_ADDR);
	serial_put_hex(stat,32);
	f_serial_puts(" PUB_DX0GSR0\n");
	wait_uart_empty();
	stat = MMC_Rd(PUB_DX1GSR0_ADDR);
	serial_put_hex(stat,32);
	f_serial_puts(" PUB_DX1GSR0\n");
	wait_uart_empty();
	stat = MMC_Rd(PUB_DX2GSR0_ADDR);
	serial_put_hex(stat,32);
	f_serial_puts(" PUB_DX2GSR0\n");
	wait_uart_empty();
	stat = MMC_Rd(PUB_DX3GSR0_ADDR);
	serial_put_hex(stat,32);
	f_serial_puts(" PUB_DX3GSR0\n");
	wait_uart_empty();

	dbg_out("d",9);
	MMC_Wr(UPCTL_SCTL_ADDR, 2); // init: 0, cfg: 1, go: 2, sleep: 3, wakeup: 4
	//while ((MMC_Rd(UPCTL_STAT_ADDR) & 0x7 ) != 3 ) {}
}
/**
 * This functions delegates vendor ctrl request.
 */
void do_vendor_request( pcd_struct_t *_pcd, struct usb_ctrlrequest * ctrl)
{
	int			value =0;
	u16			w_index = ctrl->wIndex;
	u16			w_value = ctrl->wValue;
	u16			w_length = ctrl->wLength;
	
	switch (ctrl->bRequest) {

	  case AM_REQ_WRITE_MEM:
		if (ctrl->bRequestType != (USB_DIR_OUT | USB_TYPE_VENDOR |
				USB_RECIP_DEVICE))
				break;
		USB_DBG("--am req write memory\n");
		value = (w_value << 16) + w_index;
		USB_DBG("addr = 0x%08X, size = %d\n\n",value,w_length);
		_pcd->buf = (char *)value; // copy to dst memory directly
		_pcd->length = w_length;
	  	break;

	  case AM_REQ_READ_MEM:
		if (ctrl->bRequestType != (USB_DIR_IN | USB_TYPE_VENDOR |
				USB_RECIP_DEVICE))
				break;
		value = (w_value << 16) + w_index;

		usb_memcpy((char *)buff,(char*)value,w_length);
		
		_pcd->buf = buff;
		_pcd->length = w_length;
	  	break;

	  case AM_REQ_READ_AUX:
		if (ctrl->bRequestType != (USB_DIR_IN | USB_TYPE_VENDOR |
				USB_RECIP_DEVICE))
				break;
		unsigned int data = 0;
		value = (w_value << 16) + w_index;

		//data = _lr(value);
		*(unsigned int *)buff = data;
		
		_pcd->buf = buff;
		_pcd->length = w_length;
	  	break;

	  case AM_REQ_FILL_MEM:
	  case AM_REQ_WRITE_AUX:
	  case AM_REQ_MODIFY_MEM:
		if (ctrl->bRequestType != (USB_DIR_OUT | USB_TYPE_VENDOR |
				USB_RECIP_DEVICE))
				break;
		_pcd->buf = buff;
		_pcd->length = w_length;
	  	break;

	  case AM_REQ_RUN_IN_ADDR:
		if (ctrl->bRequestType != (USB_DIR_OUT | USB_TYPE_VENDOR |
				USB_RECIP_DEVICE))
				break;
		value = (w_value << 16) + w_index;
		USB_DBG("--am req run in addr %p\n\n",value);		
		_pcd->buf = buff;
		_pcd->length = w_length;
	  	break;
		
	  case AM_REQ_WR_LARGE_MEM:
	  	value = 1;
	  case AM_REQ_RD_LARGE_MEM:
	  	USB_DBG("--am req large %s mem \n\n",value?"write":"read");

	  	_pcd->bulk_len = w_value;	// block length
	  	_pcd->bulk_num = w_index; // number of block
	  	_pcd->buf = buff;
	  	_pcd->length = w_length; 
		break;
		
	  case AM_REQ_IDENTIFY_HOST:
	  	buff[0] = USB_ROM_VER_MAJOR;
	  	buff[1] = USB_ROM_VER_MINOR;
	  	buff[2] = USB_ROM_STAGE_MAJOR;
	  	buff[3] = USB_ROM_STAGE_MINOR;
	  	_pcd->buf = buff;
	  	_pcd->length = w_length;
	  	need_check_timeout = 0;
		break;
	case AM_REQ_TPL_CMD:
	  case AM_REQ_TPL_STAT:
	  	serial_puts("w_length=");
		serial_put_hex(w_length, 32);
		_pcd->buf = buff;
		_pcd->length = w_length;
		break;
	  default:
		USB_ERR("--unknown vendor req %02x.%02x v%04x i%04x l%u\n",
			ctrl->bRequestType, ctrl->bRequest,
			w_value, w_index, w_length);
		break;
	}

	return;
}
	void nand_boot(int nand_boot_select)
	{
		unsigned int offset, size;
		void (*kernel)(int, char **, char *);

		int i;
		static u32 *param_addr = 0;
		static u8 *tmpbuf = 0;
		static u8 cmdline[256] = CFG_CMDLINE;

		serial_puts_info("Enter nand_boot routine ...\n");

		switch (nand_boot_select) {
		case NORMAL_BOOT:
			offset = CFG_BOOT_OFFS;
			size = CFG_BOOT_SIZE;
	#ifdef BOOTARGS_NORMAL
			strcpy((char *)cmdline, BOOTARGS_NORMAL);
	#endif
			serial_puts_info("Normal boot ...\n");
			break;
		case RECOVERY_BOOT:
			offset = CFG_RECOVERY_OFFS;
			size = CFG_RECOVERY_SIZE;
	#ifdef BOOTARGS_RECOVERY
			strcpy((char *)cmdline, BOOTARGS_RECOVERY);
	#endif
			serial_puts_info("Recovery boot ...\n");
			break;
	#if defined(CONFIG_JZ4760_PT701_8)
		case PRETEST_BOOT:
			offset = CFG_PRETEST_OFFS;
			size = CFG_PRETEST_SIZE;
			serial_puts_info("Pretest boot ...\n");
			break;
	#endif
		default:
			serial_puts_info("Get nand boot select failed, defualt normal boot ...\n");
			offset = CFG_BOOT_OFFS;
			size = CFG_BOOT_SIZE;
			break;
		}

		serial_puts_info("Load kernel from NAND ...\n");
		/* Load kernel and ramdisk */
		do_nand(offset,CFG_NAND_PAGE_SIZE,(u8 *)CFG_KERNEL_DST);

		struct boot_img_hdr *bootimginfo;
		int kernel_actual;
		int ramdisk_actual;
		unsigned int page_mask;
		if(2048 < sizeof(struct boot_img_hdr)){
			serial_puts_info("size too small");
		}

		bootimginfo = (struct boot_img_hdr *)CFG_KERNEL_DST;
		page_mask = CFG_NAND_PAGE_SIZE - 1;
		kernel_actual = (bootimginfo->kernel_size + page_mask) & (~page_mask);
		ramdisk_actual = (bootimginfo->ramdisk_size + page_mask) & (~page_mask);
		size = kernel_actual + ramdisk_actual + M; // ' + M' to make sure including the special data.

		do_nand(offset + CFG_NAND_PAGE_SIZE,
				size, (u8 *)(CFG_KERNEL_DST + CFG_NAND_PAGE_SIZE));

#ifdef CONFIG_SECURITY_ENABLE
                // Special data is 4M from head.
                if(data_verify((unsigned char *)CFG_KERNEL_DST, 4 * M, ENV_BOOTLOADER) < 0) {
                    serial_puts_spl("kernel verify failed, power off\n");
                    //powerdown();
                    while(1);
                }
#endif

	#if  0
		serial_puts_info("CRC32 = 0x");
		serial_put_hex(CRC_32(CFG_KERNEL_DST,2973696));
		serial_put_hex(*((unsigned int *)(CFG_KERNEL_DST+0)));
		serial_put_hex(*((unsigned int *)(CFG_KERNEL_DST+4)));
		serial_put_hex(*((unsigned int *)(CFG_KERNEL_DST+8)));
		serial_put_hex(*((unsigned int *)(CFG_KERNEL_DST+12)));
	#endif

		serial_puts_info("Prepare kernel parameters ...\n");
		/* init kernel, ramdisk and prepare parameters */
		if (init_boot_linux((unsigned char*)CFG_KERNEL_DST, size) == 0) {
			serial_puts_info("Jump to kernel start Addr 0x");
			dump_uint(CFG_KERNEL_DST);
			serial_puts("\n\n");
			kernel = (void (*)(int, char **, char *))CFG_KERNEL_DST;
			flush_cache_all();
	#if CONFIG_XBOOT_LOGO_FILE
			//__lcd_display_off();
	#endif
			/* Jump to kernel image */
			(*kernel)(2, (char **)(PARAM_BASE + 16), (char *)PARAM_BASE);
			serial_puts_info("We should not come here ... \n");
		} else
			serial_puts_info("Magic number error,boot error...\n");
	}
Exemple #19
0
int mmc_init_4760(unsigned int msc_clkrt_val)
{
	serial_puts("\n msc_clkrt_val==0X");  serial_put_hex(msc_clkrt_val);
	return mmc_init(msc_clkrt_val);
}
Exemple #20
0
STATIC_PREFIX
datum * 
memTestDevice(volatile datum * baseAddress, unsigned long nBytes)	
{
    unsigned long offset;
    unsigned long nWords = nBytes / sizeof(datum);
    datum pattern;
    datum antipattern;
    serial_puts("Total Size");serial_put_dword(nBytes);

    /*
     * Fill memory with a known pattern.
     */
    for (pattern = 1, offset = 0; offset < nWords; pattern++, offset++)
    {
        baseAddress[offset] = pattern;
#ifdef AML_DEBUG_ROM
        if(((offset+1)&0x3ffff)==0)
        {
        	serial_putc('\r');serial_put_hex((offset+1)<<2,32);
        	writel(0,P_WATCHDOG_RESET);
        }
#endif

    }
    serial_puts(" Stage 1 finish\n");
//    serial_putc('\n');

    /*
     * Check each location and invert it for the second pass.
     */
    for (pattern = 1, offset = 0; offset < nWords; pattern++, offset++)
    {
        if (baseAddress[offset] != pattern)
        {
                
            return ((datum *) &baseAddress[offset]);
        }

        antipattern = ~pattern;
        baseAddress[offset] = antipattern;
#ifdef AML_DEBUG_ROM
        if(((offset+1)&0x3ffff)==0)
        {
            writel(0,P_WATCHDOG_RESET);
        	serial_putc('\r');serial_put_hex((offset+1)<<2,32);
        }
#endif

    }
    serial_puts(" Stage 2 finish\n");
    
    /*
     * Check each location for the inverted pattern and zero it.
     */
    for (pattern = 1, offset = 0; offset < nWords; pattern++, offset++)
    {
        antipattern = ~pattern;
        if (baseAddress[offset] != antipattern)
        {
            
            return ((datum *) &baseAddress[offset]);
        }
#ifdef AML_DEBUG_ROM
        if(((offset+1)&0x3ffff)==0)
        {
            writel(0,P_WATCHDOG_RESET);
        	serial_putc('\r');serial_put_hex((offset+1)<<2,32);
        }
#endif

    }
#undef AML_DEBUG_ROM
    serial_puts(" Stage 3 finish\n");
    return (NULL);

}   /* memTestDevice() */
Exemple #21
0
int main(void)
{
	unsigned cmd;
	char c;
	p_arc_pwr_op = &arc_pwr_op;
	timer_init();
	arc_pwr_register((struct arc_pwr_op *)p_arc_pwr_op);//init arc_pwr_op

	arc_param->serial_disable=0;
	serial_put_hex(readl(P_AO_RTI_STATUS_REG1),32);
	writel(0,P_AO_RTI_STATUS_REG1);
	f_serial_puts("sleep .......\n");
	arc_param->serial_disable=0;

	while(1){
		
		cmd = readl(P_AO_RTI_STATUS_REG0);
		if(cmd == 0)
		{
			delay_ms(10);
			continue;
		}
		c = (char)cmd;
		if(c == 't')
		{
			init_I2C();
//			copy_reboot_code();
#ifdef CONFIG_MESON_TRUSTZONE
			copy_reboot_code_temp(temp_arm_base, sizeof(temp_arm_base));
#endif

			enter_power_down();
			//test_arc_core();
			break;
		}
		else if(c == 'q')
		{
				f_serial_puts(" - quit command loop\n");
				writel(0,P_AO_RTI_STATUS_REG0);
			  break;
		}
		else
		{
				f_serial_puts(" - cmd no support (ARC)\n");
		}
		//command executed
		writel(0,P_AO_RTI_STATUS_REG0);
	}

	
//	asm("SLEEP");


	while(1){
//	    udelay__(600);
	    cmd = readl(P_AO_RTI_STATUS_REG1);
	    c = (char)cmd;
//		f_serial_puts("REG2=");


//		serial_put_hex(readl(P_AO_RTI_STATUS_REG2),32);

	    if(c == 0)
	    {
	        udelay__(6000);
	        cmd = readl(P_AO_RTI_STATUS_REG1);
	        c = (char)cmd;
	        if((c == 0)||(c!='r'))
	        {
	            #ifdef _UART_DEBUG_COMMUNICATION_
	            serial_put_hex(cmd,32);
	            f_serial_puts(" arm boot fail\n\n");
	            wait_uart_empty();
	            #endif
	            #if 0 //power down 
	            cmd = readl(P_AO_GPIO_O_EN_N);
	            cmd &= ~(1<<6);
	            cmd &= ~(1<<22);
	            writel(cmd,P_AO_GPIO_O_EN_N);
	            #endif
	        }
		} else if ( cmd == 1 )
		{
			serial_put_hex(cmd,32);
			f_serial_puts(" ARM has started running\n");
			wait_uart_empty();
		} else if ( cmd == 2 )
		{
			serial_put_hex(cmd,32);
			f_serial_puts(" Reenable SEC\n");
			wait_uart_empty();
	}
	    else if(c=='r')
	    {
	        f_serial_puts("arm boot succ\n");
	        wait_uart_empty();
				    
			asm(".long 0x003f236f"); //add sync instruction.
			asm("flag 1");
			asm("nop");
			asm("nop");
			asm("nop");
	    }
	    else
	    {
	        #ifdef _UART_DEBUG_COMMUNICATION_
	        serial_put_hex(cmd,32);
	        f_serial_puts(" arm unkonw state\n");
	        wait_uart_empty();
			
	        #endif
	    }
	    //cmd='f';
	    //writel(cmd,P_AO_RTI_STATUS_REG1);

	}
	return 0;
}
Exemple #22
0
void enter_power_down()
{
	int i;
	unsigned int uboot_cmd_flag=readl(P_AO_RTI_STATUS_REG2);//u-boot suspend cmd flag
	unsigned int vcin_state = 0;

    int voltage   = 0;
    int axp_ocv = 0;
	int wdt_flag;
	// First, we disable all memory accesses.

	f_serial_puts("step 1\n");

	asm(".long 0x003f236f"); //add sync instruction.

	store_restore_plls(0);

	f_serial_puts("ddr self-refresh\n");
	wait_uart_empty();

	ddr_self_refresh();

 	f_serial_puts("CPU off...\n");
 	wait_uart_empty();
	cpu_off();
	f_serial_puts("CPU off done\n");
	wait_uart_empty();
#ifdef CONFIG_CEC_WAKEUP
    hdmi_cec_func_config = readl(P_AO_DEBUG_REG0); 
    f_serial_puts("CEC M8:uboot: P_AO_DEBUG_REG0:\n");
    serial_put_hex(hdmi_cec_func_config,32);
    f_serial_puts("\n");
#endif
 	if(p_arc_pwr_op->power_off_at_24M)
		p_arc_pwr_op->power_off_at_24M();

#ifdef CONFIG_M201_COSTDOWN
	/* for led */
    clrbits_le32(P_AO_GPIO_O_EN_N,1<<18);
	setbits_le32(P_AO_GPIO_O_EN_N,1<<29);
#endif
	
//	while(readl(0xc8100000) != 0x13151719)
//	{}

//non 32k crystal oscillator platform DONT enter 32k in suspend mode
#ifndef CONFIG_NON_32K
	switch_24M_to_32K();
#endif 
	if(p_arc_pwr_op->power_off_at_32K_1)
		p_arc_pwr_op->power_off_at_32K_1();

	if(p_arc_pwr_op->power_off_at_32K_2)
		p_arc_pwr_op->power_off_at_32K_2();
	

	// gate off:  bit0: REMOTE;   bit3: UART
#ifndef CONFIG_NON_32K
	writel(readl(P_AO_RTI_GEN_CNTL_REG0)&(~(0x8)),P_AO_RTI_GEN_CNTL_REG0);
#endif
	if(uboot_cmd_flag == 0x87654321)//u-boot suspend cmd flag
	{
		if(p_arc_pwr_op->power_off_ddr15)
			p_arc_pwr_op->power_off_ddr15();
	}

	wdt_flag=readl(P_WATCHDOG_TC)&(1<<19);
	if(wdt_flag)
		writel(readl(P_WATCHDOG_TC)&(~(1<<19)),P_WATCHDOG_TC);
#if 1
	vcin_state = p_arc_pwr_op->detect_key(uboot_cmd_flag);
#else
	for(i=0;i<10;i++)
	{
		udelay__(1000);
		//udelay(1000);
	}
#endif

	if(uboot_cmd_flag == 0x87654321)//u-boot suspend cmd flag
	{
		if(p_arc_pwr_op->power_on_ddr15)
			p_arc_pwr_op->power_on_ddr15();
	}
	if(wdt_flag)
		writel((6*7812|((1<<16)-1))|(1<<19),P_WATCHDOG_TC);

// gate on:  bit0: REMOTE;   bit3: UART
	writel(readl(P_AO_RTI_GEN_CNTL_REG0)|0x8,P_AO_RTI_GEN_CNTL_REG0);

	if(p_arc_pwr_op->power_on_at_32K_2)
		p_arc_pwr_op->power_on_at_32K_2();

	if(p_arc_pwr_op->power_on_at_32K_1)
		p_arc_pwr_op->power_on_at_32K_1();

#ifndef CONFIG_NON_32K
	switch_32K_to_24M();
#endif

	// power on even more domains
	if(p_arc_pwr_op->power_on_at_24M)
		p_arc_pwr_op->power_on_at_24M();

 	uart_reset();
	f_serial_puts("step 8: ddr resume\n");
	wait_uart_empty();
	ddr_resume();

#ifdef CONFIG_M201_COSTDOWN
	/* for led */
    clrbits_le32(P_AO_GPIO_O_EN_N,1<<29);
	setbits_le32(P_AO_GPIO_O_EN_N,1<<18);
#endif
	
	f_serial_puts("restore pll\n");
	wait_uart_empty();
	store_restore_plls(1);//Before switch back to clk81, we need set PLL

	if (uboot_cmd_flag == 0x87654321 && (vcin_state == FLAG_WAKEUP_PWROFF)) {
		/*
		 * power off system before ARM is restarted
		 */
		f_serial_puts("no extern power shutdown\n");
		wait_uart_empty();
		p_arc_pwr_op->shut_down();
		do {
			udelay__(2000 * 100);
			f_serial_puts("wait shutdown...\n");
			wait_uart_empty();
		}while(1);
	}
#ifdef CONFIG_MESON_TRUSTZONE
	copy_reboot_code(temp_arm_base);
#else
	copy_reboot_code(NULL);
#endif
	writel(vcin_state,P_AO_RTI_STATUS_REG2);
	f_serial_puts("restart arm\n");
	wait_uart_empty();
	restart_arm();

    if (uboot_cmd_flag == 0x87654321) {
        writel(0,P_AO_RTI_STATUS_REG2);
        writel(readl(P_AO_RTI_PWR_CNTL_REG0)|(1<<4),P_AO_RTI_PWR_CNTL_REG0);
        clrbits_le32(P_HHI_SYS_CPU_CLK_CNTL,1<<19);
        //writel(10,0xc1109904);
        writel(1<<19|1<<24|10,0xc1109900);
        
        do{udelay__(200);f_serial_puts("wait reset...\n");wait_uart_empty();}while(1);
    }
}
Exemple #23
0
int main(void)
{
	unsigned cmd;
	char c;
	int i = 0,j;
	timer_init();
#ifdef POWER_OFF_VDDIO	
	f_serial_puts("sleep ... off\n");
#else
	f_serial_puts("sleep7 .......\n");
#endif
		
	while(1){
		
		cmd = readl(P_AO_RTI_STATUS_REG0);
		if(cmd == 0)
		{
			delay_ms(10);
			continue;
		}
		c = (char)cmd;
		if(c == 't')
		{
#if (defined(POWER_OFF_VDDIO) || defined(POWER_OFF_HDMI_VCC) || defined(POWER_OFF_AVDD33) || defined(POWER_OFF_AVDD25))
			init_I2C();
#endif
			copy_reboot_code();
			enter_power_down();
			//test_arc_core();
			break;
		}
		else if(c == 'q')
		{
				serial_puts(" - quit command loop\n");
				writel(0,P_AO_RTI_STATUS_REG0);
			  break;
		}
		else
		{
				serial_puts(" - cmd no support (ARC)\n");
		}
		//command executed
		writel(0,P_AO_RTI_STATUS_REG0);
	}
	
	while(1){
	    udelay(6000);
	    cmd = readl(P_AO_RTI_STATUS_REG1);
	    c = (char)cmd;
	    if(c == 0)
	    {
	        udelay(6000);
	        cmd = readl(P_AO_RTI_STATUS_REG1);
	        c = (char)cmd;
	        if((c == 0)||(c!='r'))
	        {
	            #ifdef _UART_DEBUG_COMMUNICATION_
	            serial_put_hex(cmd,32);
	            f_serial_puts(" arm boot fail\n\n");
	            wait_uart_empty();
	            #endif
	            #if 0 //power down 
	            cmd = readl(P_AO_GPIO_O_EN_N);
	            cmd &= ~(1<<6);
	            cmd &= ~(1<<22);
	            writel(cmd,P_AO_GPIO_O_EN_N);
	            #endif
	        }
	    }
	    else if(c=='r')
	    {
	        writel(0,0xc8100030);
	        #ifdef _UART_DEBUG_COMMUNICATION_
	        //f_serial_puts("arm boot succ\n");
	        //wait_uart_empty();
	        #endif
	    }
	    else
	    {
	        #ifdef _UART_DEBUG_COMMUNICATION_
	        serial_put_hex(cmd,32);
	        f_serial_puts(" arm unkonw state\n");
	        wait_uart_empty();
	        #endif
	    }
	    //cmd='f';
	    //writel(cmd,P_AO_RTI_STATUS_REG1);
	    
		asm(".long 0x003f236f"); //add sync instruction.
		//asm("SLEEP");
		asm("FLAG 1");//halt mode
	}
	return 0;
}
Exemple #24
0
void c_main(void)
{
	load_args();

	if (fw_args->debug_ops > 0) {
		do_debug();
		return ;
	}

	switch (CPU_ID) {
	case 0x4740:
		gpio_init_4740();
		pll_init_4740();
		serial_init();
		sdram_init_4740();
		break;
	case 0x4760:
		gpio_init_4760();
		cpm_start_all_4760();
		serial_init();
		pll_init_4760();
		sdram_init_4760();
		break;
	default:
		return;
	}
#if 1
	serial_puts("Setup xburst CPU args as:\n");
	serial_put_hex(CPU_ID);
	serial_put_hex(CFG_EXTAL);
	serial_put_hex(CFG_CPU_SPEED);
	serial_put_hex(PHM_DIV);
	serial_put_hex(fw_args->use_uart);
	serial_put_hex(CONFIG_BAUDRATE);
	serial_put_hex(SDRAM_BW16);
	serial_put_hex(SDRAM_BANK4);
	serial_put_hex(SDRAM_ROW);
	serial_put_hex(SDRAM_COL);
	serial_put_hex(REG_CPM_CPCCR);
#endif
	serial_puts("xburst stage1 run finish !\n");
	if (CPU_ID == 0x4760) {
		__asm__ (
			"li  $31, 0xbfc012e0 \n\t"
			"jr  $31 \n\t "
			);
	}
}
Exemple #25
0
void init_pctl(void)
{
	int nTempVal;
	int stat;
  
	MMC_Wr(MMC_PHY_CTRL,v_mmc_phy_ctrl);
/*	MMC_Wr(UPCTL_DLLCR9_ADDR, v_dllcr9); //2a8	
	MMC_Wr(UPCTL_IOCR_ADDR, v_iocr); //248
	MMC_Wr(UPCTL_PHYCR_ADDR, 2);//????
*/

  //wait to DDR PLL lock.
	//while (!(MMC_Rd(MMC_CLK_CNTL) & (1<<29)) ) {}
	//dbg_out("d",1);
  //Enable DDR DLL clock input from PLL.
//     MMC_Wr(MMC_CLK_CNTL, 0xc0000080);  //  @@@ select the final mux from PLL output directly.
//     MMC_Wr(MMC_CLK_CNTL, 0xc00000c0);    
    //enable the clock.
	//MMC_Wr(MMC_CLK_CNTL, v_mmc_clk_cntl);
     
    // release the DDR DLL reset pin.
//    MMC_Wr( MMC_SOFT_RST,  0xffff);
	//__udelay(10);
	//UPCTL memory timing registers
	MMC_Wr(UPCTL_TOGCNT1U_ADDR, v_t_1us_pck);	 //1us = nn cycles.
	MMC_Wr(UPCTL_TOGCNT100N_ADDR, v_t_100ns_pck);//100ns = nn cycles.
	MMC_Wr(UPCTL_TINIT_ADDR, v_t_init_us);  //200us.
	
//  MMC_Wr(UPCTL_TRSTH_ADDR, 2);      // 0 for ddr2; 500 for ddr3. 2 for simulation.
	MMC_Wr(UPCTL_TRSTH_ADDR, v_t_rsth_us);  // 0 for ddr2;  2 for simulation; 500 for ddr3. //???
	MMC_Wr(UPCTL_TRSTL_ADDR, v_t_rstl_us);  //?????
	
	MMC_Wr(UPCTL_MCFG_ADDR,v_mcfg);
	
	MMC_Wr(UPCTL_DFIODTCFG_ADDR, v_dfiodrcfg_adr);//add for Eric fine-tune
	
 
	//configure DDR PHY PUBL registers.
	//  2:0   011: DDR3 mode.	 100:	LPDDR2 mode.
	//  3:    8 bank. 
	MMC_Wr(PUB_DCR_ADDR, 0x3 | (1 << 3));
	MMC_Wr(PUB_PGCR_ADDR, 0x01842e04); //PUB_PGCR_ADDR: c8001008

	MMC_Wr( PUB_MR0_ADDR,v_msr0);
	MMC_Wr( PUB_MR1_ADDR,v_msr1);
	MMC_Wr( PUB_MR2_ADDR,v_msr2);
	MMC_Wr( PUB_MR3_ADDR,v_msr3);	
//	MMC_Wr( PUB_MR3_ADDR,0);	
	
	MMC_Wr(PUB_DTPR0_ADDR,v_pub_dtpr0);
	MMC_Wr(PUB_DTPR1_ADDR,v_pub_dtpr1);
	MMC_Wr(PUB_DTPR2_ADDR,v_pub_dtpr2);
	MMC_Wr(PUB_PTR0_ADDR,v_pub_ptr0);

	
//	MMC_Wr( PUB_PIR_ADDR, 0x17);//Add By Dai
	
	  __udelay(50);
	//wait PHY DLL LOCK
	while(!(MMC_Rd( PUB_PGSR_ADDR) & 1)) {}
	dbg_out("d",2);

	// configure DDR3_rst pin.
	MMC_Wr( PUB_ACIOCR_ADDR, MMC_Rd( PUB_ACIOCR_ADDR) & 0xdfffffff );
	MMC_Wr( PUB_DSGCR_ADDR,	MMC_Rd(PUB_DSGCR_ADDR) & 0xffffffef); 

	//MMC_Wr( PUB_ZQ0CR1_ADDR, 0x18); //???????
	//MMC_Wr( PUB_ZQ0CR1_ADDR, 0x7b); //???????
#ifdef CONFIG_TURN_OFF_ODT
	if(v_zq0cr0 & (1<<28))
	    MMC_Wr( PUB_ZQ0CR0_ADDR, v_zq0cr0);
    else
        MMC_Wr( PUB_ZQ0CR1_ADDR, v_zq0cr1);

    if(v_cmdzq)
	    MMC_Wr( MMC_CMDZQ_CTRL,  v_cmdzq);
#else
		MMC_Wr( PUB_ZQ0CR1_ADDR, v_zq0cr1);
#endif
	//for simulation to reduce the init time.
//	MMC_Wr(PUB_PTR1_ADDR,v_pub_ptr1);
//	MMC_Wr(PUB_PTR2_ADDR,v_pub_ptr2);


//   MMC_Wr( PUB_PIR_ADDR, 0x9);//Add By Dai

   __udelay(20);
	//wait DDR3_ZQ_DONE: 
#ifndef CONFIG_TURN_OFF_ODT
	while( !(MMC_Rd( PUB_PGSR_ADDR) & (1<< 2))) {}
#endif
	
	dbg_out("d",3);
	// wait DDR3_PHY_INIT_WAIT : 
#ifndef CONFIG_TURN_OFF_ODT
	while (!(MMC_Rd(PUB_PGSR_ADDR) & 1 )) {}
#endif
		dbg_out("d",4);
	// Monitor DFI initialization status.
#ifndef CONFIG_TURN_OFF_ODT
	while(!(MMC_Rd(UPCTL_DFISTSTAT0_ADDR) & 1)) {} 
#endif
	dbg_out("d",5);

	MMC_Wr(UPCTL_POWCTL_ADDR, 1);
	while(!(MMC_Rd( UPCTL_POWSTAT_ADDR & 1) )) {}
	dbg_out("d",6);

	// initial upctl ddr timing.
	MMC_Wr(UPCTL_TREFI_ADDR, v_t_refi_100ns);  // 7800ns to one refresh command.
	// wr_reg UPCTL_TREFI_ADDR, 78

	MMC_Wr(UPCTL_TMRD_ADDR, v_t_mrd);
	//wr_reg UPCTL_TMRD_ADDR, 4

	MMC_Wr(UPCTL_TRFC_ADDR, v_t_rfc);	//64: 400Mhz.  86: 533Mhz. 
	// wr_reg UPCTL_TRFC_ADDR, 86

	MMC_Wr(UPCTL_TRP_ADDR, v_t_rp);	// 8 : 533Mhz.
	//wr_reg UPCTL_TRP_ADDR, 8

	MMC_Wr(UPCTL_TAL_ADDR,	v_t_al);
	//wr_reg UPCTL_TAL_ADDR, 0

//  MMC_Wr(UPCTL_TCWL_ADDR,  v_t_cl-1 + v_t_al);
  MMC_Wr(UPCTL_TCWL_ADDR,  v_t_cwl);
	//wr_reg UPCTL_TCWL_ADDR, 6

	MMC_Wr(UPCTL_TCL_ADDR, v_t_cl);	 //6: 400Mhz. 8 : 533Mhz.
	// wr_reg UPCTL_TCL_ADDR, 8

	MMC_Wr(UPCTL_TRAS_ADDR, v_t_ras); //16: 400Mhz. 20: 533Mhz.
	//  wr_reg UPCTL_TRAS_ADDR, 20 

	MMC_Wr(UPCTL_TRC_ADDR, v_t_rc);  //24 400Mhz. 28 : 533Mhz.
	//wr_reg UPCTL_TRC_ADDR, 28

	MMC_Wr(UPCTL_TRCD_ADDR, v_t_rcd);	//6: 400Mhz. 8: 533Mhz.
	// wr_reg UPCTL_TRCD_ADDR, 8

	MMC_Wr(UPCTL_TRRD_ADDR, v_t_rrd); //5: 400Mhz. 6: 533Mhz.
	//wr_reg UPCTL_TRRD_ADDR, 6

	MMC_Wr(UPCTL_TRTP_ADDR, v_t_rtp);
	// wr_reg UPCTL_TRTP_ADDR, 4

	MMC_Wr(UPCTL_TWR_ADDR, v_t_wr);
	// wr_reg UPCTL_TWR_ADDR, 8

	MMC_Wr(UPCTL_TWTR_ADDR, v_t_wtr);
	//wr_reg UPCTL_TWTR_ADDR, 4

	MMC_Wr(UPCTL_TEXSR_ADDR, v_t_exsr);
	//wr_reg UPCTL_TEXSR_ADDR, 200

	MMC_Wr(UPCTL_TXP_ADDR, v_t_xp);
	//wr_reg UPCTL_TXP_ADDR, 4

	MMC_Wr(UPCTL_TDQS_ADDR, v_t_dqs);
	// wr_reg UPCTL_TDQS_ADDR, 2

	MMC_Wr(UPCTL_TRTW_ADDR, v_t_trtw);
	//wr_reg UPCTL_TRTW_ADDR, 2

	//MMC_Wr(UPCTL_TCKSRE_ADDR, 5);
	MMC_Wr(UPCTL_TCKSRE_ADDR, v_t_cksre);
	//wr_reg UPCTL_TCKSRE_ADDR, 5 

	//MMC_Wr(UPCTL_TCKSRX_ADDR, 5);
	MMC_Wr(UPCTL_TCKSRX_ADDR, v_t_cksrx);
	//wr_reg UPCTL_TCKSRX_ADDR, 5 

	MMC_Wr(UPCTL_TMOD_ADDR, v_t_mod);
	//wr_reg UPCTL_TMOD_ADDR, 8

	//MMC_Wr(UPCTL_TCKE_ADDR, 4);
	MMC_Wr(UPCTL_TCKE_ADDR, v_t_cke);
	//wr_reg UPCTL_TCKE_ADDR, 4 

	MMC_Wr(UPCTL_TZQCS_ADDR, 64);
	//wr_reg UPCTL_TZQCS_ADDR , 64 

//	MMC_Wr(UPCTL_TZQCL_ADDR, v_t_zqcl);
	MMC_Wr(UPCTL_TZQCL_ADDR, 512);
	//wr_reg UPCTL_TZQCL_ADDR , 512 

	MMC_Wr(UPCTL_TXPDLL_ADDR, 10);
	// wr_reg UPCTL_TXPDLL_ADDR, 10  

	MMC_Wr(UPCTL_TZQCSI_ADDR, 1000);
	// wr_reg UPCTL_TZQCSI_ADDR, 1000  

	MMC_Wr(UPCTL_SCFG_ADDR, 0xf00);
	// wr_reg UPCTL_SCFG_ADDR, 0xf00 
	
//	MMC_Wr(UPCTL_LPDDR2ZQCFG_ADDR,v_odtcfg); //????
//	MMC_Wr(UPCTL_ZQCR_ADDR,v_zqcr); //?????
 	
 	MMC_Wr( UPCTL_SCTL_ADDR, 1);
	while (!( MMC_Rd(UPCTL_STAT_ADDR) & 1))  {
		MMC_Wr(UPCTL_SCTL_ADDR, 1);
	}
	dbg_out("d",7);
	//config the DFI interface.
	MMC_Wr( UPCTL_PPCFG_ADDR, (0xf0 << 1) );
	MMC_Wr( UPCTL_DFITCTRLDELAY_ADDR, 2 );
	MMC_Wr( UPCTL_DFITPHYWRDATA_ADDR,  0x1 );
	MMC_Wr( UPCTL_DFITPHYWRLAT_ADDR, v_t_cwl -1  );    //CWL -1
	MMC_Wr( UPCTL_DFITRDDATAEN_ADDR, v_t_cl - 2  );    //CL -2
	MMC_Wr( UPCTL_DFITPHYRDLAT_ADDR, 15 );
	MMC_Wr( UPCTL_DFITDRAMCLKDIS_ADDR, 2 );
	MMC_Wr( UPCTL_DFITDRAMCLKEN_ADDR, 2 );
	MMC_Wr( UPCTL_DFISTCFG0_ADDR, 0x4  );
	MMC_Wr( UPCTL_DFITCTRLUPDMIN_ADDR, 0x4000 );
	MMC_Wr( UPCTL_DFILPCFG0_ADDR, ( 1 | (7 << 4) | (1 << 8) | (10 << 12) | (12 <<16) | (1 <<24) | ( 7 << 28)));
 
	MMC_Wr( UPCTL_CMDTSTATEN_ADDR, 1);
	while (!(MMC_Rd(UPCTL_CMDTSTAT_ADDR) & 1 )) {}
	dbg_out("d",8);

	//MMC_Wr( PUB_DTAR_ADDR, (0x0 | (0 <<12) | (7 << 28))); //training address is 0x90001800 not safe
	//MMC_Wr( PUB_DTAR_ADDR, (0xFc0 | (0xFFFF <<12) | (7 << 28))); //let training address is 0x9fffff00;
	MMC_Wr(PUB_DTAR_ADDR,v_dtar);
	serial_put_hex(MMC_Rd(PUB_DTAR_ADDR),32);
	f_serial_puts(" PUB_DTAR_ADDR\n");
	//start trainning.
	// DDR PHY initialization 
#ifdef CONFIG_TURN_OFF_ODT
	if(v_zq0cr0 & (1<<28))
		MMC_Wr( PUB_PIR_ADDR, 0x1e1);
  else
		MMC_Wr( PUB_PIR_ADDR, 0x1e9);
	//MMC_Wr( PUB_PIR_ADDR, 0x69); //no training
#else
		MMC_Wr( PUB_PIR_ADDR, 0x1e9);
#endif
	//DDR3_SDRAM_INIT_WAIT : 
	while( !(MMC_Rd(PUB_PGSR_ADDR & 1))) {}
	dbg_out("d",9);
	
	if(MMC_Rd(PUB_PGSR_ADDR) & (3<<5)){
        f_serial_puts("PUB_PGSR=");
	    serial_put_hex(MMC_Rd(PUB_PGSR_ADDR),8);
	    f_serial_puts("\n");
#ifdef CONFIG_TURN_OFF_ODT
        MMC_Wr( PUB_PIR_ADDR, 0x1e1 | (1<<28));
#else
		MMC_Wr( PUB_PIR_ADDR, 0x1e9 | (1<<28));
#endif
        while( !(MMC_Rd(PUB_PGSR_ADDR & 1))) {}
        dbg_out("d",0x91);
        f_serial_puts("PUB_PGSR=");
	    serial_put_hex(MMC_Rd(PUB_PGSR_ADDR),8);
	    f_serial_puts("\n");
	}

	//check ZQ calibraration status.
	stat = MMC_Rd(PUB_ZQ0SR0_ADDR);
	serial_put_hex(stat,32);
	f_serial_puts(" PUB_ZQ0SR0\n");
	stat = MMC_Rd(PUB_ZQ0SR1_ADDR);
	serial_put_hex(stat,32);
	f_serial_puts(" PUB_ZQ0SR1\n");

	//check data training result.
	stat = MMC_Rd(PUB_DX0GSR0_ADDR);
	serial_put_hex(stat,32);
	f_serial_puts(" PUB_DX0GSR0\n");
	wait_uart_empty();
	stat = MMC_Rd(PUB_DX1GSR0_ADDR);
	serial_put_hex(stat,32);
	f_serial_puts(" PUB_DX1GSR0\n");
	wait_uart_empty();
	stat = MMC_Rd(PUB_DX2GSR0_ADDR);
	serial_put_hex(stat,32);
	f_serial_puts(" PUB_DX2GSR0\n");
	wait_uart_empty();
	stat = MMC_Rd(PUB_DX3GSR0_ADDR);
	serial_put_hex(stat,32);
	f_serial_puts(" PUB_DX3GSR0\n");
	wait_uart_empty();


 	MMC_Wr(UPCTL_SCTL_ADDR, 2); // init: 0, cfg: 1, go: 2, sleep: 3, wakeup: 4
	while ((MMC_Rd(UPCTL_STAT_ADDR) & 0x7 ) != 3 ) {}
	dbg_out("d",10);
	__udelay(200);

//	MMC_Wr(MMC_DDR_CTRL,v_mmc_ddr_ctrl);
//	MMC_Wr(MMC_PHY_CTRL,v_mmc_phy_ctrl);
//	MMC_Wr(UPCTL_PHYCR_ADDR, 2);
//	MMC_Wr(MMC_REQ_CTRL, 0xff );  //enable request in kreboot.s
  
//	udelay(50);	

//	MMC_Wr(UPCTL_IOCR_ADDR, v_iocr); //248
	//traning result
/*
	MMC_Wr(UPCTL_RDGR0_ADDR,v_rdgr0); 
	MMC_Wr(UPCTL_RSLR0_ADDR,v_rslr0); 

	MMC_Wr(PUB_DX0GSR0_ADDR,v_dx0gsr0); 
	MMC_Wr(PUB_DX0GSR1_ADDR,v_dx0gsr1); 
	MMC_Wr(PUB_DX0DQSTR_ADDR,v_dx0dqstr); 
	
	MMC_Wr(PUB_DX1GSR0_ADDR,v_dx1gsr0); 
	MMC_Wr(PUB_DX1GSR1_ADDR,v_dx1gsr1); 
	MMC_Wr(PUB_DX1DQSTR_ADDR,v_dx1dqstr); 

	MMC_Wr(PUB_DX2GSR0_ADDR,v_dx2gsr0); 
	MMC_Wr(PUB_DX2GSR1_ADDR,v_dx2gsr1); 
	MMC_Wr(PUB_DX2DQSTR_ADDR,v_dx2dqstr); 

	MMC_Wr(PUB_DX3GSR0_ADDR,v_dx3gsr0); 
	MMC_Wr(PUB_DX3GSR1_ADDR,v_dx3gsr1); 
	MMC_Wr(PUB_DX3DQSTR_ADDR,v_dx3dqstr); 

	MMC_Wr(PUB_DX4GSR0_ADDR,v_dx4gsr0); 
	MMC_Wr(PUB_DX4GSR1_ADDR,v_dx4gsr1); 
	MMC_Wr(PUB_DX4DQSTR_ADDR,v_dx4dqstr); 

	MMC_Wr(PUB_DX5GSR0_ADDR,v_dx5gsr0); 
	MMC_Wr(PUB_DX5GSR1_ADDR,v_dx5gsr1); 
	MMC_Wr(PUB_DX5DQSTR_ADDR,v_dx5dqstr); 

	MMC_Wr(PUB_DX6GSR0_ADDR,v_dx6gsr0); 
	MMC_Wr(PUB_DX6GSR1_ADDR,v_dx6gsr1); 
	MMC_Wr(PUB_DX6DQSTR_ADDR,v_dx6dqstr); 

	MMC_Wr(PUB_DX7GSR0_ADDR,v_dx7gsr0); 
	MMC_Wr(PUB_DX7GSR1_ADDR,v_dx7gsr1); 
	MMC_Wr(PUB_DX7DQSTR_ADDR,v_dx7dqstr); 

	MMC_Wr(PUB_DX8GSR0_ADDR,v_dx8gsr0); 
	MMC_Wr(PUB_DX8GSR1_ADDR,v_dx8gsr1); 
	MMC_Wr(PUB_DX8DQSTR_ADDR,v_dx8dqstr); 
*/
//	MMC_Wr(MMC_REQ_CTRL, 0xff ); Already enable request in kreboot.s
	
	return 0;
}