Example #1
0
/*********************************************************************************************************
**函数名称:  WriteFlash
**函数功能:  向FLASH中写入数据
**入口参数:  dst		目标地址,即FLASH起始地址,地址必须以256字节对齐,即地址的低8位必须为0
**			 src		源地址,即RAM地址,地址必须字对齐,即地址的低两位必须为0
**			 no		    写入字节数,必须为256/512/1024/4096
**出口参数:  Compare的返回值,操作成功正确返回0
********************************************************************************************************/
INT8U	WriteFlash(INT32U  dst, INT32U	src, INT32U	no)
{
	SelSector((dst/0x1000),(dst+no)/0x1000);	// 选择扇区
	EraseSector((dst/0x1000),(dst+no)/0x1000);	// 擦除扇区
	BlankCHK((dst/0x1000),(dst+no)/0x1000);		// 查空扇区
	
	SelSector((dst/0x1000),(dst+no)/0x1000);	// 选择扇区
	
	RamToFlash(dst,src,no);			            // 写数据到FLASH
	return(Compare(dst,src,no));	            // 比较数据
}
Example #2
0
/*
*******************************************************************************************************
** 函数名称:read_userinfo_flash()
** 函数功能:清除冷热启动信息
** 入口参数:无
** 出口参数:无
**          
*******************************************************************************************************
*/
void clean_userinfo_flash(void)
{
	//User_Info_Flash *readflash;
	User_Info_Flash *writeflash = (User_Info_Flash *)flashdata;
	
	writeflash->poweron_cnt = 1;
	writeflash->powerup_cnt = 0;
	writeflash->is_fistpoweron = 0x12801280;
	writeflash->err_type = 0;
	
	/*将更新好的数据写入到flash*/
	SelSector(14,14);     												// 选择扇区14
	EraseSector(14,14);   												// 擦除扇区14
	BlankCHK(14,14) ;     												// 查空扇区14
	SelSector(14,14);													// 选择扇区14
	RamToFlash(USER_FLASH_ADDR,(uint32)flashdata, 512);
}
Example #3
0
/*
*******************************************************************************************************
** 函数名称:powerup_process()
** 函数功能:冷热启动处理
** 入口参数:无
** 出口参数:无
**          
*******************************************************************************************************
*/
void startup_process(void)
{
	User_Info_Flash *readflash;
	User_Info_Flash *writeflash;

	readflash = (User_Info_Flash *)USER_FLASH_ADDR;						//flash地址
	writeflash = (User_Info_Flash *)flashdata;							//暂存flash数据数组

	/*更新User_Info_Flash 结构体的各个字段*/
	if(readflash->is_fistpoweron != 0x12801280){						//判断是否为首次上电
		IS_HOTSTART1 = 0x128A128A;
		IS_HOTSTART2 = 0x128B128B;
		RESET_TYPE = 0;
		writeflash->is_fistpoweron = 0x12801280;						//初始化各个字段
		writeflash->poweron_cnt = 1;
		writeflash->powerup_cnt = 0;
		writeflash->err_type = 0;
	}else{
		if((IS_HOTSTART1 == 0x128A128A)&&(IS_HOTSTART2 == 0x128B128B)){ //复位启动
			writeflash->is_fistpoweron = 0x12801280;
			writeflash->poweron_cnt = readflash->poweron_cnt;
			writeflash->powerup_cnt = (readflash->powerup_cnt+1);
			writeflash->err_type = RESET_TYPE;
		}else{
			IS_HOTSTART1 = 0x128A128A;
			IS_HOTSTART2 = 0x128B128B;
			RESET_TYPE = 0;															//上电启动
			writeflash->is_fistpoweron = 0x12801280;
			writeflash->poweron_cnt = (readflash->poweron_cnt + 1);
			writeflash->powerup_cnt = readflash->powerup_cnt;
			writeflash->err_type = readflash->err_type;
		}
	}

	/*将更新好的数据写入到flash*/
	SelSector(14,14);     												// 选择扇区14
	EraseSector(14,14);   												// 擦除扇区14
	BlankCHK(14,14) ;     												// 查空扇区14
	SelSector(14,14);													// 选择扇区14
	RamToFlash(USER_FLASH_ADDR,(uint32)flashdata, 512);
	
}
Example #4
0
/////////////////////////////////////////////////////////////////////
//	函数名称:void File_Table_Write(BYTE page,BYTE *buf)
//	函数功能: 配置表文件写
//	入口参数:
//
//
//	出口参数:无
////////////////////////////////////////////////////////////////////
void File_Table_Write(uint16 page, BYTE *buf, uint8 *des_ip)
{
    uint8 str[128], err, *pw,i=0,n=1;
    uint32 resault,	 tmp, resault1;
    struct CLASS_INFO *pinfo;
#if OS_CRITICAL_METHOD == 3                  /* Allocate storage for CPU status register       */
    OS_CPU_SR  cpu_sr;                       /* Prevent compiler warning                       */
#endif

    IP_printf("文件写:%d\n\n\n", page);
    //设备表擦除
    if (page == 0)
    {
        //	gDeviceTable.File.FileDebug=gDeviceTable.Debug;
        //	gDeviceTable.Debug&=~DEV_DEBUG_MSG;
        OS_ENTER_CRITICAL();
        InitIAP();
        resault = SelSector(ARM_TABLE_SECTOR_START, ARM_TABLE_SECTOR_END);
        resault = EraseSector(ARM_TABLE_SECTOR_START, ARM_TABLE_SECTOR_END);
        resault = BlankCHK(ARM_TABLE_SECTOR_START, ARM_TABLE_SECTOR_END);
        OS_EXIT_CRITICAL();
        IP_printf("配置表被擦除!");
        if (resault  !=  CMD_SUCCESS)
        {
            File_Req(0, 0xffff, des_ip);
            return;
        }
    }

    if (page < 256)
    {
        if ((page % 10) == 0)
            IP_printf("文件写:%d\n\n\n", page);
        InitIAP();
        //p=(BYTE *)(buf+sizeof (struct BASE_MSG)+sizeof(struct SFILE_TRANSLATE_TYPE ));
        pw = (BYTE *)User_mem_allco(256);
        if (pw == NULL)
        {
            File_Req(0, page, des_ip);
            return;
        }
        memcpy(pw, buf, 256);
        if (page == 0)
        {
            pinfo = (struct CLASS_INFO *)pw;
            User_ID_Read(str, 1);
            memcpy((BYTE *)pinfo->class_ID, str, 8);
            //IP_printf_256(pw);
        }

        if (page == 0xfa)
        {
            err = 0;
            memset(str, 0, 128);
            while(AT24C16_Write(str, DEVICE_USE_STAT_TIME, 128) == FALSE)
            {
                if (err++ > 10 ) break;
            };
        }
        if ((page > 2) && (page < 10)) //课程表
        {
            err = 0;
            //while(AT24C16_Write(pw,CLASS_TABLE_ADDRESS+(page-3)*256,256)==FALSE)
            //{ if (err++>10) break; };
        }
        else
        {
            tmp = ARM_TABLE_ADDRESS + page * 256;
            OS_ENTER_CRITICAL();
            resault = SelSector(ARM_TABLE_SECTOR_START, ARM_TABLE_SECTOR_END);
            resault = RamToFlash(tmp, (uint32)pw, 256);
            OS_EXIT_CRITICAL();
        }
        User_mem_free(pw);

        //申请下一包
        if ((page + 1) < 256)
        {
            File_Req(0, page + 1, des_ip);
        }
        else
        {
            File_Req(0, 0xffff, des_ip);
            Device_Rec_Scan();
        }
    }
    else
    {
        File_Req(0, 0xffff, des_ip);
        Device_Rec_Scan();
    }
}
Example #5
0
//*-----------------------------------------------------------------------------
//* Nazwa funkcji :    komunikcja_RSwin
//* Interpretacja i wykonanie rozkazów wysy³anych z programu RS-win
//*-----------------------------------------------------------------------------
void komunikcja_RSwin(char *ptr1, char *ptr2, unsigned int *ptr3)
{


    //Zmienne lokalne ----------------------------------------------------------

      unsigned long adres =0;;
    //----------------Koniec zmiennych lokalnych -------------------------------
  
 
    //Zmienne tymczasowe -------------------------------------------------------
      int tmp =0;
      
    //----------------Koniec zmiennych tymczasowych ---------------------------- 
  
  
      
      
    //Zapis do dowolnego segmentu ----------------------------------------------
    if ((ptr1[0]==0xAD)& (ptr1[1]==0x05)) 
    {
      //Zapis programu zrodlowego
      adres = ptr1[4]+(ptr1[5]*0x100);
      if (ptr1[3]==0x70)
      {


             unsigned int Save = __get_interrupt_state();            
                __disable_interrupt();
                
            if (adres==0) 
            {
              //CleanFlash((int)AT91C_IFLASH_MEM->FlashProgram+FlashProgramOfset,0,sizeof(gProg));
              CleanFlash((char*)&AT91C_IFLASH_MEM->FlashProgram+FlashProgramOfset,sizeof(gProg));
            }
            
               
                at91flashWrite((int)AT91C_IFLASH_MEM->FlashProgram+FlashProgramOfset,adres,ptr1+7,ptr1[6]);
            
                
                __set_interrupt_state(Save);
                __enable_interrupt();  
           
            
            //Potwierdzenie
            ptr2[0]=0xAC;
            ptr2[1]=0x02;
            *ptr3=2;
            ptr2[2]=CheckSum(ptr2, ptr3);
            
              /*
                     memory_read=(char*)&gProg+adres;
            
            for (char i=0; i<ptr1[6]; i++)
            {
              *memory_read=*(ptr1+7+i);
              memory_read++;
            }
                
            */
        
          //przepisz program z flash do ram
          char *memory_read_prog;
          memory_read_prog=(char*)(AT91C_IFLASH_MEM->FlashProgram+FlashProgramOfset);
      
          
          char *SourRam= (char*)&gProg;
          int tProgramTabSize=ProgramTabSize;
          for (int k = 0 ; k <= tProgramTabSize ; k++) 
          { 
                SourRam[k]=memory_read_prog[k]; 
                
          }
      } 
         
      
      if (ptr1[3]==0x10)
      {
         char *memory_read;
            memory_read=(char*)&gProg+adres;
            
            for (char i=0; i<ptr1[6]; i++)
            {
              *memory_read=*(ptr1+7+i);
              memory_read++;
            } 
            
            
           //Potwierdzenie
            ptr2[0]=0xAC;
            ptr2[1]=0x02;
            *ptr3=2;
            ptr2[2]=CheckSum(ptr2, ptr3);   
      
      }
      
    }//-----------Koniec zapisu do dowolnego segmentu --------------------------         
    
    
    
    //Odczyt z dowolnego segmentu ----------------------------------------------
    if ((ptr1[0]==0xAD)& (ptr1[1]==0x03)) 
    {
      

      //Odczyt programu zrodlowego
      if ((ptr1[2]==0x00) & (ptr1[3]==0x10) /*& (ptr1[4]!=0x40)*/)
      {
        
        tmp = 2;
        
        ptr2[0] =0xAC;
        ptr2[1] =0x04;
        //*ptr3=2;
        
        adres = ptr1[4]+(ptr1[5]*0x100);
        
        char *memory_read;
        
        //memory_read=(char*)(AT91C_IFLASH_MEM->FlashProgram+FlashProgramReserveOfset);
        memory_read=(char*)&gProg;
        
        
        for (int k = 0 ; k <= (ptr1[6]-1) ; k++) 
        { 

            tmp++;
            
            ptr2[2+k] =memory_read[adres+k]; 
            
        
        }
        
        
        

        *ptr3=tmp;
        ptr2[tmp]=CheckSum(ptr2, ptr3);
        
      }
//tmp
      if ((ptr1[2]==0x00) & (ptr1[3]>0x70) & (ptr1[3]<0xC0)  /*& (ptr1[4]!=0x40)*/)
      {
        
        tmp = 2;
        
        ptr2[0] =0xAC;
        ptr2[1] =0x04;
        //*ptr3=2;
        
        adres = ptr1[4]+(ptr1[5]*0x100);
        for (int k = 0 ; k <= (ptr1[6]-1) ; k++) 
        { 
            ptr2[2+k] = pProg[adres+k];
            tmp++;
        }

        *ptr3=tmp;
        ptr2[tmp]=CheckSum(ptr2, ptr3);
        
      } 
//kon tmp
      
    }//------------------Koniec odczytu z dowolnego segmentu--------------------    
    
    

    //Odczyt z segmentu 0 ------------------------------------------------------
    if ((ptr1[0]==0xAC)& (ptr1[1]==0x03) & (ptr1[2]!=0x14) & (ptr1[2]!=0x80) ) 
    {
      
      //odczyt zmiennych dwustanwych
      if (   (ptr1[2]+(ptr1[3]*0x100)>= 0xC000) &&  (ptr1[2]+(ptr1[3]*0x100)<= 0xC7FF)  )
      {
        
        
        ptr2[0] =0xAC;
        ptr2[1] =0x04;
        tmp = 2;
        
        for (int k = 0; k <= ptr1[4]-1; k++) 
        { 
          adres = (ptr1[2]+(ptr1[3]*0x100)-0xC000 +k);
          ptr2[2+k] = BinVarToMaster(&adres);     
          tmp++;
        }
        
      }//Koniec odczytu zmiennych dwustanowych
            
            
      //Odczyt zmiennych analogowych
      if (  (ptr1[2]+(ptr1[3]*0x100)>= 0xC800) &&  (ptr1[2]+(ptr1[3]*0x100)<= 0xDFFF) )
      {   
        
        ptr2[0] =0xAC;
        ptr2[1] =0x04;
        tmp = 2;
        
        for (int k = 0; k <= ptr1[4]-1; k=k+4) 
        { 
          
          adres = ((ptr1[2]+(ptr1[3]*0x100)-0xC800)/4)  +(k/4);
          
          Convers_DW_B.DWvar = AnaVarToMaster(&adres);  
          
          // zmiana kolejnoœci dla nowego RSWINa
         /*
          ptr2[k+2]   =Convers_DW_B.Bvar[3];
          ptr2[k+3]   =Convers_DW_B.Bvar[2];
          ptr2[k+4]   =Convers_DW_B.Bvar[0];
          ptr2[k+5]   =Convers_DW_B.Bvar[1];
         */
          ptr2[k+2]   =Convers_DW_B.Bvar[0];
          ptr2[k+3]   =Convers_DW_B.Bvar[1];
          ptr2[k+4]   =Convers_DW_B.Bvar[2];
          ptr2[k+5]   =Convers_DW_B.Bvar[3];
          
          tmp=tmp+4;
         }
       }//Koniec odczytu zmiennych analogowych
       *ptr3=tmp;
       ptr2[tmp]=CheckSum(ptr2, ptr3);
    
    }//-------------------Koniec odczytu z segmentu 0---------------------------
    
    
    
    //Zapis do segmentu 0-------------------------------------------------------
    if ((ptr1[0]==0xAC)& (ptr1[1]==0x05)) 
    {

      //Zapis zmiennych dwustanowych
      if ( (ptr1[2]+(ptr1[3]*0x100)>= 0xC000) &&  (ptr1[2]+(ptr1[3]*0x100)<= 0xC7FF))
      {
        for (int k = 0; k <= ptr1[4]-1; k++) 
        { 
          adres = (ptr1[2]+(ptr1[3]*0x100)-0xC000+k);
          MasterToBinVar(&adres, &ptr1[5]);              //Konwersja z formatu Master i zapis
        }        
      }//Koniec zapisu zmiennych dwustanowch
            
            
      
      //Zapis zmiennej analogowej
      if ( (ptr1[2]+(ptr1[3]*0x100)>= 0xC800) &&  (ptr1[2]+(ptr1[3]*0x100)<= 0xDFFF))
      {
                                                 

        for (int k = 0; k <= ptr1[4]-1; k=k+4) 
        { /*
          // zmiana kolejnoœci dla nowego RSWINa
          
          Convers_DW_B.Bvar[3] = ptr1[5+(k)+0];
          Convers_DW_B.Bvar[2] = ptr1[5+(k)+1];
          Convers_DW_B.Bvar[0] = ptr1[5+(k)+2];
          Convers_DW_B.Bvar[1] = ptr1[5+(k)+3];
          */
          Convers_DW_B.Bvar[0] = ptr1[5+(k)+0];
          Convers_DW_B.Bvar[1] = ptr1[5+(k)+1];
          Convers_DW_B.Bvar[2] = ptr1[5+(k)+2];
          Convers_DW_B.Bvar[3] = ptr1[5+(k)+3];
          
          
          adres= (((ptr1[2]+(ptr1[3]*0x100)-0xC800))/4)+(k/4);
          MasterToAnaVar(&adres, &Convers_DW_B.DWvar);

        } //koniec petli k
        
      }//Koniec zapisu zmiennych analogowych
            
            
            
            
        //Potwierdzenie
        ptr2[0]=0xAC;
        ptr2[1]=0x02;
        *ptr3=2;
        //koniec potwoerdzenia
        
         ptr2[2]=CheckSum(ptr2, ptr3);                                        //suma kontrolna
 
    }//------------------Koniec zapisu do segmentu 0---------------------------       
       
    

    
    //!!! Standardowe pytania -------------------------------------------------- 
   
        //Przepisz program uzytkowy z Ram do flash
        if ( (ptr1[0]==0xAC) && (ptr1[1]==0x06) && (ptr1[2]==0x4E) )
          {
            ptr2[0]=0xAC;
            ptr2[1]=0x02;
            *ptr3=2;
            ptr2[2]=CheckSum(ptr2, ptr3);
            
            
             RamToFlash();
             ProgramChangeExecute(&gProg); 

          }


    
          //Ustaw pu³apkê
          if (
               (ptr1[0]==0xAA)&&
               (ptr1[1]==0xAA)&&
               (ptr1[2]==0x01)
              )
            {
             
              Trap.Row=ptr1[3];
              Trap.Col=ptr1[4];
              Trap.Enable=1;
              Trap.Activ=0;
              Trap.Change=1;
              
              
              //Potwierdzenie
               ptr2[0]=0xAB;
               ptr2[1]=0xAB;
               *ptr3=2;
               ptr2[2]=CheckSum(ptr2, ptr3);                                        //suma kontrolna
              //koniec potwoerdzenia

            }//koniec "Ustaw pu³apkê"
         
    
    
          //Usuñ pu³apki
          if (
               (ptr1[0]==0xAA)&&
               (ptr1[1]==0xAA)&&
               (ptr1[2]==0x02)
              )
            {
              
              Trap.Enable=0;
              Trap.Row=0;
              Trap.Col=0;
              Trap.Activ=0;
             
              //Potwierdzenie
               ptr2[0]=0xAB;
               ptr2[1]=0xAB;
               *ptr3=2;
               ptr2[2]=CheckSum(ptr2, ptr3);                                        //suma kontrolna
              //koniec potwoerdzenia

            }//koniec "Ustaw pu³apkê"
         
    
    
           //Odczytaj stany "Output" procedur (ptr1[3]-startowy rz¹d procedur, ptr1[4]-ilosc rzedow do odczytu
          if (
               (ptr1[0]==0xAA)&&
               (ptr1[1]==0xAA)&&
               (ptr1[2]==0x03)
              )
            {

                
        
                ptr2[0] =0xAC;
                ptr2[1] =0x04;

                tmp = 2;

                for (int Row = ptr1[3] ; Row<ptr1[3]+ptr1[4] ; Row++) 
                { 
                  for (int Col = 0 ; Col<MaxPrcInLine ; Col++) 
                  { 
                    ptr2[tmp++] =gProg.Line[Row].Proc[Col].Out>>8; 
                    ptr2[tmp++] =gProg.Line[Row].Proc[Col].Out & 0xFF; 
                  }  
                }
            

                *ptr3=tmp;
                ptr2[tmp]=CheckSum(ptr2, ptr3);

              
              
            }//koniec "Ustaw pu³apkê"