ddd
全部博文(22)
分类: 嵌入式
2010-04-25 13:52:48
移植U-Boot-2009.08到友善之臂mini2440(二)
2.1 修改cpu/arm920t/start.S
(1)删除AT91RM9200使用的LED代码,117、118行,关闭LED代码。
start_code:
/*
* set the cpu to SVC32 mode
*/
mrs r0,cpsr
bic r0,r0,#0x
orr r0,r0,#0xd3
msr cpsr,r0
//bl coloured_LED_init
//bl red_LED_on
(2)修改编译条件支持s
#if defined(CONFIG_S
/* turn off the watchdog */
# if defined(CONFIG_S
# define pWTCON 0x15300000
# define INTMSK 0x14400008 /* Interupt-Controller base addresses */
# define CLKDIVN 0x14800014 /* clock divisor register */
#else
# define pWTCON 0x53000000
# define INTMSK 0x
# define INTSUBMSK 0x
# define CLKDIVN 0x
# endif
修改 CPU频率初始化设置
//xujun
#define CLK_CTL_BASE 0x
#define MDIV_405 0x
#define PSDIV_405 0x21
#define MDIV_200 0xa1 <<12
#define PSDIV_200 0x31
(3)修改中断禁止部分
165行修改0x3ff为0x7ff
#if defined(CONFIG_S
ldr r1, =0x7ff /*根据2410芯片手册,INTSUBMSK有11位可用*/
ldr r0, =INTSUBMSK
str r1, [r0]
#endif
169行添加
#if defined(CONFIG_S
ldr r1, =0x7fff
ldr r0, =INTSUBMSK
str r1, [r0]
#endif
(4)修改时钟设置(2440的主频为405MHz。)
//xujun
#if defined(CONFIG_S
/* FCLK:HCLK:PCLK = 1:4:8 */
ldr r0,=CLKDIVN
mov r1,#5
str r1,[r0]
mrc p15,0,r1,c1,c0,0
orr r1,r1,#0xc0000000
mcr p15,0,r1,c1,c0,0
mov r1,#CLK_CTL_BASE
mov r2,#MDIV_405
add r2,r2,#PSDIV_405
str r2,[r1,#0x04]
#else
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
//xujun
mrc p15,0,r1,c1,c0,0
orr r1,r1,#0xc0000000
mcr p15,0,r1,c1,c0,0
mov r1,#CLK_CTL_BASE
mov r2,#MDIV_200
add r2,r2,#PSDIV_200
str r2,[r2,#0x04]
#endif
(5)将从Flash启动改成从NAND Flash启动
将relocate U-Boot to RAM
的代码注释或者删除
#if 0
#ifndef
CONFIG_
SKIP_RELOCATE_UBOOT
。。。。。。。。。。。。。。。。。
#endif /* CONFIG_SKIP_RELOCATE_UBOOT */
#endif // if 0
在以下U-Boot的设置堆栈语句段(作用是将u-boot的源代码从nor flash到sdram中):
/* Set up the stack */
stack_setup:
ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot
的前面添加上(#endif /* CONFIG_SKIP_RELOCATE_UBOOT */
#endif的后面添加上:)以下的nand boot代码:
定义u-boot在nand flash中存放的长度为#define LENGTH_UBOOT 0x60000,可以方便修改u-boot因为裁剪和增添大小的改变而占的长度。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
//xujun
#define LENGTH_UBOOT 0x60000
#define NAND_CTL_BASE 0x4E000000
#ifdef CONFIG_S
@reset NAND
#define oNFCONF 0x00
#define oNFCONT 0x04
#define oNFSTAT 0x08
#define oNFCMD 0x20
mov r1,#NAND_CTL_BASE
ldr r2,=( (7<<12)|(7<<8)|(7<<4)|(0<<0))
str r2,[r1,#oNFCONF]
ldr r2,[r1,#oNFCONF]
ldr r2,=((1<<4)|(0<<1)|(1<<0))
str r2,[r1,#oNFCONT]
ldr r2,[r1,#oNFCONT]
ldr r2,=(0x6)
str r2,[r1,#oNFSTAT]
ldr r2,[r1,#oNFSTAT]
mov r2,#0xff
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
mov fp,#0
@copy U-Boot to Ram
ldr r0,=TEXT_BASE
mov r1,#0x0
mov r2, #LENGTH_UBOOT //the u-boot’s lenth
bl nand_read_ll
tst r0,#0x0
beq ok_nand_read
bad_nand_read:
loop2: b loop2
ok_nand_read:
@verify
mov r0,#0
ldr r1,=TEXT_BASE
mov r2,#0x400
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 @CONFIG_S
#endif
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
在“ldr pc, _start_armboot”之后加入LED代码:
ldr pc, _start_armboot
#if defined(CONFIG_MINI2440_LED)
mov r1, #GPIO_CTL_BASE
add r1, r1, #oGPIO_B
ldr r2,=0x156aa
str r2, [r1, #oGPIO_CON]
mov r2, #0xff
str r2, [r1, #oGPIO_UP]
mov r2, #0x
str r2, [r1, #oGPIO_DAT]
#endif
_start_armboot: .word start_armboot
在 “ _start_armboot: .word start_armboot ” 后加入:
_start_armboot: .word start_armboot
#define STACK_BASE 0x
#define STACK_SIZE 0x10000
.align 2
DW_STACK_START: .word STACK_BASE+STACK_SIZE-4