nboot通过DNW下载并运行eboot.nb0
2010-10-20 13:55
155 查看
1. 在stepldr/main.c下面的mian函数调用Uart_Init()对串口的初始化
我们使用UART1来作为debug口。
![](http://hi.csdn.net/attachment/201007/31/0_1280547671aaAy.gif)
2. 实现nboot通过串口下载并运行eboot.nb0的函数体
![](http://hi.csdn.net/attachment/201007/31/0_12805477334gbf.gif)
我们接下来分析其实现
2.1 Uart_Getch()函数
这个函数主要是在nboot启动的时候,判断是否有来之我们对键盘的操作,假如我们在等待的时间之内按下空格键,那么这时候nboot就处于等待用户通过DNW.exe下载并运行eboot.nb0的状态,假如我们在等待的时间内没有按键空格键,那么nboot会接下去运行eboot,继而由eboot来加载NK。
![](http://hi.csdn.net/attachment/201007/31/0_1280547830PXnr.gif)
上图的第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()
![](http://hi.csdn.net/attachment/201007/31/0_1280547949ja7X.gif)
其中#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()的函数体的后面部分
![](http://hi.csdn.net/attachment/201007/31/0_1280547982DCk4.gif)
从第102行到105行可以看出来,eboot.nb0的后两个字节是用于记录本身数据的校验码的。这几行代码也就是用来计算eboot.nb0的数据的校验码。
第107和第108这两行读取了eboot.nb0中记录的校验码。
第110行用于比较现在计算出来的校验码是否和保存在eboot.nb0中的校验码一样,如果不一样,那么nboot就会退出运行,从而eboot.nb0的代码就得不到运行,这样的现象我也遇到过(但很少出现),但如果重新来下载eboot.nb0就没有了,不知是否是因为DNW.exe本身有bug?如果校验码一直,那么接下来就在SDRAM中运行eboot.nb0
![](http://hi.csdn.net/attachment/201007/31/0_1280548017a2zz.gif)
第181行,就是eboot.nb0在SDRAM中开始运行了,也即从Src/Bootloader/Eboot/starup.s下面的StartUp函数开始运行,见下图
![](http://hi.csdn.net/attachment/201007/31/0_1280548037x45k.gif)
接着就从ResetHandler处开始运行。
我们使用UART1来作为debug口。
![](http://hi.csdn.net/attachment/201007/31/0_1280547671aaAy.gif)
2. 实现nboot通过串口下载并运行eboot.nb0的函数体
![](http://hi.csdn.net/attachment/201007/31/0_12805477334gbf.gif)
我们接下来分析其实现
2.1 Uart_Getch()函数
这个函数主要是在nboot启动的时候,判断是否有来之我们对键盘的操作,假如我们在等待的时间之内按下空格键,那么这时候nboot就处于等待用户通过DNW.exe下载并运行eboot.nb0的状态,假如我们在等待的时间内没有按键空格键,那么nboot会接下去运行eboot,继而由eboot来加载NK。
![](http://hi.csdn.net/attachment/201007/31/0_1280547830PXnr.gif)
上图的第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()
![](http://hi.csdn.net/attachment/201007/31/0_1280547949ja7X.gif)
其中#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()的函数体的后面部分
![](http://hi.csdn.net/attachment/201007/31/0_1280547982DCk4.gif)
从第102行到105行可以看出来,eboot.nb0的后两个字节是用于记录本身数据的校验码的。这几行代码也就是用来计算eboot.nb0的数据的校验码。
第107和第108这两行读取了eboot.nb0中记录的校验码。
第110行用于比较现在计算出来的校验码是否和保存在eboot.nb0中的校验码一样,如果不一样,那么nboot就会退出运行,从而eboot.nb0的代码就得不到运行,这样的现象我也遇到过(但很少出现),但如果重新来下载eboot.nb0就没有了,不知是否是因为DNW.exe本身有bug?如果校验码一直,那么接下来就在SDRAM中运行eboot.nb0
![](http://hi.csdn.net/attachment/201007/31/0_1280548017a2zz.gif)
第181行,就是eboot.nb0在SDRAM中开始运行了,也即从Src/Bootloader/Eboot/starup.s下面的StartUp函数开始运行,见下图
![](http://hi.csdn.net/attachment/201007/31/0_1280548037x45k.gif)
接着就从ResetHandler处开始运行。
相关文章推荐
- nboot通过DNW下载并运行eboot.nb0
- nboot通过串口下载并运行eboot.nb0
- MDK生成的BIN文件用DNW通过USB下载RAM中运行的问题
- 使用supervivi+DNW下载MDK环境下2440裸机程序到SDRAM中运行
- u-boot移植第五弹——2013.10u-boot通过tftp下载到内存中运行
- OK6410如何通过tftp下载运行C程序
- 通过修改程序的代码使程序能够下载并运行指定程序
- 关于XP上2410/2440用DNW通过USB下载蓝屏
- mini2440通过dnw下载linux虚拟机的程序
- 《tiny6410裸机程序》第六章:myled通过usb下载至nandflash不能运行
- homestead虚拟机,通过npm下载依赖包和解决运行gulp报错问题 yarn出错问题
- 《tiny6410裸机程序》第六章:myled通过usb下载至nandflash不能运行
- 如果在PC机上安装了S3C2440驱动但是通过虚拟机不能用DNW下载程序
- homestead虚拟机,通过npm下载依赖包和解决运行gulp报错问题
- (韦)dnw无法使用,uboot+ 通过tftp ,nfs 下载之nand flash
- U-boot 2011.06 smdk6410的移植(转载-测试通过-修改)--下载后还不能运行......
- ubuntu(12.04+14.04)下通过网络文件系统NFS将执行文件下载到开发板运行(再修改)
- 关于 通过jlink使用jtag(或swd)下载程序成功后,keil4 uversion停止运行 的解决方法
- 我们通过下面这个天气数据处理的例子来说明Hadoop的运行原理.
- java控制台编译通过,运行出现错误: 找不到或无法加载主类xx.java