这一段时间利用工作之外的时间调试了一把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中的对应。