📄 main.c
字号:
//****************************************************************************//// MAIN.C - The architecture for program the program via serial, ethernet or// usb slave chip.//// Copyright (c) 2006 Cirrus Logic, Inc.////****************************************************************************#include <stdlib.h>#include <stdio.h>#include <string.h>#include <stdarg.h>#include "ep93xx.h"#include "serial.h"#include "timer.h"#include "flash.h"#include "intel.h"#include "amd.h"#include "spi.h"#include "at25f1024.h"#include "sst25vf020.h"//****************************************************************************// USE_SEMIHOSTING// Macro definitions to handle using semihosted prints as your console//****************************************************************************#define USE_SEMIHOSTING#ifdef USE_SEMIHOSTING#define CHECK_SEMIHOSTING()#define PRINT_MSG(msg) printf(msg)#define GET_MSG(msg) gets(msg)#else#define CHECK_SEMIHOSTING() __use_no_semihosting_swi()#endif#define _DBG#define EEPROM_MAX 8static struct eeprom eeprom_ops[EEPROM_MAX]={ {ATMEL_ID, ATMEL_AT25F1024, init_at25f1024, query_at25f1024, erase_at25f1024, program_at25f1024,read_at25f1024}, {SST_ID, SST_SST25VF020, init_sst25vf020, query_sst25vf020, erase_sst25vf020, program_sst25vf020,read_sst25vf020}, {SST_ID, SST_SST25VF040B, init_sst25vf020, query_sst25vf040, erase_sst25vf040, program_sst25vf020,read_sst25vf020} };struct FlashOps sFlashOps[]={ // AMD operation function pointer! { AmdFlashQuery, AmdFlashErase, AmdFlashProgram }, // INTEL operation function pointer! { IntelFlashQuery, IntelFlashErase, IntelFlashProgram }, // Add your operation function pointer! // The last one indicate the termination { 0, 0, 0 }};//****************************************************************************// Function: flash_operate()// Description: Erase and Program the nor flash.//****************************************************************************void flash_operate(void){ struct FlashInfo sFlashInfo; struct CFIQuery sQuery; struct FlashOps *spFlashOps = sFlashOps; unsigned char *pBuffer; long iOffSet, iFileSize, iCheckSum; char data[1024]; int index = 0; char cErase=0; if ((in(0x8093009C) & BIT7)) { // The system is boot with 32bit width. sFlashInfo.ByteWidth = 2; sFlashInfo.FlashBase = 0x60000000; sFlashInfo.pQuery = &sQuery; } else { // The system is boot with 16bit width. sFlashInfo.ByteWidth = 1; sFlashInfo.FlashBase = 0x60000000; sFlashInfo.pQuery = &sQuery; } if(!sFlashOps[0].FlashQuery(&sFlashInfo)) { // The flash is amd compatible serial. spFlashOps = &sFlashOps[0]; #ifdef _DBG iOffSet = 0x00; iFileSize = 0x20000; for(index=0; index<1024; index++) { data[index] = 0xaa; } spFlashOps->FlashErase(&sFlashInfo, iOffSet, iFileSize); spFlashOps->FlashProgram(&sFlashInfo, iOffSet, (void *)data, 1024);#endif Serial_SendChar('A'); Serial_SendChar((sFlashInfo.ManufactureId)&0xff); Serial_SendChar((sFlashInfo.ManufactureId>>8)&0xff); Serial_SendChar((sFlashInfo.DeviceId[0])&0xff); Serial_SendChar((sFlashInfo.DeviceId[0]>>8)&0xff); } else if(!sFlashOps[1].FlashQuery(&sFlashInfo)) { // The flash is intel compatible serial. spFlashOps = &sFlashOps[1]; #ifdef _DBG iOffSet = 0x00; iFileSize = 0x20000; for(index=0; index<1024; index++) { data[index] = 0xaa; } spFlashOps->FlashErase(&sFlashInfo, iOffSet, iFileSize); spFlashOps->FlashProgram(&sFlashInfo, iOffSet, (void *)data, 1024);#endif Serial_SendChar('I'); Serial_SendChar((sFlashInfo.ManufactureId)&0xff); Serial_SendChar((sFlashInfo.ManufactureId>>8)&0xff); Serial_SendChar((sFlashInfo.DeviceId[0])&0xff); Serial_SendChar((sFlashInfo.DeviceId[0]>>8)&0xff); } else { Serial_SendChar('X'); } // // Get the image offset and size. // pBuffer = (unsigned char *)&iOffSet; pBuffer[0] = Serial_GetChar(); pBuffer[1] = Serial_GetChar(); pBuffer[2] = Serial_GetChar(); pBuffer[3] = Serial_GetChar(); pBuffer = (unsigned char *)&iFileSize; pBuffer[0] = Serial_GetChar(); pBuffer[1] = Serial_GetChar(); pBuffer[2] = Serial_GetChar(); pBuffer[3] = Serial_GetChar(); cErase = Serial_GetChar(); // // Begin to erase the flash. // Send '!' if flash has been erased! // if(iOffSet>sQuery.DeviceSize) { Serial_SendChar('%'); return; } if((iFileSize+iOffSet)>sQuery.DeviceSize) { Serial_SendChar('&'); return; } if(cErase=='R') { if(!spFlashOps->FlashErase(&sFlashInfo, iOffSet, iFileSize)) { Serial_SendChar('!'); } else { Serial_SendChar('='); } } // // Begin to receive the data and write to flash. // do { do { for(index=0; index<1024; index++) { data[index] = Serial_GetChar(); } pBuffer = (unsigned char *)&iCheckSum; pBuffer[0] = Serial_GetChar(); pBuffer[1] = Serial_GetChar(); pBuffer[2] = Serial_GetChar(); pBuffer[3] = Serial_GetChar(); for(index=0; index<1024; index++) { iCheckSum -= data[index]; } if (iCheckSum != 0) Serial_SendChar('@'); } while(iCheckSum != 0); if(spFlashOps->FlashProgram(&sFlashInfo, iOffSet, (void *)data, 1024)!=0) { // //program fail // Serial_SendChar('^'); } else { // //program sucessfully // Serial_SendChar('#'); iOffSet += 1024; iFileSize -= 1024; } // // Receive the next packet. // //Serial_SendChar('#'); //iOffSet += 1024; //iFileSize -= 1024; } while ( iFileSize > 0); // // Send '*' to exit. // Serial_SendChar('*');}//****************************************************************************// Function: eeprom_operate()// Description: Erase and Program the eeprom.//****************************************************************************void eeprom_operate(int iRead){ int OffSet, FileSize, CheckSum; int temp,tmp; int i,j,k; unsigned char data[1024]; int index = 0; unsigned char *pBuffer; int found_eeprom = EEPROM_MAX + 1; unsigned long ulRet=0; char cErase=0; for(i=0; i<EEPROM_MAX; i++) { eeprom_ops[i].init(); tmp = eeprom_ops[i].query(eeprom_ops[i].manufacture_id,eeprom_ops[i].device_id); if (1 == tmp) { found_eeprom = i; if(i==0) Serial_SendChar('O'); else if(i==1) Serial_SendChar('S'); else if(i==2) Serial_SendChar('S'); break; } } if ( (EEPROM_MAX + 1) == found_eeprom) { Serial_SendChar('X'); } // // Get the image offset and size. // pBuffer = (unsigned char *)&OffSet; pBuffer[0] = Serial_GetChar(); pBuffer[1] = Serial_GetChar(); pBuffer[2] = Serial_GetChar(); pBuffer[3] = Serial_GetChar(); pBuffer = (unsigned char *)&FileSize; pBuffer[0] = Serial_GetChar(); pBuffer[1] = Serial_GetChar(); pBuffer[2] = Serial_GetChar(); pBuffer[3] = Serial_GetChar(); if(iRead==0) { cErase = Serial_GetChar(); } // //erase eeprom // if((iRead==0)&&(cErase=='R')) { temp = eeprom_ops[found_eeprom].erase(OffSet,FileSize); } else { temp = 1; } // //sucess // if ( 1 == temp) { Serial_SendChar('!'); }// image +offset >eeprom size else if(0 == temp) { Serial_SendChar('&'); }//offset>eeprom size else if(2 == temp) { Serial_SendChar('%'); } if(iRead==1) { k=FileSize; for(j=0; j<FileSize; j+=1024) { if(FileSize>1024) { k=FileSize-1024; i=1024; } else { i=k; } for(index=0; index<i; index=index+4) { ulRet = eeprom_ops[found_eeprom].read((OffSet+j+index),data,1024); Serial_SendChar(ulRet&0xff); Serial_SendChar((ulRet>>8)&0xff); Serial_SendChar((ulRet>>16)&0xff); Serial_SendChar((ulRet>>24)&0xff); } } // // Send '*' to exit. // Serial_SendChar('*'); return; } // // Begin to receive the data and write // for(j=0; j<FileSize; j+=1024) { for(index=0; index<1024; index++) { data[index] = Serial_GetChar(); } pBuffer = (unsigned char *)&CheckSum; pBuffer[0] = Serial_GetChar(); pBuffer[1] = Serial_GetChar(); pBuffer[2] = Serial_GetChar(); pBuffer[3] = Serial_GetChar(); for(index=0; index<1024; index++) { temp = data[index] & 0xff; CheckSum -= temp; } if (CheckSum !=0) Serial_SendChar('@'); if(eeprom_ops[found_eeprom].program((OffSet + j ),data,1024)==-1) { // //program fail // Serial_SendChar('^'); j = j-1024; } else { // //program sucessfully // Serial_SendChar('#'); } //Serial_SendChar('#'); } // // Send '*' to exit. // Serial_SendChar('*');}//****************************************************************************// func: main()// C function entry.//****************************************************************************int main(){ char cChar; // // Reinitialize the uart 1 to 115200 baud rate and no fifo // Serial_Init(3, 0); enable_debugtimer(); while(1) { // // Read the character from the serial port. // cChar = Serial_GetChar(); switch (cChar) { case '-': // // Program the nor FLASH. // clr(PEDR, 0x3); Serial_SendChar('?'); break; case 'F': // // Program the nor FLASH. // clr(PEDR, 0x3); flash_operate(); //while(1) //{ // set(PEDR, 0x1); // delay_msec(500); // clr(PEDR, 0x1); // delay_msec(500); //} break; case 'S': // // Program the spi EEPROM. // clr(PEDR, 0x3); eeprom_operate(0); //while(1) //{ // set(PEDR, 0x1); // delay_msec(500); // clr(PEDR, 0x1); // delay_msec(500); //} break; case 'R': // // Program the spi EEPROM. // clr(PEDR, 0x3); eeprom_operate(1); //while(1) //{ // set(PEDR, 0x1); // delay_msec(500); // clr(PEDR, 0x1); // delay_msec(500); //} break; default: // // No command. // //while(1) //{ // set(PEDR, 0x1); // delay_msec(500); // clr(PEDR, 0x1); // delay_msec(500); //} break; } } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -