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

📄 flash_mtd.amd.c

📁 MTK debug flash 兼容性的code
💻 C
📖 第 1 页 / 共 5 页
字号:
         #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 + -