📄 down.c
字号:
/*************************************************************************/
/* */
/* FILE NAME VERSION */
/* */
/* down.c KS32C5000, KS32C50100 : version 1.0 */
/* */
/* COMPONENT */
/* */
/* */
/* */
/* DESCRIPTION */
/* */
/* */
/* AUTHOR */
/* */
/* */
/* DATA STRUCTURES */
/* */
/* */
/* FUNCTIONS */
/* */
/* Image code download from HOST to memory on SNDS board */
/* */
/* DEPENDENCIES */
/* */
/* */
/* HISTORY */
/* */
/* NAME DATE REMARKS */
/* */
/* hbahn 09-15-1998 Created initial version 1.0 */
/* in4maker 12-18-1998 Code updated */
/*************************************************************************/
#include <stdio.h>
#include "snds.h"
#include "uart.h"
#include "pollio.h"
#include "down.h"
#include "flash.h"
#include "sysconf.h"
#define OK 1
#define FAIL 0
/***********************************************************/
/* Main DRAM Download Program */
/***********************************************************/
void DownLoadPgm()
{
unsigned RcvDataSize ;
U32 *downarea ;
Print("\n $$ Input Download Area (0x1000050) : ") ;
downarea = (U32 *)get_num() ;
if ( downarea == 0 ) downarea = (U32 *)DownLoadArea ;
Print("\n $$ Waiting Download User Program ..... ") ;
RcvDataSize=GetDataSize(CONSOLE) ;
ReceiveData((char *)downarea,RcvDataSize) ;
Print("Ok.") ;
if(CRCErrorCheck((char *)downarea,RcvDataSize)) {
Print("\r $$ CRC Check Ok ..") ;
Print("\r $$ Now, User program will be started.\r");
Print("\r $$ Enter any key to continue....");
get_byte();
StartDownPgm(downarea) ;
}
else {
Print("\r $$$ CRC Check Error Occured!!!");
Print("\r $$$ User program start failed!!!");
}
}
/***********************************************************/
/* Main Flash EEPROM Download Program */
/***********************************************************/
void FlashDown()
{
unsigned RcvDataSize ;
U32 *Src;
U32 *Dst;
// Download ROM Data to ROM_BufferArea
Print("\r((((( This Program Should be Running at User Program )))))") ;
Print("\rWaiting for Program Download for EEPROM ..... ") ;
RcvDataSize = GetDataSize(CONSOLE) ; // down.c
ReceiveData((char *)EEPROM_BufferArea,RcvDataSize) ;
Print("Ok.") ;
if(CRCErrorCheck((char *)EEPROM_BufferArea,RcvDataSize)) {
Print("\rCRC check OK!\r");
Src = (U32 *)EEPROM_BufferArea;
Print("\r> EEPROM Load Address[0x00000000]_");
Dst= (U32 *)get_num(); //get_byte();
if(!Dst) Dst = (U32 *)EEPROM_WriteArea;
switch(EEPROM_Type()) {
case 1:
case 2:
case 3: Program_SST29EE(Src,Dst,RcvDataSize); break;
case 4: Program_SST29SF(Src,Dst,RcvDataSize); break;
default: Print("\rNot supported EEPROM type!!!");
}
}
else {
Print("\rCRC check FAIL!\r");
}
Print("\n\n") ;
Print("\r+--------------------------------------------+") ;
Print("\r| Press 'Reset' Button in SNDS board ....... |") ;
Print("\r+--------------------------------------------+") ;
}
/*********************************************************************
* Select EEPROM Type for Programming
*********************************************************************/
int EEPROM_Type(void)
{
int items;
Print("\n\n");
Print("+---------------------------------------------------+\r") ;
Print("| SELECT EEPROM TYPE |\r") ;
Print("+---------------------------------------------------+\r") ;
Print("| 1. SST :29EE512/29LE512/29VE512 |\r") ;
Print("| 2. SST :29EE010/29LE010/29VE010 |\r") ;
Print("| 3. SST :29EE020/29LE020/29VE020 |\r") ;
Print("| 4. SST :29SF040/29LF040/29VF040 |\r") ;
Print("+---------------------------------------------------+\r") ;
do {
Print("\r\r $$ Select EEPROM type : ");
items = get_digit();
} while((items<0)&&(items>9));
return(items);
}
/*********************************************************************
* GET DOWNLOAD PROGRAM SIZE
*********************************************************************/
unsigned GetDataSize(unsigned uart_channel)
{
int i ;
unsigned DataSize=0 ;
char RcvData[8] ;
for(i=0 ; i<8 ; i++)
{
RcvData[i] = get_char(uart_channel) ;
if ( (RcvData[i] >= '0') && (RcvData[i] <= '9') )
DataSize=(DataSize<<4) + (RcvData[i]-'0') ;
else if ( (RcvData[i] >= 'A') && (RcvData[i] <= 'F') )
DataSize=(DataSize<<4) + (RcvData[i]-'A'+ 10) ;
else if ( (RcvData[i] >= 'a') && (RcvData[i] <= 'f') )
DataSize=(DataSize<<4) + (RcvData[i]-'a'+ 10) ;
}
return DataSize ;
}
void ReceiveData(char *DownArea,unsigned RcvDataSize)
{
while(RcvDataSize--)
*DownArea++ = get_byte() ;
}
/*********************************************************************
* CRC CHECK PROGRAM
*********************************************************************/
unsigned CRCErrorCheck(char *DownArea,unsigned RcvDataSize)
{
int i ;
char RcvCRC[8] ;
unsigned CRCValue=0 ;
unsigned CheckSum=0xFFFF ;
int RcvData ;
for(i=0 ; i<8 ; i++)
{
RcvCRC[i] = get_byte() ;
if ( (RcvCRC[i] >= '0') && (RcvCRC[i] <= '9') )
CRCValue=(CRCValue<<4) + (RcvCRC[i]-'0') ;
else if ( (RcvCRC[i] >= 'A') && (RcvCRC[i] <= 'F') )
CRCValue=(CRCValue<<4) + (RcvCRC[i]-'A'+ 10) ;
else if ( (RcvCRC[i] >= 'a') && (RcvCRC[i] <= 'f') )
CRCValue=(CRCValue<<4) + (RcvCRC[i]-'a'+ 10) ;
}
//PrintReadData((char *)DownArea,RcvDataSize) ;
// Calcuration Received Data
while(RcvDataSize--)
{
RcvData = *DownArea++ ;
CheckSum = CalcCRC(CheckSum,RcvData) ;
}
if (CRCValue == CheckSum)
return(OK);
else
return(FAIL);
}
unsigned CalcCRC(unsigned CheckSum, int RcvData)
{
int j ;
for (j=0 ; j<8 ; j++)
{
CheckSum <<= 1 ;
if (RcvData & 0x0080) CheckSum^= CCITT_POLYNOM ;
RcvData <<= 1 ;
}
return CheckSum ;
}
/*********************************************************************
* MESSAGE
*********************************************************************/
void PrintReadData(char *DownArea,unsigned RcvDataSize)
{
Print("\rDownLoad Area -------- %x ",DownArea) ;
Print("\rReceived Data Size --- %d Byte",RcvDataSize) ;
/*
while(RcvDataSize--)
Print(" %c",*DownArea++) ;
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -