/********************************************************************************************************* **函数名称: 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)); // 比较数据 }
/* ******************************************************************************************************* ** 函数名称: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); }
/* ******************************************************************************************************* ** 函数名称: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); }
///////////////////////////////////////////////////////////////////// // 函数名称: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(); } }
//*----------------------------------------------------------------------------- //* 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ê"