转载自:http://blog.chinaunix.net/u1/34474/showart.php?id=363269 同时附加自己的一些修改
一、在U-Boot中建立自己的开发板类型,并测试编译。
我为开发板取名叫: tekkaman2410
0 在工作目录下解压U-Boot。
$tar zxvf u-boot.git.tar.gz
1 进入U-Boot目录,修改Makefile
$cd u-boot.git/
$vi Makefile
#为tekkaman2410建立编译项
smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
tekkaman2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t tekkaman2410 tekkaman s3c24x0
各项的意思如下:
arm: CPU的架构(ARCH)
arm920t: CPU的类型(CPU),其对应于cpu/arm920t子目录。
tekkaman2410: 开发板的型号(BOARD),对应于board/tekkaman/tekkaman2410目录。
tekkaman: 开发者/或经销商(vender)。
s3c24x0: 片上系统(SOC)。
同时在
“ifndef CROSS_COMPILE ”之前 加上自己交叉编译器的路径,比如我使用crosstool-0.43制作的基于2.6.22.2内核和
gcc-4.1.0-glibc-2.3.2的
ARM9TDMI交叉编译器,则:
CROSS_COMPILE=/home/tekkaman/working/crosstool-gcc410-k26222/gcc-4.1.0-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-
2 在/board子目录中建立自己的开发板tekkaman2410目录
由于我在上一步板子的
开发者/或经销商(vender)中填了 tekkaman ,所以
开发板tekkaman2410目录一定要建在
/board子目录中的tekkaman目录下
,否则编译会出错。
$cd board
$mkdir tekkaman tekkaman/tekkaman2410
$cp -arf smdk2410/* tekkaman/tekkaman2410/
$cd tekkaman/tekkaman2410
$mv smdk2410.c tekkaman2410.c
还要记得修改自己的开发板tekkaman2410目录下的Makefile文件,不然编译时会出错:
COBJS := tekkaman2410.o flash.o
$vi Makefile
3 在include/configs/中建立配置头文件
$cd ../../..
$cp include/configs/smdk2410.h include/configs/tekkaman2410.h
4 测试编译能否成功
$make tekkaman2410_config
Configuring for tekkaman2410 board...
(如果出现:
$ make tekkaman2410_config
Makefile:1927: *** 遗漏分隔符 。 停止。
请在U-boot的根目录下的Makefile的
@$(MKCONFIG) $(@:_config=) arm arm920t tekkaman2410 tekkaman
)
前加上“Tab”键)
$make
我到这一步测试交叉编译成功!!
二、修改U-Boot中的文件,以匹配博创的2410-S实验箱。
1 修改/cpu/arm920t/start.S
(1)修改中断禁止部分
# if defined(CONFIG_S3C2410)
ldr r1, =0x7ff //根据2410芯片手册,
INTSUBMSK有11位可用,
//
vivi也是0x7ff,
不知为什么U-Boot一直没改过来。
ldr r0, =INTSUBMSK
str r1, [r0]
# endif
(2)修改时钟设置(可以不修改,因为后面的board_init函数也会
将时钟设为202.8MHz
)
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
mrc p15, 0, r1, c1, c0, 0 /*read ctrl register tekkaman*/
orr r1, r1, #0xc0000000 /*Asynchronous tekkaman*/
mcr p15, 0, r1, c1, c0, 0 /*write ctrl register tekkaman*/
/*now, CPU clock is 202.8 Mhz tekkaman*/
mov r1, #CLK_CTL_BASE /* tekkaman*/
mov r2, #MDIV_200 /* mpll_200mhz tekkaman*/
add r2, r2, #PSDIV_200 /* mpll_200mhz tekkaman*/
str r2, [r1, #0x04] /* MPLLCON tekkaman */
#endif /* CONFIG_S3C2400 || CONFIG_S3C2410 */
红色部分是我添加的,因为 U-Boot 使用的是
/* default FCLK is 120 MHz ! */
我利用
博创提供的
vivi的代码,将其设为202.8MHz 并在前面加上:
#elif defined(CONFIG_S3C2410)
# define pWTCON 0x53000000
# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */
# define INTSUBMSK 0x4A00001C
# define CLKDIVN 0x4C000014 /* clock divisor register */
#define CLK_CTL_BASE 0x4C000000
/* tekkaman */
#define MDIV_200 0xa1 << 12 /* tekkaman */
#define PSDIV_200 0x31
/* tekkaman */
(3)将从Flash启动改成从NAND Flash启动。
将以下U-Boot的重定向语句段:
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp r0, r1 /* don't reloc during debug */
beq stack_setup
ldr r2, _armboot_start
ldr r3, _bss_start
sub r2, r3, r2 /* r2 <- size of armboot */
add r2, r0, r2 /* r2 <- source end address */
copy_loop:
ldmia r0!, {r3-r10} /* copy from source address [r0] */
stmia r1!, {r3-r10} /* copy to target address [r1] */
cmp r0, r2 /* until source end addreee [r2] */
ble copy_loop
#endif /* CONFIG_SKIP_RELOCATE_UBOOT */
替换成:
#ifdef CONFIG_S3C2410_NAND_BOOT @tekkaman@@@@@@@@@@@@@@@@SSSSSSSSSSSSS
@ reset NAND
mov r1, #NAND_CTL_BASE
ldr r2, =0xf830 @ initial value
str r2, [r1, #oNFCONF]
ldr r2, [r1, #oNFCONF]
bic r2, r2, #0x800 @ enable chip
str r2, [r1, #oNFCONF]
mov r2, #0xff @ RESET command
strb r2, [r1, #oNFCMD]
mov r3, #0 @ wait
nand1:
add r3, r3, #0x1
cmp r3, #0xa
blt nand1
nand2:
ldr r2, [r1, #oNFSTAT] @ wait ready
tst r2, #0x1
beq nand2
ldr r2, [r1, #oNFCONF]
orr r2, r2, #0x800 @ disable chip
str r2, [r1, #oNFCONF]
@ get read to call C functions (for nand_read())
ldr sp, DW_STACK_START @ setup stack pointer
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 @tekkaman@@@@@@@@@@@@@@@@@@EEEEEEEEE
在
“ _start_armboot: .word start_armboot
” 后加入:
.align 2
DW_STACK_START: .word STACK_BASE+STACK_SIZE-4
附:顺便提一下,在
start.S
文件的注释部分有个小错误(红色部分:原来是2):
cpu_init_crit:
......
/*
* disable MMU stuff and caches
*/
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)
bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)
orr r0, r0, #0x00000002 @ set bit 1 (A) Align
......
2
在board/
tekkaman/tekkaman2410
加入NAND Flash读函数,建立nand_read.c文件,加入如下内容(copy from vivi):
#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 >> 25) & 0xff;
wait_idle();
for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {
*buf = (NFDATA & 0xff);
buf++;
}
}
/* chip Disable */
NFCONF |= 0x800; /* chip disable */
return 0;
}
3 修改board/tekkaman/tekkaman2410/Makefile文件
......
OBJS := tekkaman2410.o nand_read.o
......
4 修改include/configs/tekkaman2410.h文件,添加如下内容:
......
/*
* Nandflash Boot
*/
#define CONFIG_S3C2410_NAND_BOOT 1
#define STACK_BASE 0x33f00000
#define STACK_SIZE 0x8000
//#define UBOOT_RAM_BASE 0x33f80000
/* NAND Flash Controller */
#define NAND_CTL_BASE 0x4E000000
#define bINT_CTL(Nb) __REG(INT_CTL_BASE + (Nb))
/* Offset */
#define oNFCONF 0x00
#define oNFCMD 0x04
#define oNFADDR 0x08
#define oNFDATA 0x0c
#define oNFSTAT 0x10
#define oNFECC 0x14
#endif /* __CONFIG_H */
5 修改board/tekkaman/tekkaman2410/lowlevel_init.S文件
依照开发箱的内存区的配置情况, 修改board/tekkaman/tekkaman2410/lowlevel_init.S文件,我利用博创提供的vivi源码里的信息做了如下更改:
......
#define B1_BWSCON (DW16) /*@tekkaman*/
#define B2_BWSCON (DW16)
#define B3_BWSCON (DW16) /*@tekkaman*/