nboot通过串口下载并运行eboot.nb0

 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处开始运行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值