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

📄 s7026.cpp

📁 DOS下使用PCI扩展串口的程序希望对大家有用
💻 CPP
📖 第 1 页 / 共 4 页
字号:

	 //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 + -