#include "global.h" | |
#include <asm/arch/cpu.h> | |
#include <asm/io.h> | |
#include "common.h" | |
#define ST_WAIT_SYNC_FLAG (0x0) | |
#define ST_WAIT_REG_CONFIG (0x1) | |
#define ST_REG_CONFIG (0x2) | |
#define ST_WAIT_DOWNLOAD (0x3) | |
#define ST_DOWNLOAD_HEAD (0x4) | |
#define ST_DOWNLOAD_DATA (0x5) | |
#define ST_DOWNLOAD_ADDR (0x6) | |
#define SYNC_FLAG (0x5a) // "Z" | |
#define REG_CONFIG_FLAG (0x6a) // "" | |
#define DOWNLOAD_FLAG (0x7a) // "z" | |
#define RUN_FLAG (0x8a) // "" | |
#define GET_ID (0x9a) // new added | |
extern void USB3Slave_boot(void); | |
extern WORD32 usb_read(BYTE *pchBuf, WORD32 dwLen); | |
extern WORD32 usb_write(BYTE *pchBuf, WORD32 dwLen); | |
extern int UART_Read(char *pchBuf, int dwLen); | |
extern int UART_Write(char *pchBuf, int dwLen); | |
WORD32 Para_Section SyncACK=0xa5; | |
__align(4) BYTE Para_Section CHIP_ID[8]={'Z','X','7','5','2','0','V','2'}; | |
WORD32 Para_Section UsbACK = 0; | |
void Boot_Process(BYTE *pkt,int len) | |
{ | |
int i=0; | |
static int count=0; | |
static int addr; | |
static int value; | |
char cTmp=0; | |
//WORD32 SyncACK=0xa5; | |
int case_state; | |
if(0==len) | |
return ; | |
while(i<len) | |
{ | |
cTmp=pkt[i++]; | |
case_state = global.g_State; | |
if( ST_WAIT_SYNC_FLAG == case_state) | |
{ | |
if(SYNC_FLAG==cTmp) | |
{ | |
global.g_State=ST_WAIT_DOWNLOAD; | |
#if CFG_USB | |
usb_write((BYTE *)&SyncACK,1); | |
#else | |
UART_Write((BYTE *)&SyncACK,1); | |
#endif | |
} | |
} | |
else if(ST_REG_CONFIG ==case_state) | |
{ | |
if(count<4) // 4 bytes addr | |
{ | |
addr<<=8; | |
addr|=cTmp; | |
} | |
else if(count<8) // 4 byte data | |
{ | |
value<<=8; | |
value|=cTmp; | |
} | |
count++; | |
if(4==count) | |
{ | |
if(0==addr) | |
{ | |
global.g_State=ST_WAIT_DOWNLOAD; | |
UsbACK=0xA6; | |
#if CFG_USB | |
usb_write(&UsbACK,1); | |
#else | |
UART_Write(&UsbACK,1); | |
#endif | |
} | |
} | |
else if(8==count) | |
{ | |
REG32(addr)=value; | |
count=0; | |
} | |
} | |
else if (ST_WAIT_DOWNLOAD==case_state) | |
{ | |
if(REG_CONFIG_FLAG==cTmp) | |
{ | |
global.g_State=ST_REG_CONFIG; | |
count=0; | |
} | |
else if(DOWNLOAD_FLAG==cTmp) | |
{ | |
global.g_State=ST_DOWNLOAD_HEAD; | |
count=0; | |
value=0; | |
} | |
else if(RUN_FLAG==cTmp) //Ö§³Ö¶à´ÎÏÂÔØ0818 | |
{ | |
global.g_State=ST_DOWNLOAD_ADDR; | |
count=0; | |
value=0; | |
} | |
} | |
else if( ST_DOWNLOAD_HEAD==case_state) | |
{ | |
if(count<4) // 4 byte addr | |
{ | |
addr<<=8; | |
addr|=cTmp; | |
} | |
else if(count<8) // 4 byte size | |
{ | |
value<<=8; | |
value|=cTmp; | |
} | |
count++; | |
if(count==8) | |
{ | |
count=0; | |
global.g_bootaddr=addr; //µØÖ· | |
global.g_bootsize=value;//³¤¶È | |
global.g_State=ST_DOWNLOAD_DATA; | |
UsbACK=0xA1; | |
#if CFG_USB | |
usb_write(&UsbACK,1); | |
#else | |
UART_Write(&UsbACK,1); | |
#endif | |
} | |
} | |
else if( ST_DOWNLOAD_DATA==case_state) | |
{ | |
if(global.g_bootsize==len) | |
{ | |
if(global.g_bootaddr==(int)pkt) | |
{ | |
global.g_State=ST_WAIT_DOWNLOAD;//Ö§³Ö¶à´ÎÏÂÔØ0818 | |
UsbACK=0xA7; | |
#if CFG_USB | |
usb_write(&UsbACK,1); | |
#else | |
UART_Write(&UsbACK,1); | |
#endif | |
return; | |
} | |
} | |
else | |
{ | |
global.g_bootaddr+=len; | |
global.g_bootsize-=len; | |
return ; | |
} | |
} | |
else if( ST_DOWNLOAD_ADDR==case_state) | |
{ | |
if(count<4) // 4 byte addr | |
{ | |
addr<<=8; | |
addr|=cTmp; | |
} | |
count++; | |
if(count==4) | |
{ | |
count=0; | |
global.g_bootaddr=addr; | |
global.g_bootfinish=1; | |
UsbACK=0xA8; | |
#if CFG_USB | |
usb_write(&UsbACK,1); | |
#else | |
UART_Write(&UsbACK,1); | |
#endif | |
return ; | |
} | |
} | |
else | |
{ | |
} | |
} | |
} | |
__align(4) BYTE Para_Section tmp[64]={0}; | |
void USB_Boot(void) | |
{ | |
WORD32 dwLen; | |
WORD32 dwMaxLen; | |
BYTE *pbyBuf; | |
printf("USB_Boot\n"); | |
global.g_State = ST_WAIT_SYNC_FLAG; | |
pbyBuf = (BYTE*)tmp; | |
for(dwMaxLen = 0; dwMaxLen < 64; dwMaxLen++) | |
{ | |
tmp[dwMaxLen] = 0; | |
} | |
dwMaxLen = 512; //¿ØÖÆÆ÷ÓÐÒªÇóbulk outʱ£¬½ÓÊÕ³¤¶È´óÓÚµÈÓÚ512 | |
/* µ±usb_mode =1ʱ£¬ÓÃÓÚHSIC,µ±usb_mode =0ʱ£¬ÓÃÓÚUSB */ | |
if(global.g_USB_MODE == 0) | |
{ | |
dwLen=USB_Check_Sync(pbyBuf,dwMaxLen); | |
if(0==dwLen) | |
{ | |
return ; | |
} | |
Boot_Process(pbyBuf,dwLen); | |
} | |
while(0 == global.g_bootfinish) | |
{ | |
dwLen=usb_read(pbyBuf,dwMaxLen); | |
Boot_Process(pbyBuf,dwLen); | |
if((ST_DOWNLOAD_DATA==global.g_State)&&(global.g_bootaddr!=0)) | |
{ | |
pbyBuf=(BYTE *)global.g_bootaddr; | |
dwMaxLen= 512;//global.g_bootsize; | |
} | |
else | |
{ | |
pbyBuf=tmp; | |
dwMaxLen=512;//½ÓÊÕµØÖ·£¬³¤¶ÈÐÅÏ¢ | |
} | |
} | |
if(1==global.g_bootfinish) | |
{ | |
#if 0 /*shield dma function*/ | |
dwc_otg_core_dev_disconnet(global.g_dwc_otg_pcd_tp.core_if); | |
printf("disconnect usb controller\n"); | |
#endif | |
writel(0xE59ff000, SYS_IRAM1_BASE); /* Ìø×ªµ½r7Ö´ÐÐtboot */ | |
writel(global.g_bootaddr, SYS_IRAM1_BASE + 8); | |
printf("Starting the tboot...\n"); | |
writel(0xf, CPU_A9_SUBSYS_CFG); | |
} | |
} | |
void usb_boot(WORD32 USB_ADDR) | |
{ | |
global.g_USB_TIMEOUT = 0xff; | |
//USB3Slave_boot(); | |
tsp_usb_init(); | |
USB_Boot(); /*usb bootÏÂÔØÄ£Ê½*/ | |
} | |
/******************************************************************************* | |
* Function: uart_boot | |
* Description: download from uart-bootrom | |
* Parameters: | |
* Input: | |
* | |
* Output: | |
* | |
* Returns: | |
* | |
* | |
* Others: | |
********************************************************************************/ | |
void UART_Boot(void) | |
{ | |
WORD32 dwLen; | |
WORD32 dwMaxLen; | |
BYTE *pbyBuf; | |
printf("UART_Boot\n"); | |
global.g_State = ST_WAIT_SYNC_FLAG; | |
pbyBuf = (BYTE*)tmp; | |
for(dwMaxLen = 0; dwMaxLen < 64; dwMaxLen++) | |
{ | |
tmp[dwMaxLen] = 0; | |
} | |
dwMaxLen = 512; //¿ØÖÆÆ÷ÓÐÒªÇóbulk outʱ£¬½ÓÊÕ³¤¶È´óÓÚµÈÓÚ512 | |
/* µ±usb_mode =1ʱ£¬ÓÃÓÚHSIC,µ±usb_mode =0ʱ£¬ÓÃÓÚUSB */ | |
if(global.g_USB_MODE == 0) | |
{ | |
dwLen=UART_Check_Sync(pbyBuf,dwMaxLen); | |
if(0==dwLen) | |
{ | |
return ; | |
} | |
Boot_Process(pbyBuf,dwLen); | |
} | |
while(0 == global.g_bootfinish) | |
{ | |
dwLen=UART_Read(pbyBuf,1); //0x7a uart | |
if(*pbyBuf == 0x7a) | |
{ | |
dwLen=UART_Read(pbyBuf,4); | |
global.g_bootaddr = pbyBuf[3]|pbyBuf[2]<<8|pbyBuf[1]<<16|pbyBuf[0]<<24; | |
dwLen=UART_Read(pbyBuf,4); | |
global.g_bootsize = pbyBuf[3]|pbyBuf[2]<<8|pbyBuf[1]<<16|pbyBuf[0]<<24; | |
} | |
dwLen=UART_Read(global.g_bootaddr,global.g_bootsize); | |
dwLen=UART_Read(pbyBuf,1); //0x8a | |
if(*pbyBuf == 0x8a) | |
{ | |
global.g_bootfinish = 1; | |
dwLen=UART_Read(pbyBuf,4); | |
global.g_bootaddr = pbyBuf[3]|pbyBuf[2]<<8|pbyBuf[1]<<16|pbyBuf[0]<<24; | |
} | |
} | |
if(1==global.g_bootfinish) | |
{ | |
writel(0xE59ff000, SYS_IRAM1_BASE); /* Ìø×ªµ½r7Ö´ÐÐtboot */ | |
writel(global.g_bootaddr, SYS_IRAM1_BASE + 8); | |
printf("Starting the tboot ...\n"); | |
writel(0xf, CPU_A9_SUBSYS_CFG); | |
} | |
} | |
void uart_boot(void) | |
{ | |
global.g_USB_TIMEOUT = 0xff; | |
UART_Boot(); /*uart bootÏÂÔØÄ£Ê½*/ | |
} | |