📄 flashu.c
字号:
#include<stdio.h>
/*global change para */
#define FLASH_BASE_ADDR 0x90000000 /*Flash address is start */
#define FLASH_ORDER 4 /*1:address at 8-Bit mode;2:address at 16-Bit mode; 4: address at 32-Bit mode*/
#define FLASH_CMD_ADDRESS_1 0x5555
#define FLASH_CMD_ADDRESS_2 0x2aaa
#define FLASH_CMD_1 *(volatile unsigned char *)(FLASH_BASE_ADDR+FLASH_CMD_ADDRESS_1*FLASH_ORDER)
#define FLASH_CMD_2 *(volatile unsigned char *)(FLASH_BASE_ADDR+FLASH_CMD_ADDRESS_2*FLASH_ORDER)
#define EMIF_GCTL 0x01800000
#define EMIF_CE1 0x01800004
#define EMIF_CE0 0x01800008
#define EMIF_CE2 0x01800010
#define EMIF_CE3 0x01800014
#define EMIF_SDRAMCTL 0x01800018
#define EMIF_SDRAMTIM 0x0180001C
#define EMIF_SDRAMEXT 0x01800020
#define EMIF_CCFG 0x01840000;
unsigned char ReadID(void);
void WriteByte(unsigned int ,unsigned char );
void Writeword(unsigned int ,unsigned short );
void EraseChip(void);
void WriteIsOver(void);
void init_emif( void );
main()
{
unsigned short j=0;
int i=0;
init_emif();
j=*(unsigned short *)(0x90000000);
j=*(unsigned short *)(0x90000000+4);
i= ReadID();
EraseChip();
*(unsigned char *)0xb020003c=0;//turn off
for(i=0;i<0x2d000;i++,i++)
{
j=*(unsigned short *) i;
Writeword(0x90000000+i*2,j);
}
*(unsigned char *)0xb020003c=7;//turn on
/* printf("Flash chip ID is %d\n",i);
printf("what are you doing?\n1:Erase\n2:program only\n3:erase and reprogram\n");
scanf("%d",&done);
switch( done )
{
case 1:
EraseChip();
puts("Erase is OK\n");
break;
case 2:
puts("Program is OK\n");
break;
case 3:
EraseChip();
puts("Erase and reprogram is OK\n");
break;
}*/
}
unsigned char ReadID(void)
{
unsigned char flash_state;
FLASH_CMD_1=0xaa;
FLASH_CMD_2=0x55;
FLASH_CMD_1=0x90;
flash_state =*(volatile unsigned char *)(FLASH_BASE_ADDR);
FLASH_CMD_1=0xf0;
return flash_state;
}
void EraseChip(void)
{
FLASH_CMD_1 = 0xaa;
FLASH_CMD_2 = 0x55;
FLASH_CMD_1 = 0x80;
FLASH_CMD_1 = 0xaa;
FLASH_CMD_2 = 0x55;
FLASH_CMD_1 = 0x10;
WriteIsOver();
}
void WriteIsOver(void)
{
unsigned int i;
unsigned char LastToggleBit,CurrentToggleBit;
LastToggleBit = (*(volatile unsigned char*)FLASH_BASE_ADDR) & 0x40;
CurrentToggleBit = (*(volatile unsigned char*)FLASH_BASE_ADDR) & 0x40;
for(i = 0; ; i++)
{
LastToggleBit = CurrentToggleBit;
CurrentToggleBit = (*(volatile unsigned char*)FLASH_BASE_ADDR) & 0x40;
if(LastToggleBit == CurrentToggleBit) break;
}
}
void init_emif( void )
{
*(int *)EMIF_GCTL = 0x00000078;
*(int *)EMIF_CE0 = 0xffffbf23; /* CE0 SDRAM */
*(int *)EMIF_CE1 = 0xffffff23; /* CE1 Flash 8-bit */
*(int *)EMIF_CE2 = 0xffffff23; /* CE2 Daughtercard 32-bit async */
*(int *)EMIF_CE3 = 0xffffff23; /* CE3 Daughtercard 32-bit async */
*(int *)EMIF_SDRAMCTL = 0x53115000; /* SDRAM control */
*(int *)EMIF_SDRAMTIM = 0x00000578; /* SDRAM timing (refresh) */
*(int *)EMIF_SDRAMEXT = 0x000a8529; /* SDRAM Extension register */
}
void Writeword(unsigned int Addr,unsigned short Val)
{
unsigned short k;
/*
*(volatile unsigned char*)(FlashMap1BaseAddr + 0x555*2) = 0xaa;
*(volatile unsigned char*)(FlashMap1BaseAddr + 0x2aa*2) = 0x55;
*(volatile unsigned char*)(FlashMap1BaseAddr + 0x555*2) = 0xa0;
*(volatile unsigned char*)(FlashMap1BaseAddr + Addr) = Val;
*/
FLASH_CMD_1=0xaa;
FLASH_CMD_2=0x55;
FLASH_CMD_1=0xa0;
*(int *)Addr=Val;
WriteIsOver();
k=*(int *)Addr;
while(k!=Val)
{ FLASH_CMD_1=0xaa;
FLASH_CMD_2=0x55;
FLASH_CMD_1=0xa0;
*(int *)Addr=Val;
}
}
void WriteByte(unsigned int Addr,unsigned char Val)
{
/*
*(volatile unsigned char*)(FlashMap1BaseAddr + 0x555*2) = 0xaa;
*(volatile unsigned char*)(FlashMap1BaseAddr + 0x2aa*2) = 0x55;
*(volatile unsigned char*)(FlashMap1BaseAddr + 0x555*2) = 0xa0;
*(volatile unsigned char*)(FlashMap1BaseAddr + Addr) = Val;
*/
FLASH_CMD_1=0xaa;
FLASH_CMD_2=0x55;
FLASH_CMD_1=0xa0;
*(int *)Addr=Val;
WriteIsOver();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -