📄 flashloader.c
字号:
{
Data1 = Data2; /* Store current value */
Data2 = *EraseAddr32 & M29W800T_DQ256_MASK;
/* Read DQ2, DQ5 & DQ6 */
if( ( EraseLow == FALSE ) && /* Low still erasing? */
( Data1 & M29W800T_LOW_DQ5_MASK ) ) /* Low DQ5 = 1? */
{
EraseLow = TRUE;
/* Test for error condition */
if( ( Data1 & M29W800T_LOW_DQ26_MASK ) !=
( Data2 & M29W800T_LOW_DQ26_MASK ) )
{
RetValue = STFLASH_ERROR_ERASE;
break;
}
}
if( ( EraseHigh == FALSE ) && /* High still erasing? */
( Data1 & M29W800T_HIGH_DQ5_MASK ) ) /* High DQ5 = 1? */
{
EraseHigh = TRUE;
/* Test for error condition */
if( ( Data1 & M29W800T_HIGH_DQ26_MASK ) !=
( Data2 & M29W800T_HIGH_DQ26_MASK ) )
{
RetValue = STFLASH_ERROR_ERASE;
break;
}
}
}
else
{
/* Erase still on going, have we timed out? */
Data1 = Data2;
Curr_Time = time_now();
if( time_minus( Curr_Time, StartTime ) >
(clock_t)ERASE_TIMEOUT )
{
RetValue = ST_ERROR_TIMEOUT;
break;
}
}
}
break;
case STFLASH_ACCESS_16_BITS:
/* keith modification ( */ #if 1 for ( i=0;i<iTotalBlockNum; i++ ) { /* Setup access pointers */ Code1Addr16 = (U16*)ThisElem->BaseAddress + M29W800T_CODED_ADDR1; Code2Addr16 = (U16*)ThisElem->BaseAddress + M29W800T_CODED_ADDR2; Code1Data16 = M29W800T_CODED_DATA1 & 0xffff; Code2Data16 = M29W800T_CODED_DATA2 & 0xffff; /* Cycle 1 - Coded cycle 1 */ *Code1Addr16 = Code1Data16; /* Cycle 2 - Coded cycle 2 */ *Code2Addr16 = Code2Data16; /* Cycle 3 - Block Erase Command */ *Code1Addr16 = M29W800T_BLOCK_ERASE & 0xffff; /* Cycle 4 - Coded cycle 1 */ *Code1Addr16 = Code1Data16; /* Cycle 5 - Coded cycle 2 */ *Code2Addr16 = Code2Data16; /* Cycle 6 - Erase Confirm */ EraseAddr16 = (U16*)( (U32)ThisElem->BaseAddress + Offset[i] ); *EraseAddr16 = M29W800T_ERASE_CONFIRM & 0xffff; /* Start Erase */ StartTime = time_now(); /* ticks at Erase start */ /* Read DQ2, DQ5 & DQ6 */ EraseAddr16 = (U16*)( (U32)ThisElem->BaseAddress + Offset[i] ); Data1 = *EraseAddr16 & M29W800T_DQ256_MASK & 0xffff; EraseLow = FALSE; while( EraseLow == FALSE /*&& RetValue == ST_NO_ERROR*/) { /* Read DQ2, DQ5 & DQ6 on all chips */ Data2 = *EraseAddr16 & M29W800T_DQ256_MASK & 0xffff; /* Are DQ2 and DQ6 toggling? */ if( Data1 == Data2 ) { EraseLow = TRUE; /* Erase was successful */ } /* High or Low DQ5 = 1? */ else if( ( Data2 & M29W800T_DQ5_MASK ) != 0 ) /* check for Time Exceed */ { Data1 = Data2; /* Store current value */ Data2 = *EraseAddr16 & M29W800T_DQ256_MASK & 0xffff; /* Read DQ2, DQ5 & DQ6 */ if( Data1 & M29W800T_LOW_DQ5_MASK ) /* Low DQ5 = 1? */ { EraseLow = TRUE; /* Test for error condition */ if( ( Data1 & M29W800T_LOW_DQ26_MASK ) != ( Data2 & M29W800T_LOW_DQ26_MASK ) ) { RetValue = STFLASH_ERROR_ERASE; break; } } } else { /* Erase still on going, have we timed out? */ Data1 = Data2; Curr_Time = time_now(); if( time_minus( Curr_Time, StartTime ) > (clock_t)ERASE_TIMEOUT ) { RetValue = ST_ERROR_TIMEOUT; break; } } /* It typically takes 2 to 3 seconds to erase a block (depending on size) so deschedule to avoid busy wait */ if ( EraseLow == FALSE ) task_delay( ClocksPerSecond ); } /* while EraseLow == False */ } /* for loop */ break; /* } keith modification */ #else
/* Setup access pointers */
Code1Addr16 = (U16*)ThisElem->BaseAddress +
M29W800T_CODED_ADDR1;
Code2Addr16 = (U16*)ThisElem->BaseAddress +
M29W800T_CODED_ADDR2;
Code1Data16 = M29W800T_CODED_DATA1 & 0xffff;
Code2Data16 = M29W800T_CODED_DATA2 & 0xffff;
/* Cycle 1 - Coded cycle 1 */
*Code1Addr16 = Code1Data16;
/* Cycle 2 - Coded cycle 2 */
*Code2Addr16 = Code2Data16;
/* Cycle 3 - Block Erase Command */
*Code1Addr16 = M29W800T_BLOCK_ERASE & 0xffff;
/* Cycle 4 - Coded cycle 1 */
*Code1Addr16 = Code1Data16;
/* Cycle 5 - Coded cycle 2 */
*Code2Addr16 = Code2Data16;
for ( i=0;i<iTotalBlockNum; i++ )
{
/* Cycle 6 - Erase Confirm */
EraseAddr16 = (U16*)( (U32)ThisElem->BaseAddress + Offset[i] );
*EraseAddr16 = M29W800T_ERASE_CONFIRM & 0xffff;
}
/* Start Erase */
StartTime = time_now(); /* ticks at Erase start */
/* Read DQ2, DQ5 & DQ6 */
EraseAddr16 = (U16*)( (U32)ThisElem->BaseAddress + Offset[0] );
Data1 = *EraseAddr16 & M29W800T_DQ256_MASK & 0xffff;
EraseLow = FALSE;
while( EraseLow == FALSE /*&& RetValue == ST_NO_ERROR*/)
{
/* Read DQ2, DQ5 & DQ6 on all chips */
Data2 = *EraseAddr16 & M29W800T_DQ256_MASK & 0xffff;
/* Are DQ2 and DQ6 toggling? */
if( Data1 == Data2 )
{
EraseLow = TRUE; /* Erase was successful */
}
/* High or Low DQ5 = 1? */
else if( ( Data2 & M29W800T_DQ5_MASK ) != 0 )
{
Data1 = Data2; /* Store current value */
Data2 = *EraseAddr16 & M29W800T_DQ256_MASK & 0xffff;
/* Read DQ2, DQ5 & DQ6 */
if( Data1 & M29W800T_LOW_DQ5_MASK ) /* Low DQ5 = 1? */
{
EraseLow = TRUE;
/* Test for error condition */
if( ( Data1 & M29W800T_LOW_DQ26_MASK ) !=
( Data2 & M29W800T_LOW_DQ26_MASK ) )
{
RetValue = STFLASH_ERROR_ERASE;
break;
}
}
}
else
{
/* Erase still on going, have we timed out? */
Data1 = Data2;
Curr_Time = time_now();
if( time_minus( Curr_Time, StartTime ) >
(clock_t)ERASE_TIMEOUT )
{
RetValue = ST_ERROR_TIMEOUT;
break;
}
}
/* It typically takes 2 to 3 seconds to erase a block
(depending on size) so deschedule to avoid busy wait */
if ( EraseLow == FALSE )
task_delay( ClocksPerSecond );
}
if ( iTotalBlockNum > 1 )
{
/* Read DQ2, DQ5 & DQ6 */
EraseAddr16 = (U16*)( (U32)ThisElem->BaseAddress + Offset[iTotalBlockNum-1] );
Data1 = *EraseAddr16 & M29W800T_DQ256_MASK & 0xffff;
EraseLow = FALSE;
while( EraseLow == FALSE /*&& RetValue == ST_NO_ERROR*/)
{
/* Read DQ2, DQ5 & DQ6 on all chips */
Data2 = *EraseAddr16 & M29W800T_DQ256_MASK & 0xffff;
/* Are DQ2 and DQ6 toggling? */
if( Data1 == Data2 )
{
EraseLow = TRUE; /* Erase was successful */
}
/* High or Low DQ5 = 1? */
else if( ( Data2 & M29W800T_DQ5_MASK ) != 0 )
{
Data1 = Data2; /* Store current value */
Data2 = *EraseAddr16 & M29W800T_DQ256_MASK & 0xffff;
/* Read DQ2, DQ5 & DQ6 */
if( Data1 & M29W800T_LOW_DQ5_MASK ) /* Low DQ5 = 1? */
{
EraseLow = TRUE;
/* Test for error condition */
if( ( Data1 & M29W800T_LOW_DQ26_MASK ) !=
( Data2 & M29W800T_LOW_DQ26_MASK ) )
{
RetValue = STFLASH_ERROR_ERASE;
break;
}
}
}
else
{
/* Erase still on going, have we timed out? */
Data1 = Data2;
Curr_Time = time_now();
if( time_minus( Curr_Time, StartTime ) >
(clock_t)ERASE_TIMEOUT )
{
RetValue = ST_ERROR_TIMEOUT;
break;
}
}
/* It typically takes 2 to 3 seconds to erase a block
(depending on size) so deschedule to avoid busy wait */
if ( EraseLow == FALSE )
task_delay( ClocksPerSecond );
}
}
break;
#endif
}
}
else
{
TempAddress = (U8*)ThisElem->BaseAddress; /* recasting */
Access_Addr = TempAddress + Offset[0]; /* Erase block base */
/* form all width pointers, only one will be used */
EraseAddr32 = (U32*)Access_Addr;
EraseAddr16 = (U16*)Access_Addr;
EraseAddr08 = Access_Addr;
VppEnable( ThisElem->VppAddress );
/* Maximum access width MUST be used for all erasure, otherwise only
every second or fourth device will be erased (not very useful) */
switch( ThisElem->MaxAccessWidth )
{
case STFLASH_ACCESS_08_BITS:
/* Clear Status Register (precautionary) */
*EraseAddr08 = CLEAR_SR08; /* "Don't Care" address in Flash */
/* commence Erase Command Sequence */
*EraseAddr08 = ERASE_SU08; /* "Don't Care" address in Flash */
*EraseAddr08 = ERASE_CR08; /* Confirm at Flash block base */
StartTime = time_now(); /* ticks at Erase start */
/* commence Read Status Register Command Sequence */
*EraseAddr08 = READ_SR08; /* "Don't Care" address in Flash */
/* poll for completion of Erasure on the chip */
while( DoingErase )
{
if( ( *EraseAddr08 & COM_STAT08 ) == COM_STAT08 )
{
DoingErase = FALSE; /* Erase sequence completed */
/* check for Erase sequence failure on the chip */
if( ( *EraseAddr08 & ERA_STAT08 ) != 0 )
{
RetValue = STFLASH_ERROR_ERASE;
}
else
{
/* check for Vpp below minimum on the chip */
if( ( *EraseAddr08 & VPP_STAT08 ) != 0 )
{
RetValue = STFLASH_ERROR_VPP_LOW;
}
}
}
else
{
Curr_Time = time_now();
if( time_minus( Curr_Time,
StartTime ) >
(clock_t)ERASE_TIMEOUT )
{
DoingErase = FALSE; /* Erase sequence timed out */
RetValue = ST_ERROR_TIMEOUT;
}
}
}
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -