Chinaunix首页 | 论坛 | 博客
  • 博客访问: 64166
  • 博文数量: 24
  • 博客积分: 31
  • 博客等级: 民兵
  • 技术积分: 139
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-05 13:58
文章分类
文章存档

2013年(2)

2012年(22)

我的朋友

分类:

2012-05-06 21:50:39

原文地址:Wince bootloader和内核定制 作者:so927

Wince bootloader和内核定制

l BootLoader Eboot

 
 
*   NBOOT
nboot是从NAND flash读image到内存并执行,也可以读eboot.nb0到内存中并执行,eboot是下载并烧写image到内存并执行。将nboot.nb0烧到第0块,将eboot.nb0烧到第2块。启动时nboot从flash读出eboot并执行之。
NBOOT->EBOOT->USB download NK.NB0 to memory-> jump to start address of nk.nb0 in Memory-> WINCE start.
    Memory layout on NAND flash:
ü  Block 0 has the NAND boot loader (NBOOT.BIN)
ü  Block 1 is the TOC block which specifies the layout on the NAND
ü  Block 2 is the start block for secondary bootloader
ü  Block n is the start of image. n is defined in the block 1 structure
TOC (Table Of Contents) : This block shows links to a subset of the available pages, filtered upon current visitor access privileges. This makes it easy to deliver custom access to different sections of your site.
   The layout on the first sector of TOC block is:
    typedef struct _TOC_SECTOR {
        DWORD               dwSignature;        //  4 bytes
        IMAGE_DESCRIPTOR    id[4];              //  480 bytes
        UCHAR               Pad[32];            //  32 bytes
        } TOC_SECTOR, *PTOC_SECTOR;
 
Nboot做了大部分的硬件初始化,然后将会在nand flash第一块内存(TOC)中查找images的位置!这个TOC定义在loader.h中,我在我的pb里面搜索了一下,路径如下
 
几个文件中的定义都是一样的,下面的代码是我从里面拷贝下来的!与上面的有所不同!可能是版本不同吧!
typedef struct _TOC {
    DWORD               dwSignature;
              BYTE                                              udid[8]; //
        // How to boot the images in this TOC This could be moved into the image descriptor if desired,                       . // but I prefer to conserve space.
    BOOT_CFG            BootCfg;
    IMAGE_DESCRIPTOR    id[MAX_TOC_DESCRIPTORS]; // Array of Image Descriptors.
//    UCHAR Pad[12];      // align on SECTOR_SIZE
    CHAININFO           chainInfo;
} TOC, *PTOC;           // 512 bytes
tocblock1 file,同样是使用SJF烧写到第一个(0为第一个)内存块的!
整个过程就很明显了:第一步,先烧写nboot.bin 到nand flash的第0个内存块!
                    第二步,烧写 tocblock1 file 到nand flash 的第一个内存块!
                    第三步,烧写 eboot.nb0 到nand flash 的第二块内存开始的地方!
 
*   EBOOT
  BinFS
在移植使用BOOTLOADER下载镜像的时候我法相,他会调用EBOOT中的一段代码去对nand进行一些操作,主要工作是格式化nand并简历文件系统!这个文件系统就是ROM image filesystem(BINFS)二进制文件系统!也称之为闪存文件系统。
EBOOT启动菜单中,我们会看到有两项是关于格式化FLASH的命令!一个是低格选项:
Low-level FORMAT Boot Media
他的代码解释如下:
// low-level format
// N.B: this erases images, BinFs, FATFS, user data, etc.
// However, we don't format Bootloaders & TOC bolcks; use JTAG for this.
另外一个是:Format Boot Media for BinFS
// format the boot media for BinFS
// N.B: this does not destroy our OEM reserved sections (TOC, bootloaders, etc)
// N.B: format offset by # of reserved blocks, decrease the ttl # blocks available by that amount.
   主要理解一下Format Boot Media for BinFS的过程!
在选择了这个选项之后,他首先会判断flash是否存在,然后调用WINCE的库函数BP_LowLevelFormat。这个函数的原型:
BOOL BP_LowLevelFormat(
  DWORD dwStartBlock,
  DWORD dwNumBlocks,
  DWORD dwFlags
);
 
文章还不是很完善,大家一起交流,如果问题,请提出来,大家一起塔讨论
 
阅读(752) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~