您的位置:首页 > 其它

nboot通过DNW下载并运行eboot.nb0

2010-10-20 13:55 155 查看
1. 在stepldr/main.c下面的mian函数调用Uart_Init()对串口的初始化
我们使用UART1来作为debug口。




2. 实现nboot通过串口下载并运行eboot.nb0的函数体




我们接下来分析其实现
2.1 Uart_Getch()函数
这个函数主要是在nboot启动的时候,判断是否有来之我们对键盘的操作,假如我们在等待的时间之内按下空格键,那么这时候nboot就处于等待用户通过DNW.exe下载并运行eboot.nb0的状态,假如我们在等待的时间内没有按键空格键,那么nboot会接下去运行eboot,继而由eboot来加载NK。




上图的第119行表示UART1的RX buffer register是否接受到数据,如果有数据,就接下来执行第124行,也即读取接收到的数据
#define RdURXH1() (*(volatile unsigned char *)0x50004024)
当然,我们按下键盘的空格键,这时候DNW.exe会接受到这个信息,然后DNW.exe会通过我们WINCE设备与PC实际的串口线来发送到UART1的RX buffer register。
当我们按下键盘的空格键,nboot就处于等待我们下载eboot.nb0的状态,通过DNW.exe的“serial port -> transmit”来发送eboot.nb0,那么nboot是如何接受并运行eboot.nb0呢?接下来,我们来看看ComLoad()的函数体
2.2 ComLoad()




其中#define LOAD_ADDRESS_PHYSICAL 0x30038000
上图的第87是把串口发送过来的数据保存到SDRAM中以0x0x30037FFC为起始的内存中,而地址0x30037FFC到0x30037FFF用于记录eboot.nb0的文件大小,从0x30038000地址开始记录eboot.nb0的数据,这也是eboot在SDRAM中的起始地址。

第90行到第93行是记录下eboot.nb0文件的大小,用4个字节来记录,为什么是4个字节?而且为什么是前面4个字节呢?这应该是由微软WINCE6.0编译生成eboot.nb0时,由其编译生成工具决定的。

第99行,为什么DownloadFileSize=fileSize-6呢?因为有4个字节是用于记录eboot.nb0的大小,那么另外2个字节应该是用于记录eboot.nb0的校验码。

当DNW.exe通过UART1把eboot.nb0下载到以0x30038000为起始的内存中后,接下来做什么呢?接着看ComLoad()的函数体的后面部分




从第102行到105行可以看出来,eboot.nb0的后两个字节是用于记录本身数据的校验码的。这几行代码也就是用来计算eboot.nb0的数据的校验码。

第107和第108这两行读取了eboot.nb0中记录的校验码。
第110行用于比较现在计算出来的校验码是否和保存在eboot.nb0中的校验码一样,如果不一样,那么nboot就会退出运行,从而eboot.nb0的代码就得不到运行,这样的现象我也遇到过(但很少出现),但如果重新来下载eboot.nb0就没有了,不知是否是因为DNW.exe本身有bug?如果校验码一直,那么接下来就在SDRAM中运行eboot.nb0




第181行,就是eboot.nb0在SDRAM中开始运行了,也即从Src/Bootloader/Eboot/starup.s下面的StartUp函数开始运行,见下图




接着就从ResetHandler处开始运行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: