⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flashloader.c

📁 linked list construct to support any number of Flash banks.
💻 C
📖 第 1 页 / 共 5 页
字号:
                      {
                        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 + -