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

📄 spl.c

📁 mx21的NAND Flash Bootloader源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		    spare[9] = 0x19;		    spare[10] = 0x03;		    spare[11] = 0x20;		    spare[12] = 0x08;		    spare[13] = 0x00;		    spare[14] = 0x00;		    spare[15] = 0x00;*/		  		    isFirstPageOfaBlock = 0;		}	spare[5] = 0xff;	if(choice == 2)	{			if(write_over == 0)			{				if(NAND_WriteAndVerify_OnePage(page, (char*)p, spare))				{					EUARTputString("Program Error\n");					FoundBadBlock(badBlockPos);					return;				}				p += 512/sizeof(int);			}			page++;					if(write_over == 0)			{				if(size<(page-startPage-nBadBlock*32)*512)					write_over = 1;			}		/*	if(write_over == 1)				{					NAND_Write_OnePage(page, (char*)p, spare);				}			*/			//if(page >= (0x1500000/512 - 31))			if((page*NAND_FLASH_PAGE_MAIN_SIZE) >= 0x02300000)			{				erase_over = 1;				EUARTputString("Erase complete\n");			}			if(erase_over == 1)				return;	}	else	{		if(NAND_WriteAndVerify_OnePage(page, (char*)p, spare))			{				EUARTputString("Program Error\n");				FoundBadBlock(badBlockPos);				return;			}			page++;			p+=512/sizeof(int);			if(size<(page-startPage-nBadBlock*32)*512)				return;	}	}}void RestoreBadBlock(){	char	spare[NAND_FLASH_PAGE_SPARE_SIZE];	char	main[NAND_FLASH_PAGE_MAIN_SIZE];	int	startPage, page,endpage;	int	isFirstPageOfaBlock = 0,i,badBlockPos;	startPage = 0x100000/512;	endpage = 0x04000000/512;		for(i=0;i<NAND_FLASH_PAGE_SPARE_SIZE;i++)		spare[i]=0xff;	for(i=0;i<NAND_FLASH_PAGE_MAIN_SIZE;i++)		main[i]=0xff;	for(page=startPage;page<endpage;page++)	{		if(page%32==0)		{			badBlockPos = page;				if(NAND_Erase(page))			{				EUARTputString("Erase Error\n");				FoundBadBlock(page);				return;			}			EUARTputString(".");											}		if(NAND_WriteAndVerify_OnePage(page, main, spare))			{				EUARTputString("program Error\n");				FoundBadBlock(badBlockPos);				return;			}	}	}void FoundBadBlock(int page){	char	spare[NAND_FLASH_PAGE_SPARE_SIZE];	char	main[NAND_FLASH_PAGE_MAIN_SIZE];	int	startPage, page,endpage;	int	isFirstPageOfaBlock = 0,i;	startPage = 0x100000/512;	endpage = 0x04000000/512;		for(i=0;i<NAND_FLASH_PAGE_SPARE_SIZE;i++)		spare[i]=0xff;	for(i=0;i<NAND_FLASH_PAGE_MAIN_SIZE;i++)		main[i]=0xff;	spare[5] = 0x0;	NAND_WriteAndVerify_OnePage(page, main, spare);}void mx21_module_init(){	//comment ### Master Priority Register for Slave Port 3	// Keep LCDC as the highest priority	_reg_SYS_PCSR = 0;	_reg_MAX_SLV_MPR(3) = 0x00123056;	_reg_MAX_SLV_SGPCR(3) = 0;//comment # enable user mode CSI access//setmem 0x10027818 0x6000e 32        _reg_SYS_GPCR = 0x6000e;}///The Main Functionint main(){	char	*pCmdLine;	char    *pMem;	int 	i;	int	bootOption;	int	fileSize;#ifdef __PLL_CHOICE__	int mpll[3];	int MFI,MFN,MFD;	unsigned long mpll_value,fout;	unsigned long presc,bclkdiv,ipdiv,fref;	int fout_trial;	signed long deviation;	unsigned long temp;	int redundant = 0;	//stat data	char c;	char  freq = '7';//default setting, mpll 266,fclk 266, bclk 88.	#endif	init();	//Set this for NAND Flash work rightly	_reg_CRM_PCDR0=(_reg_CRM_PCDR0&0xffff0fff)|0x00007000;	for(i=0;i<100000;i++);	MX21_UartSetting();	MX21_InitInternalUART();		EUARTputString("\n\nDBMX21 Linux 8-bit NAND Flash Bootloader ver mx21_to3_rel3.2\n");	EUARTputString("Copyright (C) 2005 Freescale Semiconductors Suzhou Ltd.\n\n");   	EUARTputString((char *)cmdLine);   	EUARTputString("\n\n");	EUARTputString("MPLL = 266, FCLK = 266, BCLK = 133\n\n");		//Copy Kernel to Memory	if(NAND_ReadID(&i))	{		//EUARTputString("NAND ID Read Error\n");	}	EUARTputString("NAND Flash ID:");	EUARTputHex(i>>24);EUARTputHex(i>>16);EUARTputHex(i>>8);EUARTputHex(i);	EUARTputString("\n");	bootOption=GetBootOption();	if(bootOption==-1)	{boot_kernel:		EUARTputString("Copy Kernel to Memory\n");			CopyKernelToMem();			//Copy Command Line		pMem = (char *)KERNEL_CMDLINE;		pCmdLine = (char *)&cmdLine;		while ((*(pMem++)=*(pCmdLine++)) != 0);		EUARTputString("\nJump To Kernel\n");		mx21_module_init();		//JumpToKernel((void *)KERNEL_START_ADDRESS, KERNEL_CMDLINE);		return KERNEL_START_ADDRESS;		}		// process boot option	if ((bootOption >= '0') && (bootOption <= '2'))		// i.e. flash programming	{		fileSize=usbrx();		EUARTputString("\n");		switch (bootOption)		{			case '0':	// i.e. program bootloader					EUARTputString("Program BootLoader\n");					EUARTputString("Please Plug USB Cable\n");					//_reg_CRM_PCDR0=(_reg_CRM_PCDR0&0xffff0fff)|0x00007000;					ProgramFlash(USB_DISK_START+0x9A00,fileSize,0);					break;			case '1':	// i.e. program kernel image					EUARTputString("Program Kernel Image\n");					EUARTputString("Please Plug USB Cable\n");					ProgramFlash(USB_DISK_START+0x9A00,fileSize,1);					break;			case '2':	// i.e. program root-disk					EUARTputString("Program RootDisk\n");					EUARTputString("Please Plug USB Cable\n");					ProgramFlash(USB_DISK_START+0x9A00,fileSize,2);					break;		}		EUARTputString("\nPress RESET button on ADS board ...");		while (1);	// infinite loop	}	if(bootOption == '9')	{		RestoreBadBlock();	}	if (bootOption == '6')	// i.e. boot with a different command line	{		EUARTputString("New command line: ");		i = 0;		do		{			while (!EUARTdataReady());		// wait for key press			c = EUARTgetData();			if (c != '\r')			{				if (c == '\b')				{					if (i > 0)					{						// erase the character						EUARTputData('\b');						EUARTputData(' ');						EUARTputData('\b');						--i;					}				}				else				{					EUARTputData(c);					cmdLine[i++] = c;				}			}		} while ((c != '\r') && (i < CMD_LINE_LEN-1));		if (i > 0)			cmdLine[i] = 0;		// mark end of string		EUARTputData('\n');		goto boot_kernel;	}	#ifdef __PLL_CHOICE__	if(bootOption == '8')	{		//now it is mpll266,presc 0, bclkdiv 2,ipdiv 1.		//get input mpll				EUARTputString("Please enter your settings mpll(MHz)... \n ");		i = 0;		do		{			while (!EUARTdataReady());		// wait for key press			c = EUARTgetData();			if (c != '\r')			{				EUARTputData(c);				c = c - '0';				mpll[i++] = c;			}		} while ((c != '\r') && (i<3));		mpll_value = mpll[0]*100 + (mpll[1])*10 + mpll[2];		EUARTputString("\n");		//get input presc value		#if 1		EUARTputString("Please enter your settings PRESC(0~3)... \n ");#else//Changed for TO2		EUARTputString("Please enter your settings PRESC(0~7)... \n ");#endif		while (!EUARTdataReady());		// wait for key press		c = EUARTgetData();		if (c != '\r')		{			EUARTputData(c);			c = c - '0';			presc = c;		}		EUARTputString("\n");				//get input bclkdiv value				EUARTputString("Please enter your settings BCLKDIV(00~15)... \n ");		i = 0;		do		{			while (!EUARTdataReady());		// wait for key press			c = EUARTgetData();			if (c != '\r')			{				EUARTputData(c);				c = c - '0';				mpll[i++] = c;			}		} while ((c != '\r') && (i <2));		bclkdiv = mpll[0]*10+mpll[1];		EUARTputString("\n");		//get input ipdiv value				EUARTputString("Please enter your settings ipdiv(0~1)... \n ");		while (!EUARTdataReady());		// wait for key press		c = EUARTgetData();		if (c != '\r')		{			EUARTputData(c);			c = c - '0';			ipdiv = c;		}				_reg_CRM_MPCTL0 = mpll_value | (presc<<10) | (bclkdiv<<16) | (ipdiv<<26);		EUARTputString("\n");	}	goto boot_kernel;#endif	return 0;}//>>>>>Body

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -