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

📄 k9s1208.c

📁 U-BOOT的前面的程序,后面还要加上去
💻 C
字号:
#include <string.h>
#include "def.h"
#include "option.h"
#include "2410addr.h"

#define TOTAL_READ_BLOCKS  10  //num of blocks removed to sdram
#define	K9F5608_IN_USE
#define DOWNLOAD_ADDR_START 0x30000000

#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.   

// HCLK=100Mhz
#define TACLS		0  //1clk(0ns) 
#define TWRPH0		3  //3clk(25ns)
#define TWRPH1		0  //1clk(10ns)  //TACLS+TWRPH0+TWRPH1>=50ns

void NF_ReadPage(void);
void NF_Init(void);
void NF_Reset(void);
static volatile U8 *Sdram_Pointer;
static U32 block,page;

//******************************************************************

void K9S1208_LoadImage(void)
{
    NF_Init();
    Sdram_Pointer = (volatile U8 *)DOWNLOAD_ADDR_START;

	for(block=1; block<1+TOTAL_READ_BLOCKS; block++)
		for(page=0; page<32; page++)
			NF_ReadPage();
}




void NF_ReadPage(void)
{
    int i;
    U32 blockPage;
    U8 ecc0,ecc1,ecc2;
    U8 se[16];	   
    
    blockPage=(block<<5) + (page & 0x1f);
    
    NF_RSTECC();    // Initialize ECC
    NF_nFCE_L();	// Chip enable
        
    NF_CMD(0x00);   // Read command
    NF_ADDR(0);	    // Column = 0
    NF_ADDR(blockPage&0xff);	    //
    NF_ADDR((blockPage>>8)&0xff);   // Block & Page num.
    #ifndef  K9F5608_IN_USE
	    NF_ADDR((blockPage>>16)&0xff);  //for k9f5608, only three adress step needed
	#endif

    for(i=0;i<10;i++); //wait tWB(100ns)
    
    NF_WAITRB();    // Wait tR(max 12us)
    for(i=0;i<512;i++)
    {
    	*Sdram_Pointer++=NF_RDDATA();	// Read one page
    }
    ecc0=rNFECC0;
    ecc1=rNFECC1;
    ecc2=rNFECC2;
    for(i=0;i<16;i++)
    {
    	se[i]=NF_RDDATA();	// Read spare array
    }
    
    NF_nFCE_H();    
}

void NF_Reset(void)
{
    int i;   
    
    NF_nFCE_L();

    NF_CMD(0xFF);	//reset command

    for(i=0;i<10;i++);  //tWB = 100ns. //??????

    NF_WAITRB();      //wait 200~500us;
     
    NF_nFCE_H();
}



void NF_Init(void)
{
    rNFCONF=(1<<15)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0);	
			// 1       1      1        xxx,      r xxx,      r xxx        
		    // En    ECCR   nFCE=H    tACLS      tWRPH0      tWRPH1    
    NF_Reset();
}

⌨️ 快捷键说明

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