*buf=(NFDATA&0xff);
buf++;
}
}
/*chipDisable*/
NFCONF|=0x800;/*chipdisable*/
return0;
}
#endif
四.同时修改board/fs2410/Makefile文件,增加nand_read文件
COBJS :
=fs2410.o nand_read.oflash.o
五、修改board/fs2410/fs2410.c文件,加入NANDFlash操作
(1)加入NandFlash的初始化函数
在文件的最后加入NandFlash的初始化函数,该函数在后面NandFlash的操作都要用到。
u-boot运行到第2阶段会进入start_armboot()函数。
其中nand_init()函数是对nandflash的最初初始化函数。
nand_init()函数在两个文件中实现。
其调用与CFG_NAND_LEGACY宏有关,如果没有定义这个宏,系统调用drivers/nand/nand.c中的nand_init();否则调用自己在本文件中的nand_init()函数,本例使用后者。
fs2410.c代码如下:
#ifdefined(CONFIG_CMD_NAND)
typedefenum{
NFCE_LOW,
NFCE_HIGH
}NFCE_STATE;
staticinlinevoidNF_Conf(u16conf)
{
S3C2410_NAND*constnand=S3C2410_GetBase_NAND();
nand->NFCONF=conf;
}
staticinlinevoidNF_Cmd(u8cmd)
{
S3C2410_NAND*constnand=S3C2410_GetBase_NAND();
nand->NFCMD=cmd;
}
staticinlinevoidNF_CmdW(u8cmd)
{
NF_Cmd(cmd);
udelay
(1);
}
staticinlinevoidNF_Addr(u8addr)
{
S3C2410_NAND*constnand=S3C2410_GetBase_NAND();
nand->NFADDR=addr;
}
staticinlinevoidNF_WaitRB(void)
{
S3C2410_NAND*constnand=S3C2410_GetBase_NAND();
while(!
(nand->NFSTAT&(1<<0)));
}
staticinlinevoidNF_Write(u8data)
{
S3C2410_NAND*constnand=S3C2410_GetBase_NAND();
nand->NFDATA=data;
}
staticinlineu8NF_Read(void)
{
S3C2410_NAND*constnand=S3C2410_GetBase_NAND();
return(nand->NFDATA);
}
staticinlineu32NF_Read_ECC(void)
{
S3C2410_NAND*constnand=S3C2410_GetBase_NAND();
return(nand->NFECC);
}
staticinlinevoidNF_SetCE(NFCE_STATEs)
{
S3C2410_NAND*constnand=S3C2410_GetBase_NAND();
switch(s){
caseNFCE_LOW:
nand->NFCONF&=~(1<<11);
break;
caseNFCE_HIGH:
nand->NFCONF|=(1<<11);
break;
}
}
staticinlinevoidNF_Init_ECC(void)
{
S3C2410_NAND*constnand=S3C2410_GetBase_NAND();
nand->NFCONF|=(1<<12);
}
externulongnand_probe(ulongphysadr);
staticinlinevoidNF_Reset(void)
{
inti;
NF_SetCE(NFCE_LOW);
NF_Cmd(0xFF);/*resetcommand*/
for(i=0;i<10;i++);/*tWB=100ns.*/
NF_WaitRB();/*wait200~500us;*/
NF_SetCE(NFCE_HIGH);
}
staticinlinevoidNF_Init(void)
{
#if0
#defineTACLS0
#defineTWRPH03
#defineTWRPH10
#else
#defineTACLS0
#defineTWRPH04
#defineTWRPH12
#endif
#ifdefined(CONFIG_S3C2440)
NF_Conf((TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4));
NF_Cont((1<<6)|(1<<4)|(1<<1)|(1<<0));
#else
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);*/
/*1111,1xxx,rxxx,rxxx*/
/*En512B4stepECCRnFCE=HtACLStWRPH0tWRPH1*/
#endif
NF_Reset();
}
voidnand_init(void)
{
S3C2410_NAND*constnand=S3C2410_GetBase_NAND();
NF_Init();
#ifdefDEBUG
printf("NANDflashprobingat0x%.8lX\n",(ulong)nand);
#endif
printf("%4luMB\n",nand_probe((ulong)nand)>>20);
}
#endif
(2)配置GPIO和PLL
根据开发板的硬件说明和芯片手册,修改GPIO和PLL的配置。
六、修改include/configs/fs2410.h头文件
(1)加入命令定义
/* Commandlineconfiguration. */
#include
#defineCONFIG_CMD_ASKENV
#defineCONFIG_CMD_CACHE
#defineCONFIG_CMD_DATE
#defineCONFIG_CMD_DHCP
#defineCONFIG_CMD_ELF
#defineCONFIG_CMD_PING
#defineCONFIG_CMD_NAND
#defineCONFIG_CMD_REGINFO
#defineCONFIG_CMD_USB
#defineCONFIG_CMD_FAT
(2)修改命令提示符
#defineCFG_PROMPT"SMDK2410#"
->#defineCFG_PROMPT"FS2410#"
(3)修改默认载入地址
#defineCFG_LOAD_ADDR0x33000000
->#defineCFG_LOAD_ADDR0x30008000
(4)加入Flash环境信息
#defineCFG_ENV_IS_IN_NAND1
#defineCFG_ENV_OFFSET0X30000
#defineCFG_NAND_LEGACY
//#define CFG_ENV_IS_IN_FLASH 1
#defineCFG_ENV_SIZE 0x10000 /*TotalSizeofEnvironmentSector*/
(5)加入NandFlash设置(在文件结尾处)
/*NANDflashsettings */
#ifdefined(CONFIG_CMD_NAND)
#defineCFG_NAND_BASE0x4E000000/*NandFlash控制器在SFR区起始寄存器地址*/
#defineCFG_MAX_NAND_DEVICE1 /*支持的最在NandFlash数据*/
#defineSECTORSIZE512/*1页的大小*/
#defineNAND_SECTOR_SIZESECTORSIZE
#defineNAND_BLOCK_MASK511/*页掩码*/
#defineADDR_COLUMN1/*一个字节的Column地址*/
#defineADDR_PAGE3/*3字节的页块地址!
!
!
!
!
*/
#defineADDR_COLUMN_PAGE4/*总共4字节的页块地址!
!
!
!
!
*/
#defineNAND_ChipID_UNKNOWN0x00/*未知芯片的ID号*/
#defineNAND_MAX_FLOORS1
#defineNAND_MAX_CHIPS1
/*NandFlash命令层底层接口函数*/
#defineWRITE_NAND_ADDRESS(d,adr){rNFADDR=d;}
#defineWRITE_NAND(d,adr){rNFDATA=d;}
#defineREAD_NAND(adr)(rNFDATA)
#defineNAND_WAIT_READY(nand){while(!
(rNFSTAT&(1<<0)));}
#defineWRITE_NAND_COMMAND(d,adr){rNFCMD=d;}
#defineWRITE_NAND_COMMANDW(d,adr) NF_CmdW(d)
#defineNAND_DISABLE_CE(nand){rNFCONF|=(1<<11);}
#defineNAND_ENABLE_CE(nand){rNFCONF&=~(1<<11);}
/*thefollowingfunctionsareNOP'sbecauseS3C24X0handlesthisinhardware*/
#defineNAND_CTL_CLRALE(nandptr)
#defineNAND_CTL_SETALE(nandptr)
#defineNAND_CTL_CLRCLE(nandptr)
#defineNAND_CTL_SETCLE(nandptr)
/*允许NandFlash写校验*/
#defineCONFIG_MTD_NAND_VERIFY_WRITE1
(6)加入NandFlash启动支持(在文件结尾处)
/*NandflashBoot*/
#defineSTACK_BASE0x33f00000
#defineSTACK_SIZE0x8000
/*NANDFlashController*/
#defineNAND_CTL_BASE0x4E000000
#definebINT_CTL(Nb)__REG(INT_CTL_BASE+(Nb))
/*Offset*/
#defineoNFCONF0x00
#defineCONFIG_S3C2410_NAND_BOOT1
/*Offset*/
#defineoNFCONF0x00
#defineoNFCMD0x04
#defineoNFADDR0x08
#defineoNFDATA0x0c
#defineoNFSTAT0x10
#defineoNFECC0x14
#definerNFCONF(*(volatileunsignedint*)0x4e000000)
#definerNFCMD(*(volatileunsignedchar*)0x4e000004)
#definerNFADDR(*(volatileunsignedchar*)0x4e000008)
#definerNFDATA(*(volatileunsignedchar*)0x4e00000c)
#definerNFSTAT(*(volatileunsignedint*)0x4e000010)
#definerNFECC(*(volatileunsignedint*)0x4e000014)
#definerNFECC0(*(volatileunsignedchar*)0x4e000014)
#definerNFECC1(*(volatileunsignedchar*)0x4e000015)
#definerNFECC2(*(volatileunsignedchar*)0x4e000016)
#endif
(7)加入jffs2的支持
/*JFFS2Support*/
#undefCONFIG_JFFS2_CMDLINE
#defineCONFIG_JFFS2_NAND1
#defineCONFIG_JFFS2_DEV"nand0"
#defineCONFIG_JFFS2_PART_SIZE0x4c0000