移植U-BOOT到扬创2440心得

 

移植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/

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值