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

📄 mainfile.c

📁 源代码为ARM2410上NAND FLASH 的驱动程序
💻 C
字号:


/*----------------------------------------------------------------------------------
Module :           Main Function 
Author :           kreal@163.net
Creation Date  :   04-04-15
Revision       :   None 
Function       :   To  test 2410 base function 
-----------------------------------------------------------------------------------*/


#define  MAIN_G

#include "sysincludes.h"


uchar  SerialBuffer[1024] ;
uint   DataLen ; 
uchar  Updating, Loading ;
uchar  CommandFlag ; 
uint    SA,EA;
uchar   *pStr;
uint UsedBlk  ;  
uint UsedPage  ; 



void LoadSys()
{
   
   uint iN, iP ; 
   
   uchar *pStart ;
   
   
    
   
   pStart = (uchar *) 0x32000000 ;  
   
   for( iN = 0 ; iN < 100 ; iN ++ ) 
   {
      
      for( iP = 0 ; iP < 32 ; iP ++ ) 
      {
         NF_ReadPage( iN+20, iP, (uchar*)pStart, 512 ) ;
         pStart += 512 ; 
      
      } 
     
   
   }
   
 //  pStart = ( uchar * ) 0x30000000;
   
 //  for( iN  = 0 ; iN < 1024 ; iN ++ ) 
 //  {
  //    printf("%02x", *pStart++ ) ; 
  //    printf(" " ) ; 
  // }

}

void (*Sys)(void);






void MemVarInit( void ) 
{
  
   DataLen = 0 ; 
    
   Updating = FALSE ; Loading = FALSE  ; 

   CommandFlag = 0x00 ; 
   UsedPage  = 0 ; UsedBlk = 20 ; 

}






void ProcessBuffer( void ) 
{

    uchar  Header1 , Header2 ;
    uchar  Len1 , Len2 ; 
      
    uint   iN ; 

    Header1 = Uart_Getch()  ;
    
    if( Loading == TRUE ) return ; 
      
    

    if( Header1 == 0x55 ) 
    {
       Updating = TRUE ; 

       Header2 = Uart_Getch() ; 
       if( Header2 == 0xAA ) 
       {
          
           SerialBuffer[0] = Header1 ; 
           SerialBuffer[1] = Header2 ; 
           
           Len1 = Uart_Getch() ; 
           Len2 = Uart_Getch() ;
           DataLen = (Len1<<8)|Len2 ;

           SerialBuffer[2] = Len1 ;
           SerialBuffer[3] = Len2 ;
           
           
           
           for( iN = 0 ; iN < DataLen ; iN ++ )
              SerialBuffer[4+iN] = Uart_Getch() ;
                  
           SerialBuffer[4+iN] = Uart_Getch() ;
           SerialBuffer[5+iN] = Uart_Getch() ;

                 
           CommandFlag = 0x01 ; 
       }   

       


    }  
          
}

char  CheckSum( void ) 
{
   uint iN ;
 
   uint  Sum ; 

   Sum = 0 ; 

   for( iN = 0 ; iN < DataLen + 4 ; iN ++ ) 
      Sum += SerialBuffer[iN ] ; 
    
   

     if( SerialBuffer[ iN ] == (( Sum&0xFFFF)>>8 ) && SerialBuffer[iN+1] == ( Sum&0xFF ) )
        return TRUE ;
     else 
        return FALSE ;



}


unsigned char W_BUF[512];


void RespCommand( void ) 
{
   uint i = 0 ; 
   uint  ret   ;  
   uint  Len ; 
  
    if( CheckSum() ) 
    {

        if(( SerialBuffer[4] =='L' ) && ( SerialBuffer[5] == 'L') ) 
        {

            printf( "Y" ) ; 

        }else
        if( SerialBuffer[4] =='E' && SerialBuffer[5] == 'E' ) 
        {
                pStr = (unsigned char*)&SA;
                pStr[0] = SerialBuffer[6];
                pStr[1] = SerialBuffer[7];
                pStr[2] = SerialBuffer[8];
                pStr[3] = SerialBuffer[9];

                pStr = (unsigned char*)&EA;
                pStr[0] = SerialBuffer[10];
                pStr[1] = SerialBuffer[11];
                pStr[2] = SerialBuffer[12];
                pStr[3] = SerialBuffer[13];
             

              
                ret = NandErase( SA, EA);
              
                if( ret ) 
                {
                   printf("Y" ) ; 
                }
                else  printf( "N" ) ;
                
            
        }else

               if( SerialBuffer[4] == 'P' && SerialBuffer[5] == 'P' )
               {
                
                 pStr = (unsigned char*)&SA;
                 pStr[0] = SerialBuffer[6];
                 pStr[1] = SerialBuffer[7];
                 pStr[2] = SerialBuffer[8];
                 pStr[3] = SerialBuffer[9];

                 pStr = (unsigned char*)&EA;
                 pStr[0] = SerialBuffer[10];
                 pStr[1] = SerialBuffer[11];
                 pStr[2] = SerialBuffer[12];
                 pStr[3] = SerialBuffer[13];

                 Len =  DataLen - 10 ;
                                 
                 for( i = 0 ; i <512; i++ ) W_BUF[i] = SerialBuffer[ 14 + i ]; 
                 
                 if( Len < 512 ) { for( i = Len ; i< 512 ; i ++ ) W_BUF[i]= 0xFF ; }
                 
                  
                 ret = NF_WritePage( UsedBlk, UsedPage++, W_BUF, Len ) ;  
                 
                 if( UsedPage >= 32 ) { UsedPage = 0 ; UsedBlk ++ ; } 

                 if( ret ) printf("Y") ;
                 else printf("N" ) ; 

              }
             

  }

  CommandFlag = 0x00 ;  DataLen = 0 ; 
     
}
   






void Main( void ) 
{
   
   
   
   SysInit() ;
   MemVarInit() ;
   
   

   UartSelect( 0 ) ;                             // Test Uart 0 
   printf( "\r\nBooting Nand System....") ;
   
   NF_Init() ;  
   
   printf("\r\nNand Flash ID is 0x%x",  NF_CheckId() ) ;  
   
    
  
  
   
   while( 1 ) 
   {
   
      ProcessBuffer() ; 
      
      if( CommandFlag == 0x01 )  RespCommand() ; 
      
      
      
      if( Loading == TRUE )  
      {
      
              
         LoadSys() ; 
         
         Sys = (void(*)())0x32000000;
         
        
         (*Sys)() ; 

      
      }
   
   }      
   



}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -