📄 spl.c
字号:
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 + -