//LPC2132片内flash分布表
/**********************************************************************************************************************
**扇区号0 1 2 3 4 5 6 7 8 **
**规格 0000-0FFF 1000-1FFF 2000-2FFF 3000-3FFF 4000-4FFF 5000-5FFF 6000-6FFF 7000-7FFF 8000-FFFF**
**地址 4K 4K 4K 4K 4K 4K 4K 4K 32K **
***********************************************************************************************************************/
//LPC2138片内flash分布表
/**********************************************************************************************************************
**扇区号0 1 2 3 4 5 6 7 8 9 ... **
**规格 0000-0FFF 1000-1FFF 2000-2FFF 3000-3FFF 4000-4FFF 5000-5FFF 6000-6FFF 7000-7FFF 8000-FFFF 8000-FFFF**
**地址 4K 4K 4K 4K 4K 4K 4K 4K 32K 32K ... **
***********************************************************************************************************************/
#include "config.h"
char chipflag;
/********************************************************************************************
**函数名称 : CmdSendandRecvCheck
**输入参数 : sentbuf,指向待发送数据指针
** recvbuf,指向对收到数据进行比较的指针
** len,待收数据的长度
**输出参数 : 执行成功返回零值,否则返回大于零的值
**功能描述 : 发送命令和校验和
**创 建 人 :
**创建日期 :2010-09-01
**注意事项 :
**------------------------------修改日志---------------------------------
**修 改 人 : 修改日期 : 修改说明 :
*********************************************************************************************/
char CmdSendandRecvCheck(TTY_INFO*ptty,char *sentbuf,char*recvAckbuf)
{
unsigned int rCnt,sentLen,recLen,realRecvLen;
char realRecvBuf[100];
rCnt=0;
sentLen=0;
recLen=0;
realRecvLen=0;
/*发送命令*/
sentLen=strlen(sentbuf);
if(sentLen!=sendnTTY(ptty,sentbuf,sentLen))
{
if((0x3F==sentbuf[0])&&(1==sentLen))
{/*发送"?"出错,单独处理*/
syslog(LOG_INFO,"BMCIsp-->%s:SendnTTY(?) err\n\r",__func__);
return SENT_UPDATE_CMD_ERR;
}
/*截除\n\r*/
sentbuf[sentLen-2]='\0';
syslog(LOG_INFO,"BMCIsp-->%s:SendnTTY(%s) err\n\r",__func__,sentbuf);
return SENT_UPDATE_CMD_ERR;
}
/*接收响应*/
recLen=strlen(recvAckbuf);
realRecvLen = recvnTTY(ptty,realRecvBuf,recLen);
if(realRecvLen<recLen)
{/*超时*/
return RECEIVEE_CMD_ACK_TIMOUT;
}
realRecvBuf[realRecvLen]='\0';
//读器件ID单独处理
if(0==strcmp(sentbuf,"J\r\n"))
{
if(0==strcmp(realRecvBuf,"J\r\n0\r\n196369\r\n"))
{
chipflag=CHIPLPC2132;
return 0;
}
else if(0==strcmp(realRecvBuf,"J\r\n0\r\n196389\r\n"))
{
chipflag=CHIPLPC2138;
return 0;
}
else
{
return RECEIVEE_CMD_UNMATCH;
}
}
else
{
if(0!=strcmp(realRecvBuf,recvAckbuf))
{
/*截除\n\r*/
syslog(LOG_INFO,"BMCIsp-->%s:RecvnTTY(%s)ACK err\n\r",__func__,sentbuf);
return RECEIVEE_CMD_UNMATCH;
}
return 0;
}
}
/********************************************************************************************
**函数名称 : SendDataToFlash
**输入参数 : sentbuf,指向待发送数据指针
** recvbuf,指向对收到数据进行比较的指针
** len,待收数据的长度
**输出参数 : 执行成功返回零值,否则返回大于零的值
**功能描述 : 发送升级数据
**创 建 人 :
**创建日期 :2010-09-01
**注意事项 :
**------------------------------修改日志---------------------------------
**修 改 人 : 修改日期 : 修改说明 :
*********************************************************************************************/
char SendDataToFlash(TTY_INFO*ptty,char *databuf,unsigned int len)
{
unsigned int i,rCnt,realRecvLen;
char realRecvBuf[100];
if(len!=sendnTTY(ptty,databuf,len))
{
syslog(LOG_INFO,"BMCIsp-->%s:SendnTTY(ENCODE DATA) err\n\r",__func__);
return SENT_ENCODE_DATA_ERR;
}
/*接收响应*/
realRecvLen = recvnTTY(ptty,realRecvBuf,len);
if(realRecvLen<len)
{/*超时*/
return RECEIVEE_CMD_ACK_TIMOUT;
}
realRecvBuf[realRecvLen]='\0';
for(i=0;i<len;i++)
{
if(realRecvBuf[i]!=databuf[i])
{
syslog(LOG_INFO,"BMCIsp-->%s:RecvnTTY(DATA)ACK err\n\r",__func__);
return RECEIVEE_ACK_DATA_UNMATCH;
}
}
return 0;
}
/********************************************************************************************
**函数名称 : ProgramFlash
**输入参数 : ptty,指向要使用的串口指针
** sBuf ,指向待写入flash数据的指针
** len,bin数据的长度
**输出参数 : 执行成功返回零值,否则返回大于零的值
**功能描述 : 向flash写入升级程序
**创 建 人 :
**创建日期 :2010-09-01
**注意事项 :
**------------------------------修改日志---------------------------------
**修 改 人 : 修改日期 : 修改说明 :
*********************************************************************************************/
char ProgramFlash(TTY_INFO*ptty,unsigned char *Buf,unsigned int len)
{
char sentStr[100];
char ackStr[100];
char outbuf[256];//输出缓冲区
unsigned int xLen;//xLen=bin数据长度,rLen=串口读取到的字符数
unsigned char i,blockNum;//记录程序需要使用的扇区数
unsigned char dataCnt;//记录程序烧写的块号
unsigned char*sBuf;//指向待写入flash数据的指针
int linelen;//记录构成一个uu编码行的字符长度
int linecnt;//记录编码到第几个字符
int iSect=0;//记录flash编程扇区号
int tmpSect=0;//记录flash编程扇区号
int stringlen;//字符串长度
float tmp;
unsigned long iPos=0;
unsigned long xCrc=0;//检验和
int oPos=0;
xLen=len;
sBuf=Buf;
dataCnt=0;
printf("Synchronizing with bmc/bcb.\r");
fflush(stdout);
/*发送一个同步字符"?〃0x3F并等待响应*/
sentStr[0]=0x3F;
sentStr[1]='\0';
strcpy(ackStr,"Synchronized\r\n");
if(CmdSendandRecvCheck(ptty,sentStr,ackStr))
{
syslog(LOG_INFO,"BMCIsp-->%s:Bmc/Bcb no ACK\n\r",__func__);
printf("Synchronizing with bmc/bcb.........[Failed]\n\r");
return CMD_SEND_NO_RECIVE_ACK;
}
printf("Synchronizing with bmc/bcb..\r");
fflush(stdout);
/*主机发送同步字("Synchronized\r\n"),
*接收响应("Synchronized<CR><LF>OK<CR><LF>")
*/
strcpy(sentStr,"Synchronized\r\n");
strcpy(ackStr,"Synchronized\r\nOK\r\n");
if(0!=CmdSendandRecvCheck(ptty,sentStr,ackStr))
{
return CMD_SEND_AND_RECIVE_CHECK_ERR;
}
//usleep(800000);
printf("Synchronizing with bmc/bcb...\r");
fflush(stdout);
/*发送正在运行部分的晶振频率25MHz,(25000<CR><LF>)
*接收响应(25000<CR><LF>OK<CR><LF>)
*/
strcpy(sentStr,"25000\r\n");
strcpy(ackStr,"25000\r\nOK\r\n");
if(0!=CmdSendandRecvCheck(ptty,sentStr,ackStr))
{
return CMD_SEND_AND_RECIVE_CHECK_ERR;
}
//usleep(800000);
printf("Synchronizing with bmc/bcb....\r");
fflush(stdout);
/*发送U 23130解锁,(U 23130<CR><LF>)
*接收响应(U 23130<CR><LF>0<CR><LF>)
*/
strcpy(sentStr,"U 23130\r\n");
strcpy(ackStr,"U 23130\r\n0\r\n");
if(0!=CmdSendandRecvCheck(ptty,sentStr,ackStr))
{
return CMD_SEND_AND_RECIVE_CHECK_ERR;
}
//usleep(800000);
printf("Synchronizing with bmc/bcb.....\r");
fflush(stdout);
/*发送J读器件标识,(J<CR><LF>)
*接收响应(J<CR><LF>0<CR><LF>X<CR><LF>)
*/
strcpy(sentStr,"J\r\n");
strcpy(ackStr,"J\r\n0\r\n196369\r\n");
if(0!=CmdSendandRecvCheck(ptty,sentStr,ackStr))
{
return CMD_SEND_AND_RECIVE_CHECK_ERR;
}
/*lpc2132片内flash最大为64k,lpc2138片内flash最大为512k*/
if(CHIPLPC2132==chipflag)
{
if((xLen/1024)>64)
{
syslog(LOG_INFO,"BMCIsp-->%s:Over flash volume\n\r",__func__);
DEBUG_OUT("\n\rOver flash volume");
return UPDATE_FILE_OVER_FLASH_VOLUME;
}
}
else if(CHIPLPC2138==chipflag)
{
if((xLen/1024)>512)
{
syslog(LOG_INFO,"BMCIsp-->%s:Over flash volume\n\r",__func__);
DEBUG_OUT("\n\rOver flash volume");