nboot通过DNW下载并运行eboot.nb0
发布日期:2021-06-30 21:55:04 浏览次数:3 分类:技术文章

本文共 1503 字,大约阅读时间需要 5 分钟。

 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行表示UART1RX buffer register是否接受到数据,如果有数据,就接下来执行第124行,也即读取接收到的数据

#define RdURXH1()   (*(volatile unsigned char *)0x50004024)

当然,我们按下键盘的空格键,这时候DNW.exe会接受到这个信息,然后DNW.exe会通过我们WINCE设备与PC实际的串口线来发送到UART1RX 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为起始的内存中,而地址0x30037FFC0x30037FFF用于记录eboot.nb0的文件大小,从0x30038000地址开始记录eboot.nb0的数据,这也是ebootSDRAM中的起始地址。

 

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

 

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

 

DNW.exe通过UART1eboot.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.nb0SDRAM中开始运行了,也即从Src/Bootloader/Eboot/starup.s下面的StartUp函数开始运行,见下图

 

接着就从ResetHandler处开始运行。

转载地址:https://loongembedded.blog.csdn.net/article/details/5954023 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:在WinCE 6.0系统下实现USB功能定制
下一篇:WINCE6.0 + S3C2443的启动过程---nboot篇

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月08日 21时47分04秒