2440loader.c
上传用户:qiulin1960
上传日期:2013-10-16
资源大小:2844k
文件大小:8k
源码类别:

Windows CE

开发平台:

Windows_Unix

  1. //
  2. // Copyright (c) Microsoft Corporation.  All rights reserved.
  3. //
  4. //
  5. // Use of this source code is subject to the terms of the Microsoft end-user
  6. // license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
  7. // If you did not accept the terms of the EULA, you are not authorized to use
  8. // this source code. For a copy of the EULA, please see the LICENSE.RTF on your
  9. // install media.
  10. //
  11. /*++
  12. THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  13. ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  14. THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  15. PARTICULAR PURPOSE.
  16. --*/
  17. /************************************************
  18.  * NAME    : 2440loader.C *
  19.  * DESC    :  *
  20.  * History : 2002.02.25 ver 0.0 *
  21.  *         : Modified for SMDK2440 PPC2003 BSP ( November 29, 2003 ) -> HMSEO
  22.  * History : 2006.03.27 ver 1.0 *
  23.  *         : Modified for QT2440 by wujiarui
  24. ************************************************/
  25. #include <stdlib.h>
  26. #include <string.h>
  27. #include "option.h"
  28. #include "def.h"
  29. #include "2440addr.h"
  30. #include "2440lib.h"
  31. #include "2440slib.h"
  32. #include "2440addr.h"
  33. #include "nand.h"
  34. #include "..incloader.h"
  35. #define SIGN_ON "nWinCE NAND Boot v1.00n" __DATE__ " " __TIME__ "n"
  36. // HMSEO : Please check UUID memory location from incdrv_glob.h file.
  37. unsigned char * pbUUID = ((unsigned char *) (0x30030000 + 0x4608));
  38. //
  39. // Globals
  40. //
  41. DWORD JumpAddr;
  42. DWORD ReadImageFromNand(DWORD dwEntry, DWORD dwSig);
  43. void loadboot(void);
  44. void Main(void)
  45. {
  46.     DWORD  err; //, t0 = 0;
  47. unsigned char i,j;
  48.     
  49.     // By default, we launch image CE image. If you want to launch
  50.     // Eboot, you need to send char"e"or"E" to UART1 when it boots.
  51.     DWORD dwEntry = 1; 
  52.     MMU_EnableICache();
  53.     Uart_Init();
  54.     Uart_SendString(SIGN_ON);
  55.     NF_Init();
  56. // Check to see if the apps buttons are pressed and take
  57. // the corresponding actions if they do.
  58.     //  Change this for the final shipping device, so that user
  59.     //  doesn't have to press button to start!
  60.     //
  61.     
  62. for(j=0;j<10;j++)
  63. {
  64.  Uart_SendString("*");
  65.  Delay100us(9000);
  66.  if(rUTRSTAT1 & 0x1) //UART 有数据输入
  67.     
  68.  {
  69.  i=RdURXH1();
  70.  if((i='E')||(i='e'))
  71.  {
  72.  Uart_SendString("nEbootn");
  73.  loadboot();
  74.  }
  75.  }
  76. }
  77.     Uart_SendString("ndwEntry is ");
  78.     Uart_SendDWORD(dwEntry, TRUE);
  79.     // Hardcoded to fetch TOC descriptor dwEntry
  80.     err = ReadImageFromNand(dwEntry,0);
  81.     if (ERR_SUCCESS == err) {
  82.         Launch(JumpAddr);
  83.         err = ERR_JUMP_FAILED;
  84.     }
  85.     Uart_SendString("nBoot ERROR:");
  86.     Uart_SendDWORD(err, TRUE);
  87.     while (1);
  88. }
  89. // -----------------------------------------------------------------------------
  90. //  ReadImageFromNand:
  91. //      Reads nk.nb0 off NAND
  92. //      Returns ERR_Xxx
  93. // -----------------------------------------------------------------------------
  94. TOC toc; // made global because it's too big for our tiny stack
  95. DWORD
  96. ReadImageFromNand(DWORD dwEntry, DWORD dwSig)
  97. {
  98.     DWORD dwSectorsNeeded;
  99.     DWORD dwSector, dwLength;         // Start Sector & Length
  100.     DWORD dwRAM, i;
  101.     if ( !FMD_ReadSector(TOC_SECTOR,
  102.                         (LPBYTE)&toc,
  103.                         NULL, 1) )
  104.     {
  105.         Uart_SendString("ERR_DISK_OP_FAIL1n");
  106.         return ERR_DISK_OP_FAIL1;
  107.     }
  108.     if ( !VALID_TOC(&toc) ) {
  109.         Uart_SendString("ERR_INVALID_TOC: ");
  110.         Uart_SendDWORD(toc.dwSignature, TRUE);
  111.         return ERR_INVALID_TOC;
  112.     }
  113.     if ( !(toc.id[dwEntry].dwImageType & IMAGE_TYPE_RAMIMAGE) ) {
  114.         Uart_SendString("ERR_INVALID_FILE_TYPE: ");
  115.         Uart_SendDWORD(toc.id[dwEntry].dwImageType, TRUE);
  116.         return ERR_INVALID_FILE_TYPE;
  117.     }
  118. // ??
  119. //    if ( !(toc.id[dwEntry].dwImageType & IMAGE_TYPE_BINFS) ) {
  120. //        dwSectorsNeeded = toc.id[dwEntry].dwTtlSectors;
  121. //    } else {
  122.         dwSectorsNeeded = toc.id[dwEntry].dwTtlSectors; // xipkernel size = 0x9B4
  123. //    }
  124. Uart_SendString("Sector addr on NAND: ");
  125. Uart_SendDWORD(toc.id[dwEntry].sgList[0].dwSector, TRUE);
  126.     Uart_SendString("TotalSector: ");
  127.     Uart_SendDWORD(dwSectorsNeeded, TRUE);
  128.     dwRAM    = VIRTUAL_TO_PHYSICAL(toc.id[dwEntry].dwLoadAddress);
  129.     JumpAddr = toc.id[dwEntry].dwJumpAddress ? VIRTUAL_TO_PHYSICAL(toc.id[dwEntry].dwJumpAddress) :
  130.                                                VIRTUAL_TO_PHYSICAL(toc.id[dwEntry].dwLoadAddress);
  131.                                                
  132.     //
  133.     // Load the disk image directly into RAM
  134.     // BUGBUG: recover from read failures
  135.     //
  136. Uart_SendString("Reading Kernel Image from NANDrn");
  137.     i = 0;
  138. while (dwSectorsNeeded && i < MAX_SG_SECTORS)
  139. {
  140.         dwSector = toc.id[dwEntry].sgList[i].dwSector;
  141.         dwLength = toc.id[dwEntry].sgList[i].dwLength;
  142. Uart_SendString("    dwSector: ");
  143. Uart_SendDWORD(dwSector, TRUE);
  144. Uart_SendString("    dwLength: ");
  145. Uart_SendDWORD(dwLength, TRUE);
  146. Uart_SendString("    dwRAM: ");
  147. Uart_SendDWORD(dwRAM, TRUE);
  148.         // read each sg segment
  149.         while (dwLength) {
  150.             if ( !FMD_ReadSector(dwSector,
  151.                                 (LPBYTE)dwRAM,
  152.                                 NULL, 1) )
  153.             {
  154.                 Uart_SendString("ERR_DISK_OP_FAIL2: ");
  155.                 Uart_SendDWORD(dwSector, TRUE);
  156.      dwSector++;
  157. continue;
  158. //                return ERR_DISK_OP_FAIL2;
  159.             }
  160.             
  161.      dwSector++;
  162.      dwLength--;
  163.             dwRAM += SECTOR_SIZE;
  164.         }
  165.         dwSectorsNeeded -= toc.id[dwEntry].sgList[i].dwLength;
  166.         i++;
  167.     }
  168.     //  We only do this if the dwRAM is not zero (The default tocblock1 
  169.     //  set the dwRAM to be 0)
  170.     if (toc.chainInfo.dwLoadAddress == 0) {
  171.         return ERR_SUCCESS;
  172.     }
  173.     // Load the Chain.bin stored on NAND to the SDRAM
  174. // if ( toc.id[dwEntry].dwImageType == 6 ) // For WinCE 4.2 Image
  175. // if ( 1 ) // For WinCE 4.2 Image
  176. // {
  177. // dwRAM = VIRTUAL_TO_PHYSICAL(toc.id[dwEntry].dwLoadAddress);
  178. // dwSectorsNeeded = toc.id[dwEntry].sgList->dwLength;
  179. // dwSector = toc.id[dwEntry].sgList->dwSector;
  180. // }
  181. // else
  182. {
  183. dwRAM = VIRTUAL_TO_PHYSICAL(toc.chainInfo.dwLoadAddress); // 0x303c0000
  184. dwSectorsNeeded = toc.chainInfo.dwLength; // 0x20
  185. dwSector = toc.chainInfo.dwFlashAddress; // 0x103c0
  186. // dwSectorsNeeded = 0x20;
  187. // dwSector = 0x104C0;
  188. }
  189. #if 0
  190. // Copy UUID to SDRAM drv_glob area from NAND
  191.     Uart_SendString("Reading UUID from NAND : ");
  192. for ( i = 0; i < 8; i++ )
  193. {
  194. *pbUUID = toc.udid[i];
  195. // Uart_SendByte(*pbUUID);
  196. // Uart_SendDWORD(*pbUUID, FALSE);
  197. //     Uart_SendString(": ");
  198. pbUUID++;
  199. }
  200.     Uart_SendString("rn");
  201. #endif
  202. // Uart_SendString("Reading Chain from NANDrn");
  203. // Uart_SendString("LoadAddr: ");
  204. // Uart_SendDWORD(dwRAM, TRUE);
  205. // Uart_SendString("NAND SectorAddr: ");
  206. // Uart_SendDWORD(dwSector, TRUE);
  207. // Uart_SendString("Length: ");
  208. // Uart_SendDWORD(dwSectorsNeeded, TRUE);
  209. #if 1
  210.     while(dwSectorsNeeded) {
  211.         
  212.         if (!FMD_ReadSector(dwSector, 
  213.                             (LPBYTE) dwRAM,
  214.                             NULL, 1) ) {
  215.             Uart_SendString("Failed reading Chain.bin:");
  216.             Uart_SendDWORD(dwSector, TRUE);
  217. dwSector++;
  218. continue;
  219.         }
  220.         dwSector++;
  221.         dwSectorsNeeded--;
  222.         dwRAM += SECTOR_SIZE;
  223.     }
  224. #endif
  225. //    Uart_SendString("RETURN SUCCESS");
  226. //    Uart_SendString("rn                     ");
  227. return ERR_SUCCESS;
  228. }
  229. void loadboot(void)
  230. {
  231. DWORD dwSector, dwLength;         // Start Sector & Length
  232.     DWORD dwRAM, i;
  233.     
  234. dwSector=64;//从block:2 page:0开始存放eboot
  235. dwLength=192;//一共6个block;block2-7;96K容量;如果eboot文件大于96K,需要修改该代码
  236. dwRAM=0x30038000;//eboot load Start address;把NAND FLASH内容拷贝到0X30038000
  237. while (dwLength) 
  238. {
  239.             FMD_ReadSector(dwSector,(LPBYTE)dwRAM,NULL, 1);
  240.      dwSector++;
  241.      dwLength--;
  242.             dwRAM += SECTOR_SIZE;//该程序目前不做校验
  243.             //因为勤研电子QT2440开发板已经确保NAND FLASH从block 0 到 block 10无坏块
  244.         }
  245.         
  246. Launch(0x30038000);//跳转到eboot,启动eboot,程序不会返回
  247. }