小议DBAU1200 Development Board的Boot Flash更新

//========================================================================
//TITLE:
//    小议DBAU1200 Development Board的Boot Flash更新
//AUTHOR:
//    norains
//DATE:
//    Tuesday  15-April-2008
//Environment:
//    RMI Development Board + YAMON
//========================================================================
    很多人拿到RMI的DBAU1200 Development Board后,估计第一步就是迫不及待更新BOOT FLASH。如果仔细阅读《RMI Alchemy Processors AutoBoot Boot Loader User’s Guide》,可能会对BOOT FLASH和PARAMETER FLASH的擦除地址不同会感到非常疑惑。前者在YAMON中擦除BFD00000,而后者则是BDC00000。
   
    在对此进行解释之前,我们先来略微了解一下MIPS CPU。32位MIPS CPU中,程序的内存地址分为四大区域,用传统命名来说,分别是:kuseg,kseg0,kseg1和kseg2。
   
    这四个区域划分的程序地址空间如下:
    kseg2:0xC0000000~0xFFFFFFFF
    kseg1:0xA0000000~0xBFFFFFFF
    kseg0:0x80000000~0x9FFFFFFF
    kuseg:0x00000000~0x7FFFFFFF
   
   
    除了kuseg只能在核心态下使用,其它三个都可以在用户态模式中存取。kseg0和kseg1对应的物理地址都是相同的,唯一不同的是,kseg0是有cache,kseg1则否。需要注意的是,在cache没有正确初始化之前,最好不要使用kseg0.
   
    正如前面所说,kseg0和kseg1映射了相应的物理地址,那么,如何将程序地址转换为物理地址呢?对于kseg0来说,只需要将最高位清零,这些地址就被转换为物理地址;而kseg1,则是通过将最高3位清零的方式。
   
    在这里有一点最重要,kseg1是系统重启后唯一能正常工作的地址空间,而0xBFC00000则是重启后的入口向量!换句话说,CPU RESET后执行的第一个地址就是0xBFC00000!
   
    现在我们来根据指导手册,看看如何烧录Stand-Alone AutoBoot。
   
    1.BOOT FLASH中已经含有YAMON Bootloader,将s11开关拨动到Not Dot位置,重启Development Board,令其从BOOT FLASH启动。
   
    2.因为NOR FLASH只能写0,所以在写入数据之前,先擦除FLASH: YAMON> erase BDC00000 20000
   
    3.将s11拨动到dot位置。
   
    4.最后保存rec文件。YAMON> load DB1200_booter_standalone.rec
   
    第1、2、3步都没什么问题,第3步疑惑的是,为什么擦除的地址为0xBDC00000?根据文档,0xBDC00000的地址是这样计算出来的:0x1DFFFFFF – 0x3FFFFF = 0x1DC00000 = 0xBDC00000
   
    0x1DFFFFFF是FLASH的物理地址。我们需要知道一点,BOOT FLASH和PARAMETER FLASH的物理地址是可以通过s11来切换的:
   
    S11:NOT DOT
    BOOT ROM(NOR FLASH): 0x1E000000~0x1FFFFFFF
    PARAMETER(NOR FLASH):0x1C000000~0x1DFFFFFF
   
    S11:DOT
    BOOT ROM(NOR FLASH): 0x1C000000~0x1DFFFFFF
    PARAMETER(NOR FLASH):0x1E000000~0x1FFFFFFF
   
    那么,为什么我们需要将PARAMETER的TOP地址减去0x3FFFFF呢?而0x3FFFFF又是怎么来的?
   
    先撇开0x3FFFFF不说,我们来看看擦除的地址:0xBDC00000。这个地址是s11为NOT DOT时,那么为DOT时,这块地址是什么呢?
   
    我们可以计算:0x1FFFFFFF - 0x3FFFFF = 0x1FC00000
   
    0x1FC00000是不是很熟悉?对,没错,0x1FC00000在kseg1对应的程序地址为0xBFC00000,也就是恰好是CPU复位的入口向量!这样就非常清晰为什么我们在NOT DOT时擦除PARAMETER的地址是0xBDC00000,减去的数值是0x3FFFFF!
   
    接下来我们反过来看看知道文档中是如何更新YAMON-Invoked AutoBoot。
   
    文档的步骤如下:
    1.YAMON> erase BFD00000 20000
    2.YAMON> load DB1200_booter.rec
    3.YAMON> go BFD00000
    4.YAMON> set start “go BFD00000”
   
    为什么更新YAMON时我们擦除的地址是0xBFD00000,而不是如同PARAMETER FLASH的0xBDC00000呢?
   
    答案在《RMI Alchemy Au1200 Processor-Based System Windows CE 5.0 Build Guide》有描述:This address is 1 MB above the MIPS reset exception vector, 0xBFC00000, which allows the boot monitor (YAMON) and CLI to coexist, and significantly reduces the opportunity of corrupting Flash and rendering the development board non-bootable。
   
    意义很明显,主要是为了两个能够YAMON共存。当按照文档的操作,那么在BOOT FLASH中应该有两个YAMON,它们存储的地址分别为0xBDC00000和0xBFD00000。当CPU Reset后,就会跳到0xBDC00000执行第一个YAMON,然后第一个YAMON会跳转到0xBFD00000执行第二个YAMON。这就完成了更新YAMON的目的,同时也减少了non-bootable的可能性。
   
    不仅YAMON可以保存到0xBFD00000,eboot等其它的bootloader也可以依样画瓢,这对于没有仿真器的同行来说,无异是个及其便利的手段。

你可能感兴趣的:(小议DBAU1200 Development Board的Boot Flash更新)