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

📄 load.c

📁 一款交换机BSP开发代码
💻 C
字号:
#include<stdio.h>
#include<bios.h>
#include<dos.h>
#include<string.h>
#include<process.h>
#include<conio.h>
#include<io.h>

void interrupt ( *oldint)(void);

#define CRC32_POLY 0x04c11db7L     /* AUTODIN II, Ethernet, & FDDI */

unsigned long crc32_table[256];

void init_CRC32(void);
unsigned long CRC32(unsigned char *buf, unsigned long len);

void write_port (char data);
char read_port(void);
int read_port1(char *dat);
void set_exit(void);
void set_bps(int bps);
void handshake(void);
int wait_status(char);
void hang_modem(void);
void setmodembps(int);
void getport(int p);
int Check_Name( char *filename);

int port;
unsigned char buff[0x1100],mask1;
unsigned int read_p,write_p;
char *bv1[2]={
"STAR-S1924F-BOOT",
"STAR-S1924F-CTRL"
};

int cmd_type,file_type,com_type;

void interrupt int_232()
{
	buff[write_p++]=inportb(port);
	outp(0x20,0x20);
}

void main(int argc,char *argv[])
{
	unsigned char *ptr,filename[256],file_flag,buf[100],recv[0x1010];
	int i,j,frame,errortimes;
	FILE    *fp;
	unsigned long tempCRC,filelen,len,num,l;
	unsigned char CRCIndex;

	if(argc < 2)
	{
Input_Error:
		printf(	"Download file.\n"
			"\n"
			//"LOAD [/D] [/C1 | /C2] source \n"
			"LOAD filename [/C1 | /C2] \n"
			//"LOAD /U[B|C|D|F] [/C1 | /C2] destination \n"
			"\n"
			"filename		Specifies the file to be downloaded.\n"
			//"/D		Indicates download.\n"
			"/C1			Indicates com1.\n"
			"/C2			Indicates com2.\n"
			"Default to use com1.\n"
			//"destination	Specifies the file to be uploaded.\n"
			//"/UB		Indicates upload boot code.\n"
			//"/UC		Indicates upload ctrl program.\n"
			//"/UM		Indicates upload main program.\n"
			//"/UD		Indicates upload record data.\n"
			//"/UF		Indicates upload web files.\n"
			//"\n"
			//"The switch /D may be absent when downloading,but the switch /U must be present \nwhen uploading.\n"
			);
			return;
	}
	file_flag = 0;
	i = 1;
	while(i != argc)
	{
		ptr = argv[i];
		if(ptr[0] == '/')
		{
			if(ptr[1] == 'D' || ptr[1] == 'd')
				cmd_type = 0;		// download
			else if(ptr[1] == 'U' || ptr[1] == 'u')
			{
				cmd_type = 1;		// upload
				switch(ptr[2])
				{
					case 'B':
					case 'b':
						file_type = 1;
						break;
					case 'C':
					case 'c':
						file_type = 2;
						break;
					case 'D':
					case 'd':
						file_type = 3;
						break;
					case 'F':
					case 'f':
						file_type = 4;
						break;
					case 'M':
					case 'm':
						file_type = 5;
						break;
					default:
						goto Input_Error;
				}
			}
			else if(ptr[1] == 'C' || ptr[1] == 'c')
			{
				if(ptr[2] == '1')
					com_type = 1;
				else if(ptr[2] == '2')
					com_type = 2;
				else goto Input_Error;
			}
		}
		else if(file_flag == 0)
		{
			if(strstr(ptr,".bin") != NULL)
			{
				file_flag = 5;
				strcpy(filename,ptr);
			}
			else if(strstr(ptr ,".dat") != NULL)
			{
				strcpy(filename,ptr);
				file_flag = 3;
			}
			else if(strstr(ptr ,".fil") != NULL)
			{
				strcpy(filename,ptr);
				file_flag = 4;
			}
			else if(strstr(ptr ,".boo") != NULL)
			{
				strcpy(filename,ptr);
				file_flag = 1;
			}
			else if (strstr(ptr,".ctr") != NULL)
			{
				strcpy(filename,ptr);
				file_flag = 2;
			}
		}
		else goto Input_Error;
		i ++;
	}

	if(file_flag == 0) goto Input_Error;
	if( com_type != 2) com_type = 1;
	if( cmd_type != 1) cmd_type = 0;

	if( cmd_type == 1)
		fp = fopen(filename,"wb");
	else
		fp = fopen(filename,"rb");

	if( fp == NULL)
	{
		printf("File not found: %s\n",filename);
		return;
	}

	printf("STAR SWITCH DOWNLOAD&UPLOAD PROGRAM V1.0");
	printf("\nSTAR NETWORKS TECHNOLOGY CO. LTD.,(C)Copyright 1995,2000\n");

	if( cmd_type == 1)
	{
		getport(com_type);
		set_bps(3);		// 57600BPS

		while((inportb(port+5))&1)
			inportb(port);
		outportb(port+1,1);     /*enable receive interrupt */

		delay(500);

		printf("Start upload ...\n");
		printf("Handshake ");

		write_p=read_p=0;		// clear receive buf

		while(1)
		{
			buf[0] = 0x50;
			if(file_type == 1)
				buf[1] = 0x40;
			else if(file_type == 2)
				buf[1] = 0x41;
			else if(file_type == 3)
				buf[1] = 0x42;
			else if(file_type == 4)
				buf[1] = 0x43;
			else if(file_type == 5)
				buf[1] = 0x44;
			else
				buf[1] = 0;
			tempCRC = CRC32(buf,2);

			ptr = (unsigned char *)&tempCRC;

			write_port(buf[0]);
			write_port(buf[1]);
			write_port(ptr[3]);
			write_port(ptr[2]);
			write_port(ptr[1]);
			write_port(ptr[0]);

			for (i = 0; i < 10; i ++)	//1S
			{
				delay(100);
				if( read_p != write_p) 	// receive buf not empty
				{
					recv[0] = read_port();
					if(recv[0] == 0x06)
						break;
				}
			}
			if( i != 10) break;
			if( kbhit())
			{
				if( getch() == 0x1b )		// ESC
				{
					printf("\n Upload has been cancled!");
					fclose(fp);
					set_exit();
				}
			}
			printf(".");
		}
		printf("ok!\n");

		// Receive upload frame
		frame = 1;
		while(1)
		{
			printf("frame %d ",frame++);
			filelen = 0;
			for(i = 0; i < 16; i ++)
			{
				errortimes = 0;
Retry_Frame:
				while(read_port() != 0x02);
				recv[0] = read_port();
				recv[1] = read_port();
				len = recv[0]*0x100 + recv[1];

				if(len > 0x1000)
				{
					printf("\nFrame length Error: %lx",len);
					write_port(0x15);
					fclose(fp);
					set_exit();
				}

				tempCRC = 0xffffffffL;
				num = 0;
				while(len--)
				{
					if(read_port1(recv+num)) break;
					tempCRC = (tempCRC << 8) ^crc32_table[(tempCRC >> 24) ^ recv[num]];
					num ++;
				}

				if( len == 0xffffffff)
				{
					for ( j = 0; j < 4 ; j ++)
					{
						read_port1(buf+j);
						tempCRC = (tempCRC << 8) ^crc32_table[(tempCRC >> 24) ^ buf[j]];
					}
				}
				else
				{
//					printf("len%lx,",len);
					tempCRC = 1;
				}

				if( tempCRC)
				{
					errortimes ++;
					if( errortimes < 5)
					{
						write_p=read_p=0;
						write_port(0x16);
						goto Retry_Frame;
					}
					printf("\n Upload check CRC Error!\n");
					write_port(0x15);
					fclose(fp);
					set_exit();
				}
				else
				{
					if(fwrite(recv,1,num,fp) != num)
					{
						printf("Write Error : %d,%x",i,num);
					}
					filelen += num;
					recv[0]=read_port();
					if (recv[0]==0x17)
						printf(".");
					write_p=read_p=0;
					write_port(0x05);
					if (recv[0]==0x03)
					{
						printf("%ld bytes ok!\nUpload ok!\n",filelen);
						fclose(fp);
						set_exit();
					}
				}
			}
			printf("65536 bytes ok!\n");
		}
	}
	else
	{
		if(Check_Name(filename))
		{
			fclose(fp);
			return;
		}
//		file_type = 1;
		getport(com_type);
		set_bps(3);		// 57600BPS

		while((inportb(port+5))&1)
			inportb(port);
		outportb(port+1,1);     /*enable receive interrupt */

		delay(500);

		printf("Start download ...\n");
		printf("Handshake ");

		write_p=read_p=0;		// clear receive buf

		while(1)
		{
			buf[0] = 0x50;
			if(file_type == 1)
				buf[1] = 0x30;
			else if(file_type == 2)
				buf[1] = 0x31;
			else if(file_type == 3)
				buf[1] = 0x32;
			else if(file_type == 4)
				buf[1] = 0x33;
			else if(file_type == 5)
				buf[1] = 0x34;
			else
				buf[1] = 0;

			tempCRC = CRC32(buf,2);

			ptr = (unsigned char *)&tempCRC;

			write_port(buf[0]);
			write_port(buf[1]);
			write_port(ptr[3]);
			write_port(ptr[2]);
			write_port(ptr[1]);
			write_port(ptr[0]);

			for (i = 0; i < 10; i ++)	//1S
			{
				delay(100);
				if( read_p != write_p) 	// receive buf not empty
				{
					recv[0] = read_port();
					if(recv[0] == 0x50)
						break;
				}
			}
			if( i != 10) break;
			if( kbhit())
			{
				if( getch() == 0x1b )		// ESC
				{
					printf("\n Download has been cancled!");
					fclose(fp);
					set_exit();
				}
			}
			printf(".");
		}
		printf("ok!\n");

		for( i = 0; i < 48; i ++)
			recv[i] = read_port();
		recv[48] = 0;
		printf("Switch Version: %s\n",recv);
		if(file_type == 1)
		{
			// boot file
			fseek(fp,0x8,SEEK_SET);
			fread(buf,1,48,fp);
			buf[48] = 0;
		}
		else if(file_type == 2)
		{
			// ctrl file
			fseek(fp,0x400,SEEK_SET);
			fread(buf,1,48,fp);
			buf[48] = 0;
		}
		else if(file_type == 5)
		{
			// main file
			fseek(fp,0x400,SEEK_SET);
			fread(buf,1,48,fp);
			buf[48] = 0;
		}
		printf("File Version: %s\n",buf);
		fseek(fp,0,SEEK_SET);

		if(file_type == 1)
		{
			// BOOT code
			if ((recv[12] == 'S') ||( recv[12] == 's'))
			{
				// switch:startup
			}
			else
			{
				write_port(0x15);
				printf("Version Error!\n");
				fclose(fp);
				set_exit();
			}
		}
		else if(file_type == 2)
		{
			// CTRL code
			if ((recv[12] == 'B') ||( recv[12] == 'b'))
			{	// switch:BOOT
				// file ver
				i = buf[16] * 0x10 + buf[17];
				// switch ver
				j = recv[19] * 0x10 + recv[20];
			}
			else if ((recv[12] == 'C') ||( recv[12] == 'c'))
			{
				// switch:CTRL
				// file ver
				i = buf[16] * 0x10 + buf[17];
				// switch ver
				j = recv[16] * 0x10 + recv[17];
			}
			else
			{
				i = 2;
				j = 1;
			}

			if ( i < j )
			{
				write_port(0x15);
				printf("Version Error!\n");
				fclose(fp);
				set_exit();
			}
		}
		else if(file_type == 5)
		{
			// Main code
			if ((recv[12] == 'C') || ( recv[12] == 'c'))
			{	// switch:ctrl
				// file ver
				i = buf[16] * 0x10 + buf[17];
				// switch ver
				j = recv[19] * 0x10 + recv[20];
			}
			else if((recv[12] == 'M') || ( recv[12] == 'm'))
			{	// switch:main
				// file ver
				i = buf[16] * 0x10 + buf[17];
				// switch ver
				j = recv[16] * 0x10 + recv[17];
			}
			else
			{
				i = 2;
				j = 1;
			}

			if ( i < j )
			{
				write_port(0x15);
				printf("Version Error!\n");
				fclose(fp);
				set_exit();
			}
		}

		write_port(0x06);	// Version OK
		write_p= read_p = 0;

		// Send download frame
		frame = 1;
		filelen = filelength(fileno(fp));
		while(filelen)
		{
			printf("frame %d ",frame++);
			l = 0;
			write_port(0x02);
			if(filelen >=0x10000L)
			{
				write_port(0x00);
				write_port(0x00);
				filelen -= 0x10000L;
				len = 0x10000L;
			}
			else
			{
				len = filelen;
				filelen = 0;
				write_port(len/0x100);
				write_port(len%0x100);
			}
			l = len;

			tempCRC = 0xffffffffL;
			num = 0;
			while(len--)
			{
				fread(recv,1,1,fp);
				write_port(recv[0]);
				tempCRC = (tempCRC << 8) ^crc32_table[(tempCRC >> 24) ^ recv[0]];
				num ++;
				if(num >= 0x1000)
				{
					printf(".");
					num = 0;
				}
			}

			ptr = (unsigned char *)&tempCRC;    	// Send CRC
			write_port(ptr[3]);
			write_port(ptr[2]);
			write_port(ptr[1]);
			write_port(ptr[0]);

			if(filelen == 0) write_port(0x03);
			else write_port(0x17);
			delay(100);
			recv[0] = read_port();
			while(recv[0]!=0x15 && recv[0]!=0x05 && recv[0] != 0x12) recv[0]=read_port();

			if(recv[0]==0x15) {
				printf("\nDownload check CRC Error!\n");
				fclose(fp);
				set_exit();
			}
			else if(recv[0] == 0x12)
			{
				printf("\nFile Write Error!\n");
				fclose(fp);
				set_exit();
			}
			printf("%ld bytes ok!\n",l);
		}
		printf("Download ok!\n");
		fclose(fp);
		set_exit();
	}
}

void set_exit(void)
{
	set_bps(1);	// 9600

	if( com_type == 1)	// restore INTERRUPT
		setvect(0x0c, oldint);
	else
		setvect(0x0b, oldint);

	outportb(0x21,mask1);	// restore
	exit(1);
}

void set_bps(int bps)
{
unsigned char c;
	switch (bps)
	{
	  case 1:
	    c=0x0c;
	    break;      /*9600*/
	  case 2:
	    c=0x04;
	    break;      /*28800*/
	  case 3:
	    c=0x02;
	    break;      /*57600*/
	  case 4:       // 115200
	    c = 0x01;
	    break;
	}
	       outportb(port+3,0x80);/*1->DLAB*/
	       outportb(port,c);/*set bps low bits*/
	       outportb(port+1,0);/*set bps high bits*/
	       outportb(port+3,0x03);
	       outportb(port+1,0);
	       outportb(port+4,0x0b);
}

void write_port(char data)
{
	while(!((inportb(port+5))&0x20));
	outportb(port,data);
}

char read_port(void)
{
	int i;
	while(1)
	{
	  if (read_p!=write_p)
	    break;
	  if (kbhit())
	  {
	    if (getch()==0x1b)
	      set_exit();
	  }
	}
	return(buff[read_p++]);
}

int read_port1(char *dat)
{
	int i;
	for( i = 0 ;i < 1000; i ++)
	{
		if (read_p!=write_p)
		{
			*dat = buff[read_p++];
			return 0;
		}
		delay(1);
	}
	return 1;
}

void getport(int p)		// init com1/com2
{
	char mask;
	switch(p)
	{
		case 1:
		port=0x3f8;
			mask=0xef;     /* open IRQ4(COM1) */
			oldint = getvect(0x0c);
			setvect(0x0c,int_232);
			break;
		case 2:
			port=0x2f8;
			mask=0xf7;     /* open IRQ3(COM2) */
			oldint = getvect(0x0b);
			setvect(0x0b,int_232);
			break;
	}
	mask1=inp(0x21);
	outp(0x21,mask1&mask); /* 11100111 76543210 */
	read_p=0;
	write_p=0;
}

/* Initialized first time "crc32()" is called. If you prefer, you can
 * statically initialize it at compile time. [Another exercise.]
 */

unsigned long CRC32(unsigned char *buf, unsigned long len)
{
	unsigned char *p;
	unsigned long  crc;

	if (!crc32_table[1])    /* if not already done, */
		init_CRC32();   /* build table */
	crc = 0xffffffffL;       /* preload shift register, per CRC-32 spec */
	for (p = buf; len > 0; ++p, --len)
		crc = (crc << 8) ^ crc32_table[(crc >> 24) ^ *p];
	return crc;            /* transmit complement, per CRC-32 spec */
}

/*
 * Build auxiliary table for parallel byte-at-a-time CRC-32.
 */

void init_CRC32(void)
{
	int i, j;
	unsigned long c;

	for (i = 0; i < 256; ++i) {
		for (c =((unsigned long) i) << 24, j = 8; j > 0; --j)
		{
			c = (c & 0x80000000L) ? (c << 1) ^ CRC32_POLY : (c << 1);
		}
		crc32_table[i] = c;
	}
}

int Check_Name( char *filename)
{
	int i;

	i = strlen(filename) - 4;

	if( filename[i] != '.')
	{
		printf("File type Error: %s",filename);
		return 1;
	}

	if( (filename[i+1] == 'c' || filename[i+1] == 'C') &&
		(filename[i+2] == 't' || filename[i+2] == 'T') &&
		(filename[i+3] == 'r' || filename[i+3] == 'R') )
	{
		file_type = 2;
		return 0;
	}

	if( (filename[i+1] == 'b' || filename[i+1] == 'B') &&
		(filename[i+2] == 'i' || filename[i+2] == 'I') &&
		(filename[i+3] == 'n' || filename[i+3] == 'N') )
	{
		file_type = 5;
		return 0;
	}

	if( (filename[i+1] == 'd' || filename[i+1] == 'D') &&
		(filename[i+2] == 'a' || filename[i+2] == 'A') &&
		(filename[i+3] == 't' || filename[i+3] == 'T') )
	{
		file_type = 3;
		return 0;
	}

	if( (filename[i+1] == 'f' || filename[i+1] == 'F') &&
		(filename[i+2] == 'i' || filename[i+2] == 'I') &&
		(filename[i+3] == 'l' || filename[i+3] == 'L') )
	{
		file_type = 4;
		return 0;
	}

	if( (filename[i+1] == 'b' || filename[i+1] == 'B') &&
		(filename[i+2] == 'o' || filename[i+2] == 'O') &&
		(filename[i+3] == 'o' || filename[i+3] == 'O') )
	{
		file_type = 1;
		return 0;
	}

	printf("File type Error: %s",filename);
	return 1;
}

⌨️ 快捷键说明

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