📄 nandflash.c
字号:
/*************************************** Copyright (c) *************************************************
*
* POLAR STAR
* 北天星国际有限公司
* http://www.po-star.com
*
*文 件 名: NandFlash.c
*文件描述:NandFlash初始化主程序及test
*编译环境:ADS1.2
*
********************************************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include "main.h"
#include "com.h"
#include "NandFlash.h"
#include "nand.h"
#include "jffs2.h"
extern int nand_erase(struct nand_chip* nand, size_t ofs, size_t len, int clean);
//*----------------------------------------------------------------------------
//* \fn AT91F_NandFlash_Init
//* \brief NandFlash init
//*----------------------------------------------------------------------------
void AT91F_NandFlash_Init (void)
{
// Setup Smart Media, first enable the address range of CS3 in HMATRIX user interface
AT91F_EBI_EnableSM_On_CS3 (AT91C_BASE_CCFG);
// Configure SMC CS3
AT91C_BASE_SMC->SMC_SETUP3 = (AT91C_SM_NWE_SETUP | AT91C_SM_NCS_WR_SETUP |
AT91C_SM_NRD_SETUP | AT91C_SM_NCS_RD_SETUP);
AT91C_BASE_SMC->SMC_PULSE3 = (AT91C_SM_NWE_PULSE | AT91C_SM_NCS_WR_PULSE |
AT91C_SM_NRD_PULSE | AT91C_SM_NCS_RD_PULSE);
AT91C_BASE_SMC->SMC_CYCLE3 = (AT91C_SM_NWE_CYCLE | AT91C_SM_NRD_CYCLE);
AT91C_BASE_SMC->SMC_CTRL3 = (AT91C_SMC_READMODE | AT91C_SMC_WRITEMODE |
AT91C_SMC_NWAITM_NWAIT_DISABLE |
AT91C_SMC_DBW_WIDTH_EIGTH_BITS | AT91C_SM_TDF);
AT91F_PIOC_CfgPMC ();
// Configure Ready/Busy signal
AT91F_PIO_CfgInput(AT91C_BASE_PIOC, AT91C_PIO_PC13);
// Enable NandFlash
AT91F_PIO_CfgOutput(AT91C_BASE_PIOC, AT91C_PIO_PC14);
nand_dev_desc[0].ChipID = 0;
if(!nand_probe(AT91_SMARTMEDIA_BASE))
{
sprintf(message, "\n\r-E- No NandFlash detected !!!\n\r");
AT91F_DBGU_Printk(message);
}
if (nand_dev_desc[curr_device].bus_width_16bit)
AT91C_BASE_SMC->SMC_CTRL3 |= AT91C_SMC_DBW_WIDTH_SIXTEEN_BITS;
}
//*----------------------------------------------------------------------------
//* \fn AT91F_Test_NandFlash
//* \brief NandFlash test
//*----------------------------------------------------------------------------
void AT91F_Test_NandFlash (void)
{
size_t total, offset, len;
u_char TestBuffer[2*NANDFLASH_PAGESIZE], buffer[3*NANDFLASH_PAGESIZE];
unsigned int i;
AT91F_DBGU_Printk("\n\r-I- Step 8. Test EBI/NandFlash\n\r");
AT91F_NandFlash_Init();
len = 2*nand_dev_desc[curr_device].oobblock; // 0x800
offset = nand_dev_desc[curr_device].erasesize + len; // 0x20000 + 0x1000 = 0x21000 -> page 0x42 & 0x43
for (i=0; i<len; i++)
TestBuffer[i] = 0x00;
sprintf((char *)TestBuffer,"\n\rThis sentence is written in your device... Congratulations\n\r");
// Verify page is erased
nand_rw(nand_dev_desc + curr_device, NANDRW_READ, offset, len, &total, buffer);
for(i=0; i<len; i++)
{
if (buffer[i] != 0xFF)
{
// Erase Second Block
nand_erase(nand_dev_desc + curr_device, nand_dev_desc[curr_device].erasesize, nand_dev_desc[curr_device].erasesize, 0);
break;
}
}
// Write 3rd Page in the Second Block
if (nand_rw(nand_dev_desc + curr_device, NANDRW_WRITE, offset, len, &total, TestBuffer))
{
AT91F_DBGU_Printk("-E- Error writing page...\n\r");
return;
}
nand_rw(nand_dev_desc + curr_device, NANDRW_READ, offset, len, &total, buffer);
for(i=0; i<len; i++)
{
if (buffer[i] != TestBuffer[i])
{
AT91F_DBGU_Printk("-E- Error: page is not written correctly...\n\r");
return;
}
}
// Erase Second Block
nand_erase(nand_dev_desc + curr_device, nand_dev_desc[curr_device].erasesize, nand_dev_desc[curr_device].erasesize, 0);
// Verify page is erased
nand_rw(nand_dev_desc + curr_device, NANDRW_READ, offset, len, &total, buffer);
for(i=0; i<len; i++)
{
if (buffer[i] != 0xFF)
{
AT91F_DBGU_Printk("-E- Error: page is not erased correctly...\n\r");
return;
}
}
AT91F_DBGU_Printk("-I- Test OK\n\r");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -