版权归作者原所有

==========================================================================================================

关于Uboot启动网上有例子,
一、wince 启动过程分析
    我用的是utu2440的开发板,板子自带的启动文件包括NBOOT1、NBOOT2、EBOOT、wince内核,各个文件作用是:
NBOOT1:S3C2440对于NAND FLash,最大加载4K的代码运行,可以直接运行这个程序,NBOOT1启动后会从FLASH中加载NBOOT2
NBOOT2:主要实现从FLASH中读取wince内核、加载eboot、显示启动画面
EBOOT:实现对FLASH进行分区、格式化和烧写WINCE内核镜像文件,这里要注意的是EBOOT在烧写 wince内核镜像的过程中会把NK.bin解压为NB.nb0再写入到flash中。
二、分析UBOOT启动wince的可能性
    对于NBOOT1、NBOOT2的功能完全可以用UBOOT代替,本身UBOOT已经实现NAND falsh 启动,再就是wince内核文件 NK.nb0 可以直接加载到内存的 0x30200000,然后使用 uboot的 go 指令直接运行wince内核文件。
    比较难办的就是eboot功能的uboot实现,eboot的分区功能在flash中创建了一个binfs的分区用于存放wince内核镜像文件,在 wince中可以直接支持binfs分区,可以看到镜像文件。如果要在uboot中实现这个功能,则必须为uboot添加对flash分区的功能,为了测 试实现的可能性花了两天做了不少实现,发现要想做好这个功能实在是太花时间、精力了,只好作罢(如果哪位兄弟能提供帮助就太好了)。
    在去掉binfs支持后,uboot可以实现将NK.nb0烧写到flash中,然后启动时读取到0x30200000位置,最后用go命令加载启动 wince,这么来看应该是很简单的事了(后来证明此时的想法太。。。。。。)
三、测试可能性
    使用uboot将nk.nb0加载到0x3020000中,然后go 0x30200000,等了一会果真看到了wince的界面,这一步成功了,下一步就可以直接烧写了。但是很快发现,使用这种方法启动一次wince后就 无法再启动uboot,通过读取flash的内容发现,wince把uboot的flash块给格式化了。是什么原因呢?
    原来是因为这个wince内核有自动分区格式化功能,上面已经说了uboot中不实现分区格式化的功能,所以在wince中就必须添加这个功能。但是这样 一来wince就会格式化uboot,通过阅读eboot发现,eboot在格式化的时候会把eboot区标记为坏块,这样wince就不会进行格式化 了,看来必须首先解决这个问题。
四、FLASH 管理区域划分
    我的FLASH大小是64M,wince 内核文件加上uboot不超过32M,这样就定义FLASH的前32M由uboot进行管理,这32M对wince来说是不存在的,后32M归于 wince进行存储,在wince中进行管理。
    如果要阻止wicne格式化前32M,可以再uboot中对前32M全部标记为坏块,但是这样一来uboot本身对flash所有操作也会首先做坏块检 测。如果这么做的话,每次uboot对flash读写时取消坏块标记,操作完成后在标记为坏块。思路应该是可行的,但是感觉这么做太麻烦了。当然条条大路 通罗马,我们可以逆向思维一下,为何不能修改wince内核来屏蔽前32M flash空间呢?
    通过阅读wince的bsp,发现有个很重要的宏定义
loader.h中
// NAND Boot (loads into SteppingStone) @ Block 0

#define NBOOT_BLOCK 0
#define NBOOT_BLOCK_SIZE 1
#define NBOOT_SECTOR BLOCK_TO_SECTOR(NBOOT_BLOCK)

// TOC @ Block 1

#define TOC_BLOCK 1
#define TOC_BLOCK_SIZE 1
#define TOC_SECTOR BLOCK_TO_SECTOR(TOC_BLOCK)

// Eboot @ Block 2

#define EBOOT_BLOCK 2
#define EBOOT_SECTOR_SIZE FILE_TO_SECTOR_SIZE(EBOOT_RAM_IMAGE_SIZE)
#define EBOOT_BLOCK_SIZE SECTOR_TO_BLOCK(EBOOT_SECTOR_SIZE)
#define EBOOT_SECTOR BLOCK_TO_SECTOR(EBOOT_BLOCK)

//#define RESERVED_BOOT_BLOCKS (NBOOT_BLOCK_SIZE + TOC_BLOCK_SIZE + EBOOT_BLOCK_SIZE)/*这个参数是定义预览 block 的数量,默认是NBOOT + TOC + EBOOT,我为了屏蔽前面32M空间,需要修改此定义*/
#define RESERVED_BOOT_BLOCKS SECTOR_TO_BLOCK(FILE_TO_SECTOR_SIZE(0x2000000))

// Images start after OEM Reserved Blocks

#define IMAGE_START_BLOCK RESERVED_BOOT_BLOCKS
#define IMAGE_START_SECTOR BLOCK_TO_SECTOR(IMAGE_START_BLOCK)
    修改RESERVED_BOOT_BLOCKS 后重新编译wince(由于我用的是win7,不支持wince5的编译,只好用虚拟机来编译,速度真是 太折磨人了),希望能够一次成功,重烧uboot,下载wince内核文件NK.nb0,启动wince,失望,还是失望,uboot依旧被擦除了。
    为了搞清楚问题的原因,打开wince的调试信息, 特别是NAND FLash驱动的所有调试信息。重新编译、下载运行。发现wince开始擦除的位置是正确的,在擦除未完时此时我复位了开发板,uboot可以正常启动。 重来,等擦除操作完成了以后我再复位,发现uboot不能启动了,这可真是奇怪了,开始擦除的位置是正确的,每次block会递增,怎么会擦除前面的 block 呢?再来一遍,发现问题了,wince的整个擦除起始位置是正确的,但是结束 block 是错误的,我的FLASH整个 block 是4096个,wince从正确的起始位置开始,擦除了 4096 个块,估计就是这个原因导致把 uboot 给擦除了。
    阅读了一下wince的fmd驱动,这里初始化flash,发现有一句很不可理解
// pFlashInfo->dwNumBlocks            = NUM_BLOCKS ;/*这是原来的定义,修改为下面的值*/

pFlashInfo->dwNumBlocks            = NUM_BLOCKS - IMAGE_START_BLOCK ;

按照道理来讲,初始化flash block数量时至少应该屏蔽nbot eboot两部分,但是这个bsp中未屏蔽,在网上查询了一下,的确有的bsp是定义为
NUM_BLOCKS - IMAGE_START_BLOCK,我觉得这样定义更合理。也许是bsp从三星出来到我手上中间经过不少人修改,留下了这个bug吧。
    重新编译,加载,一切正常,wince可正常启动。
    最后把wince内核文件烧写到flash中,uboot启动时自动加载,一切正常。
    经过这样修改以后,wince启动时如果没有检测到有效的mbr,则会自动分区格式化,第二次再启动时就不会再格式化了,剩余的32M空间可以存储用户文 件。在wince的存储管理中可以看到flash大小为32M,的确已经成功屏蔽了前面的32M空间。
至此,该工作告一段落,uboot可以正常烧写、加载wince了。

Wince启动自动进行分区,我想把剩余的分区格式化显示为“本地硬盘” ,本来Eboot引导时候可以显示。分析注册表后,进行如下修改,在Uboot引导也可也显示分区的盘符。
在[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SMFLASH]中加上"IClass"="{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"

uboot 引导wince NK.nb0相关推荐

  1. WinCE NK.bin与NK.nb0

    in config.bib(应为boot.bib?) , set    ROMSTART=xxxx    ROMWIDTH=xxxx    ROMSIZE=xxxxxx 这3个变量必须被赋值. 可以参 ...

  2. NK.bin和NK.nb0学习

    1.       NK.bin Bin:Microsoft Windwos CE binary image data format(.bin)文件格式中包含若干个独立的记录(record),以记录(r ...

  3. nk.bin和nk.nb0

    nk.bin和nk.nb0都是CE的镜像.然而,我们在下载的过程中常常会遇到,有时候下载nk.bin,有时确是下载nk.nb0,这两者到底有什么区别呢? 首先,NK.BIN中的内容是被压缩过的,NK. ...

  4. NK.bin和NK.nb0详解

    1.       NK.bin Bin:Microsoft Windwos CE binary image data format(.bin)文件格式中包含若干个独立的记录(record),以记录(r ...

  5. NK.bin与NK.nb0格式

    转自: http://hi.baidu.com/luckdst/item/8b893ec69622a863f6c95d36 NK.bin与NK.nb0格式 借用别人的解释:这里提到的bin是一种二进制 ...

  6. 提取nk.nb0中的文件

    http://www.nah6.com/~itsme/cvs-xdadevtools/dumprom/ 这是国外某高人写的提取wince镜像文件的源代码,下载下来后编译可以生成最后的dumprom.e ...

  7. 嵌入式 uboot引导kernel,kernel引导fs【转】

    转自:http://www.cnblogs.com/lidabo/p/5383934.html#3639633 1.uboot引导kernel:u-boot中有个bootm命令,它可以引导内存中的应用 ...

  8. 嵌入式 uboot引导kernel,kernel引导fs

    1.uboot引导kernel:u-boot中有个bootm命令,它可以引导内存中的应用程序映像(Kernel),bootm命令对应 common/cmd_bootm.c中的do_bootm()函数, ...

  9. skyeye linux qt,在ARM9上安装Linux,利用SkyEye模拟器及U-BOOT引导

    提示:本人在2008年进行Linux@ARM实验,在ARM9上安装Linux.利用SkyEye模拟器及U-BOOT引导.这是实验报告.以及实验过程中留下的记录,按日期倒序排列. 本文以Creative ...

最新文章

  1. 如何面对自己不喜欢的工作?
  2. 【Java 虚拟机原理】栈帧 | 局部变量表 | 操作数栈 | 方法出口 | JVM 指令逐条解析
  3. 2.5e2.0是合法的c语言常量,二级考试C语言程序设计.ppt
  4. 近世代数--整环与域--有限的整环是域
  5. RuntimeError: Error occured during execution of the processing block! See the log for more info
  6. 爬虫工具——Selenium和PhantomJS
  7. java高并发类_Java 高并发之魂
  8. LeetCode 1185. 一周中的第几天
  9. 二级缓存失效_缓存核心技术:缓存穿透、缓存并发、缓存失效之思路变迁
  10. python爬虫网页pdf_爬虫实战【3】Python-如何将html转化为pdf(PdfKit)
  11. java实现多表增加_java多表插入数据
  12. 知网搜索论文:如何在知网上查找期刊论文
  13. cognos oracle sql,Cognos联接Oracle数据库
  14. 网上教学管理系统的设计与实现
  15. 安全培训教程之------利用IIS写权限漏洞
  16. 用计算机解决问题时 首先应该确定程序,算法与程序设计试题带答案
  17. 哈佛大学《幸福课》笔记
  18. 如何烧写Bubblegum-96 board
  19. 字符集详解(一看就懂系列)
  20. iphone铃声android铃声,iphone12如何设置铃声?iphone12更换铃声方式分享[多图]

热门文章

  1. 数据库逻辑结构设计之E-R图向关系模型的转换
  2. IIS无法访问aspx 文件的解决方法
  3. linux shell 用cp -f 还是有覆盖提醒
  4. Win7 Python3.7 解决 sklearn库 ImportError:DLL load failed:找不到指定模块
  5. 前端 --- CSS
  6. C语言——PAT_1002.读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字
  7. Kafka配置安全认证
  8. 微信小程序之加载更多(分页加载)实例
  9. ⭐算法入门⭐《队列 - 单调队列》中等02 —— LeetCode 1438. 绝对差不超过限制的最长连续子数组
  10. 《Ruby》学习笔记