- 論壇徽章:
- 0
|
u-boot1.5移植
系統(tǒng)環(huán)境:
windows XP pro2002 pack2
VMware workstation 5.5.2
linux 9.0(全安裝)
編譯環(huán)境:
cross-2.95.3
原文件
u-boot-1.1.4.tar.bz2
下載地址:[color="#0080ff"]ftp://ftp.denx.de/pub/u-boot/
移植過(guò)程:
1、參照u-boot1.5移植一文。
2、在fs2410.c修改代碼
開(kāi)頭增加如下代碼:
#include
#include
[color="#ff0000"]#include
最后增加如下代碼:
[color="#ff0000"]/*
* NAND flash initialization.
*/
#if (CONFIG_COMMANDS & CFG_CMD_NAND)
extern ulong
nand_probe(ulong physadr);
static inline void NF_Reset(void)
{
int i;
NF_SetCE(NFCE_LOW);
NF_Cmd(0xFF); /* reset command */
for(i = 0; i NFCONF = (1> 20);
}
#endif
3、在board/fs2410文件夾中[color="#ff0000"]增加nand_read.c文件(參照VIVI)
代碼如下:
#include
#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 NFCONT __REGi(NF_BASE + 0x4)
#define NFCMD __REGb(NF_BASE + 0x8)
#define NFADDR __REGb(NF_BASE + 0xC)
#define NFDATA __REGb(NF_BASE + 0x10)
#define NFSTAT __REGb(NF_BASE + 0x20)
//#define GPDAT __REGi(GPIO_CTL_BASE+oGPIO_F+oGPIO_DAT)
#define NAND_CHIP_ENABLE (NFCONT &= ~(1> 9) & 0xff;
NFADDR = (i >> 17) & 0xff;
NFADDR = (i >> 25) & 0xff;
NAND_DETECT_RB;
for(j=0; j
4、編輯board/fs2410/Makefile
LIB = $(obj)lib$(BOARD).a
COBJS := fs2410.o [color="#ff0000"]nand_read.o flash.o
SOBJS := lowlevel_init.o
5、增加include/[color="#ff0000"]nand.h文件
編輯代碼如下:
#include
extern int mem_test(unsigned long start, unsigned long ramsize,int mode);
#if (CONFIG_COMMANDS & CFG_CMD_NAND)
typedef enum {
NFCE_LOW,
NFCE_HIGH
} NFCE_STATE;
static inline void NF_Conf(u16 conf)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
nand->NFCONF = conf;
}
static inline void NF_Cmd(u8 cmd)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
nand->NFCMD = cmd;
}
static inline void NF_CmdW(u8 cmd)
{
NF_Cmd(cmd);
udelay(1);
}
static inline void NF_Addr(u8 addr)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
nand->NFADDR = addr;
}
static inline void NF_SetCE(NFCE_STATE s)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
switch (s) {
case NFCE_LOW:
nand->NFCONF &= ~(1NFCONF |= (1NFSTAT & (1NFDATA = data;
}
static inline u8 NF_Read(void)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
return(nand->NFDATA);
}
static inline void NF_Init_ECC(void)
{
S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
nand->NFCONF |= (1NFECC);
}
#endif
6、編輯cpu/arm920t/start.S文件,增加nand boot 代碼
……………………
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
/* END stuff after relocation */
#endif
[color="#ff0000"]#ifdef CONFIG_S3C2440_NAND_BOOT
bl copy_myself
#if 1
mov r1, #GPIO_CTL_BASE
add r1, r1, #oGPIO_F
mov r2, #0x00
[color="#ff0000"]str r2, [r1, #oGPIO_DAT]
#endif
@ jump to ram
ldr r1, =on_the_ram
add pc, r1, #0
nop
nop
1: b 1b @ infinite loop
on_the_ram:
#endif
ldr pc, _start_armboot
_start_armboot: .word start_armboot
……………………
……………………
ldr pc, _start_armboot
_start_armboot: .word start_armboot
[color="#ff0000"]#ifdef CONFIG_S3C2440_NAND_BOOT
copy_myself:
mov r10, lr
@ reset NAND
mov r1, #NAND_CTL_BASE
ldr r2, =( (7
文件最后添加:
[color="#ff0000"]#ifdef CONFIG_S3C2410_NAND_BOOT
.align 2
DW_STACK_START:
.word STACK_BASE+STACK_SIZE-4
#endif
7、編輯include/configs/fs2410.h文件
修改
#define CONFIG_COMMANDS \
(CONFIG_CMD_DFL | \
CFG_CMD_CACHE | \
[color="#ff0000"]CFG_CMD_NAND | \
/*CFG_CMD_EEPROM |*/ \
/*CFG_CMD_I2C |*/ \
/*CFG_CMD_USB |*/ \
CFG_CMD_REGINFO | \
CFG_CMD_DATE | \
CFG_CMD_ELF)
[color="#ff0000"]//#define CFG_ENV_IS_IN_FLASH 1
[color="#ff0000"]//#define CFG_ENV_SIZE 0x10000
[color="#ff0000"]#define CFG_ENV_IS_IN_NAND 1
#define CFG_ENV_OFFSET 0x020000
#define CFG_NAND_BASE 0x4E000000
#define CMD_SAVEENV
#define CFG_NAND_LEGACY
#define CFG_ENV_SIZE 0x10000
文件[color="#ff0000"]最后的#endif之前增加如下代碼:
#if (CONFIG_COMMANDS & CFG_CMD_NAND)
#define CONFIG_S3C2410_NAND_BOOT 1
#define CFG_MAX_NAND_DEVICE 1 /* Max number of NAND devices */
#define SECTORSIZE 512
#define ADDR_COLUMN 1
#define ADDR_PAGE 2
#define ADDR_COLUMN_PAGE 3
#define NAND_ChipID_UNKNOWN 0x00
#define NAND_MAX_FLOORS 1
#define NAND_MAX_CHIPS 1
#define NAND_WAIT_READY(nand) NF_WaitRB()
#define NAND_DISABLE_CE(nand) NF_SetCE(NFCE_HIGH)
#define NAND_ENABLE_CE(nand) NF_SetCE(NFCE_LOW)
#define WRITE_NAND_COMMAND(d, adr) NF_Cmd(d)
#define WRITE_NAND_COMMANDW(d, adr) NF_CmdW(d)
#define WRITE_NAND_ADDRESS(d, adr) NF_Addr(d)
#define WRITE_NAND(d, adr) NF_Write(d)
#define READ_NAND(adr) NF_Read()
/* the following functions are NOP's because S3C24X0 handles this in hardware */
#define NAND_CTL_CLRALE(nandptr)
#define NAND_CTL_SETALE(nandptr)
#define NAND_CTL_CLRCLE(nandptr)
#define NAND_CTL_SETCLE(nandptr)
#define CONFIG_MTD_NAND_VERIFY_WRITE 1
#define CONFIG_MTD_NAND_ECC_JFFS2 1
/*define NAND BOOT*/
#define UBOOT_RAM_BASE 0x33f80000
#define STACK_BASE 0x33f00000
#define STACK_SIZE 0x8000
#define NAND_CTL_BASE 0x4E000000
#define bINT_CTL(Nb) __REG(INT_CTL_BASE + (Nb))
#define oNFCONF 0x00
#define oNFCMD 0x04
#define oNFADDR 0x08
#define oNFDATA 0x0c
#define oNFSTAT 0x10
#define oNFECC 0x14
#endif
#endif
8、確認(rèn)存在以下文件:
[color="#ff0000"]drivers/nand_legacy/nand_legacy.c
include/linux/mtd/nand_ids.h
include/linux/mtd/nand.h
9、編輯include/linux/mtd/nand_ids.h文件
{"Samsung K9K1216Q0C", NAND_MFR_SAMSUNG, 0x46, 26, 0, 3, 0x4000, 1},
[color="#ff0000"]{"Samsung K9F1208U0M", NAND_MFR_SAMSUNG, 0xf6, 26, 0, 4, 0X4000, 0},
{ NULL,}
編譯過(guò)程:
1、編輯Makefile 中的交叉編譯環(huán)境
ifeq ($(ARCH),arm)
CROSS_COMPILE = [color="#ff0000"]/usr/local/arm/2.95.3/bin/arm-linux-
endif
2、編譯配置文件
make fs2410_config
3、編譯u-boot
make all ARCH=ARM
4、u-boot根目錄下編譯完成的u-boot.bin文件可以下載到fs2410板的nandflash上。。
本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u2/64539/showart_1200104.html |
|