nand_read.c

来自「arm9的bootloader大家下载解压缩即可看到」· C语言 代码 · 共 66 行

C
66
字号
//#include "NAND.h"
#include "2410addr.h"
#include "def.h"
#define NF_CMD(cmd)	{rNFCMD=cmd;}
#define NF_ADDR(addr)	{rNFADDR=addr;}	
#define NF_nFCE_L()	{rNFCONF&=~(1<<11);}
#define NF_nFCE_H()	{rNFCONF|=(1<<11);}
#define NF_RSTECC()	{rNFCONF|=(1<<12);}
#define NF_RDDATA() 	(rNFDATA)
#define NF_WRDATA(data) {rNFDATA=data;}

#define NF_WAITRB()    {while(!(rNFSTAT&(1<<0)));} 
	    //wait tWB and check F_RNB pin.   

#define ID_K9S1208V0M	0xec76

#define NAND_SECTOR_SIZE	512
#define NAND_BLOCK_MASK		(NAND_SECTOR_SIZE - 1)
static void
wait_idle(void)
{
    int i;
	//volatile unsigned char *ptr = rNFCONF;

    while(!(rNFSTAT & (1<<0))) for(i=0; i<10; i++);
}

int nand_read_ll(unsigned char *buf, unsigned long start_addr,  int size)
{
    int  j,z;
    unsigned long i;

    if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {
       return -1;	/* invalid alignment */
    }

    /* chip Enable */
    rNFCONF &= ~0x800;
    for(i=0; i<10; i++);

    for(i=start_addr; i < (start_addr + size);) {
      /* READ0 */
      NF_CMD(0) ;

      /* Write Address */
      NF_ADDR ( i & 0xff);
      NF_ADDR ( (i >> 9) & 0xff);
      NF_ADDR ((i >> 17) & 0xff);
      NF_ADDR ((i >> 25) & 0xff);

      wait_idle();
      //NF_WAITRB();

      for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {
	*buf = (NF_RDDATA() & 0xff);
	
	buf++;
      }
    }

    /* chip Disable */
    rNFCONF |= 0x800;	/* chip disable */  
    
    return 0;
}

⌨️ 快捷键说明

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