关于wince bootloader的一点分析

来源:互联网 发布:上古5捏脸数据怎么用 编辑:程序博客网 时间:2024/06/13 09:41

Bootloader要做的事情,这个大家应该很清楚,无外乎是下载内核,烧写Flash,启动OS。当然可以在里面实现其他功能,但不是必须的。

Wince6的bootloader当然是烧写到Flash中,通过JTAG工具。如果板子上有nor flash,可以把bootloader烧写到nor flash上,这样可以上电XIP。但目前流行的趋势是采用大容量nand flash,很多设计上都只有nand flash,而nand flash是不能XIP的,因此bootloader放到那上面是无法直接执行的。办法是 CPU要内部集成nand flash控制器,这个控制器要支持boot from nand功能,其实说白了就是处理器内部的控制器能够上电直接把nand flash的前面一小块拷贝到sdram中去,相当于控制器内部有个小cpu+sram运行一段程序把nand flash中最前面那一段拷到内存中。

Wince6中微软提供了这么个bootloader的框架:

其中BLCommon是一个通用的bootloader库,实现的都是些与具体硬件无关的功能,但是它需要底层的OEM代码支持;EBOOT是微软提供的基于以太网的bootloader实现,它基本上也是通用的,当然它同样需要OEM代码支持,比如实现以太网控制器的驱动,这个常常需要用户自己实现;bootpart 这个东西就是实现在flash上分区的功能,它下面以来与具体flash的驱动。

Wince下现在最常用的bootloader大概就是eboot。上电后,首先执行的是startup()这个函数,它是汇编写的,这个函数干的事情就是初始化cpu和sdram控制器,包括关闭MMU,清TLB,cache,关中断。这样后续代码是在中断关闭的情况下,访问的地址全是物理地址,没有开启虚拟地址的情况下执行,这样的好处就是简单。Startup()完了后会跳入bootloader的main()函数,在这个函数里调用bootloadermain()函数,这个函数干以下事情:


1. 调用OEMDebugInit( ),初始化调试端口,以后可以输出调试信息了,通常都会选择一个串口,因为它简单


2. 调用OEMPlatformInit( ),初始化板子(所谓的platform),比如RTC,显示,flash控制器,以太网控制器等,通常还可以在这里实现显示bootloader的菜单。(当然并比一定要这么做,也可以把这个工作放在下面OEMPreDownload中做)。在这个函数里会打开MMU,启用虚拟内存。


3. 根据用户的选择分别执行,如果选择下载内核,则调用OEMPreDownload(),这个函数设置设备名,设置MAC地址,IP地址啊等,为下载内核做必要准备;然后调用DownloadImage()下载内核。如果选择直接启动OS,那么它会去读出存储在flash上的内核


4. 调用OEMLaunch()函数,这个函数负责启动OS,在启动前可能会传递一些参数给内核。一般的在启动内核前,bootloader会重新关闭MMU,跳到内核中的startup()执行。


Eboot中是通过bootme和tftp协议来下载内核的,这部分协议的实现微软做好了。大概说来移植个bootloader,要做下面几件事情:


1. 实现用来下载内核的以太网控制器驱动,就是OEMReadDat()等几个函数

2. 实现读写擦除flash的功能,用于烧写flash

3. 实现那个g_oalAddressMap,定义好 SDRAM,各外设寄存器等的物理地址和虚拟地址对应关系

4. 实现调试串口的驱动,主要也就是实现OEMInitDebugSerial(),OEMWriteDebugString()等几个函数

5. 可能还要实现eboot输出的那个菜单功能。

0 0
原创粉丝点击