?? nandflash.c
字號:
#include <stdio.h>
#define GPIOBASE 0xff004000#define GPOUTR (GPIOBASE+0)#define GPOER (GPIOBASE+4)#define GPINR (GPIOBASE+8)#define GPISR (GPIOBASE+12)#define GPIT1R (GPIOBASE+16)#define GPIT2R (GPIOBASE+20)#define GPCLKR (GPIOBASE+24)#define CE 12
#define CLE 5
#define ALE 1
#define FC_CMD {*(unsigned long *)GPOUTR|=(1<<CLE);*(unsigned long *)GPOUTR&=~((1<<ALE)|(1<<CE));}
#define FC_ADDR {*(unsigned long *)GPOUTR|=(1<<ALE);*(unsigned long *)GPOUTR&=~((1<<CLE)|(1<<CE));}
#define FC_DATA {*(unsigned long *)GPOUTR&=~((1<<CLE)|(1<<CE)|(1<<ALE));}
#define FC_INACTIVE {*(unsigned long *)GPOUTR|=(1<<CE);*(unsigned long *)GPOUTR&=~((1<<ALE)|(1<<CLE));}
#define NAND_BASE (*(unsigned char *)0xE4000000)
static void Flash_Reset(void ) //flash reset
{
int i;
FC_CMD;
NAND_BASE = 0xff; //reset command
for (i=0;i<300;i++); //delay
}
static unsigned short CheckFlash(void)
{
int i;
unsigned int id;
Flash_Reset();
FC_CMD;
NAND_BASE = 0x90;
for(i=0;i<10;i++);
FC_ADDR;
NAND_BASE = 0;
for(i=0;i<10;i++);
FC_DATA;
for(i=0;i<10;i++); //wait 100ns
id = NAND_BASE<<8;
id += NAND_BASE;
FC_INACTIVE;
return id;
}
static void InitChipSelect(void)
{
unsigned long *cs4;
cs4=(unsigned long *)0xff00d010; //Nand flash chip select
*cs4=0xbfff3c43; //8位 INTEL t1-t5最大
// *cs4=0x98513c43; //8位 INTEL t1-t5=1
//設置CE/CLE/ALE作為輸出
*(unsigned long *)GPOER&=~((1<<CLE)|(1<<CE)|(1<<ALE));
FC_INACTIVE;
}
int main(void)
{
printf("Test Nand flash build %s %s\n", __DATE__,__TIME__);
InitChipSelect();
printf("CS4 = 0x%x GPOER=0x%x\n",*(unsigned long *)0xff00d010,*(unsigned long *)GPOER);
printf("Check Flash 0x%x\n",CheckFlash());
//*(unsigned long *)GPOUTR|=((1<<ALE)|(1<<CLE));
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -