/*=================================================================================================
NOTE:
This file implements all the operations for S3C6410+K9GAG08.
To use on other hardware platforms, please modify accordingly.
==================================================================================================*/
#include "Types.h"
#include "Comm.h"
#include "Flash.h"
/*=================================================================================================
FUNCTION: nand_wait()
DESCRIPTION:
Used to check if device is busy or ready for new command. Return only when the device is ready.
ARGUMENTS PASSED:
None
RETURN VALUE:
None
==================================================================================================*/
void nand_wait(void)
{
while( !(*SysAddr32(NFSTAT) & 0x1) );
}
/*=================================================================================================
FUNCTION: nand_init()
DESCRIPTION:
Used to do some initialization. User can put any initialization inside this function.
ARGUMENTS PASSED:
None
RETURN VALUE:
None
==================================================================================================*/
void nand_init(void)
{
//Config
*SysAddr32(NFCONF) = 0x01007770;
//Control
*SysAddr32(NFCTRL) = 0x000400C5;
//Reset
nand_wait();
*SysAddr32(NFCMD) = 0xFF;
nand_wait();
}
/*=================================================================================================
FUNCTION: nand_read_id()
DESCRIPTION:
Used to read the flash ID.
ARGUMENTS PASSED:
None
RETURN VALUE:
U32 id - Read flash ID.
==================================================================================================*/
U32 nand_read_id(void)
{
U8 id1;
U8 id2;
//Read ID
nand_wait();
*SysAddr32(NFCMD) = 0x90;
*SysAddr32(NFADDR) = 0x00;
nand_wait();
id1 = *SysAddr8(NFDATA);
id2 = *SysAddr8(NFDATA);
return ((id2<<16) | id1);
}
/*=================================================================================================
FUNCTION: nand_read_page()
DESCRIPTION:
Used to read one page.
ARGUMENTS PASSED:
U32 blockidx - [i] Block index/number for read operation.
U32 pageidx - [i] Page index/number for read operation.
RETURN VALUE:
None
==================================================================================================*/
void nand_read_page(U32 blockidx, U32 pageidx)
{
int i;
U32 blkpgnum;
U32 *ptr32;
U8 data[4];
ptr32 = (U32*)data;
blkpgnum = blockidx*NAND_BLOCK_PAGE_NUM + pageidx;
//Read a page
nand_wait();
*SysAddr32(NFCMD) = 0x00;
*SysAddr32(NFADDR) = 0x00;
*SysAddr32(NFADDR) = 0x00;
*SysAddr32(NFADDR) = (blkpgnum>>0) & 0xFF;
*SysAddr32(NFADDR) = (blkpgnum>>8) & 0xFF;
*SysAddr32(NFADDR) = (blkpgnum>>16) & 0xFF;
*SysAddr32(NFCMD) = 0x30;
nand_wait();
for(i = 0; i < NAND_PAGE_SIZE; i += 4){
data[0] = *SysAddr8(NFDATA);
data[1] = *SysAddr8(NFDATA);
data[2] = *SysAddr8(NFDATA);
data[3] = *SysAddr8(NFDATA);
write_to_host(*ptr32);
}
}
/*=================================================================================================
FUNCTION: nand_program_page()
DESCRIPTION:
Used to program one page.
ARGUMENTS PASSED:
U32 blockidx - [i] Block index/number for program operation.
U32 pageidx - [i] Page index/number for program operation.
RETURN VALUE:
U32 0 - Program the page successfully.
1 - Program the page unsuccessfully.
==================================================================================================*/
U32 nand_program_page(U32 blockidx, U32 pageidx)
{
int i;
U32 blkpgnum;
U32 *ptr32;
U8 data[4];
ptr32 = (U32*)data;
blkpgnum = blockidx*NAND_BLOCK_PAGE_NUM + pageidx;
//Program a page
nand_wait();
*SysAddr32(NFCMD) = 0x80;
*SysAddr32(NFADDR) = 0x00;
*SysAddr32(NFADDR) = 0x00;
*SysAddr32(NFADDR) = (blkpgnum>>0) & 0xFF;
*SysAddr32(NFADDR) = (blkpgnum>>8) & 0xFF;
*SysAddr32(NFADDR) = (blkpgnum>>16) & 0xFF;
for(i = 0; i < NAND_PAGE_SIZE; i += 4){
*ptr32 = read_from_host();
*SysAddr8(NFDATA) = data[0];
*SysAddr8(NFDATA) = data[1];
*SysAddr8(NFDATA) = data[2];
*SysAddr8(NFDATA) = data[3];
}
*SysAddr32(NFCMD) = 0x10;
nand_wait();
//Read status
*SysAddr32(NFCMD) = 0x70;
nand_wait();
if(*SysAddr8(NFDATA) & 0x1)
return 1;
return 0;
}
/*=================================================================================================
FUNCTION: nand_erase_block()
DESCRIPTION:
Used to erase one block. If can't erase, mark as bad/invalid block.
ARGUMENTS PASSED:
U32 blockidx - [i] Block index/number for erase operation.
RETURN VALUE:
U32 0 - Erase the block successfully.
1 - Erase the block unsuccessfully.
==================================================================================================*/
U32 nand_erase_block(U32 blockidx)
{
U32 blkpgnum;
blkpgnum = blockidx * NAND_BLOCK_PAGE_NUM;
//Erase a block
nand_wait();
*SysAddr32(NFCMD) = 0x60;
*SysAddr32(NFADDR) = (blkpgnum>>0) & 0xFF;
*SysAddr32(NFADDR) = (blkpgnum>>8) & 0xFF;
*SysAddr32(NFADDR) = (blkpgnum>>16) & 0xFF;
*SysAddr32(NFCMD) = 0xD0;
nand_wait();
//Read status
*SysAddr32(NFCMD) = 0x70;
nand_wait();
if(*SysAddr8(NFDATA) & 0x1){
nand_mark_badblock(blockidx);
return 1;
}
return 0;
}
/*=================================================================================================
FUNCTION: nand_check_blank()
DESCRIPTION:
Used to check if a block is blank or not.
ARGUMENTS PASSED:
U32 blockidx - [i] Block index/number for blank check operation.
RETURN VALUE:
U32 0 - The specified block is blank.
1 - The specified block is NOT blank.
==================================================================================================*/
U32 nand_check_blank(U32 blockidx)
{
int i;
U32 pageidx;
U32 blkpgnum;
U32 *ptr32;
U8 data[4];
ptr32 = (U32*)data;
blkpgnum = blockidx*NAND_BLOCK_PAGE_NUM;
//Read a page
for(pageidx = 0; pageidx < NAND_BLOCK_PAGE_NUM; pageidx += 1){
nand_wait();
*SysAddr32(NFCMD) = 0x00;
*SysAddr32(NFADDR) = 0x00;
*SysAddr32(NFADDR) = 0x00;
*SysAddr32(NFADDR) = (blkpgnum>>0) & 0xFF;
*SysAddr32(NFADDR) = (blkpgnum>>8) & 0xFF;
*SysAddr32(NFADDR) = (blkpgnum>>16) & 0xFF;
*SysAddr32(NFCMD) = 0x30;
nand_wait();
for(i = 0; i < NAND_PAGE_SIZE; i += 4){
data[0] = *SysAddr8(NFDATA);
data[1] = *SysAddr8(NFDATA);
data[2] = *SysAddr8(NFDATA);
data[3] = *SysAddr8(NFDATA);
if(*ptr32 != 0xFFFFFFFF)
return 1;
}
blkpgnum += 1;
}
return 0;
}
/*=================================================================================================
FUNCTION: nand_mark_badblock()
DESCRIPTION:
Used to mark a bad/invalid block.
ARGUMENTS PASSED:
U32 blockidx - [i] Block index/number to be marked.
RETURN VALUE:
U32 0 - Mark successfully.
1 - Mark unsuccessfully.
==================================================================================================*/
U32 nand_mark_badblock(U32 blockidx)
{
return 0;
}
/*=================================================================================================
FUNCTION: nand_is_badblock()
DESCRIPTION:
Used to check if a block is bad/invalid or not.
ARGUMENTS PASSED:
U32 blockidx - [i] Block index/number to be checked.
RETURN VALUE:
U32 0 - The specified block
S3C6410+K9GAG08的H-JTAG的驱动
4星 · 超过85%的资源 需积分: 10 70 浏览量
2012-04-27
11:42:49
上传
评论
收藏 21KB RAR 举报
lishengwu
- 粉丝: 1
- 资源: 6
最新资源
- 操作简单的Mongodb网页web管理工具,基于Spring Boot2.0支持mongodb集群.zip
- tms-mongodb-web,提供访问mongodb数据的REST API和可灵活扩展的mongodb web 客户端.zip
- SpringBoot整合mongodb学习MongoTemplate和MongoRepository两种方式CRUD使用.zip
- SpringBoot整合MongoDB实现对数据库的CRUD小demo.zip
- Python操作MongoDB数据库的基本一些操作 .zip
- NOSQL数据库监控工具,目前实现了对Redis、MongoDB的监控功能 .zip
- mongoDB数据库的增删改查,以及所需要的配置.zip
- mongodb数据库idea测试.zip
- koa 分别 连接 mysql、mongodb数据库操作.zip
- 基于pytorch实现的人体部件分割源码+模型.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈