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

📄 nand_flash.c.svn-base

📁 u-boot for S3c2443 processor
💻 SVN-BASE
字号:
/*  * cpu/arm920t/nand_flash.c: nand control function for booting from NAND * *  * Date : Dec. 30. 2008 * */#include <common.h>#if CONFIG_S3C2410#include <s3c2410.h>#elif CONFIG_S3C2440#include <s3c2440.h>#elif CONFIG_S3C2443#include <s3c2443.h>#endif#ifdef CONFIG_NAND_BOOT#include <linux/mtd/nand.h>#if CONFIG_MBA2410#include <configs/mba2410.h>#elif CONFIG_MBA2440#include <configs/mba2440.h>#elif CONFIG_SMDK2443#include <configs/smdk2443.h>#endif/*int NAND_badBlock(unsigned int block){	int i;	unsigned int blockPage = block * NAND_PAGES_IN_BLOCK;	u8 data;#if CONFIG_MBA2410	NFCONF &= ~(1<<11);#elif CONFIG_MBA2440	NFCONT &= ~(1<<1);#endif	NFCMD  = NAND_CMD_READOOB;	NFADDR  = 517 & 0Xf;	NFADDR  = blockPage & 0xff;	NFADDR  = (blockPage >> 8) & 0xff;	NFADDR  = (blockPage >> 16) & 0xff;	for(i=0;i<10;i++);#if CONFIG_S3C2410	while(!(NFSTAT & (1<<0)));	data = NFDATA;	NFCONF |= (1<<11);#elif CONFIG_S3C2440	while(!(NFSTAT & (1<<2)));	data = NFDATA8;	NFCONT |= (1<<1);#endif	if(data != 0xff)	return 1; //bad	else				return 0; //good}*/int read_NAND_page(unsigned int block, unsigned int page, unsigned char *buffer){	int i;	unsigned int blockPage = (block * NAND_PAGES_IN_BLOCK) + (page & 0x1f);	unsigned char * bufpt = buffer;#if CONFIG_S3C2410	NFCONF &= ~(1<<11);#elif  CONFIG_S3C2440 	NFCONT &= ~(1<<1);	NFSTAT |= (1<<2);#elif  CONFIG_S3C2443  	NFCONT &= ~(1<<1);	NFSTAT |= (1<<4);#endif	NFCMD   = NAND_CMD_READ0;	NFADDR = 0;	NFADDR = blockPage & 0xff;	NFADDR = (blockPage >> 8) & 0xff;	NFADDR = (blockPage >> 16) & 0xff;	        for(i=0;i<10;i++);#if CONFIG_S3C2410	while(!(NFSTAT & (1<<0)));	for(i=0; i<NAND_PAGE_SIZE; i++)	    *bufpt++ = NFDATA;	NFCONF |=  (1<<11);#elif CONFIG_S3C2440	while(!(NFSTAT & (1<<2)));	for(i=0; i<NAND_PAGE_SIZE; i++)     *bufpt++ = NFDATA8;	NFCONT |= (1<<1);#elif CONFIG_S3C2443	while(!(NFSTAT & (1<<4)));	for(i=0; i<NAND_PAGE_SIZE; i++)     *bufpt++ = NFDATA8;	NFCONT |= (1<<1);#endif	return 0;}int read_NAND(unsigned char *dst_addr, unsigned long src_addr, unsigned int size){	int i, j, k;	unsigned char * buffer = dst_addr;	unsigned int blk_num  = size / (unsigned int)NAND_BLOCK_SIZE;	unsigned int pg_num   = (size&(NAND_BLOCK_SIZE-1)) / (unsigned int)NAND_PAGE_SIZE;        #if (CONFIG_S3C2440 | CONFIG_S3C2443)        	*(volatile unsigned *)0x56000054 = 0x70;	//GPFDAT	#endif	for(i=0; i<=blk_num; i++){//		if(NAND_badBlock(i) == 1){//			blk_num++;//			continue;//		}		if((i == blk_num) && (pg_num != 0)){			for(j=0; j<=pg_num; j++){                read_NAND_page(i, j, buffer);                buffer += NAND_PAGE_SIZE;            }		}else{			for(j=0; j<NAND_PAGES_IN_BLOCK; j++){				read_NAND_page(i, j, buffer);                buffer += NAND_PAGE_SIZE;			}		}	}	return 0;}int copy_uboot_func(void){	NFCONF = 0xFFF0; /* Max TACLS, TWRPH0, TWRPH1 */ #if (CONFIG_S3C2440 |  CONFIG_S3C2443) 	NFCONT = 0x1;  /* NAND Flash Controller Enable  */#endif/* Copy uboot to ram. 256k is enough. */ 		read_NAND((unsigned char *)TEXT_BASE, 0x0, (16*NAND_BLOCK_SIZE));	return 0;}#endif //CONFIG_NAND_BOOT

⌨️ 快捷键说明

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