eCos,是个新手;我也是个新手;不过我喜欢新的东西,当然是在IT世界!
前不久弄到了一块阳初的S3C2410开发板,总算可以对eCos进行感性认识了。都说接触eCos最好的入门方法就是RedBoot,自然从安装RedBoot开始了!
其实阳初的s3c2410开发板和三星的SMDK2410几乎是一致的,想当然的认为感性认识马上就可以开始,然而事实总是残酷的!配置SMDK2410的Redboot,选择启动方式,RAM、ROM、ROMRAM,which one should i choose? 答案却是none!才发现CPU核心板上有一块空白,本应该是一块NOR Flash的地盘...一切变得复杂起来了...
问题已经出来了,如何从NAND Flash启动Redboot?google,baidu,回答了如何从NAND启动vivi,u-boot等等...;查阅了s3c2410的资料,当CPU配置从NAND启动时,其硬件逻辑会将4K的代码从NAND中拷贝到CPU内部的SRAM中进行执行,那么也就是说在这4K代码中必须实现将所有代码拷贝到内存(SDRAM)中的工作。
从网上可以找到实现这些拷贝工作的代码,我从vivi中找到了这一段...
首先分析了一下Redboot启动代码的调用过程,先是Redboot目录下的Vectors.S文件,如果设置启动模式为ROM或ROMRAM的话,则在reset_vector的一开始会执行PLATFORM_SETUP1宏,这个宏的实现在hal\arm\arm9\smdk2410\current\include\hal_platform_setup.h文件中进行了实现,其主要工作就是关闭WatchDog、Interrupt、cache,然后设置PLL即CPU的倍频,初始化内存管理的每个Bank的访问设置,即B0~7_BWSCON的设置(包括访问位宽、WAIT方式和UBLB等),随后进行的是mmu的初始化;如果是ROMRAM的启动方式的话,在这里就会实现将整个Redboot代码拷贝到SDRAM的程序。
显然,从Redboot的体系结构出发,由于hal_platform_setup.h是和平台相关的实现,那么将NAND启动时的拷贝代码放到这里则是更加合理的,因此将从vivi中抽出来的这一段代码放到了这个代码段中。一开始不是很熟悉CDL语言,因此没有想修改这一部分的脚本,就将ROMRAM的拷贝代码用vivi中的代码替换掉了。很显然这是个错误的决定,启动没有成功。
又花了几天的功夫熟悉了CDL语言以及配置脚本的结构,在hal\arm\arm9\smdk2410\current\cdl\目录下的hal_arm_arm9_smdk2410.cdl文件中找到了cdl_component CYG_HAL_STARTUP的设置,在"ROMRAM"的后面加上了一个"NAND"选项,对应于宏CYG_HAL_STARTUP_NAND。这样就可以选择启动模式为NAND了!
回到hal_platform_setup.h中,就可以在其中加入NAND启动的代码:
#ifdef CYG_HAL_STARTUP_NAND
/**************************/
/* My NAND BOOT CODE */
/**************************/
#endif
经过这一折腾,自我感觉也还不错,总算对于Redboot的体系结构有了一些了解,对于CDL脚本的构成和语法也熟悉了一些,作为接触eCos的第一步,至少有了一些认识...
当然,事情总是没有那么顺利的,Redboot仍然是启动不了的,只有继续再往下走了...待续...
阅读(2001) | 评论(0) | 转发(0) |