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

📄 main.c

📁 对nand flash的读写
💻 C
字号:
/********************************************************************************************
*filename:			main.c						
*author:			ASIC system team,wuer
*create date:		2005-5-23 14:17                                                                      
*description:	    This file is used for nand burning only                                                              
*modify history:	                                                                      
*misc:           
********************************************************************************************/

#include "HA_typedef.h"
#include "hardware.h"
#include "hardware_reg.h" 
#include <stdio.h>
#include <string.h>
 

/* 宏READOUT_CHECK如果定义,表示在每次写入一页后都进行读出校验,反之则不进行 */
#define READOUT_CHECK


/************************************************/
#define		ERASENUM		0x57					/* 擦除的总块数,需要根据具体烧录内容大小计算得到 */

#define		PAGESINBLOCK	0x20					/* 一块中有32页 */
#define		BYTESINPAGE		0x200					/* 一页中有512字节 */
#define		ERASESIZE		PAGESINBLOCK*BYTESINPAGE/* 每次擦除的大小,根据flash资料得到,不可随意变动 */	

#define		SIZE1			0x1						/* 第1次烧录的文件大小,如果是bootloader则就为1(页) */
#define		SIZE2			0x1b00					/* 第2次烧录的文件(kernel code)大小,单位为页 */

U32	DataHead = 0x30000000;							/* 临时存放烧录内容的内存地址,用户可改变 */
U32	NandHead = 0x0;									/* 需要烧录的Nor Flash中的目标地址,如果是bootloader,肯定是0 */
U32	kernelHead = 0x2000;							/* 需要烧录kernel的Nor Flash中的目标地址,取决于用户需要和bootloader的内容 */

/*****************************************************/
void system_init(void);
void pmc_init(void);
void init_nand(void);
void int_serv_emi(void);
int nand_rd_page(U32 page, U32*buffer,  U32 do_read);
int nand_erase_block(U32 page);
/*****************************************************/


                
int main()
{
	U32 i = 0;
	U32 status = 0;
	U32 data = DataHead;
	U32 address = NandHead;
	
	system_init();
															/* GPIO PH5设置为 "1", Nand Flash写使能 */

/***** erase operation first ******/	
	for(i = 0; i < ERASENUM; i++)					
	{	                    
  		status = nand_erase_block( address >> 9 );			/* 擦除操作 */
  		if(status != YES) 
 		{
 			printf("Erase fail!!\n");
 			return NO;
 		}
  		address += ERASESIZE;								/* 每次擦除32页(1block = 32pages)*/																	  		
   	}	
	printf("Erase complished! \n");


	status = nand_rd_page((0 >> 9), (U32 *)0x30010000, 1);	/* 读出实验 */		
	
/***** test or burn bootleader ****/
	data = DataHead;
 	address = NandHead;
 	for(i = 0; i < SIZE1; i++ )								/* 如果是烧录bootloader。需要设置断点,load二进制文件*/
 	{
 		status = nand_rd_page((address >> 9), (U32 *)data, 0);
 		if(status != YES) 									/* 写入(SIZE1)页数据 */
 		{
 			printf("write bootloader fail!!\n");
 			return NO;
 		} 	
 		data += 512;
 		address += 512;										/* 每次写入数据量为1页(512bytes)*/		
 	}
 	printf("Write block1 complished!.\n");		


	status = nand_rd_page((0 >> 9), (U32 *)0x30010000, 1);	/* 读出实验 */
	
/***** burn kernel only ***********/						/* 需要再次设置断点,load OS kernel代码,然后继续执行*/		
 
	data = DataHead;
	address = kernelHead;
 	for(i = 0; i < SIZE2; i++ )
 	{
 		status = nand_rd_page((address >> 9), (U32 *)data, 0);
 		if(status != YES) 
 		{
 			printf("write kernel fail!!\n");
 			return 0;
 		}
 		data += 512;										/* 写完一页后,地址累加 */
 		address += 512;
 	}
 	printf("Write kernel complished!.\n");		

	status = nand_rd_page((0 >> 9), (U32 *)0x30010000, 1);	/* 读出实验 */
/******** end now *****************/			
	while(1);		
	return YES;
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -