📄 main.c
字号:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
puts("Now it the test\n");
InitPio();
while(1)
{
c = getchar();
switch(c)
{
case 'X':
commDebug();
break;
case 'a':
break;
default:
printf("%c pressed\n",c);
break;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
puts("\n***************BIOS For 9200******************\n");
//puts("* *\n");
//puts("* BIOS For AT91RM9200 *\n");
//puts("* *\n");
//puts("*********************************************\n");
//get counter from CKGR_MCFR
/*printf("Set Processor Clock = %dHz, Master Clock = %dHz\n",
AT91F_PMC_GetProcessorClock(AT91C_BASE_PMC, AT91C_BASE_CKGR, 32768),
AT91F_PMC_GetMasterClock(AT91C_BASE_PMC, AT91C_BASE_CKGR, 32768));
*/
InitPio();
InitTwi();
InitNorFlash();
InitNandFlash();
while(timeout--)
{
int key_status;
key_status=GetKeyStatus();
if((key_status==1)||(key_status==2)||(key_status==3)||(key_status==4))
{
bootflag=2;
break;
}
}
if(bootflag==1)
{
FindNandBoot();
}
while(1) {
puts("Select\n");
for(i=0; Functions[i].FuncAddr; i++)
printf("%d : %s\n", i, Functions[i].str);
//putch('\n');
c = getch();
if((c>='0')&&(c<('0'+i)))
(*Functions[c-'0'].FuncAddr)(downloadAddress, downloadFileSize);
}
}
static volatile U8 *RxTmp;
void DBGU_Rx_Isr(void)
{
//读完状态寄存器后才清掉中断源
unsigned int csr = (((AT91PS_USART)AT91C_BASE_DBGU)->US_CSR & ((AT91PS_USART)AT91C_BASE_DBGU)->US_IMR);
if (csr & AT91C_US_RXRDY) {
*RxTmp = AT91F_US_GetChar((AT91PS_USART) AT91C_BASE_DBGU);
// putch(*RxTmp);
RxTmp++;
}
}
U32 WaitComDownload(void);
void ComDownload(U32 a1, U32 a2)
{
U8 sel;
puts("Select\n1: Kernel\n2: initrd\n3: boot\nEsc: exit\n");
while(1) {
sel = getch();
if(sel=='1') {
downloadAddress = LINUX_KERNEL_ADDR;
break;
}
if(sel=='2') {
downloadAddress = INITRD_START;
break;
}
if(sel=='3') {
downloadAddress = BOOT_PORG_ADDR;
break;
}
if(sel==0x1b)
return;
}
if(WaitComDownload())
return;
if(sel=='2')
return;
if(sel=='3')
start_kernel(downloadAddress, 0);
puts("Run ?\n1: boot without initrd\n2: boot wiht initrd\nEsc: exit\n");
while(1) {
char c = getch();
if(c==0x1b)
break;
if((c=='1')||(c=='2'))
start_kernel(downloadAddress, (c=='1')?0:INITRD_START);
}
}
/*
void RunProg(U32 addr, U32 size)
{
start_kernel(downloadAddress, 0);
}*/
void Program_eep(U32 addr, U32 size)
{
#ifdef IIC_SUPPORT
char *pdata;
U32 eep_addr;
int bytes, len;
U32 loop;
char data[EEP_RW_CHK_CNT];
eep_addr = 0;
pdata = (char *)addr;
len = size;
while(len>0) {
putchar('.');
bytes = (len>EEP_RW_CHK_CNT)?EEP_RW_CHK_CNT:len;
AT91F_TWI_Write(AT91C_BASE_TWI, eep_addr, pdata, bytes);
eep_addr += bytes;
pdata += bytes;
len -= bytes;
//for (loop=0; loop<30000; loop++);
delay(5);
}
puts("end\n");
eep_addr = 0;
pdata = (char *)addr;
len = size;
/*
while(len) {
bytes = (len>EEP_RW_CHK_CNT)?EEP_RW_CHK_CNT:len;
AT91F_TWI_Read(AT91C_BASE_TWI, eep_addr, data, bytes);
for(loop=0; loop<bytes; loop++)
if(data[loop]!=pdata[loop]) {
puts("Program EEPROM fail!\n");
printf("%x,%x\n", loop, data[loop]);
return;
}
eep_addr += bytes;
pdata += bytes;
len -= bytes;
}*/
puts("Program EEPROM OK!\n");
#endif
}
U32 WaitComDownload(void)
{
U32 size;
U16 dnCS, CheckSum;
U8 *buf;
puts("Now downloadfile from uart0...\n");
buf = (U8 *)downloadAddress;
RxTmp = buf-4;
//设置调试串口中断处理程序入口,使能属于调试串口的子中断
DbguIrqHandler = DBGU_Rx_Isr;
AT91F_US_EnableIt((AT91PS_USART) AT91C_BASE_DBGU, (AT91C_US_RXRDY | AT91C_US_OVRE | AT91C_US_FRAME | AT91C_US_PARE));
while((U32)RxTmp<(U32)buf) {
ShowLed(0);
delay(80);
ShowLed(15);
delay(80);
} //接收文件长度,4 bytes
size = *(U32 *)(buf-4);
downloadFileSize = size-6;
printf("Download File Size = %d\n", size);
while(((U32)RxTmp-(U32)buf)<(size-4)) {
ShowLed(0);
delay(80);
ShowLed(15);
delay(80);
}
AT91F_US_DisableIt((AT91PS_USART) AT91C_BASE_DBGU, (AT91C_US_RXRDY | AT91C_US_OVRE | AT91C_US_FRAME | AT91C_US_PARE));
DbguIrqHandler = NULL;
dnCS = (buf[downloadFileSize+1]<<8)|buf[downloadFileSize];
CheckSum = 0;
for(size=0; size<downloadFileSize; size++)
CheckSum += buf[size];
if(dnCS!=CheckSum) {
puts("\nCheckSum error!\n");
return 1;
}
puts("\nDwonload ok\n");
return 0;
}
U8 ch2int(U8 data)
{
if((data >= '0')&&(data <= '9'))
return (data - '0');
if((data >= 'a') && (data <= 'f'))
return (data - 'a' + 10);
return -1;
}
U8 int2ch(U8 data)
{
if((data >= 0)&&(data <= 9))
return (data + '0');
if((data >= 0xa) && (data <= 0xf))
return (data + 'a' - 0xa);
return -1;
}
void commDebug(void)
{
U32 addr, data;
U8 rx[21];
U32 CAN_BASE_ADDR = 0x50000000;
while(1)
{
printf("\nX");
rx[20] = getchar();
putchar(rx[20]);
if(rx[20]=='x') return;
switch(rx[20])
{
case 'w':
rx[0] = getchar(); //space
putchar(rx[0]);
rx[1] = getchar();
putchar(rx[1]);
rx[2] = getchar();
putchar(rx[2]);
rx[3] = getchar();
putchar(rx[3]);
rx[4] = getchar();
putchar(rx[4]);
rx[5] = getchar();
putchar(rx[5]);
rx[6] = getchar();
putchar(rx[6]);
rx[7] = getchar();
putchar(rx[7]);
rx[8] = getchar();
putchar(rx[8]);
rx[9] = getchar(); //space
putchar(rx[9]);
rx[11] = getchar();
putchar(rx[11]);
rx[12] = getchar();
putchar(rx[12]);
rx[13] = getchar();
putchar(rx[13]);
rx[14] = getchar();
putchar(rx[14]);
rx[15] = getchar();
putchar(rx[15]);
rx[16] = getchar();
putchar(rx[16]);
rx[17] = getchar();
putchar(rx[17]);
rx[18] = getchar();
putchar(rx[18]);
addr = ch2int(rx[1])* 0x10* 0x10* 0x10* 0x10* 0x10* 0x10* 0x10 + ch2int(rx[2])* 0x10* 0x10* 0x10* 0x10* 0x10* 0x10 + ch2int(rx[3])* 0x10* 0x10* 0x10* 0x10* 0x10 + ch2int(rx[4])* 0x10* 0x10* 0x10* 0x10 + ch2int(rx[5])* 0x10* 0x10* 0x10 + ch2int(rx[6])* 0x10* 0x10 + ch2int(rx[7]) * 0x10 + ch2int(rx[8]);
data = ch2int(rx[11])* 0x10* 0x10* 0x10* 0x10* 0x10* 0x10* 0x10 + ch2int(rx[12])* 0x10* 0x10* 0x10* 0x10* 0x10* 0x10 + ch2int(rx[13])* 0x10* 0x10* 0x10* 0x10* 0x10 + ch2int(rx[14])* 0x10* 0x10* 0x10* 0x10 + ch2int(rx[15])* 0x10* 0x10* 0x10 + ch2int(rx[16])* 0x10* 0x10 + ch2int(rx[17]) * 0x10 + ch2int(rx[18]);
VPint(addr) = data;
printf("\nwrite 0x%x to 0x%x\n", data, addr);
break;
case 'W':
rx[0] = getchar(); //space
putchar(rx[0]);
rx[7] = getchar();
putchar(rx[7]);
rx[8] = getchar();
putchar(rx[8]);
rx[9] = getchar(); //space
putchar(rx[9]);
rx[17] = getchar();
putchar(rx[17]);
rx[18] = getchar();
putchar(rx[18]);
addr = ch2int(rx[7]) * 0x10 + ch2int(rx[8]);
data = ch2int(rx[17]) * 0x10 + ch2int(rx[18]);
VPint(CAN_BASE_ADDR + addr) = data;
printf("\nwrite 0x%x to 0x%x\n", data, addr);
break;
case 'r':
rx[0] = getchar(); //space
putchar(rx[0]);
rx[1] = getchar();
putchar(rx[1]);
rx[2] = getchar();
putchar(rx[2]);
rx[3] = getchar();
putchar(rx[3]);
rx[4] = getchar();
putchar(rx[4]);
rx[5] = getchar();
putchar(rx[5]);
rx[6] = getchar();
putchar(rx[6]);
rx[7] = getchar();
putchar(rx[7]);
rx[8] = getchar();
putchar(rx[8]);
addr = ch2int(rx[1])* 0x10* 0x10* 0x10* 0x10* 0x10* 0x10* 0x10 + ch2int(rx[2])* 0x10* 0x10* 0x10* 0x10* 0x10* 0x10 + ch2int(rx[3])* 0x10* 0x10* 0x10* 0x10* 0x10 + ch2int(rx[4])* 0x10* 0x10* 0x10* 0x10 + ch2int(rx[5])* 0x10* 0x10* 0x10 + ch2int(rx[6])* 0x10* 0x10 + ch2int(rx[7]) * 0x10 + ch2int(rx[8]);
printf("\n0x%x = 0x%x\n", addr, VPint(addr));
break;
case 'R':
rx[0] = getchar(); //space
putchar(rx[0]);
rx[7] = getchar();
putchar(rx[7]);
rx[8] = getchar();
putchar(rx[8]);
addr = ch2int(rx[7]) * 0x10 + ch2int(rx[8]);
printf("\n0x%x + 0x%x = 0x%x\n", CAN_BASE_ADDR, VPint(CAN_BASE_ADDR + addr));
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -