S3C2440平台下调试u-boot的方法——代码加载
来源:互联网 发布:适合矮个子的淘宝店铺 编辑:程序博客网 时间:2024/06/03 23:41
S3C2440平台下调试u-boot的方法——代码加载
Author:梁桥江 转载请注明出处
本人曾经在csdn上发布了一篇<<调试u-boot的方法>>,该文章具有局限性,因为它把代码加载(代码从nand flash到SDRAM的搬移)部分代码注释掉了。这篇文章就是要讨论在<<调试u-boot的方法>>基础上,加入代码加载的调试,所以在阅读本文前,先要读懂<<调试u-boot的方法>>。
一. 代码加载源码:
//下面添加2440中u-boot从Nand Flash启动
#ifdef CONFIG_S3C2440_NAND_BOOT
mov r1, #NAND_CTL_BASE //复位Nand Flash
ldr r2, =( (7<<12)|(7<<8)|(7<<4)|(0<<0) )
str r2, [r1, #oNFCONF] //设置配置寄存器的初始值,参考s3c2440手册
ldr r2, [r1, #oNFCONF]
ldr r2, =( (1<<4)|(0<<1)|(1<<0) )
str r2, [r1, #oNFCONT] //设置控制寄存器
ldr r2, [r1, #oNFCONT]
ldr r2, =(0x6) //RnB Clear
str r2, [r1, #oNFSTAT]
ldr r2, [r1, #oNFSTAT]
mov r2, #0xff //复位command
strb r2, [r1, #oNFCMD]
mov r3, #0 //等待
nand1:
add r3, r3, #0x1
cmp r3, #0xa
blt nand1
nand2:
ldr r2, [r1, #oNFSTAT] //等待就绪
tst r2, #0x4
beq nand2
ldr r2, [r1, #oNFCONT]
orr r2, r2, #0x2 //取消片选
str r2, [r1, #oNFCONT]
//get read to call C functions (for nand_read())
ldr sp, DW_STACK_START //C代码准备堆栈,DW_STACK_START定义在下面
mov fp, #0
//copy U-Boot to RAM
ldr r0, =TEXT_BASE
mov r1, #0x0
mov r2, #0x30000
bl nand_read_ll
tst r0, #0x0
beq ok_nand_read
bad_nand_read:
loop2: b loop2 //infinite loop
ok_nand_read:
//检查搬移后的数据,如果前4k完全相同,表示搬移成功
mov r0, #0
ldr r1, =TEXT_BASE
mov r2, #0x400 //4 bytes * 1024 = 4K-bytes
go_next:
ldr r3, [r0], #4
ldr r4, [r1], #4
teq r3, r4
bne notmatch
subs r2, r2, #4
beq stack_setup
bne go_next
notmatch:
loop3: b loop3 //infinite loop
#endif //CONFIG_S3C2440_NAND_BOOT
上面那段代码,如果你的开发板只有nand flash而没有nor flash, 而且亲自移植过u-boot的朋友,那么一定不会陌生,它就是开发板上电后把nand flash里面的u-boot搬移到SDRAM的代码(该代码基本上全世界都是这样写的)。
从代码上看,该段代码主要是从nand flash的0地址把u-boot搬移到SDRAM的TEXT_BASE开始的地方,然后把S3C2440从0到0x1000的4K SRAM的内容与TEXT_BASE开始的4K内容相比,如果完全一样,代码加载成功,否则失败。
根据上面分析,我们只需要修改几个地址,即可在不烧写nand flash的情况下实现调试上面代码。
二. 修改以后的代码
//下面添加2440中u-boot从Nand Flash启动
#ifdef CONFIG_S3C2440_NAND_BOOT
mov r1, #NAND_CTL_BASE //复位Nand Flash
ldr r2, =( (7<<12)|(7<<8)|(7<<4)|(0<<0) )
str r2, [r1, #oNFCONF] //设置配置寄存器的初始值,参考s3c2440手册
ldr r2, [r1, #oNFCONF]
ldr r2, =( (1<<4)|(0<<1)|(1<<0) )
str r2, [r1, #oNFCONT] //设置控制寄存器
ldr r2, [r1, #oNFCONT]
ldr r2, =(0x6) //RnB Clear
str r2, [r1, #oNFSTAT]
ldr r2, [r1, #oNFSTAT]
mov r2, #0xff //复位command
strb r2, [r1, #oNFCMD]
mov r3, #0 //等待
nand1:
add r3, r3, #0x1
cmp r3, #0xa
blt nand1
nand2:
ldr r2, [r1, #oNFSTAT] //等待就绪
tst r2, #0x4
beq nand2
ldr r2, [r1, #oNFCONT]
orr r2, r2, #0x2 //取消片选
str r2, [r1, #oNFCONT]
//get read to call C functions (for nand_read())
ldr sp, DW_STACK_START //C代码准备堆栈,DW_STACK_START定义在下面
mov fp, #0
//copy U-Boot to RAM
ldr r0, =0x32000000
mov r1, #0x0
mov r2, #0x30000
bl nand_read_ll
tst r0, #0x0
beq ok_nand_read
bad_nand_read:
loop2: b loop2 //infinite loop
ok_nand_read:
//检查搬移后的数据,如果前4k完全相同,表示搬移成功
ldr r0, = 0x33f80000
ldr r1, =0x32000000
mov r2, #0x400 //4 bytes * 1024 = 4K-bytes
go_next:
ldr r3, [r0], #4
ldr r4, [r1], #4
teq r3, r4
bne notmatch
subs r2, r2, #4
beq stack_setup
bne go_next
notmatch:
loop3: b loop3 //infinite loop
#endif //CONFIG_S3C2440_NAND_BOOT
修改成上面代码以后,就相当于把nand flash里的u-boot搬移到SDRAM 0x32000000开始的地方,然后用SDRAM 0x33f80000开始前4K与0x3200000开始前4K内存相比,如果完全一样说明代码加载成功了,调试完成。
- S3C2440平台下调试u-boot的方法——代码加载
- 调试u-boot的方法
- u-boot 的调试方法
- 移植u-boot-2011.03到S3C2440(utu2440)的方法与步骤###6.使用AXD和JLINK调试u-boot方法与步骤
- 移植u-boot-2010.09到S3C2440(五)—— 通过OPENJTAG、OPENOCD、ECLIPSE进行调试
- S3C2440的U-Boot移植
- S3C2440的U-Boot移植
- 移植u-boot-2010.09到S3C2440(三)——判断NAND还是NOR启动的汇编代码
- u-boot下s29gl128p的调试
- 使用AXD调试U-BOOT的方法
- s3c2440的U-boot移植(一)
- u-boot下nand调试
- S3C2440 U-Boot补丁
- 移植u-boot-2011.03到S3C2440(utu2440)的方法与步骤###2. 让u-boot-2011.03跑起来
- U-BOOT中start.s包含S3C2440代码分析
- U-BOOT中start.s包含S3C2440代码分析
- 移植u-boot-2010.09到S3C2440(二)——ARM汇编中的LDR及ADR的区别及其在U-BOOT中的应用 (SDRAM)
- 移植u-boot-2011.03到S3C2440(utu2440)的方法与步骤###4.支持内核启动
- informix 11.7各版本介绍
- 飞鸽"隐身"的问题——主机名惹得祸
- CDocManager
- Java的内存泄漏
- 《进一步鼓励软件产业和集成电路产业发展的若干政策》解读
- S3C2440平台下调试u-boot的方法——代码加载
- jQuery 的插件 dataTables
- c++笔试题汇总
- PHP 基础测试!
- win2003+Eclipse+Tomcat+Lomboz的配置总结
- SQL Server FOR XML PATH 语句的应用
- 用ADO操作数据库的方法步骤
- emacs常用命令
- jsp的exception技术整理