📄 nand_flash.c.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 + -