📄 flash_mtd.amd.c
字号:
#else
RestoreIRQMask(savedMask);
WaitReady_AMD((kal_uint32)Address, *(kal_uint16*)Data);
#endif
break;
case 1:
{
volatile FLASH_CELL *fp;
kal_uint32 ofs = ((kal_uint32) Address) & (sizeof(FLASH_CELL)-1);
FLASH_CELL Cell;
kal_uint8 *b = (kal_uint8*) &Cell;
fp = (void*) (((kal_uint32) Address) & ~(sizeof(FLASH_CELL)-1)); // round it down
Cell = fp[0];
b[ofs] = ((kal_uint8*)Data)[0];
#ifdef DEBUG
//Attempt to set bits in flash!
ASSERT(!((~fp[0]) & Cell))
#endif
savedMask = SaveAndSetIRQMask();
bp[ADDR_UNLOCK_1] = CMD_UNLOCK_1;
bp[ADDR_UNLOCK_2] = CMD_UNLOCK_2;
bp[ADDR_UNLOCK_1] = CMD_PROG;
fp[0] = Cell;
#ifdef _LOW_COST_SINGLE_BANK_FLASH_
WaitReady_AMD((kal_uint32)fp, (kal_uint16)Cell);
RestoreIRQMask(savedMask);
#else
RestoreIRQMask(savedMask);
WaitReady_AMD((kal_uint32)fp, (kal_uint16)Cell);
#endif
}
break;
default:
#ifdef DEBUG
//Misaligned write into flash
ASSERT(!(((kal_uint32)Address) % sizeof(FLASH_CELL)));
//Misaligned length write into flash
ASSERT(!(Length % sizeof(FLASH_CELL)));
#endif
#ifdef DEBUG
{
kal_uint32 i;
volatile FLASH_CELL *fp = (void*) Address;
FLASH_CELL * V = Data;
for (i=0; i<Length/sizeof(FLASH_CELL); i++)
ASSERT(!((~fp[i]) & V[i]));//Attempt to set bits in flash!
}
#endif
{
kal_uint32 i, j=0;
#ifdef __PAGE_BUFFER_PROGRAM__
kal_uint32 Words;
kal_uint32 ProgramWords;
#endif
volatile FLASH_CELL *fp;
fp = (volatile FLASH_CELL *)Address;
if((((kal_uint32)Data) % sizeof(FLASH_CELL)))
{
kal_uint8 *bdp = (kal_uint8*)Data;
FLASH_CELL Cell;
kal_uint8 *b = (kal_uint8*)&Cell;
#ifndef __PAGE_BUFFER_PROGRAM__
for(i = 0; i < Length/sizeof(FLASH_CELL); i++)
{
b[0] = bdp[j++];
b[1] = bdp[j++];
savedMask = SaveAndSetIRQMask();
bp[ADDR_UNLOCK_1] = CMD_UNLOCK_1;
bp[ADDR_UNLOCK_2] = CMD_UNLOCK_2;
bp[ADDR_UNLOCK_1] = CMD_PROG;
fp[i] = Cell;
#ifdef _LOW_COST_SINGLE_BANK_FLASH_
WaitReady_AMD((kal_uint32)&fp[i], (kal_uint16)Cell);
RestoreIRQMask(savedMask);
#else
RestoreIRQMask(savedMask);
WaitReady_AMD((kal_uint32)&fp[i], (kal_uint16)Cell);
#endif
}
#else //__PAGE_BUFFER_PROGRAM__
Words = (Length/sizeof(FLASH_CELL));
#ifdef __TOSHIBA_TV__
ProgramWords = 8; //TOSHIBA_TV only support 8 word auto page program
#endif
while(Words > 0 )
{
#ifdef __TOSHIBA_TV__
if ((Words >= 8) && (!((kal_uint32)fp & (8*sizeof(FLASH_CELL)-1))) )
{
savedMask = SaveAndSetIRQMask();
bp[ADDR_UNLOCK_1] = CMD_UNLOCK_1;
bp[ADDR_UNLOCK_2] = CMD_UNLOCK_2;
bp[ADDR_UNLOCK_1] = 0xE6;
for(i = 0; i < ProgramWords; i++)
{
b[0] = bdp[j++];
b[1] = bdp[j++];
fp[i] = Cell;
}
#ifdef _LOW_COST_SINGLE_BANK_FLASH_
WaitReady_AMD((kal_uint32)&fp[ProgramWords -1], (kal_uint16)Cell);
RestoreIRQMask(savedMask);
#else
RestoreIRQMask(savedMask);
WaitReady_AMD((kal_uint32)&fp[ProgramWords -1], (kal_uint16)Cell);
#endif
Words -= ProgramWords;
fp += ProgramWords;
}
else
{
b[0] = bdp[j++];
b[1] = bdp[j++];
savedMask = SaveAndSetIRQMask();
bp[ADDR_UNLOCK_1] = CMD_UNLOCK_1;
bp[ADDR_UNLOCK_2] = CMD_UNLOCK_2;
bp[ADDR_UNLOCK_1] = CMD_PROG;
fp[0] = Cell;
#ifdef _LOW_COST_SINGLE_BANK_FLASH_
WaitReady_AMD((kal_uint32)&fp[0], (kal_uint16)Cell);
RestoreIRQMask(savedMask);
#else
RestoreIRQMask(savedMask);
WaitReady_AMD((kal_uint32)&fp[0], (kal_uint16)Cell);
#endif
Words -= 1;
fp += 1;
}
#elif defined __TOSHIBA_TY__
{
kal_uint16 PageProgramCommand;
if (Words >= 32)
{
ProgramWords = 32;
PageProgramCommand = 0xE8;
}
else if (Words >= 16)
{
ProgramWords = 16;
PageProgramCommand = 0xE7;
}
else if (Words >= 8)
{
ProgramWords = 8;
PageProgramCommand = 0xE6;
}
else if (Words >= 4)
{
ProgramWords = 4;
PageProgramCommand = 0xE5;
}
else
{
ProgramWords = 1;
PageProgramCommand = CMD_PROG;
}
savedMask = SaveAndSetIRQMask();
bp[ADDR_UNLOCK_1] = CMD_UNLOCK_1;
bp[ADDR_UNLOCK_2] = CMD_UNLOCK_2;
bp[ADDR_UNLOCK_1] = PageProgramCommand;
for(i = 0; i < ProgramWords; i++)
{
b[0] = bdp[j++];
b[1] = bdp[j++];
fp[i] = Cell;
}
#ifdef _LOW_COST_SINGLE_BANK_FLASH_
WaitReady_AMD((kal_uint32)&fp[ProgramWords -1], (kal_uint16)Cell);
RestoreIRQMask(savedMask);
#else
RestoreIRQMask(savedMask);
WaitReady_AMD((kal_uint32)&fp[ProgramWords -1], (kal_uint16)Cell);
#endif
Words -= ProgramWords;
fp += ProgramWords;
}
#else
ASSERT(0);
#endif
}//while(Words > 0 )
#endif //__PAGE_BUFFER_PROGRAM__
}
else
{
FLASH_CELL *dp = (FLASH_CELL*)Data;
#ifndef __PAGE_BUFFER_PROGRAM__
for(i = 0; i < Length/sizeof(FLASH_CELL); i++)
{
savedMask = SaveAndSetIRQMask();
bp[ADDR_UNLOCK_1] = CMD_UNLOCK_1;
bp[ADDR_UNLOCK_2] = CMD_UNLOCK_2;
bp[ADDR_UNLOCK_1] = CMD_PROG;
fp[i] = dp[i];
#ifdef _LOW_COST_SINGLE_BANK_FLASH_
WaitReady_AMD((kal_uint32)&fp[i], (kal_uint16)dp[i]);
RestoreIRQMask(savedMask);
#else
RestoreIRQMask(savedMask);
WaitReady_AMD((kal_uint32)&fp[i], (kal_uint16)dp[i]);
#endif
}
#else //__PAGE_BUFFER_PROGRAM__
Words = (Length/sizeof(FLASH_CELL));
#ifdef __TOSHIBA_TV__
ProgramWords = 8;
#endif
while(Words > 0 )
{
#ifdef __TOSHIBA_TV__
if ((Words >= 8) && (!((kal_uint32)fp & (8*sizeof(FLASH_CELL)-1))) )
{
savedMask = SaveAndSetIRQMask();
bp[ADDR_UNLOCK_1] = CMD_UNLOCK_1;
bp[ADDR_UNLOCK_2] = CMD_UNLOCK_2;
bp[ADDR_UNLOCK_1] = 0xE6;
for(i = 0; i < ProgramWords; i++)
{
fp[i] = dp[i];
}
#ifdef _LOW_COST_SINGLE_BANK_FLASH_
WaitReady_AMD((kal_uint32)&fp[ProgramWords -1], (kal_uint16)dp[ProgramWords -1]);
RestoreIRQMask(savedMask);
#else
RestoreIRQMask(savedMask);
WaitReady_AMD((kal_uint32)&fp[ProgramWords -1], (kal_uint16)dp[ProgramWords -1]);
#endif
Words -= ProgramWords;
fp += ProgramWords;
dp += ProgramWords;
}
else
{
savedMask = SaveAndSetIRQMask();
bp[ADDR_UNLOCK_1] = CMD_UNLOCK_1;
bp[ADDR_UNLOCK_2] = CMD_UNLOCK_2;
bp[ADDR_UNLOCK_1] = CMD_PROG;
fp[0] = dp[0];
#ifdef _LOW_COST_SINGLE_BANK_FLASH_
WaitReady_AMD((kal_uint32)&fp[0], (kal_uint16)dp[0]);
RestoreIRQMask(savedMask);
#else
RestoreIRQMask(savedMask);
WaitReady_AMD((kal_uint32)&fp[0], (kal_uint16)dp[0]);
#endif
Words -= 1;
fp += 1;
dp += 1;
}
#elif defined __TOSHIBA_TY__
{
kal_uint16 PageProgramCommand;
if (Words >= 32)
{
ProgramWords = 32;
PageProgramCommand = 0xE8;
}
else if (Words >= 16)
{
ProgramWords = 16;
PageProgramCommand = 0xE7;
}
else if (Words >= 8)
{
ProgramWords = 8;
PageProgramCommand = 0xE6;
}
else if (Words >= 4)
{
ProgramWords = 4;
PageProgramCommand = 0xE5;
}
else
{
ProgramWords = 1;
PageProgramCommand = CMD_PROG;
}
savedMask = SaveAndSetIRQMask();
bp[ADDR_UNLOCK_1] = CMD_UNLOCK_1;
bp[ADDR_UNLOCK_2] = CMD_UNLOCK_2;
bp[ADDR_UNLOCK_1] = PageProgramCommand;
for(i = 0; i < ProgramWords; i++)
{
fp[i] = dp[i];
}
#ifdef _LOW_COST_SINGLE_BANK_FLASH_
WaitReady_AMD((kal_uint32)&fp[ProgramWords -1], (kal_uint16)dp[ProgramWords -1]);
RestoreIRQMask(savedMask);
#else
RestoreIRQMask(savedMask);
WaitReady_AMD((kal_uint32)&fp[ProgramWords -1], (kal_uint16)dp[ProgramWords -1]);
#endif
Words -= ProgramWords;
fp += ProgramWords;
dp += ProgramWords;
}
#else
ASSERT(0);
#endif
}//while(Words > 0 )
#endif //__PAGE_BUFFER_PROGRAM__
}
}
break;
}
return FS_NO_ERROR;
}
#else //(defined(__TOSHIBA_TV__) || defined(__TOSHIBA_TY__))
static int ProgramData_AMD(void * DriveData, void * Address, void * Data, kal_uint32 Length)
{
NOR_Flash_MTD_Data *D = DriveData;
volatile FLASH_CELL *bp = (volatile FLASH_CELL *) D->CurrAddr;
kal_uint32 savedMask;
ASSERT((~D->Signature == (kal_uint32)D->RegionInfo));
#ifdef DEBUG
//can't write zero bytes into flash
ASSERT(Length != 0);
#endif
switch (Length)
{
case sizeof(FLASH_CELL):
#if defined(DEBUG)
//Misaligned write into flash
ASSERT(!(((kal_uint32)Address) % sizeof(FLASH_CELL)));
#endif
#ifdef DEBUG
//Attempt to set bits in flash!
ASSERT(!(~((volatile FLASH_CELL*)Address)[0] & ((FLASH_CELL*)Data)[0]));
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -