📄 load.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 + -