📄 flash_mtd.amd.c
字号:
#if defined(MT6205B)
if( kal_query_systemInit() || INT_QueryExceptionStatus() )
{
while(!CheckReadyAndResume_AMD((kal_uint32)Address, (kal_uint16)Cell));
}
else
{
while(!CheckReadyAndResume_AMD((kal_uint32)Address, (kal_uint16)Cell))
{
savedMask = CHECK_PENDING_IRQ(savedMask, (kal_uint32)Address);
}
}
CHECK_LOG_STOP(sla_id[5])
RestoreIRQMask(savedMask);
#else /* !MT6205B */
RestoreIRQMask(savedMask);
while(!CheckReadyAndResume_AMD((kal_uint32)Address, (kal_uint16)Cell));
CHECK_LOG_STOP(sla_id[5])
#endif /* MT6205B */
#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);
#elif defined(__SINGLE_BANK_NOR_FLASH_SUPPORT__)
NOR_FLASH_BUSY = KAL_TRUE;
#if defined(MT6205B)
if( kal_query_systemInit() || INT_QueryExceptionStatus() )
{
while(!CheckReadyAndResume_AMD((kal_uint32)Address, (kal_uint16)Cell));
}
else
{
while(!CheckReadyAndResume_AMD((kal_uint32)Address, (kal_uint16)Cell))
{
savedMask = CHECK_PENDING_IRQ(savedMask, (kal_uint32)Address);
}
}
CHECK_LOG_STOP(sla_id[5])
RestoreIRQMask(savedMask);
#else /* !MT6205B */
RestoreIRQMask(savedMask);
while(!CheckReadyAndResume_AMD((kal_uint32)Address, (kal_uint16)Cell));
CHECK_LOG_STOP(sla_id[5])
#endif /* MT6205B */
#else
RestoreIRQMask(savedMask);
WaitReady_AMD((kal_uint32)&fp[i], (kal_uint16)Cell);
#endif
} /* end of for loop */
#else //__PAGE_BUFFER_PROGRAM__
FLASH_CELL prog_buffer[BUFFER_PROGRAM_ITERATION_LENGTH];
Words = (Length/sizeof(FLASH_CELL));
b = (kal_uint8 *)prog_buffer;
j = 0;
#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))) )
{
for(i = 0; i < ProgramWords*sizeof(FLASH_CELL); i++)
{
b[i] = bdp[j++];
}
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] = prog_buffer[i];
}
#ifdef _LOW_COST_SINGLE_BANK_FLASH_
WaitReady_AMD((kal_uint32)&fp[ProgramWords -1], (kal_uint16)prog_buffer[ProgramWords-1]);
RestoreIRQMask(savedMask);
#elif defined(__SINGLE_BANK_NOR_FLASH_SUPPORT__)
NOR_FLASH_BUSY = KAL_TRUE;
#if defined(MT6205B)
if( kal_query_systemInit() || INT_QueryExceptionStatus() )
{
while(!CheckReadyAndResume_AMD((kal_uint32)&fp[ProgramWords -1], (kal_uint16)prog_buffer[ProgramWords-1]));
}
else
{
while(!CheckReadyAndResume_AMD((kal_uint32)&fp[ProgramWords -1], (kal_uint16)prog_buffer[ProgramWords-1]))
{
savedMask = CHECK_PENDING_IRQ(savedMask, (kal_uint32)&fp[ProgramWords -1]);
}
}
CHECK_LOG_STOP(sla_id[8])
RestoreIRQMask(savedMask);
#else /* !MT6205B */
RestoreIRQMask(savedMask);
while(!CheckReadyAndResume_AMD((kal_uint32)&fp[ProgramWords -1], (kal_uint16)prog_buffer[ProgramWords-1]));
CHECK_LOG_STOP(sla_id[8])
#endif /* MT6205B */
#else
RestoreIRQMask(savedMask);
WaitReady_AMD((kal_uint32)&fp[ProgramWords -1], (kal_uint16)prog_buffer[ProgramWords-1]);
#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);
#elif defined(__SINGLE_BANK_NOR_FLASH_SUPPORT__)
NOR_FLASH_BUSY = KAL_TRUE;
#if defined(MT6205B)
if( kal_query_systemInit() || INT_QueryExceptionStatus() )
{
while(!CheckReadyAndResume_AMD((kal_uint32)&fp[0], (kal_uint16)Cell));
}
else
{
while(!CheckReadyAndResume_AMD((kal_uint32)&fp[0], (kal_uint16)Cell))
{
savedMask = CHECK_PENDING_IRQ(savedMask, (kal_uint32)&fp[0]);
}
}
CHECK_LOG_STOP(sla_id[5])
RestoreIRQMask(savedMask);
#else /* !MT6205B */
RestoreIRQMask(savedMask);
while(!CheckReadyAndResume_AMD((kal_uint32)&fp[0], (kal_uint16)Cell));
CHECK_LOG_STOP(sla_id[5])
#endif /* MT6205B */
#else
RestoreIRQMask(savedMask);
WaitReady_AMD((kal_uint32)&fp[0], (kal_uint16)Cell);
#endif
Words -= 1;
fp += 1;
}
#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);
#elif defined(__SINGLE_BANK_NOR_FLASH_SUPPORT__)
NOR_FLASH_BUSY = KAL_TRUE;
#if defined(MT6205B)
if( kal_query_systemInit() || INT_QueryExceptionStatus() )
{
while(!CheckReadyAndResume_AMD((kal_uint32)&fp[ProgramWords -1], (kal_uint16)dp[ProgramWords -1]));
}
else
{
while(!CheckReadyAndResume_AMD((kal_uint32)&fp[ProgramWords -1], (kal_uint16)dp[ProgramWords -1]))
{
savedMask = CHECK_PENDING_IRQ(savedMask, (kal_uint32)&fp[ProgramWords -1]);
}
}
CHECK_LOG_STOP(sla_id[10])
RestoreIRQMask(savedMask);
#else /*!MT6205B*/
RestoreIRQMask(savedMask);
while(!CheckReadyAndResume_AMD((kal_uint32)&fp[ProgramWords -1], (kal_uint16)dp[ProgramWords -1]));
CHECK_LOG_STOP(sla_id[10])
#endif /*MT6205B*/
#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);
#elif defined(__SINGLE_BANK_NOR_FLASH_SUPPORT__)
NOR_FLASH_BUSY = KAL_TRUE;
#if defined(MT6205B)
if( kal_query_systemInit() || INT_QueryExceptionStatus() )
{
while(!CheckReadyAndResume_AMD((kal_uint32)&fp[0], (kal_uint16)dp[0]));
}
else
{
while(!CheckReadyAndResume_AMD((kal_uint32)&fp[0], (kal_uint16)dp[0]))
{
savedMask = CHECK_PENDING_IRQ(savedMask, (kal_uint32)&fp[0]);
}
}
CHECK_LOG_STOP(sla_id[10])
RestoreIRQMask(savedMask);
#else /*!MT6205B*/
RestoreIRQMask(savedMask);
while(!CheckReadyAndResume_AMD((kal_uint32)&fp[0], (kal_uint16)dp[0]));
CHECK_LOG_STOP(sla_id[10])
#endif /*MT6205B*/
#else
RestoreIRQMask(savedMask);
WaitReady_AMD((kal_uint32)&fp[0], (kal_uint16)dp[0]);
#endif
Words -= 1;
fp += 1;
dp += 1;
}
//#else
// ASSERT(0);
#endif
}//while(Words > 0 )
#endif //__PAGE_BUFFER_PROGRAM__
}
}
break;
}
return FS_NO_ERROR;
}
//#else //(defined(__TOSHIBA_TV__) || defined(__TOSHIBA_TY__))
/*-----------------------------------*/
//#if (defined(__TOSHIBA_TV__) || defined(__TOSHIBA_TY__))
static int ProgramData_TOSHIBA_TV_NOPBP(void * DriveData, void * Address, void * Data, kal_uint32 Length)
{
kal_uint32 savedMask;
#ifndef __NOR_FDM5__
NOR_Flash_MTD_Data * D = DriveData;
volatile FLASH_CELL *bp = (volatile FLASH_CELL *) (D->CurrAddr);
ASSERT((~D->Signature == (kal_uint32)D->RegionInfo));
#else
NOR_MTD_DATA *D= DriveData;
NORLayoutInfo * Layout = D->LayoutInfo;
volatile FLASH_CELL *bp = (volatile FLASH_CELL *)((kal_uint32)Address&(~((Layout->BlkSize-1))));
ASSERT(D->Signature == ~((kal_uint32)D->LayoutInfo));
#endif
#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
savedMask = SaveAndSetIRQMask();
bp[ADDR_UNLOCK_1] = CMD_UNLOCK_1;
bp[ADDR_UNLOCK_2] = CMD_UNLOCK_2;
bp[ADDR_UNLOCK_1] = CMD_PROG;
((volatile FLASH_CELL*)Address)[0] = ((FLASH_CELL*)Data)[0];
#ifdef _LOW_COST_SINGLE_BANK_FLASH_
WaitReady_AMD((kal_uint32)Address, *(kal_uint16*)Data);
RestoreIRQMask(savedMask);
#elif defined(__SINGLE_BANK_NOR_FLASH_SUPPORT__)
NOR_FLASH_BUSY = KAL_TRUE;
#if defined(MT6205B)
if( kal_query_systemInit() || INT_QueryExceptionStatus() )
{
while(!CheckReadyAndResume_AMD((kal_uint32)Address, *(kal_uint16*)Data));
}
else
{
while(!CheckReadyAndResume_AMD((kal_uint32)Address, *(kal_uint16*)Data))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -