📄 s7026.cpp
字号:
//unsigned char allporttest=1;
int n,i,stringslen;
int Mportoffset;
char ch;
unsigned int pcinum,idepci;
unsigned int BAR0[4],BAR2[4],BAR01[4],BAR21[4],intveta[4];
unsigned int BaseAdr2;
time_t seconds;
unsigned char argnum=1;
PCIcfg *cfg;
SaveCRT();
clrscr();
fprintf(stderr,"MUL_SERIAL SEM7513 test kit " VERSION " created by Cwy Maxwell\n");
fprintf(stderr, "ALL copyright reserved by SBS CO.LTD\n\n");
pcinum=0;
for (i=1; i<20; i++)
{
cfg=read_PCI_config(0,i,0);
if (cfg->vendorID != 0x1415) continue;
intveta[pcinum]=cfg->nonbridge.interrupt_line;
BAR0[pcinum]=cfg->nonbridge.base_address0;
BAR2[pcinum]=cfg->nonbridge.base_address2;
#if (PORTSUM>4)
cfg=read_PCI_config(0,i,1);
BAR01[pcinum]=cfg->nonbridge.base_address0;
BAR21[pcinum]=cfg->nonbridge.base_address2;
#endif
pcinum++;
}
//printf("%d",pcinum);
if (pcinum == 0)
{
fprintf(stderr, "\nDidn't found serial device oxmpci954!!!\n");
fprintf(stderr, "Please power down devices and install SBS sem7513 module for continue!\n");
exit(0);
}
else if(pcinum > 1)
{
fprintf(stderr,"please select pci device to test\n");
ch=getchar();
pcitest[0]=ch;
pcitest[1]='\0';
idepci=atoi(pcitest)-1;
}
else if(pcinum == 1)
idepci=0;
BaseAdr= BAR0[idepci]-0x01;
BaseAdr2=BAR2[idepci]-0x01;
intvet=intveta[idepci];
//printf("%x,%x,%x,%x\n",BAR0[idepci]-1,BAR2[idepci]-1,BAR01[idepci]-1,BAR21[idepci]-1);
/*if ( argc<2)
{
helpini();
exit(0);
}
*/
//printf("%d\n",argnum);
for (i=1; i<argc; i++)
{
if (strchr("/?", *argv[i]))
{
helpini();
exit(0);
}
if (strchr("/o", *argv[i])) /*function operation mode */
{
argnum++;
switch (argv[i][2])
{
case '1':
testmode=1;
break;
case '2':
testmode=2;
break;
case '3':
testmode=3;
break;
case '4':
testmode=4;
break;
case '5':
testmode=5;
break;
case '6':
testmode=6;
break;
case '7':
testmode=7;
break;
default:
break;
}
}
if (strchr("/W", *argv[i]))
{
//if (!strncmp("wai",argv[i],3))
argnum++;
portsend=1;
}
/*if (strchr("/m", *argv[i]))
{
if (!strncmp("mode485",argv[i],7))
mode485=1;
} */
if (strchr("/B", *argv[i])) /*baut rate */
{
argnum++;
strcpy(bautrat,argv[i]);
}
if (strchr("/M", *argv[i])) /*uart mode */
{
//strcpy(uartmodename,argv[i]);
//UART mode differente
argnum++;
switch (argv[i][1])
{
case '4':
modevar=1;//gUARTmodes[1].UARTmode_code;
break;
case '5':
modevar=2;//gUARTmodes[2].UARTmode_code;
break;
case '6':
modevar=4;//gUARTmodes[4].UARTmode_code;
break;
case '7':
modevar=5;//gUARTmodes[5].UARTmode_code;
break;
case '9':
modevar=6;//gUARTmodes[6].UARTmode_code;
break;
default:
modevar=6;//gUARTmodes[7].UARTmode_code;
printf("UART Mode such as 450,550,650,750,950,now default 950\n");
break;
}
}
if (strchr("/S", *argv[i])) /*cycle clock per bit*/
{
argnum++;
ccpb[0]=argv[i][1];
if (strlen(argv[i])>2)
{
ccpb[1]=argv[i][2];
ccpb[2]='\0';
}
else
ccpb[1]='\0';
tcr30ccpb=atoi(ccpb);
if (tcr30ccpb>15)
printf("Clock cycle per bit doesn't correct,it must less than 16\n");
}
if (strchr("/I", *argv[i])) /*tranmit interrupt trigger level*/
{
argnum++;
titl[0]=argv[i][1];
titl[1]=argv[i][2];
if (strlen(argv[i])>3)
{
titl[2]=argv[i][3];
titl[3]='\0';
}
else
titl[2]='\0';
titl650=atoi(titl);
if (!strcmp("I16", argv[i])) /*FCR[54] is used under FCR[3]=1 in Enhanced mode*/
fcr54titl=0x00;
else if (!strcmp("I32", argv[i]))
fcr54titl=0x10;
else if (!strcmp("I64", argv[i]))
fcr54titl=0x20;
else if (!strcmp("I112", argv[i]))
fcr54titl=0x30;
else fprintf(stderr,"650 transmitte interrupt level needed to adjust\n");
}
if (strchr("/J", *argv[i])) /*tranmit interrupt trigger level*/
{
argnum++;
ritl[0]=argv[i][1];
ritl[1]=argv[i][2];
if (strlen(argv[i])>3)
{
ritl[2]=argv[i][3];
ritl[3]='\0';
}
else
ritl[2]='\0';
rtl650=atoi(ritl);
if (!strcmp("J16", argv[i])) /*FCR[54] is used under FCR[3]=1 in Enhanced mode*/
fcr76rtl=0x00;
else if (!strcmp("J32", argv[i]))
fcr76rtl=0x40;
else if (!strcmp("J112", argv[i]))
fcr76rtl=0x80;
else if (!strcmp("J120", argv[i]))
fcr76rtl=0xc0;
else fprintf(stderr,"650 receive interrupt level needed to adjust\n");
}
if (strchr("/T", *argv[i])) /*950 tranmit interrupt trigger level*/
{
argnum++;
ttl[0]=argv[i][1];
if (strlen(argv[i])==2)
{
ttl[1]='\0';
}
else if (strlen(argv[i])==3)
{
ttl[1]=argv[i][2];
ttl[2]='\0';
}
else if (strlen(argv[i])==4)
{
ttl[1]=argv[i][2];
ttl[2]=argv[i][3];
ttl[3]='\0';
}
else printf("T interrupt trigger level doesn't correct,it must less than 127\n");
//strcpy(ttl,argv[i],2);
titl950=atoi(ttl);
if (titl950 > 127)
{
printf("T interrupt trigger level doesn't correct,it must less than 127\n");
titl950=0x30;
}
}
if (strchr("/R", *argv[i])) /*950 tranmit interrupt trigger level*/
{
argnum++;
rtl[0]=argv[i][1];
if (strlen(argv[i])==2)
{
rtl[1]='\0';
}
else if (strlen(argv[i])==3)
{
rtl[1]=argv[i][2];
rtl[2]='\0';
}
else if (strlen(argv[i])==4)
{
rtl[1]=argv[i][2];
rtl[2]=argv[i][3];
rtl[3]='\0';
}
else printf("R Interrupt trigger level doesn't correct,it must less than 127\n");
//strncpy(ttl,argv[i],2);
rtl950=atoi(rtl);
if (rtl950 > 127)
{
printf("R Interrupt trigger level doesn't correct,it must less than 127\n");
rtl950=0x30;
}
//printf("%x",rtl950);
}
if (strchr("/D", *argv[i])) /*data length*/
{
argnum++;
switch(argv[i][2])
{
case '5':
lcr10dl=0;
break;
case '6':
lcr10dl=1;
break;
case '7':
lcr10dl=2;
break;
case '8':
lcr10dl=3;
break;
default:
printf("Data length argument value doesn't correct\n");
break;
}
}
if (strchr("/N", *argv[i])) /*stop bit number*/
{
argnum++;
if (!strcmp(argv[i], "N1"))
lcr2nos=0;
else lcr2nos=4;
}
if (strchr("/P", *argv[i])) /*parity check select*/
{
argnum++;
switch(argv[i][1])
{
case 'n':
lcr53pt=0;
break;
case 'o':
lcr53pt=1;
break;
case 'e':
lcr53pt=3;
break;
case '1':
lcr53pt=5;
break;
case '0':
lcr53pt=7;
break;
default:
printf("Parity argument value doesn't correct\n");
break;
}
}
if (strchr("/U", *argv[i])) /*uart com port select uartx--x*/
{
//allporttest=0;
argnum++;
switch(argv[i][1])
{
case '1':
gstep=0;
break;
case '2':
gstep=1;
break;
case '3':
gstep=2;
break;
case '4':
gstep=3;
break;
case '5':
gstep=4;
break;
case '6':
gstep=5;
break;
case '7':
gstep=6;
break;
case '8':
gstep=7;
break;
default:
printf("The PORT number doesn't correct,it's one of 1--8\n");
break;
}
if ((gstep+1) > PORTSUM) exit(0);
if (strlen(argv[i]) >= 4)
{
switch(argv[i][3])
{
case '1':
gstepn=0;
break;
case '2':
gstepn=1;
break;
case '3':
gstepn=2;
break;
case '4':
gstepn=3;
break;
case '5':
gstepn=4;
break;
case '6':
gstepn=5;
break;
case '7':
gstepn=6;
break;
case '8':
gstepn=7;
break;
default:
printf("The PORT number doesn't correct,it's one of 1--8\n");
break;
}
if ((gstepn+1) > PORTSUM) exit(0);
//if ((gstep==gstepn))
//{
// loopbackb=0x10; /*loopback mode bit---MCR[4]*/
//UartsRegsset(BaseAdr, portadr[gstep], bautrat);
//outportb(BaseAdr+portadr[gstep]+MCR,0x0b|loopbackb);
//}
}
}
}
if (argc != argnum)
{
fprintf(stderr,"Parameters type doesn't right,please correctly input\n");
exit(0);
}
if ((portsend == 1)&&((gstep+1) > PORTSUM))
{
fprintf(stderr,"Please selcet one Port connecting with other device serial port\n");
exit(0);
}
if ((portsend == 0)&&((gstep+1) < PORTSUM)&&(gstepn == 20))
{
fprintf(stderr,"Please increase a parameter 'W',or select two ports useing 'Ux-y'\n");
exit(0);
}
if (titl950 > 64) titl950=64;
//else if ((titl950 < 5) && (titl950 !=rtl950))
// titl950 =5;
fprintf(stderr,"In testing ...... \n");
//printf("Please input transmit strings,or press enter to tra-and-rec '0--127'\n");
//gets(strings);
//if ((strlen(strings) < 65) && (strlen(strings) > 4))
//titl950=strlen(strings);
confLCRegs(BaseAdr2); /*local control register configeration*/
for(n=0;n<PORTSUM;n++) /*all eight uart port initialization*/
{
///IndecontrolReg(0x0d000,portadd[n],0x0c,0x00);
/*0x0c is the CSR SPRoffset*/
UartsRegsset(BaseAdr, portadr[n], bautrat);
outportb(BaseAdr+portadr[n]+LCR, inportb(BaseAdr+portadr[n]+LCR) & 0x7f);
for(i=0;i<128;i++)
{
if((inportb(BaseAdr+portadr[n]+LSR)&0x01))
inportb(BaseAdr+portadr[n]);
}
}
if(testmode<5) /*interrupt receive */
{
//printf("\r\n");
//printf("Please input transmit strings,or press enter\n");
//gets(strings);
seconds=time(NULL);
printf("pressed key D to turn off display,or press other key\n");
ch=getch();
if ((100==ch)||(68==ch))display=0;
Intertxrx( );
printf("It takes %d seconds\n",time(NULL)-seconds);
}
/*if ((testmode==1)||((3<testmode)&&(testmode<7))) //query transmit and receive
{
seconds=time(NULL);
if (allporttest==1)
{
for (gstep=0; gstep<4; gstep++) //port 1-5 2-6 3-7 4-5
{
gstepn=7-gstep;
querytest(gstep, gstepn);
}
}
else
querytest(gstep, gstepn);
printf("It take %d seconds\n",time(NULL)-seconds);
}
if ((testmode==1)||(testmode==3)||testmode>5) //extern strings
{
gets(strings);
stringslen=strlen(strings);
for(n=0;n<stringslen;n++)
{
while((inportb(BaseAdr+portadr[gstepn]+LSR)&0x20)==0);
outport(BaseAdr+portadr[gstepn],strings[n]);
while((inportb(BaseAdr+portadr[gstep]+LSR)&0x01)==0);
printf("%c",inportb(BaseAdr+portadr[gstep]));
}
printf("\n");
}
*/
printf("press any key to quit....");
while(1)
{
if(kbhit())
{
ch=getch();
break;
}
}
RestoreCRT();
return(ch);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -