加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

个人对nandflash驱动的总结(ok6410版)

发布时间:2020-12-15 07:07:33 所属栏目:百科 来源:网络整理
导读:? ? ? ? ? ? 1 ,首先说明要用 nandflash 的原因,当你从 nand 启动时, 6410 中的硬件会自动将 nand 中的 8k 内容拷贝到开发板中内存空间的 iRAM 中,然后 iRAM 再将这 8k 内容拷贝到内从中进行运行,一旦 nand 中的内容大于 8k 则多余的那些将无法被拷贝机

? ? ? ? ? ?

1,首先说明要用nandflash的原因,当你从nand启动时,6410中的硬件会自动将nand中的8k内容拷贝到开发板中内存空间的iRAM中,然后iRAM再将这8k内容拷贝到内从中进行运行,一旦nand中的内容大于8k则多余的那些将无法被拷贝机运行,因此需要一个驱动程序来将多余的代码移到内存中那就是nandflash驱动程序

2?其次说说使用了nandflash之后的代码搬移过程;第一步,硬件会自动将nand中的8k内容拷贝到开发板中内存空间的iRAM中,然后iRAM再将这8k内容拷贝到内从中进行运行,??第二步,将nand中剩余的代码直接拷贝到内存中接着运行

3现在到了代码编写时间,其他的不多说因为已经总结完了,就说自己被卡的地方

??就在页读这里出错了结果导致整个程序有问题,之后参考了正确的代码,运行出来了

代码如下;

?#define?NFCONF?????????????(*((volatile?unsigned?long*)0x70200000))

#define?NFCONT?????????????(*((volatile?unsigned?long*)0x70200004))

#define?NFCMMD?????????????(*((volatile?unsigned?char*)0x70200008))

#define?NFSTAT?????????????(*((volatile?unsigned?char*)0x70200028))

#define?NFADDR?????????????(*((volatile?unsigned?char*)0x7020000c))

#define?NFDATA?????????????(*((volatile?unsigned?char*)0x70200010))

?

void?select_ship(void)

{

????NFCONT?&=?~(1<<1);

}

?

void?delselect_ship(void)

{

????NFCONT?|=?(1<<1);

}

?

void?clean_RnB()

{

????NFSTAT?|=?(1<<4);

}?

void?nand_cmd(unsigned?char?cmd)

{

????NFCMMD?=?cmd;???

}

?

void?wait_RnB(void)

{

????while(!(NFSTAT?&?0x1));

}

?

void?nand_addr(unsigned?char?addr)

{

????NFADDR?=?addr;

}

?

void?nand_reset(void)

{

????/*?选中?*/

????select_ship();

????

????/*?清除RnB?*/

????clean_RnB();

????

????/*?发出复位信号?*/

????nand_cmd(0xff);

????

????/*?等待就绪?*/

????wait_RnB();

????

????/*?取消选中?*/

????delselect_ship();

}

?

void?nand_init(void)

{?

/*

HCLK的频率为100MHZ,周期就为10ns

TACLS?>?0?ns

TWRPH0 >?15ns

TWRPH1?>?5ns

?

TACLS的值?=?HCLK?x?TACLS?>?0ns

TWRPH0的值?=?HCLK?x?(TWRPH0?+?1)?>?15ns

TWRPH1的值?=?HCLK?x?(TWRPH1?+1)?>?5ns?

*/

????/*?设置时间参数?*/

#define?TACLS??1

#define?TWRPH0?2

#define?TWRPH1?1

????

????NFCONF?&=?~((7<<12)|(7<<8)|(7<<4));

????NFCONF?|=?(TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4);

????

????/*?使能?nandflash?controller*/

????NFCONT?=?1?|?(1<<1);

????

????/*?复位?*/

????nand_reset();

}

?

?

void?NF_PageRead(unsigned?long?addr,unsigned?char*?buff)

{

????int?i;

????

????

????/*?选中芯片?*/

????select_ship();

????

????/*?清除RnB?*/

????clean_RnB();

????

????

????

????

????/*?发出命令0x00?*/

?????nand_cmd(0x00);

????????

?????/*?发出列地址?*/

????nand_addr(0x00);

????nand_addr(0x00);

????/*?发出行地址?*/

????nand_addr(addr&0xff);

????nand_addr((addr?>>8?)?&?(0xff));

????nand_addr((addr?>>16?)?&?(0xff));

????????

????/*?发出命令0x30?*/

?????nand_cmd(0x30);

????????

????/*?等待就绪?*/

?????wait_RnB();

????????

????/*?读数据?*/

?????for(i?=?0;?i<1024*4;?i++)

????{

???? buff[i]?=?NFDATA;

????}

??????

??????

?????

??????

?????/*?取消片选?*/

?????

?????delselect_ship();

?????

}

?

?

?

?

void?nand_to_ram(unsigned?long?start_addr,unsigned?char*?sdram_addr,int?size)

{

/*?i为页号、sdram_addr为内存中的位置、size拷贝数据的大小?*/

int?i;

unsigned?int?page_shift?=?12;

/*?页的起始地址给ii为页号),这个start_addr包含列地址和行地址,我们只需要页地址(行地址)?*/

/*for(i=(start_addr?>>?12);size>0;)

{

NF_PageRead(i,sdram_addr);? //读一页的数据

???? size?-=?1024*4;?? //ok6410页的大小是4K

???? start_addr?+=?1024*4;

???? i++;

}

*/

/*?Read?pages?*/

????????for?(i?=?0;?i?<?4;?i++,?sdram_addr+=(1<<(page_shift-1)))?

????????{

????????????NF_PageRead(i,sdram_addr);

????????}

?

????????/*?Read?pages?*/

????????for?(i?=?4;?i?<?(0x3c000>>page_shift);?i++,?sdram_addr+=(1<<page_shift))

????????{

????????????NF_PageRead(i,sdram_addr);

????????}

???

}

?

?

int?NF_Erase(unsigned?long?addr)

{

int?ret;

//选中flash芯片

select_ship();

//清除RnB

clean_RnB();

//发送命令60

nand_cmd(0x60);

//发送行地址(3个周期)

nand_addr(addr&0xff);

???? nand_addr((addr?>>8?)?&?(0xff));

???? nand_addr((addr?>>16?)?&?(0xff));

//发送命令D0

nand_cmd(0xD0);

//等待RnB

wait_RnB();

//发送命令70

nand_cmd(0x70);

//读取擦除结果

ret?=?NFDATA;

//取消选中flash芯片

delselect_ship();

return?ret;

}

?

int?NF_WritePage(unsigned?long?addr,unsigned?char*?buff)

{

int?ret,i;

//选中flash芯片

select_ship();

//清除RnB

clean_RnB();

//发送命令80

nand_cmd(0x80);

//发送列地址(2个周期)

nand_addr(0x00);

???? nand_addr(0x00);

//发送行地址(3个周期)

nand_addr(addr&0xff);

???? nand_addr((addr?>>8?)?&?(0xff));

???? nand_addr((addr?>>16?)?&?(0xff));

//写入数据

for(i=0;i<1024*4;i++)

{

NFDATA?=?buff[i];

}

//发送命令10

nand_cmd(0x10);

//等待RnB

wait_RnB();

//发送命令70

nand_cmd(0x70);

//读取写入结果

ret?=?NFDATA;

//取消选中flash芯片

delselect_ship();

return?ret;

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读