?? flash.c
字號:
#include "flash.h"
extern void AT91F_DBGU_Printf(char *fmt,...);
extern void AT91F_DBGU_Printk(char *buffer);
//write data
void _WR(unsigned int addr,unsigned short data){
*((unsigned short *)(addr))=data;
}
//read data
unsigned short _RD(unsigned int addr){
return *((unsigned short *)(addr));
}
//read ID
unsigned short Strata_CheckID(unsigned int targetAddr)
{
_WR(targetAddr, 0x0090);
return _RD(targetAddr);
}
//read Device
unsigned short Strata_CheckDevice(unsigned int targetAddr)
{
_WR(targetAddr, 0x0090);
return _RD(targetAddr+0x2);
}
void _RESET(void)
{
_WR(0x0,0x00ff);
}
//clear all block lock,if ok return 1
unsigned char Strata_ClearLock(unsigned int targetAddr)
{
unsigned short ReadStatus;
unsigned short bSR5;
unsigned short bSR7;
_WR(targetAddr,0x0060);
_WR(targetAddr,0x00d0);
_WR(targetAddr, 0x0070);
ReadStatus=_RD(targetAddr);
bSR7=ReadStatus & (1<<7);
while(!bSR7)
{
_WR(targetAddr, 0x0070);
ReadStatus=_RD(targetAddr);
bSR7=ReadStatus & (1<<7);
}
_WR(targetAddr, 0x0070);
ReadStatus=_RD(targetAddr);
bSR5=ReadStatus & (1<<5);
if (bSR5!=0)
{
_WR(targetAddr, 0x0050); // Clear Status Register
return 0;
}
else return 1;
}
void Strata_EraseSector(unsigned int targetAddress)
{
unsigned short ReadStatus;
unsigned short bSR5; // Erase and Clear Lock-bits Status,
unsigned short bSR7; // Write State Machine Status,
Strata_ClearLock(targetAddress);//Clear all Block Lock
_WR(targetAddress, 0x0020); // Block Erase, First Bus Cycle, targetAddress is the address withint the block
_WR(targetAddress, 0x00d0); // Block Erase, Second Bus Cycle, targetAddress is the address withint the block
_WR(targetAddress, 0x0070); // Read Status Register, First Bus Cycle, targetAddress is any valid address within the device
ReadStatus=_RD(targetAddress); // Read Status Register, Second Bus Cycle, targetAddress is any valid address within the device
bSR7=ReadStatus & (1<<7);
while(!bSR7)
{
_WR(targetAddress, 0x0070);
ReadStatus=_RD(targetAddress);
bSR7=ReadStatus & (1<<7);
}
_WR(targetAddress, 0x0070); // When the block erase is complete, status register bit SR.5 should be checked.
// If a block erase error is detected, the status register should be cleared before
// system software attempts correct actions.
ReadStatus=_RD(targetAddress);
bSR5=ReadStatus & (1<<5); // lower 16-bit 8MB Strata
if (bSR5==0)
{
}
else
{
_WR(targetAddress, 0x0050); // Clear Status Register
}
_RESET(); // write 0xffh(_RESET()) after the last opoeration to reset the device to read array mode.
}
//High-Density Symmetrical 128-Kbyte Blocks
//128 Mbit (128 Blocks)
//64 Mbit (64 Blocks)
//32 Mbit (32 Blocks)
void Strata_EraseChip(void)
{
unsigned int targetAddress;
unsigned short tmp;
unsigned int block_size;
unsigned char block_number;
tmp=Strata_CheckDevice(AT91_FLASH_BASIC);
block_size=0x20000;
switch(tmp)
{
case 0x16:
block_number=32;
break;
case 0x17:
block_number=64;
break;
case 0x18:
block_number=128;
break;
default:
block_number=32;
break;
}
block_number=10;
AT91F_DBGU_Printk("Flash Erase\n\r");
for(targetAddress=0;targetAddress<(block_number*block_size);targetAddress +=block_size)
{
Strata_EraseSector(AT91_FLASH_BASIC+targetAddress);
AT91F_DBGU_Printf("Block_%d Erase O.K. \r",targetAddress/block_size+1);
}
}
//write flash
void Strata_ProgFlash(unsigned int realAddr,unsigned short data)
{
unsigned short *ptargetAddr;
unsigned short ReadStatus;
unsigned short bSR4; // Erase and Clear Lock-bits Status, lower 16bit, 8MB Intel Strate Flash ROM
unsigned short bSR7; // Write State Machine Status, lower 16bit, 8MB Intel Strate Flash ROM
ptargetAddr = (unsigned short *)realAddr;
_WR(realAddr, 0x0040); // realAddr is any valid adress within the device
// Word/Byte Program(or 0x00100010 can be used)
*ptargetAddr=data; // 32 bit data
_WR(realAddr, 0x0070); // Read Status Register
ReadStatus=_RD(realAddr); // realAddr is any valid address within the device
bSR7=ReadStatus & (1<<7);
while(!bSR7)
{
_WR(realAddr, 0x0070); // Read Status Register
ReadStatus=_RD(realAddr);
bSR7=ReadStatus & (1<<7);
}
_WR(realAddr, 0x0070);
ReadStatus=_RD(realAddr); // Real Status Register
bSR4=ReadStatus & (1<<4);
if (bSR4==0)
{
;
}
else
{
_WR(realAddr, 0x0050); // Clear Status Register
}
_RESET();
}
/*
void Strata_ChipProg(unsigned int ulRomAddr,unsigned int ulRamAddr,unsigned int ulRomSize)
{
unsigned short usData;
unsigned int i;
Strata_EraseChip();
AT91F_DBGU_Printk("\r\nFlash Promgram\n\r");
for(i=0;i<65536;i++);
for(ulRomAddr=AT91_FLASH_BASIC;ulRomAddr<(AT91_FLASH_BASIC+ulRomSize);ulRomAddr +=2)
{
usData=*(unsigned short *)ulRamAddr;
Strata_ProgFlash(ulRomAddr,usData);
ulRamAddr+=2;
AT91F_DBGU_Printf("Flash_%d Byte Write O.K. \r",(ulRomAddr-AT91_FLASH_BASIC));
}
}
*/
void Strata_ChipProg(unsigned int ulRomAddr,unsigned int ulRamAddr,unsigned int ulRomSize)
{
unsigned short usData;
unsigned int i;
Strata_EraseChip();
AT91F_DBGU_Printk("\r\nFlash Promgram\n\r");
for(i=0;i<65536;i++);
for(ulRomAddr=AT91_FLASH_BASIC;ulRomAddr<(AT91_FLASH_BASIC+ulRomSize);ulRomAddr +=2)
{
usData=*(unsigned short *)ulRamAddr;
Strata_ProgFlash(ulRomAddr,usData);
ulRamAddr+=2;
AT91F_DBGU_Printf("Flash_%d Byte Write O.K. \r",(ulRomAddr-AT91_FLASH_BASIC));
}
ulRomAddr=0x10010000;
ulRamAddr=0x20000000;
ulRomSize=0xffff;
AT91F_DBGU_Printk("\r\nFlash Promgram\n\r");
for(i=0;i<65536;i++);
for(;ulRomAddr<(0x10010000+ulRomSize);ulRomAddr +=2)
{
usData=*(unsigned short *)ulRamAddr;
Strata_ProgFlash(ulRomAddr,usData);
ulRamAddr+=2;
AT91F_DBGU_Printf("Flash_%d Byte Write O.K. \r",(ulRomAddr-AT91_FLASH_BASIC));
}
}
void Strata_Flash_Test()
{
unsigned short tmp;
AT91F_DBGU_Printk("***************Flash Test**************\n\r");
tmp=Strata_CheckID(AT91_FLASH_BASIC);
AT91F_DBGU_Printf("Flash ID is %x\n\r",(unsigned char)tmp);
tmp=Strata_CheckDevice(AT91_FLASH_BASIC);
AT91F_DBGU_Printf("Flash Device is %x\n\r",(unsigned char)tmp);
//Strata_ChipProg(AT91_FLASH_BASIC,0x20000000,0xffff);
AT91F_DBGU_Printk("\n\r************Flash Test completed**************\n\r");
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -