⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 调试9200处理器板卡的一个调试实例
💻 C
📖 第 1 页 / 共 2 页
字号:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	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 + -