Chinaunix首页 | 论坛 | 博客
  • 博客访问: 112552
  • 博文数量: 23
  • 博客积分: 975
  • 博客等级: 准尉
  • 技术积分: 262
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-19 00:54
文章分类
文章存档

2011年(2)

2010年(3)

2008年(18)

我的朋友

分类: LINUX

2008-07-22 02:19:28

(续1...)

           make ARCH=arm 测试一下

到这里 u-boot 已经可以从nand启动了

下面我们对u-boot添加nand指令的支持

 

2、           修改include/configs/sky2410.h

1)        去掉CFG_CMD_NAND的注释

#define CONFIG_COMMANDS \

                  (CONFIG_CMD_DFL      | \

                  CFG_CMD_CACHE | \

                  CFG_CMD_NAND   | \

                  /*CFG_CMD_EEPROM |*/ \

                  /*CFG_CMD_I2C     |*/ \

                  /*CFG_CMD_USB    |*/ \

                  CFG_CMD_REGINFO  | \

                  CFG_CMD_DATE     | \

                  CFG_CMD_ELF | \

                  CFG_CMD_NET       | \

                  CFG_CMD_PING)

 

2)        修改我们在第10步添加的内容。(下文蓝色部分为添加的内容,紫色部分是第10步已经添加的内容。)

#define CFG_NAND_LEGACY

#define CFG_ENV_OFFSET 0X20000

#if (CONFIG_COMMANDS & CFG_CMD_NAND)

#define CFG_NAND_BASE 0x4E000000

/* NandFlash控制器在SFR区起始寄存器地址 */

#define CFG_MAX_NAND_DEVICE 1

/* 支持的最在Nand Flash数据 */

#define SECTORSIZE 512

/* 1页的大小 */

#define NAND_SECTOR_SIZE SECTORSIZE

#define NAND_BLOCK_MASK 511

/* 页掩码 */

#define ADDR_COLUMN 1

/* 一个字节的Column地址 */

#define ADDR_PAGE 3

/* 3字节的页块地址!!!!!*/

#define ADDR_COLUMN_PAGE 4

/* 总共4字节的页块地址!!!!! */

#define NAND_ChipID_UNKNOWN 0x00

/* 未知芯片的ID */

#define NAND_MAX_FLOORS 1

#define NAND_MAX_CHIPS 1

/* Nand Flash命令层底层接口函数 */

#define WRITE_NAND_COMMAND(d, adr) {rNFCMD = d;}

#define WRITE_NAND_ADDRESS(d, adr) {rNFADDR = d;}

#define WRITE_NAND(d, adr) {rNFDATA = d;}

#define READ_NAND(adr) (rNFDATA)

#define NAND_WAIT_READY(nand) {while(!(rNFSTAT&(1<<0)));}

#define NAND_DISABLE_CE(nand) {rNFCONF |= (1<<11);}

#define NAND_ENABLE_CE(nand) {rNFCONF &= ~(1<<11);}

/* 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)

/* 允许Nand Flash写校验 */

#define CONFIG_MTD_NAND_VERIFY_WRITE 1

/*

* 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

#define rNFCONF (*(volatile unsigned int *)0x4e000000)

#define rNFCMD (*(volatile unsigned char *)0x4e000004)

#define rNFADDR (*(volatile unsigned char *)0x4e000008)

#define rNFDATA (*(volatile unsigned char *)0x4e00000c)

#define rNFSTAT (*(volatile unsigned int *)0x4e000010)

#define rNFECC (*(volatile unsigned int *)0x4e000014)

#define rNFECC0 (*(volatile unsigned char *)0x4e000014)

#define rNFECC1 (*(volatile unsigned char *)0x4e000015)

#define rNFECC2 (*(volatile unsigned char *)0x4e000016)

#endif /* CONFIG_COMMANDS & CFG_CMD_NAND*/

 

3、           修改 board/jan2410/jan2410.c

在文件尾部添加

#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 &= ~(1<<11);

break;

 

case NFCE_HIGH:

nand->NFCONF |= (1<<11);

break;

}

}

 

static inline void NF_WaitRB(void)

{

S3C2410_NAND * const nand = S3C2410_GetBase_NAND();

 

while (!(nand->NFSTAT & (1<<0)));

}

 

static inline void NF_Write(u8 data)

{

S3C2410_NAND * const nand = S3C2410_GetBase_NAND();

 

nand->NFDATA = 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 |= (1<<12);

}

 

static inline u32 NF_Read_ECC(void)

{

S3C2410_NAND * const nand = S3C2410_GetBase_NAND();

 

return(nand->NFECC);

}

 

#endif

/*

 

* 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 < 10; i++); /* tWB = 100ns. */

NF_WaitRB(); /* wait 200~500us; */

NF_SetCE(NFCE_HIGH);

}

 

 

static inline void NF_Init(void)

{

#if 0 /* a little bit too optimistic */

#define TACLS 0

#define TWRPH0 3

#define TWRPH1 0

#else

#define TACLS 0

#define TWRPH0 4

#define TWRPH1 2

#endif

 

NF_Conf((1<<15)|(0<<14)|(0<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0));

/*nand->NFCONF = (1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0); */

/* 1 1 1 1, 1 xxx, r xxx, r xxx */

/* En 512B 4step ECCR nFCE=H tACLS tWRPH0 tWRPH1 */

 

NF_Reset();

}

 

void

nand_init(void)

{

S3C2410_NAND * const nand = S3C2410_GetBase_NAND();

 

NF_Init();

#ifdef DEBUG

printf("NAND flash probing at 0x%.8lX\n", (ulong)nand);

#endif

printf ("%4lu MB\n", nand_probe((ulong)nand) >> 20);

}

#endif

 

好了,现在大功告成了!

 

编译u-boot

make ARCH=arm all

 

Have fun!!!

下一步就是移植Linux内核了!

 

增加提示:

include\configs\jan2410.h里面,通过宏定义定义了一些环境变量,可以根据自己的需要把环境变量的值固化到代码里面。

 
此外,该u-boot还存在一些不足,如:saveenv命令无效(save到Nor Flash去了),bootm不传递启动参数(采用内核默认启动参数)。在以后的文章中会解决这些问题。
阅读(1624) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~