移植U-BOOT到扬创2440(莫同学)
最初调试u-boot的时候直接下载到内存运行测试,开机启动flash中的u-boot,使用u-boot的
tftp命令实现tftp下载,首先设置好server ip,用setnev命令并saveenv保存。然后tftp 0x32000000
test-u-boot.bin实现从服务器现在bin到指定内存中,再使用go 0x32000000命令运行test-u-boot,
注意go方式调试u-boot时不能重复初始化cpu、sdram等,将start.S中的cpu_init_crit注释掉。
在实际调试过程中可是在第一阶段采用点灯法测试,对于开发板GPF接LED灯,点完灯则
loopwhile: bl loopwhile 死循环等待确保当前运行位置。
第一阶段流程:_start为程序入口,然后跳转到start_code进行cpu模式设置为SVC32,接着
关闭看门狗
ldr r0, =pWTCON
mov r1, #0x0
str r1, [r0]
和关闭所有的中断
mov r1, #0xffffffff
ldr r0, =INTMSK
str r1, [r0]
接着进行cpu时钟设置,2440标准为405MHz。配置完后,可以进行重定位操作了,从flash到ram中运行
,接着就是设置堆栈和进入start_armboot开始第二阶段C。
在第二阶段时使用C实现,依次执行初始化函数表中的每个函数(init_sequence[],board.c
中),调试时可以使用while1和printf方式查看初始化顺序。在第二阶段中enable_interrupts打开中
断,第一阶段是关闭的。跟踪到for (;;) {main_loop ();}前面点亮灯提示,进入main_loop(函数在
main.c)主循环寻找倒计时循环,以便在该循环中加入按键检测。
继续使用while和printf法一步步接下去跟踪,发现static __inline__ int abortboot(int
bootdelay)函数是决定进入u-boot还是kernel。查看代码看到其中有个while ((bootdelay > 0) &&
(!abort))循环等待,abort标志位来表示启动选择。在里面加入按键扫描key =0x0f & *(volatile
unsigned int *)(GPIO_CTL_BASE+oGPIO_F+oGPIO_DAT)获得GPF口的数据,第四位为按键k1到k4,判断
到k1按下则使用while1停止并点灯提示。
u-boot测试完毕后将其烧写入flash,注意将cpu_init_crit注释去掉。第一阶段点一个灯,
第二阶段主循环前点全部灯,这样不用看串口信息也能知道当前启动位置,按键k1则点亮一半灯表示
识别k1并循环等待。
接着用自己编译好的u-boot引导kernel,kernel直接使用扬创自带的。采用tftp加bootm方式
调试,但是移植卡死在booting linux kernel. 可能性为1.console设置没有传递到内核。
这种情况是
1.kernel已经启动信息看不到,终端为ttySAC0,排除。
2.u-boot的时钟设置不在405MHz,与Kernel的不一致。汇编代码中已经设置为405,排除这种可能。
3.Machine ID设置的与Kernel不一致。当前默认为
782,通过u-boot的bdinfo命令看到arch_number = 0x30E,内核默认为5244,修改内核或者修改u-
boot,方便起见只修改u-boot中的include/asm-arm/mach-type.h文件,其中有这么一个语句,
#define MACH_TYPE_mini2440 782将ARCH_mini2440 改为5244即可。
测试tftp 32000000 uImage;bootm 32000000。接着测试go方式启动kernel,在linux下编译kernel,make后在arh/arm/boot下生成zImage压缩映像,tftp 32000000 zImage;go 32000000卡死在booting linux kernel. go启动内核的话,u-boot不会传machine ID给内核,因为go只是执行普通的应用程序,不考虑到传递参数给内核的问题。修改command/cmd_boot.c 中的go命令实现函数,rc = ((unsigned long(*)(int, char *[]))addr) (0, (unsigned long)5244);手动指定arch number为5244。go命令引导kernel成功。
重新烧写u-boot,引导kernel启动成功。
在移植过程中一些很好的资料: http://blog.csdn.net/hugerat/archive/2009/01/21/3847025.aspx
ftp://ftp.denx.de/pub/u-boot/ 这是u-boot官方源码下载地址。
http://www.martinliu.info/2009/05/mini2440%E4%BD%BF%E7%94%A8u-boot/