⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main_.c

📁 一款交换机BSP开发代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		if (!UART_Get_Char1(&xcsum))
			return -1;

#ifdef _XMODEM_DEBUG
		Mtrace("*");
#endif

		csum = 0;
		for(i=0;i<xip->pktlen;i++)
			csum += *pkt++;
		if (csum != xcsum) {
			UART_Put_Char(CAN);

#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 *main_ver, char *boot_ver)
{
	//pc_cb:
	//CB:表示BOOT层升级导致CODE层软件版本升级的CODE 层版本域
	//cf_bc:
	//BC:表示BOOT层软件由BS或BH两域升级导致CODE层升级的BOOT层域
	//data_kind:表示该程序是何种程序,这部分字段可以为BOOT、CODE、FILE、DATA
	
	char pc_cb[2], cf_bc[2], data_kind[5];
	int ver_pc, ver_cf, i;

	// verify version info
	for( i=0; i<4; i++)
		data_kind[i] = main_ver[12+i];
		
	data_kind[4] = '\0';
	
	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 ver,获取版本字段
	pc_cb[0] = main_ver[19];
	pc_cb[1] = main_ver[20];
	ver_pc = pc_cb[0] * 10 + pc_cb[1];
	cf_bc[0] = boot_ver[22];
	cf_bc[1] = boot_ver[23];
	ver_cf = cf_bc[0] * 10 + cf_bc[1];
	
	// PC >= CF -- download
	if( ver_pc >= ver_cf)
		return 1;
	else
		return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -