norains的专栏

只专注于WINCE开发

用户操作
[即时聊天] [发私信] [加为好友]
norainsID:norains
142907次访问,排名598,好友0人,关注者53人。
代码其实是一种乐趣
norains的文章
原创 189 篇
翻译 0 篇
转载 10 篇
评论 274 篇
norains的公告
联系方式请看置顶文章
最近评论
dfdf:讨厌MFC!我觉得MFC就是太乱了!看似无用的代码不要不行,MD微软啥都给我们做完了,原理性的东西我们却永远没法搞懂了!
ironox:有个地方 我觉得很别扭,不知道怎么办好

比如说 CReg reg(HKEY_CURRENT_USER,TEXT("ControlPanel\Volume"));
ControlPanel\Volume 有可能不存在呀,这个该怎么处理哦?对象虽然创建了,出错了也没提示
szterry:呵呵,果然工作狂技术狂,同感,一样的感觉……不过我才刚毕业一年……搞IT就是玩……
jinlking:这个botton的实现只是在主窗口画了一块区域,对于事件的处理还要放在主窗口的窗口处理函数之中,在对应的消息处理上调用CheckTap来判断是否是此“按钮”,问一下,这种方法与把按钮封装在子窗口中有什么区别,二者使用那个更好?
KUODY:博主真是好人
文章分类
收藏
    相册
    动漫
    文章图片
    程序交流
    xumercury的BLOG
    狗友们的博客
    清蒸石斑鱼
    美女如刀锋
    茁茁的BLOG
    魅力老姐的窝
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 小议DBAU1200 Development Board的Boot Flash更新收藏

    新一篇: DBAu1200 Development Board Boot Flash 地址释疑 | 旧一篇:  Au1200 CoreBSP v1.51默认工程编译记录

    //========================================================================
    //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也可以依样画瓢,这对于没有仿真器的同行来说,无异是个及其便利的手段。

    发表于 @ 2008年04月15日 12:33:00|评论(loading...)|编辑|

    新一篇: DBAu1200 Development Board Boot Flash 地址释疑 | 旧一篇:  Au1200 CoreBSP v1.51默认工程编译记录

    评论:没有评论。

    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © norains