📄 main.c.bak
字号:
#ifdef _XMODEM_DEBUG
Mtrace("2");
Mtrace("2 %02x != %02x",csum,xcsum);
#endif
return(-1);
}
}
if ((UCHAR)seq[0] != xip->sno) {
if ((xip->sno == 0x02) && (seq[0] == 0x01)) { /* TeraTerm has a */
xip->sno = 0x01; /* "peculiarity". */
#ifdef _XMODEM_DEBUG
Mtrace("--TERABUG--");
#endif
goto teratermbug;
}
UART_Put_Char(CAN);
#ifdef _XMODEM_DEBUG
Mtrace("3 %02x != %02x",seq[0],xip->sno);
#endif
return(-1);
}
teratermbug:
if ((UCHAR)seq[1] != (UCHAR)~(xip->sno)) {
UART_Put_Char(CAN);
#ifdef _XMODEM_DEBUG
Mtrace("4 %02x != %02x",seq[1],(UCHAR)~(xip->sno));
#endif
return(-1);
}
/* First packet of YMODEM contains informaiton about the transfer: */
/* FILENAME SP FILESIZE SP MOD_DATE SP FILEMODE SP FILE_SNO */
/* Only the FILENAME is required and if others are present, then none */
/* can be skipped. */
if ((xip->flags & YMODEM) && (xip->pktcnt == 0)) {
/* char *slash, *space, *fname;
slash = (char *)strrchr((char *)(xip->dataddr),'/');
space = (char *)strchr((char *)(xip->dataddr),' ');
if (slash)
fname = slash + 1;
else
fname = (char *)(xip->dataddr);
#ifdef _XMODEM_DEBUG
Mtrace("<fname=%s>",fname);
#endif
if (space) {
*space = 0;
xip->size = atoi(space+1);
}
// strcpy(xip->fname,fname);
if (fname[0])
xip->filcnt++;
*/ }
else
xip->dataddr += xip->pktlen;
xip->sno++;
xip->pktcnt++;
xip->xfertot += xip->pktlen;
UART_Put_Char(ACK);
/* if (xip->flags & YMODEM) {
if (xip->fname[0] == 0) {
#ifdef _XMODEM_DEBUG
Mtrace("\nRcvd %d file%c\n",
xip->filcnt,xip->filcnt > 1 ? 's' : ' ');
#endif
return(1);
}
}
*/ return(0);
}
/* Xup():
* Called when a transfer from target to host is being made (considered
* an upload).
*/
static int
Xup(struct xinfo *xip)
{
UCHAR c, *buf;
int done, pktlen,retry=0;
long actualsize;
buf = (UCHAR *)packetbuf;
#ifdef _XMODEM_DEBUG
Mtrace("Xup starting");
#endif
actualsize = xip->size;
if (xip->size & 0x7f) {
xip->size += 128;
xip->size &= 0xffffff80L;
}
#ifdef _XMODEM_DEBUG
Mtrace("Upload %ld bytes from 0x%lx\n",xip->size,(ULONG)xip->base);
#endif
Restart:
retry ++;
if( retry > 4 )
return -1;
/* Startup synchronization... */
/* Wait to receive a NAK or 'C' from receiver. */
done = 0;
while(!done) {
c = 0;
UART_Get_Char1(&c);
switch(c) {
case NAK:
done = 1;
#ifdef _XMODEM_DEBUG
Mtrace("CSM");
#endif
break;
case 'C':
xip->flags |= USECRC;
done = 1;
#ifdef _XMODEM_DEBUG
Mtrace("CRC");
#endif
break;
case 'q': /* ELS addition, not part of XMODEM spec. */
return(0);
default:
break;
}
}
if (xip->flags & YMODEM) {
#ifdef _XMODEM_DEBUG
Mtrace("SNO_0");
#endif
xip->sno = 0;
memset((char *)buf,0,PKTLEN_128);
strcpy((char *)buf,Ctrl_fname);
// sprintf((char *)buf,"%s",xip->fname);
pktlen = xip->pktlen;
xip->pktlen = PKTLEN_128;
putPacket(buf,xip);
xip->pktlen = pktlen;
}
done = 0;
xip->sno = 1;
xip->pktcnt = 0;
while(!done) {
c = 0;
c = (UCHAR)putPacket((UCHAR *)(xip->dataddr),xip);
switch(c) {
case ACK:
xip->sno++;
xip->pktcnt++;
xip->size -= xip->pktlen;
xip->dataddr += xip->pktlen;
#ifdef _XMODEM_DEBUG
Mtrace("A");
#endif
break;
case NAK:
#ifdef _XMODEM_DEBUG
Mtrace("N");
#endif
//putPacket again
goto Restart;
break;
case CAN:
done = 1;
#ifdef _XMODEM_DEBUG
Mtrace("C");
#endif
//putPacket again
goto Restart;
break;
case EOT:
done = 1;
#ifdef _XMODEM_DEBUG
Mtrace("E");
#endif
break;
default:
done = 1;
#ifdef _XMODEM_DEBUG
Mtrace("<%2x>",c);
#endif
//putPacket again
goto Restart;
break;
}
if (xip->size <= 0) {
UART_Put_Char(EOT);
UART_Get_Char1(&c); /* Flush the ACK */
break;
}
#ifdef _XMODEM_DEBUG
Mtrace("!");
#endif
}
#ifdef _XMODEM_DEBUG
Mtrace("Xup_almost");
#endif
if (xip->flags & YMODEM) {
xip->sno = 0;
xmodemstart = 1;
memset((char *)buf,0,PKTLEN_128);
pktlen = xip->pktlen;
xip->pktlen = PKTLEN_128;
putPacket(buf,xip);
xip->pktlen = pktlen;
}
#ifdef _XMODEM_DEBUG
Mtrace("Xup_done.");
#endif
return(0);
}
/* Xdown():
* Called when a transfer from host to target is being made (considered
* an download).
*/
#define RETRY_TIMES 10
static int
Xdown(struct xinfo *xip)
{
extern int LoopsPerSecond;
long timeout;
char c, *tmppkt;
int done;
int ret=0,retry=0;
// tmppkt = malloc(PKTLEN_1K);
// if (!tmppkt) {
// Mtrace("malloc failed");
// return(-1);
// }
tmppkt = packetbuf;
nextfile:
if (xip->flags & YMODEM)
xip->sno = 0x00;
else
xip->sno = 0x01;
xip->pktcnt = 0;
xip->errcnt = 0;
xip->xfertot = 0;
xip->firsterrat = 0;
/* Startup synchronization... */
/* Continuously send NAK or 'C' until sender responds. */
restart:
#ifdef _XMODEM_DEBUG
Mtrace("Xdown");
#endif
while(1) {
if (xip->flags & USECRC)
UART_Put_Char('C');
else
UART_Put_Char(NAK);
timeout = LoopsPerSecond;
while(!UART_Data_Ready() && timeout)
timeout--;
if (timeout)
break;
}
done = 0;
#ifdef _XMODEM_DEBUG
Mtrace("Got response");
#endif
while(done == 0) {
//clear char
c = 0;
ret = UART_Get_Char1((UCHAR *)&c);
if( ret == 0 )//get char failure
{
UART_Put_Char(ACK);
continue;
}
switch(c) {
case SOH: /* 128-byte incoming packet */
#ifdef _XMODEM_DEBUG
Mtrace("O");
#endif
xip->pktlen = 128;
done = getPacket((UCHAR *)tmppkt,xip);
//get packet fail
if( done == -1 )
{
retry ++;
if( retry == RETRY_TIMES )
break;
goto restart;
}
if (!done && (xip->pktcnt == 1) && (xip->flags & YMODEM))
goto restart;
break;
case STX: /* 1024-byte incoming packet */
#ifdef _XMODEM_DEBUG
Mtrace("T");
#endif
xip->pktlen = 1024;
done = getPacket((UCHAR *)tmppkt,xip);
if (!done && (xip->pktcnt == 1) && (xip->flags & YMODEM))
goto restart;
break;
case CAN:
#ifdef _XMODEM_DEBUG
Mtrace("C");
#endif
done = -1;
break;
case EOT:
#ifdef _XMODEM_DEBUG
Mtrace("E");
#endif
UART_Put_Char(ACK);
if (xip->flags & YMODEM) {
if (!xip->size)
xip->size = xip->pktcnt * xip->pktlen;
// if (xip->fname[0])
// tfsadd(xip->fname,0,0,(UCHAR *)xip->base,xip->size);
// Write yo flash
xip->dataddr = xip->base;
goto nextfile;
}
else {
done = xip->xfertot;
// Mtrace("\nRcvd %d pkt%c (%d bytes)\n",xip->pktcnt,
// xip->pktcnt > 1 ? 's' : ' ',xip->xfertot);
}
break;
case ESC: /* User-invoked abort */
#ifdef _XMODEM_DEBUG
Mtrace("X");
#endif
done = -1;
break;
default:
#ifdef _XMODEM_DEBUG
Mtrace("<%02x>",c);
#endif
done = -1;
break;
}
#ifdef _XMODEM_DEBUG
Mtrace("!");
#endif
retry = 0;
}
// if (xip->flags & VERIFY) {
// if (xip->errcnt)
// printf("%d errors, first at 0x%lx\n",
// xip->errcnt,(ULONG)(xip->firsterrat));
// else
// printf("verification passed\n");
// }
// free(tmppkt);
return(done);
}
unsigned long comp_ver( char *ctrl_ver, char *boot_ver )
{
//BOOT version:BH-BS-BC
//BH:表示硬件版本升级导致软件版本升级的BOOT层软件版本域
//BS:表示由软件本身或用户需求导致升级的BOOT层软件版本域
//BC:表示BOOT层软件由BS或BH两域升级导致CTRL层升级的BOOT层域
//CTRL verision:CH-CC-CU
//CH:表示硬件升级导致CTRL层软件版本升级的CTRL层版本域
//CC:表示CTRL层软件本身升级或 BOOT层升级导致CTRL层软件版本升级的CTRL 层版本域
//CU:表示由于CTRL层软件升级导致USER层软件版本升级的CTRL层软件版本域
//满足下列条件方可下装:CH==BH && CC>=BC
char file_ver[2], switch_ver[2], data_kind[5];
int ver_file, ver_switch, i;
data_kind[4] = 0;
// verify version info
for( i=0; i<4; i++)
data_kind[i] = ctrl_ver[12+i];
if( strcmp( data_kind, "CTRL" ) != 0)
return 0;
for( i=0; i<4; i++)
data_kind[i] = boot_ver[12+i];
data_kind[4] = '\0';
if( strcmp( data_kind,"BOOT" ) != 0)
return 0;
// get hardware version
file_ver[0] = ctrl_ver[16]-'0';
file_ver[1] = ctrl_ver[17]-'0';
ver_file = file_ver[0] * 10 + file_ver[1];
switch_ver[0] = boot_ver[16]-'0';
switch_ver[1] = boot_ver[17]-'0';
ver_switch = switch_ver[0] * 10 + switch_ver[1];
// CH == BH -- download
if( ver_file != ver_switch )
return 0;
// get software version
file_ver[0] = ctrl_ver[19]-'0';
file_ver[1] = ctrl_ver[20]-'0';
ver_file = file_ver[0] * 10 + file_ver[1];
switch_ver[0] = boot_ver[22]-'0';
switch_ver[1] = boot_ver[23]-'0';
ver_switch = switch_ver[0] * 10 + switch_ver[1];
// CC >= BC -- download
if( ver_file >= ver_switch )
return 1;
else
return 0;
}
void init_uart(void)
{
UART_INIT uart_init;
// 初始化uart2
uart_init.com_port = UART2;
uart_init.baud_rate = 57600;
uart_init.data_bits = DATA_BITS_8;
uart_init.stop_bits = STOP_BITS_1;
uart_init.parity = PARITY_NONE;
uart_init.data_mode = MODE_NORMAL;
uart_init.vect = 64;
UART_Init_Port(&uart_init);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -