📄 main.c
字号:
/******************************************************** * bootloader/main.c: main routine * Copyright (C) LiYuTai,CO.,Ltd. * ARMSys's BootLoader * Revision: 1.3 * Id: main.c,v 1.3 2005/03/20 * Modified: * -- Add Xmodem download function * (main.c, xmodem.c, xmodem.h); * -- Correct a bug for Exception vector * (44binit.s, 44b.h); * ********************************************************/#include <string.h>#include ".\Target\option.h"#include ".\Target\def.h"#include ".\Target\44b.h"#include ".\Target\44blib.h"#include ".\usb\usbdrv.h"#include ".\usb\Usb_reg.h"#include ".\fat16\fat16.h"#include ".\flashtest\flash.h"#include "modem\xmodem.h"//////////////////board test/////////////////////#include ".\armsystest\Nandflash.h"#include ".\armsystest\rtc.h"#include ".\armsystest\keyboard.h"#include ".\armsystest\eint.h"#include ".\armsystest\iic.h"#include ".\armsystest\adc.h"#include ".\armsystest\lcd.h"#include ".\armsystest\touch.h"#include ".\armsystest\timer.h"#include ".\armsystest\uart.h"//#include ".\tcpipsrc\ping.h"extern void Ping_test(void);#include <stdio.h>void __irq MEint4567Isr(void);void (*runinram)(void)=(void (*)(void))RAM_ADDRESS;extern byte USBN9604_init(void);volatile byte code_loaded=0;volatile byte flash_exist=1;volatile byte filesys_exist=0;volatile char exeLoadedcode=0;volatile char Mwhich_int=0;volatile byte save_file=0;INT32U ram_addr=RAM_ADDRESS;INT32U src_addr,des_addr,length;int Uart_Getaddress(char *str, INT32U *address);//////////////test function///////////////////////void * function[][2]={ (void *)Read_ID, "Nandflash-Read ID", (void *)Test_Iic, "IIC(24LCxx)-Test ", (void *)Display_Rtc, "RTC-Display ", (void *)Keyboard_test, "Keyboard-Test ", (void *)Test_Eint, "Ext.Int-Test ", (void *)Test_Adc, "ADC-Test ", (void *)Test_TimerInt, "Timer.Int-Test ", (void *)Test_LCD, "Color LCD-Test ", (void *)Test_grayLCD, "Gray LCD-Test ", (void *)Test_Touch, "TouchScreen-Test ", (void *)Ping_test, "Ping diagnose tool", 0,0};/////////////main function////////////////////////void Main(void){ int handle,i=0,j=0,breakflag,ack,size; char aa=0; char *buff,argv[256]; //char addrbuf[4]; unsigned short nandflashid; rSYSCFG=CACHECFG;// Using 8KB Cache// Port_Init(); Uart_Init(0,115200); Beep(0x01); Led_Display(0xf); Delay(0); Uart_Select(0); //Select UART0// Uart_Printf("\n---------------------------------------------------------------"); Beep(0x00); Uart_Printf("\nOEM name : HangZhou LiYuTai elec. www.hzlitai.com.cn "); Uart_Printf("\nFunction : ARMSys's BootLoader for Linux V1.3 "); Uart_Printf("\nEmail : lyt_tech@yahoo.com.cn "); Uart_Printf("\nUART comfig: 115.2kbps,8Bit,NP,UART0 "); Uart_Printf("\nusing USB : Yes "); nandflashid=Check_Flash_Id(); if(nandflashid==0xec73) Uart_Printf("\nNand-flash : K9F2808 "); else if(nandflashid==0xec75) Uart_Printf("\nNand-flash : K9F5608 "); else { Uart_Printf("\nNand-flash : None "); flash_exist=0; } Led_Display(0x0); Uart_Printf("\nInitializing system... ..."); if(flash_exist) { if(fatInit()==0)//如果文件系统存在,就可以通过exint4~6键启动保存的程序,或通过exint7键设置保存file模式 { /* Uart_Printf("\n---------------------------------------------------------------"); Uart_Printf("\n按下EXINTx键自动进入对应功能: "); Uart_Printf("\nEXINT4:"); Uart_Printf("\nEXINT5:载入uClinux运行."); Uart_Printf("\nEXINT6:载入保存在Nandflash中的程序并运行(仅用于从0xc008000运行)."); Uart_Printf("\nEXINT7:准备好将从USB口下载的程序保存到Nandflash。\n等待按键"); */ filesys_exist=1; rINTCON=0x1;//disable fiq, enable irq pISR_EINT4567=(int)MEint4567Isr; rPCONG|=0xff00; //EINT7~0 rPUPG=0x0; //pull up enable rEXTINT=(rEXTINT&0x0000ffff)|0x22220000; //Falling edge mode--------04-12-11 rINTMSK&=~(BIT_GLOBAL|BIT_EINT4567); while((i<10)&&(exeLoadedcode==0)) { Delay(1500); Uart_Printf(" ..."); i++; } if(exeLoadedcode) { switch(Mwhich_int) { case 1: case 3: case 5: case 7: break; case 2: Uart_Printf("\nLoad image.rom...\n"); src_addr=0x20000; des_addr=0xc100000; for(i=0;i<0x180000;i++) *(unsigned char *)des_addr++ = *(unsigned char *)src_addr++; Uart_Printf("\nStart uClinux\n"); ram_addr=0xc100000; ((void (*)(void))ram_addr)(); break; case 4: Uart_Printf("EXINT5/EXINT6 is Pressed! "); handle=fat_open("\\code\\44bapp.bin"); if((handle==(-1))||(handle==(-2))) { Uart_Printf("\nOpen 44bapp.bin failed!"); //return -1; } else { buff=(char *)RAM_ADDRESS; fat_read(handle, buff, 0x5f0000); fat_close(handle); Uart_Printf("\nCompleted download, turn to execute the code!\n"); Delay(1000); //it should be delay a long time for pc software stable runinram(); } break; case 8: save_file=1; break; }//switch }//if(exe...) }//if(fatinit...) }//if(flash_...)//================================================================================================== while(1) { breakflag=0; code_loaded=0; Uart_Printf("\n---------------------------------------------------------------"); Uart_Printf("\n1.Download code to SDRAM."); Uart_Printf("\n2.Download code to SDRAM & Nandflash."); Uart_Printf("\n3.Burn flashROM."); Uart_Printf("\n4.Copy code from flashROM to SDRAM."); Uart_Printf("\n5.Run at specify address."); Uart_Printf("\n6.Run code in Nandflash."); Uart_Printf("\n7.Start uClinux."); Uart_Printf("\n8.Format Nandflash."); Uart_Printf("\n9.Test hardware"); aa = Uart_Getch(); switch(aa) { case '2': if(filesys_exist==1) save_file=1; else { Uart_Printf("\nError: Nandflash has not been formatted!"); break; } case '1': Uart_Printf("\nInput the address to put the code (Default address is 0xc008000):"); while(Uart_Getaddress(argv,&ram_addr)); Uart_Printf("Use USB (U) or Xmodem(X) to download code?(U/X)"); aa = Uart_Getch(); if((aa=='U')||(aa=='u')) { if(USBN9604_init()) { Uart_Printf("\nReset the USB controller failed, active USB interface failed."); //return 1; } else { Uart_Printf("\nUSB Interface is active!\nYou can use USBdownload.exe to download *.bin file!"); } rINTCON=0x5;//fiq disable while (!code_loaded); Uart_Printf("\nCompleted Download!"); } else if((aa='X')||(aa='x')) { Uart_Printf("\nReady for downloading using xmodem..."); Uart_Printf("\nWaiting..."); buff=(char *)ram_addr; ack=xmodem_receive(buff); if (ack == 0) { Uart_Printf("\nFailed downloading file."); } else { Uart_Printf("\nSuccess downloading file of %d bytes.",ack); } if(save_file==1) { handle=fat_open("\\code\\44bapp.bin"); if((handle!=-1)&&(handle!=-2)) { i=fat_close(handle); i=fat_remove("\\code\\44bapp.bin"); } fat_mkdir("\\code"); handle = fat_creat("\\code\\44bapp.bin", 0x27);//0x27:txt file? //Uart_Printf("\nfat_creat's file handle=%d",handle); buff=(char *)ram_addr; Uart_Printf("\nBegin Write to file in nandflash..., please wait ..." ); i=fat_write(handle, (char *)buff, ack);// i=fat_lseek(handle, 0, SEEK_SET); i=fat_close(handle); i=fat_open("\\code\\44bapp.bin"); i=fat_close(i); Uart_Printf("\nFinished writing!" ); } } break; case '3': Uart_Printf("\n\nPlease refer 3 step below and use function 1 and 5 to burn flash:"); Uart_Printf("\nStep1: Download *.bin (the binary code you want to burn to flash) to address 0x0c200000."); Uart_Printf("\nStep2: Download flashprgm\44bapp.bin to 0x0c008000."); Uart_Printf("\nStep3: Run at address 0x0c008000.\n"); break; case '4': Uart_Printf("\nInput source address:"); while(Uart_Getaddress(argv,&src_addr)); Uart_Printf("\nInput destination address:"); while(Uart_Getaddress(argv,&des_addr)); Uart_Printf("\nInput the length (BYTE):"); while(Uart_Getaddress(argv,&length)); Uart_Printf("\nDo you confirm to copy? (Y/N)"); aa = Uart_Getch(); if((aa=='Y')||(aa=='y')) { Uart_Printf("\nBegin copy ..."); j=1; for(i=0;i<length;i++) *(unsigned char *)des_addr++ = *(unsigned char *)src_addr++; if((i%0x100)==0) { Led_Display(j); j<<1; if(j==0x10) j=1; } Uart_Printf("\nComplete copy."); } break; case '5': Uart_Printf("\nInput the address (Default address is 0xc008000):"); ram_addr=RAM_ADDRESS; while(Uart_Getaddress(argv,&ram_addr)); Uart_Printf("\nPlese wait a moment to start running..."); /*对USBN9603进行一次软件复位*/ write_usb(MCNTRL, SRST); Delay(1000);//it should be delay a long time for pc software stable ((void (*)(void))ram_addr)(); break; case '6': write_usb(MCNTRL, SRST); Delay(1000);//it should be delay a long time for pc software stable if((flash_exist==1) && (filesys_exist==1)) { handle=fat_open("\\code\\44bapp.bin"); if((handle==(-1))||(handle==(-2))) { Uart_Printf("\nOpen 44bapp.bin file faild!"); //return -1; } else { Uart_Printf("\nInput the running address (Default address is 0xc008000):"); ram_addr=RAM_ADDRESS; while(Uart_Getaddress(argv,&ram_addr)); buff=(char *)ram_addr;//RAM_ADDRESS; i=fat_read(handle, buff, 0x5f0000); i=fat_close(handle); Uart_Printf("\nComplete download, turn to execute the code!\n"); Delay(1000);//it should be delay a long time for pc software stable ((void (*)(void))ram_addr)();////////runinram(); } } break; case '7': Uart_Printf("\nLoad image.rom...\n"); src_addr=0x20000; des_addr=0xc100000; for(i=0;i<0x180000;i++) *(unsigned char *)des_addr++ = *(unsigned char *)src_addr++; Uart_Printf("\nStart uClinux\n"); ram_addr=0xc100000; ((void (*)(void))ram_addr)(); case '8': if(flash_exist) { Uart_Printf("\nThe content in Nandflash will be lost, confirm to format?(Y/N)"); aa= Uart_Getch(); if((aa=='Y')||(aa=='y')) { fat_format(NAND_FLASH_Drv,16,0x06); filesys_exist=1; } } else Uart_Printf("\nCan't find Nandflash!"); break; case '9': //Uart_Printf("\nUSB接口失效。"); /*对USBN9603进行一次软件复位*/ write_usb(MCNTRL,SRST); Delay(1000);//it should be delay a long time for pc software stable //Functions test while(1) { i=0; Uart_Printf("\n\n"); while(1) { //display menu Uart_Printf("%2d:%s",i+1,function[i][1]); i++; if((int)(function[i][0])==0) { Uart_Printf("\n"); break; } if((i%2)==0) Uart_Printf("\n"); } Uart_Printf("\nSelect the function to test?(Press Reset button to restart)"); i=Uart_GetIntNum(); i--; Uart_Printf("\n"); if(i>=0 && (i<(sizeof(function)/8)) ) ( (void (*)(void)) (function[i][0]) )(); } break; }//switch }//while (1) //return 0;}void __irq MEint4567Isr(void){ rINTMSK|=(BIT_GLOBAL|BIT_EINT4567); exeLoadedcode=1; Mwhich_int=rEXTINTPND; rEXTINTPND=0x0f; //clear EXTINTPND reg. rI_ISPC=BIT_EINT4567; //clear pending_bit rINTMSK&=~(BIT_GLOBAL|BIT_EINT4567); }int Uart_Getaddress(char *str, INT32U *address){ char aa; char *buff; INT32U tempaddress=RAM_ADDRESS; int result=0; buff=str; Uart_GetString(buff); buff=str; while(*buff++!='\0') { aa=*buff; result=0; if(aa=='x'||aa=='X') { tempaddress=0; buff++; result=0; while(*buff!='\0') { aa=*buff; buff++; if((aa>=0x30)&&(aa<=0x39)) /* Destination IP address */ { aa=aa-'0'; } else if ((aa>='A')&&(aa<='F')) { aa=aa-'A'+10; } else if((aa>='a')&&(aa<='f')) { aa=aa-'a'+10; } else { result=-1; break; } tempaddress=(tempaddress<<4)+aa; } } } if(result!=0) { Uart_Printf("\nPlease input Hex value, example: 0xc008000\n"); result=-1; } *address=tempaddress; return(result);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -