/**********************************************
function: ok6410 nand flash operation
sdrom ic: K9XXG08UXM 2g
author: lvtory
date: 2013.4.13
**********************************************/
#define MEM_SYS_CFG (*((volatile unsigned long *)0x7E00F120))
#define NFCONF (*((volatile unsigned long *)0x70200000))
#define NFCONT (*((volatile unsigned long *)0x70200004))
#define NFCMMD (*((volatile unsigned long *)0x70200008))
#define NFADDR (*((volatile unsigned long *)0x7020000C))
#define NFDATA (*((volatile unsigned char *)0x70200010))
#define NFSTAT (*((volatile unsigned long *)0x70200028))
void nand_select(void)
{
NFCONT &= ~(1<<1);
}
void nand_deselect(void)
{
NFCONT |= (1<<1);
}
void nand_cmd(unsigned char cmd)
{
NFCMMD = cmd;
}
void nand_addr(unsigned char addr)
{
NFADDR = addr;
}
unsigned char nand_get_data(void)
{
return NFDATA;
}
void wait_ready(void)
{
while ((NFSTAT & 0x1) == 0);
}
void nand_reset(void)
{
/* 选中 */
nand_select();
/* 发出0xff命令 */
nand_cmd(0xff);
/* 等待就绪 */
wait_ready();
/* 取消选中 */
nand_deselect();
}
void nand_init(void)
{
/* 让xm0csn2用作nand flash cs0 片选引脚 */
MEM_SYS_CFG &= ~(1<<1);
/* 设置时间参数 */
#define TACLS 0
#define TWRPH0 1
#define TWRPH1 0
NFCONF &= ~((1<<30) | (7<<12) | (7<<8) | (7<<4));
NFCONF |= ((TACLS<<12) | (TWRPH0<<8) | (TWRPH1<<4));
/* 使能nand flash controller */
NFCONT |= 1;
nand_reset();
}
void nand_send_addr(unsigned int addr)
{
/* 2G nand flash */
nand_addr(addr & 0xff); /* a0~a7 */
nand_addr((addr >> 8) & 0xf); /* 程序的角度: a8~a11 */
nand_addr((addr >> 12) & 0xff); /* 程序的角度: a12~a19 */
nand_addr((addr >>20) & 0xff); /* 程序的角度: a20~a27 */
nand_addr((addr >> 28) & 0x7); /* 程序的角度: a2~a30 */
}
int nand_read(unsigned int nand_start, unsigned int ddr_start, unsigned int len)
{
unsigned int addr = nand_start;
unsigned char *dest = (unsigned char *)ddr_start
int i,count = 0;
/*选中nand flash*/
nand_slect();
while(count<len)
{
//发出读命令//
nand_cmd(0x00);
//发出地址
nand_send_addr(addr);
//发出30命令
nand_cmd(0x30);
//等待就绪
wait_ready();
for(i=0;i<2048 && count<len;i++)
{
dest[i++]=nand_get_data();
}
addr +=2048;
nand_deselect();
return 0;
}
}
int copy2ddr(unsigned int nand_start, unsigned int ddr_start, unsigned int len)
{
int ret;
//nand flash controller init
nand_init();
ret=nand_read(nand_start,ddr_start,len);
return ret;
}
ok6410 nandflash 2
最新推荐文章于 2019-02-24 20:42:18 发布