微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式Linux开发环境的搭建之:U-Boot移植

嵌入式Linux开发环境的搭建之:U-Boot移植

时间:08-13 来源:3721RD 点击:

mov fp, #0 @ no previous frame, so fp=0

@ copy U-Boot to RAM

ldr r0, =TEXT_BASE

mov r1, #0x0

mov r2, #0x20000

bl nand_read_ll

tst r0, #0x0

beq ok_nand_read

bad_nand_read:

loop2: b loop2 @ infinite loop

ok_nand_read:

@ verify

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_S3C2410_NAND_BOOT @END

在 " _start_armboot: .word start_armboot " 后加入:

.align 2

DW_STACK_START: .word STACK_BASE+STACK_SIZE-4

(5)修改内存配置(board/fs2410/lowlevel_init.S)。

#define BWSCON 0x48000000

#define PLD_BASE 0x2C000000

#define SDRAM_REG 0x2C000106

/* BWSCON */

#define DW8 (0x0)

#define DW16(0x1)

#define DW32(0x2)

#define WAIT(0x1<<2)

#define UBLB(0x1<<3)

/* BANKSIZE */

#define BURST_EN (0x1<<7)

#define B1_BWSCON (DW16 + WAIT)

#define B2_BWSCON (DW32)

#define B3_BWSCON (DW32)

#define B4_BWSCON (DW16 + WAIT + UBLB)

#define B5_BWSCON (DW8 + UBLB)

#define B6_BWSCON (DW32)

#define B7_BWSCON (DW32)

/* BANK0CON */

#define B0_Tacs 0x0 /* 0clk */

#define B0_Tcos 0x1 /* 1clk */

#define B0_Tacc 0x7 /* 14clk */

#define B0_Tcoh 0x0 /* 0clk */

#define B0_Tah 0x0 /* 0clk */

#define B0_Tacp0x0 /* page mode is not used */

#define B0_PMC 0x0 /* page mode disabled */

/* BANK1CON */

#define B1_Tacs 0x0 /* 0clk */

#define B1_Tcos 0x1 /* 1clk */

#define B1_Tacc 0x7 /* 14clk */

#define B1_Tcoh 0x0 /* 0clk */

#define B1_Tah 0x0 /* 0clk */

#define B1_Tacp0x0 /* page mode is not used */

#define B1_PMC 0x0 /* page mode disabled */

……

/* REFRESH parameter */

#define REFEN 0x1 /* Refresh enable */

#define TREFMD 0x0 /* CBR(CAS before RAS)/Auto refresh */

#define Trp 0x0 /* 2clk */

#define Trc 0x3 /* 7clk */

#define Tchr0x2 /* 3clk */

#define REFCNT 1113 /*period=15.6us,HCLK=60Mhz, (2048+1-15.6*60) */

......

.word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))

.word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))

.word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)

.word 0x32

.word 0x30

.word 0x30

(6)加入Nand Flash读函数(创建board/fs2410/nand_read.c文件)。

#include <config.h>

#define __REGb(x) (*(volatile unsigned char *)(x))

#define __REGi(x) (*(volatile unsigned int *)(x))

#define NF_BASE 0x4e000000

#define NFCONF __REGi(NF_BASE + 0x0)

#define NFCMD __REGb(NF_BASE + 0x4)

#define NFADDR __REGb(NF_BASE + 0x8)

#define NFDATA __REGb(NF_BASE + 0xc)

#define NFSTAT __REGb(NF_BASE + 0x10)

#define BUSY 1

inline void wait_idle(void)

{

Int i;

while(!(NFSTAT & BUSY))

{

for (i = 0; i < 10; i++);

}

}

/* low level nand read function */

int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)

{

int i, j;

if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK))

{

return -1; /* invalid alignment */

}

/* chip Enable */

NFCONF &= ~0x800;

for (i = 0; i < 10; i++);

for (i = start_addr; i < (start_addr + size);)

{

/* READ0 */

NFCMD = 0;

/* Write Address */

NFADDR = i & 0xff;

NFADDR = (i >> 9) & 0xff;

NFADDR = (i >> 17) & 0xff;

NFADDR = (i >>

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top