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

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. Module Name:
  17.     loader.h   Catfish Boot Loader definitions
  18. -- */
  19. #ifndef _LOADER_H_
  20. #define _LOADER_H_                  1
  21. #ifndef __ARMCC_VERSION             // ! ARM Developer Suite
  22. #define __packed
  23. #pragma pack(1)
  24. #endif
  25. //#define PLATFORM_STRING             "SMDK2410"
  26. #define PLATFORM_STRING             "SMDK2440"
  27. #define EDBG_CPUID                  EDBG_CPU_ARM720
  28. #define EBOOT_VERSION_MAJOR         1
  29. #define EBOOT_VERSION_MINOR         2
  30. #ifndef CACHED_TO_UNCACHED_OFFSET
  31. #define CACHED_TO_UNCACHED_OFFSET   0x20000000
  32. #endif
  33. #ifndef SECTOR_SIZE
  34. #define SECTOR_SIZE                 512
  35. #endif
  36. #ifndef PAGES_PER_BLOCK
  37. #define PAGES_PER_BLOCK             32
  38. #endif
  39. #ifndef BADBLOCKMARK
  40. #define BADBLOCKMARK                0x00
  41. #endif
  42. #ifndef SECTOR_TO_BLOCK
  43. #define SECTOR_TO_BLOCK(sector)     ((sector) >> 5 )
  44. #endif
  45. #ifndef BLOCK_TO_SECTOR
  46. #define BLOCK_TO_SECTOR(block)      ((block)  << 5 )
  47. #endif
  48. // fs: sector number
  49. // returns block aligned value
  50. __inline DWORD SECTOR_TO_BLOCK_SIZE(DWORD sn) {
  51.     return ( (sn / PAGES_PER_BLOCK) + ( (sn % PAGES_PER_BLOCK) ? 1 : 0) );
  52. }
  53. // fs: file size in bytes
  54. // returns sector aligned value
  55. __inline DWORD FILE_TO_SECTOR_SIZE(DWORD fs) {
  56.     return ( (fs / SECTOR_SIZE) + ( (fs % SECTOR_SIZE) ? 1 : 0) );
  57. }
  58. // ns: number of sectors
  59. // N.B: returns sector aligned value since we can't tell
  60. __inline DWORD SECTOR_TO_FILE_SIZE(DWORD ns) {
  61.     return ( ns * SECTOR_SIZE );
  62. }
  63. //
  64. // Boot Config Flags...
  65. //
  66. // BOOT_MODE_ flags indicate where we are booting from
  67. #define BOOT_MODE_NAND          0x00000001
  68. #define BOOT_MODE_NOR_AMD       0x00000002
  69. #define BOOT_MODE_NOR_STRATA    0x00000004
  70. #define BOOT_MODE_TEST          0x00000008
  71. #define BOOT_MODE_MASK(dw)     (0x0000000F & (dw))
  72. // BOOT_TYPE_ flags indicate whether we are booting directly off media, or downloading an image
  73. #define BOOT_TYPE_DIRECT        0x00000010  // boot off media?
  74. #define BOOT_TYPE_MULTISTAGE    0x00000020  // multi-stage bootloaders?
  75. #define BOOT_TYPE_MASK(dw)     (0x000000F0 & (dw))
  76. // TARGET_TYPE_ flags indicate where the image is to be written to.
  77. #define TARGET_TYPE_RAMIMAGE    0x00000100  // Directly to SDRAM
  78. #define TARGET_TYPE_CACHE       0x00000200  // FLASH_CACHE
  79. #define TARGET_TYPE_NOR         0x00000400  // NOR Flash
  80. #define TARGET_TYPE_NAND        0x00000800  // NAND Flash
  81. //...
  82. #define TARGET_TYPE_MASK(dw)   (0x00000F00 & (dw))
  83. #define CONFIG_FLAGS_DHCP       0x00001000
  84. #define CONFIG_FLAGS_DEBUGGER   0x00002000
  85. #define CONFIG_FLAGS_MASK(dw)  (0x0000F000 & (dw))
  86. #define CONFIG_BOOTDELAY_DEFAULT       15
  87. //
  88. // Bootloader configuration parameters.
  89. //
  90. #if !defined(UNDER_CE)
  91. __packed
  92. typedef struct _EDBG_ADDR {
  93. DWORD  dwIP;         // @field IP address (net byte order)
  94. USHORT wMAC[3];      // @field Ethernet address (net byte order)
  95. USHORT wPort;        // @field UDP port # (net byte order) - only used if appropriate
  96. } EDBG_ADDR;
  97. #else
  98. #include <halether.h>
  99. #endif
  100. __packed
  101. typedef struct _BOOTCFG {
  102.     ULONG       ImageIndex;
  103.     ULONG       ConfigFlags;
  104.     ULONG       BootDelay;
  105.     EDBG_ADDR   EdbgAddr;
  106.     ULONG       SubnetMask;
  107. } BOOT_CFG, *PBOOT_CFG;
  108. //
  109. // Memory reigions defined in boot.bib...
  110. //
  111. #define EBOOT_RAM_IMAGE_BASE        0x8c038000
  112. #define EBOOT_RAM_IMAGE_SIZE        0x00020000
  113. #define EBOOT_STORE_OFFSET          0
  114. #define EBOOT_STORE_ADDRESS         (EBOOT_RAM_IMAGE_BASE + EBOOT_STORE_OFFSET)
  115. #define EBOOT_STORE_MAX_LENGTH      EBOOT_RAM_IMAGE_SIZE
  116. // Flash Cache area defined in boot.bib
  117. #define FLASH_CACHE                 0x8D000000UL
  118. #define FLASH_CACHE_SIZE            0x01000000UL
  119. // BinFS work area defined in boot.bib
  120. #define BINFS_RAM_START             (0x8c021000 | CACHED_TO_UNCACHED_OFFSET)   // uncached
  121. #define BINFS_RAM_LENGTH            0x5000
  122. //
  123. // Nk Memory reigions defined in config.bib...
  124. //
  125. #define ROM_RAMIMAGE_START          0x8C100000
  126. #define ROM_RAMIMAGE_SIZE           0x01000000
  127. // Start addresses must match config.bib's RAMIMAGE
  128. #define RAM_START                   0x8d100000
  129. #define RAM_SIZE                    0x00F00000
  130. #define DEFAULT_LAUNCHADDR          ROM_RAMIMAGE_START
  131. //
  132. // SDRAM
  133. //
  134. #define SDRAM_BASE             0x8C000000   // defined in OEMAddressTable
  135. #define SDRAM_SIZE             0x02000000   // 32 MB
  136. //
  137. // On disk structures for NAND bootloaders...
  138. //
  139. //
  140. // OEM Reserved (Nand) Blocks for TOC and various bootloaders
  141. //
  142. // NAND Boot (loads into SteppingStone) @ Block 0
  143. #define NBOOT_BLOCK                 0
  144. #define NBOOT_BLOCK_SIZE            1
  145. #define NBOOT_SECTOR                BLOCK_TO_SECTOR(NBOOT_BLOCK)
  146. // TOC @ Block 1
  147. #define TOC_BLOCK                   1
  148. #define TOC_BLOCK_SIZE              1
  149. #define TOC_SECTOR                  BLOCK_TO_SECTOR(TOC_BLOCK)
  150. // Eboot @ Block 2
  151. #define EBOOT_BLOCK                 2
  152. #define EBOOT_SECTOR_SIZE           FILE_TO_SECTOR_SIZE(EBOOT_RAM_IMAGE_SIZE)
  153. #define EBOOT_BLOCK_SIZE            SECTOR_TO_BLOCK(EBOOT_SECTOR_SIZE)
  154. #define EBOOT_SECTOR                BLOCK_TO_SECTOR(EBOOT_BLOCK)
  155. #define RESERVED_BOOT_BLOCKS        (NBOOT_BLOCK_SIZE + TOC_BLOCK_SIZE + EBOOT_BLOCK_SIZE)
  156. // Images start after OEM Reserved Blocks
  157. #define IMAGE_START_BLOCK           RESERVED_BOOT_BLOCKS
  158. #define IMAGE_START_SECTOR          BLOCK_TO_SECTOR(IMAGE_START_BLOCK)
  159. //
  160. // OEM Defined TOC...
  161. //
  162. #define MAX_SG_SECTORS              14
  163. #define IMAGE_STRING_LEN            16  // chars
  164. #define MAX_TOC_DESCRIPTORS         3   // per sector
  165. #define TOC_SIGNATURE               0x434F544E  // (NAND TOC)
  166. // Default image descriptor to load.
  167. // We store Eboot as image 0, nk.nb0 as image 1
  168. #define DEFAULT_IMAGE_DESCRIPTOR    1
  169. // IMAGE_TYPE_ flags indicate whether the image is a Bootloader,
  170. // RAM image, supports BinFS, Multiple XIP, ...
  171. //
  172. #define IMAGE_TYPE_LOADER           0x00000001  // eboot.bin
  173. #define IMAGE_TYPE_RAMIMAGE         0x00000002  // nk.bin
  174. #define IMAGE_TYPE_BINFS            0x00000004
  175. #define IMAGE_TYPE_MXIP             0x00000008
  176. #define IMAGE_TYPE_MASK(dw)        (0x0000000F & (dw))
  177. // SG_SECTOR: supports chained (scatter gather) sectors.
  178. // This structure equates to a sector-based MXIP RegionInfo in blcommon.
  179. //
  180. __packed
  181. typedef struct _SG_SECTOR {
  182.     DWORD dwSector;     // Starting sector of the image segment
  183.     DWORD dwLength;     // Image length of this segment, in contigious sectors.
  184. } SG_SECTOR, *PSG_SECTOR;
  185. // IMAGE_DESCRIPTOR: describes the image to load.
  186. // The image can be anything: bootloaders, RAMIMAGE, MXIP, ...
  187. // Note: Our NAND uses H/W ECC, so no checksum needed.
  188. //
  189. __packed
  190. typedef struct _IMAGE_DESCRIPTOR {
  191.     // File version info
  192.     DWORD dwVersion;                    // e.g: build number
  193.     DWORD dwSignature;                  // e.g: "EBOT", "CFSH", etc
  194.     UCHAR ucString[IMAGE_STRING_LEN];   // e.g: "PocketPC_2002"
  195.     DWORD dwImageType;      // IMAGE_TYPE_ flags
  196.     DWORD dwTtlSectors;     // TTL image size in sectors.
  197.                             // We store size in sectors instead of bytes
  198.                             // to simplify sector reads in Nboot.
  199.     DWORD dwLoadAddress;    // Virtual address to load image (ImageStart)
  200.     DWORD dwJumpAddress;    // Virtual address to jump (StartAddress/LaunchAddr)
  201.     // This array equates to a sector-based MXIP MultiBINInfo in blcommon.
  202.     // Unused entries are zeroed.
  203.     // You could chain image descriptors if needed.
  204.     SG_SECTOR sgList[MAX_SG_SECTORS];
  205.     // BinFS support to load nk region only
  206. //struct
  207. //{
  208. ULONG dwStoreOffset;    // byte offset - not needed - remove!
  209. //ULONG RunAddress;     // nk dwRegionStart address
  210. //ULONG Length;         // nk dwRegionLength in bytes
  211. //ULONG LaunchAddress;  // nk dwLaunchAddr
  212. //} NKRegion;
  213. } IMAGE_DESCRIPTOR, *PIMAGE_DESCRIPTOR;
  214. //
  215. // IMAGE_DESCRIPTOR signatures we know about
  216. //
  217. #define IMAGE_EBOOT_SIG             0x45424F54          // "EBOT", eboot.nb0
  218. #define IMAGE_RAM_SIG               0x43465348          // "CFSH", nk.nb0
  219. #define IMAGE_BINFS_SIG             (IMAGE_RAM_SIG + 1)
  220. __inline BOOL VALID_IMAGE_DESCRIPTOR(PIMAGE_DESCRIPTOR pid) {
  221.     return ( (pid) &&
  222.       ((IMAGE_EBOOT_SIG == (pid)->dwSignature) ||
  223.        (IMAGE_RAM_SIG == (pid)->dwSignature) ||
  224.        (IMAGE_BINFS_SIG == (pid)->dwSignature)));
  225. }
  226. //  This is for MXIP chain.bin, which needs to be loaded into the SDRAM
  227. //  during the start up. 
  228. __packed
  229. typedef struct _CHAININFO {
  230.     DWORD   dwLoadAddress;          // Load address in SDRAM
  231.     DWORD   dwFlashAddress;         // Start location on the NAND
  232.     DWORD   dwLength;               // The length of the image
  233. } CHAININFO, *PCHAININFO;
  234. //
  235. // TOC: Table Of Contents, OEM on disk structure.
  236. // sizeof(TOC) = SECTOR_SIZE.
  237. // Consider the TOC_BLOCK to contain an array of PAGES_PER_BLOCK
  238. // TOC entries, since the entire block is reserved.
  239. //
  240. __packed
  241. typedef struct _TOC {
  242.     DWORD               dwSignature;
  243.     // How to boot the images in this TOC.
  244.     // This could be moved into the image descriptor if desired,
  245.     // but I prefer to conserve space.
  246.     BOOT_CFG            BootCfg;
  247.     // Array of Image Descriptors.
  248.     IMAGE_DESCRIPTOR    id[MAX_TOC_DESCRIPTORS];
  249. //    UCHAR Pad[12];      // align on SECTOR_SIZE
  250.     CHAININFO           chainInfo;
  251. } TOC, *PTOC;           // 512 bytes
  252. __inline BOOL VALID_TOC(PTOC ptoc) {
  253.     return ((ptoc) &&  (TOC_SIGNATURE == (ptoc)->dwSignature));
  254. }
  255. #ifdef SIMULATOR
  256. #define TEST_TRAP    { 
  257. RETAILMSG(1, (_T("%s: Code Coverage Trap in: PWR, Line: %dn"), TEXT(__FILE__), __LINE__)); 
  258. DebugBreak();   
  259. }
  260. #else
  261. #define TEST_TRAP
  262. #endif
  263. #ifndef __ARMCC_VERSION
  264. #pragma pack()
  265. #endif
  266. #ifdef __cplusplus
  267. extern "C" {
  268. #endif
  269. void    Launch(unsigned int  uAddr);
  270. DWORD   ToVirtualAddr(DWORD add);
  271. BOOL    TOC_Init(DWORD dwEntry, DWORD dwImageType, DWORD dwImageStart, DWORD dwImageLength, DWORD dwLaunchAddr);
  272. BOOL    TOC_Read(void);
  273. BOOL    TOC_Write(void);
  274. void    TOC_Print(void);
  275. BOOL    ReadRamImageFromBootMedia( );
  276. BOOL    WriteRamImageToBootMedia(DWORD dwEntry);
  277. BOOL    ReadKernelRegionFromBootMedia(void);
  278. BOOL    WriteRegionsToBootMedia(DWORD dwImageStart, DWORD dwImageLength, DWORD dwLaunchAddr);
  279. void    BootConfigPrint(void);
  280. BOOL    OEMVerifyMemory(DWORD dwStartAddr, DWORD dwLength);
  281. #ifdef __cplusplus
  282. }
  283. #endif
  284. #endif  // _LOADER_H_