⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nandflash.c

📁 关于测试at91sam9260的各种驱动和功能的测试源代码。
💻 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 + -