示例#1
0
文件: main.c 项目: k-nowicki/NowBoot
int main( void )
{
	volatile unsigned long ul;

	// Initialize address and notify host
  	pCurrent = (u08*)vStart;
  	u32 kopycounter=0;

	prvSetupHardware( );

    // Version Controll
    debug_msg( "NowBoot V1.2; Compiled at: "__DATE__" "__TIME__"\r");
	wait_ms(1000);
    debug_msg("NowBoot: Running drives and filesystem.");
    StorageInit();
	wait_ms(100);
    debug_msg("NowBoot: Checking for new firmware...");
    //f_rename ( "1:fmw/fmw_n.old", "fmw/fmw_n.bin" );	//For tests only
	res = f_open(&firmwarefile, "1:fmw/fmw_n.bin", FA_OPEN_EXISTING | FA_READ);
	if(res != FR_OK){
		f_close(&firmwarefile);
    	debug_msg("NowBoot: Can`t find new firmware.");
        debug_msg("NowBoot: Checking for in-flash firmware");
        if((*((u08*)vStart+4)==0xFF)&&(*((u08*)(vStart+5))==0xff)){
        	debug_msg("NowBoot: Flash is empty!");
        	debug_msg("NowBoot: Opening default firmware!");
        	res = f_open(&firmwarefile, "1:fmw/fmw_0.bin", FA_OPEN_EXISTING | FA_READ);
        	if(res != FR_OK){
        		f_close(&firmwarefile);
            	debug_msg("NowBoot: Can`t find any firmware file... Nothing to do.");
            	for(;;)AT91C_BASE_SYS->WDTC_WDCR = 0xA5000001;	//endless loop
        	}
        	goto fmw_prog;
        }
        else{
        	debug_msg("NowBoot: Flash contain firmware.");
        	goto app_now;
        }
	}else{
    	debug_msg("NowBoot: Found new firmware.");
    	fmw_prog:
    	debug_msg("NowBoot: Start programming...");
		wait_ms(300);
		debug_txt("\rCopying page: ");
		for (;;) {
			debug_txt("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\bKopiuje strone: "); debug32_tdec(kopycounter++);
        	res = f_read(&firmwarefile, page, sizeof(page), &br);    /* Read a chunk of src file */
        	if (res || br == 0) {
        		wait_ms(100);
        		debug_msg("NowBoot: Copying finshed.");
        		break; /* error or eof */
        	}
        	//memset(page,0xff,sizeof(page));		//for tests only
        	flash_write(pCurrent , (void *) page );
        	pCurrent+= MEMORY_PAGE_SIZE;
    	}

	}
	f_close(&firmwarefile);

/*
    TO DO:
		MD5 verification
*/


    wait_ms(300);
    debug_msg("NowBoot: Firmware upgrade successful.");
    debug_msg("NowBoot: Removing firmware file.");
    f_unlink ( "1:fmw/fmw_n.old" );	//removeing old firmware
    f_rename ( "1:fmw/fmw_n.bin", "fmw/fmw_n.old" );

app_now:
	wait_ms(100);
    debug_msg("NowBoot: End of Boot.");
    spiInit();
    wait_ms(1000);
    AT91C_BASE_SYS->WDTC_WDCR = 0xA5000001;	//WDT restart
    asm volatile(
    	"LDR pc, =0x00108000"		//Jump to firmware start
    );
    debug_msg("NowBoot: Something bad happened! I should never be here.");
    wait_ms(100);
	vPortSoftReset();

  	return 0;
}
示例#2
0
//prints text starting at str
//adds new line first
void debug_msg(char *str)
{
	debug_chr('\r');
	debug_chr('\n');
	debug_txt(str);
}