« | July 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | |
| 公告 |
☆★☆★☆★☆★☆★☆ 生活的点点记录,以及一些体会...........
喜欢是淡淡的爱,爱是深深的喜欢.
时间会见证一切.......................
欢迎大家指出错误,共同进步..........
期待中..............................
☆★☆★☆★☆★☆★☆ |
Blog信息 |
blog名称: 日志总数:162 评论数量:312 留言数量:0 访问次数:939736 建立时间:2005年5月17日 |

| |
[Arm_Embeded]也说eboot流程 文章收藏
oceanblue 发表于 2008/6/13 10:46:02 |
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://bluefish.blog.51cto.com/214870/58130
这一段时间利用工作之外的时间调试了一把eboot(wince5-s3c2440)。还好eboot终于可以用了,就是烧写太麻烦,256k要烧8分钟之多(通过jtag)。
wince5中的eboot默认是用的cs8900的网卡,而我们现在板子上的是dm9000。幸运的是从网上down了一个这么一个dm9000实现的代码。下面具体说下eboot的代码和修改流程。
bootloader的作用无非就是将nk从pc端先down到ram再写到指定地址的flash,下次启动的时候直接从flash上读到ram并跳到ram中去执行,以启动nk。
eboot(.nb0)是先被nboot之类的上电执行的代码拷贝到指定地址的ram中去,并执行。先是一段汇编,用以设置cpu时钟,屏蔽中断之类的,然后就是跳到main(smdk2440\src\bootloader\eboot\main.c)中去执行。这个函数直接调用BootloaderMain,并不再回头了。不过可以在这个main函数中打开led,以调试看eboot有没有跑到c函数的main中去。
所有的内容,包括下载nk和启动都是在BootloaderMain(public\common\oak\drivers\ethdbg\blcommon\blocommon.c)中实现。从大的方面说它调用了OEMPlatformInit,DownloadImage,OEMLaunch这3个功能函数。
OEMPlatformInit进入menu,让用户选择下一步所要执行的操作,并配置以太网控制器。如果是要下载nk则DownloadImage,如果从flash启动则加载并OEMLaunch(启动要从flash加载的话是在OEMPlatformInit中执行的)。
所有eboot的操作几乎都是通过pToc(很多值是通过boot.bib来映射的,g_pBootCfg是pToc的一个成员)这个结构连接在一起的。它包括所有用到的配置,例如是否在down完之后写flash等。
以下说下我在调试eboot时候的修改
首先InitEthDevice。由于现在要通过dm9000来实现eboot,所以要改下这个函数中的设置的几个功能函数:pfnEDbgInit = DM9000DBG_Init;pfnEDbgGetFrame = DM9000DBG_GetFrame;pfnEDbgSendFrame = DM9000DBG_SendFrame;也就是说在dm9000中只要实现这3个功能函数就ok了。在调试的时候pBaseIOAddress也是个值得关注的地方。
接下来是修改boot.bib中FLSCACHE的值,它是所down的nk在ram中的开始地址和长度。
loader.h中定义了很多宏需要注意,例如ROM_RAMIMAGE_START和ROM_RAMIMAGE_SIZE的值应该和config.bib中的对应。 |
|
|