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

📄 16pci954driver.c

📁 16PCI954串口信片Vxworks驱动程序源码
💻 C
📖 第 1 页 / 共 2 页
字号:


unsigned char  getCTS(char *comName)
{
	unsigned char ch;
	PCI954UARTdev  *temPCI954UARTdev ;
	temPCI954UARTdev=comNameAttach(comName);
	ch = READ_CTS(temPCI954UARTdev);/**/
	
	#if 1
	printf("CTS is %x\n",ch);
	#endif
	return ch;
}
unsigned char   getDTR(char *comName)
{
	unsigned char ch;
	PCI954UARTdev  *temPCI954UARTdev ;
	temPCI954UARTdev=comNameAttach(comName);

	ch = READ_DTR(temPCI954UARTdev);
	#if 0
	printf("DTR value is %u\n",ch);
	#endif
	return ch;
}
unsigned char  getDSR(char *comName)
{
	unsigned char ch;
	PCI954UARTdev  *temPCI954UARTdev ;
	temPCI954UARTdev=comNameAttach(comName);
	ch = READ_DSR(temPCI954UARTdev);
	
	#if 1
	printf("DSR value is %x\n",ch);
	#endif
	return ch;
}
unsigned char  getRTS(char *comName)
{
	unsigned char ch;
	PCI954UARTdev  *temPCI954UARTdev ;
	temPCI954UARTdev=comNameAttach(comName);
	ch = READ_RTS(temPCI954UARTdev);
	#if 0
	printf("RTS value is %u\n",ch);
	#endif
	return ch;
}

STATUS PCI954UARTDrv(
			PCI954UARTdev * pPCI954UARTdev
			)
{
	(pPCI954UARTdev->devHdr).drvNum=iosDrvInstall(PCI954UARTOpen, PCI954UARTClose, PCI954UARTOpen,
				PCI954UARTClose, PCI954UARTRead, PCI954UARTWrite, PCI954UARTIoctl);
				
	return ((pPCI954UARTdev->devHdr).drvNum == ERROR ? ERROR : OK);
} 



 
STATUS PCI954UARTDevCreate (
				PCI954UARTdev * pPCI954UARTdev,
				char * name
				)
{ 
  	int status;
  	
	pPCI954UARTdev->rdBuf=rngCreate(SIZEOFRDBUF);
	pPCI954UARTdev->wrtBuf=rngCreate(SIZEOFWRTBUF);	  	
  	
  	
	pPCI954UARTdev->rdSyncSem=semBCreate(SEM_Q_PRIORITY,SEM_EMPTY);		
	pPCI954UARTdev->wrtSyncSem=semBCreate(SEM_Q_PRIORITY,SEM_FULL);		  	
  	
   		
   	InitUART(pPCI954UARTdev);
   	 	
  	status = iosDevAdd (&(pPCI954UARTdev->devHdr), name, (pPCI954UARTdev->devHdr).drvNum); 
	selWakeupListInit(&(pPCI954UARTdev->selWakeupList));

	#ifdef DEBUGDRIVER
	printf("\nBaseAddrfordev=%x\n",pPCI954UARTdev->BaseAddr);
	#endif

	return(status);
	
}


void IntPCI954UART(
		   PCI954UARTdev * pPCI954UARTdev
		  )
{
	int i,k;
	char temp[128];
	char ccharNum;
	int icharNum;
	char IERValue;
	

	
	switch(sysInByte(pPCI954UARTdev->BaseAddr+ISR))
	{
		case 0xe6:	
			IERValue=sysInByte(pPCI954UARTdev->BaseAddr+IER);		
			sysOutByte(pPCI954UARTdev->BaseAddr+IER,0x0);		
			sysInByte(pPCI954UARTdev->BaseAddr+LSR);		
			sysOutByte(pPCI954UARTdev->BaseAddr+FCR,0xa3);		
			sysOutByte(pPCI954UARTdev->BaseAddr+FCR,0xa2);		
			sysOutByte(pPCI954UARTdev->BaseAddr+FCR,0xa1);		
			sysOutByte(pPCI954UARTdev->BaseAddr+IER,IERValue);	
		break; 
		case 0xe4:	
			IERValue=sysInByte(pPCI954UARTdev->BaseAddr+IER);
			IERValue=IERValue&0xfe;				
			sysOutByte(pPCI954UARTdev->BaseAddr+IER,IERValue);		
			
			for(i=0;i<64;i++)
			{
				temp[i]=sysInByte(pPCI954UARTdev->BaseAddr+RHR);
			}
			k=rngBufPut(pPCI954UARTdev->rdBuf,temp,64);
			
			IERValue=sysInByte(pPCI954UARTdev->BaseAddr+IER);
			IERValue=IERValue|0x1;
			sysOutByte(pPCI954UARTdev->BaseAddr+IER,IERValue);	
				
			semGive(pPCI954UARTdev->rdSyncSem);			
			selWakeupAll(&pPCI954UARTdev->selWakeupList,SELREAD);	 
		break;
		case 0xec:	
			
			sysOutByte(pPCI954UARTdev->BaseAddr+SPR,ACR);		
			sysOutByte(pPCI954UARTdev->BaseAddr+LSR,0x80);			
			ccharNum=sysInByte(pPCI954UARTdev->BaseAddr+RFL);				
			sysOutByte(pPCI954UARTdev->BaseAddr+SPR,ACR);	
			sysOutByte(pPCI954UARTdev->BaseAddr+LSR,0x0);				
						
			icharNum=(int)ccharNum;		
			for(i=0;i<icharNum;i++)
			{
				temp[i]=sysInByte(pPCI954UARTdev->BaseAddr+RHR);
			}
			k=rngBufPut(pPCI954UARTdev->rdBuf,temp,icharNum);
			
			semGive(pPCI954UARTdev->rdSyncSem);			
			selWakeupAll(&pPCI954UARTdev->selWakeupList,SELREAD);				
		break;			
		case 0xe2:				
			IERValue=sysInByte(pPCI954UARTdev->BaseAddr+IER);
			IERValue=IERValue&0xfd;
			sysOutByte(pPCI954UARTdev->BaseAddr+IER,IERValue);			
			
			k=rngNBytes(pPCI954UARTdev->wrtBuf);
			if(k>128)
			{
				rngBufGet(pPCI954UARTdev->wrtBuf,temp,128);
				for(i=0;i<128;i++)
				{
					sysOutByte(pPCI954UARTdev->BaseAddr+THR,temp[i]);
				}
				semGive(pPCI954UARTdev->wrtSyncSem);			
				
				IERValue=sysInByte(pPCI954UARTdev->BaseAddr+IER);
				IERValue=IERValue|0x02;		
				sysOutByte(pPCI954UARTdev->BaseAddr+IER,IERValue);		
				selWakeupAll(&pPCI954UARTdev->selWakeupList,SELWRITE);												
			}
			else
			{
				k=rngBufGet(pPCI954UARTdev->wrtBuf,temp,128);
				for(i=0;i<k;i++)
				{
					sysOutByte(pPCI954UARTdev->BaseAddr+THR,temp[i]);
				}
				
				semGive(pPCI954UARTdev->wrtSyncSem);			
				selWakeupAll(&pPCI954UARTdev->selWakeupList,SELWRITE);	
				
			
			}	
		break;			
	}
}


void  IntPCI954(void)
{
	#ifdef DEBUGDRIVER
	logMsg("\nIntPCI954\n",0,0,0,0,0,0);
	#endif	
	
	IntPCI954UART(&PCI954UARTdev0);		
	IntPCI954UART(&PCI954UARTdev1);		
	IntPCI954UART(&PCI954UARTdev2);		
	IntPCI954UART(&PCI954UARTdev3);		
	#if 1
	IntPCI954UART(&PCI954UARTdev4);		
	IntPCI954UART(&PCI954UARTdev5);		
	IntPCI954UART(&PCI954UARTdev6);		
	IntPCI954UART(&PCI954UARTdev7);		
	#endif	
		
}

#ifdef DEBUGDRIVER
void temptest(void)
{
	semGive(PCI954UARTdev0.rdSyncSem);
	semGive(PCI954UARTdev0.rdSyncSem);
	semGive(PCI954UARTdev0.rdSyncSem);
	
	
}
#endif


void OpenIntShield (
			int IntNum	
  			)
{
	int oldlevel;
	char PIC8259IMR;
	if(IntNum<8)
	{
		switch(IntNum)
		{
			case 3:
				oldlevel=intLock();
				PIC8259IMR=sysInByte(0x21);	
				PIC8259IMR=PIC8259IMR&0xf7;
				sysOutByte(0x21,PIC8259IMR);
				intUnlock(oldlevel);			
			break;
			case 4:
				oldlevel=intLock();
				PIC8259IMR=sysInByte(0x21);	
				PIC8259IMR=PIC8259IMR&0xef;
				sysOutByte(0x21,PIC8259IMR);
				intUnlock(oldlevel);					
			break;
			case 5:
				oldlevel=intLock();
				PIC8259IMR=sysInByte(0x21);	
				PIC8259IMR=PIC8259IMR&0xdf;
				sysOutByte(0x21,PIC8259IMR);
				intUnlock(oldlevel);			
			break;
			case 6:
				oldlevel=intLock();
				PIC8259IMR=sysInByte(0x21);
				PIC8259IMR=PIC8259IMR&0xbf;
				sysOutByte(0x21,PIC8259IMR);
				intUnlock(oldlevel);					
			break;			
			case 7:
				oldlevel=intLock();
				PIC8259IMR=sysInByte(0x21);	
				PIC8259IMR=PIC8259IMR&0x7f;
				sysOutByte(0x21,PIC8259IMR);
				intUnlock(oldlevel);					
			break;											
		}
		
	}
	else
	{
		switch(IntNum)
		{
			case 9:
				oldlevel=intLock();
				PIC8259IMR=sysInByte(0xa1);	
				PIC8259IMR=PIC8259IMR&0xfd;
				sysOutByte(0xa1,PIC8259IMR);
				intUnlock(oldlevel);			
			break;
			case 10:
				oldlevel=intLock();
				PIC8259IMR=sysInByte(0xa1);	
				PIC8259IMR=PIC8259IMR&0xfb;
				sysOutByte(0xa1,PIC8259IMR);
				intUnlock(oldlevel);					
			break;
			case 11:
				oldlevel=intLock();
				PIC8259IMR=sysInByte(0xa1);	
				PIC8259IMR=PIC8259IMR&0xf7;
				sysOutByte(0xa1,PIC8259IMR);
				intUnlock(oldlevel);			
			break;
			case 12:
				oldlevel=intLock();
				PIC8259IMR=sysInByte(0xa1);	
				PIC8259IMR=PIC8259IMR&0xef;
				sysOutByte(0xa1,PIC8259IMR);
				intUnlock(oldlevel);					
			break;			
			case 14:
				oldlevel=intLock();
				PIC8259IMR=sysInByte(0xa1);	
				PIC8259IMR=PIC8259IMR&0xbf;
				sysOutByte(0xa1,PIC8259IMR);
				intUnlock(oldlevel);					
			break;	
			case 15:
				oldlevel=intLock();
				PIC8259IMR=sysInByte(0xa1);	
				PIC8259IMR=PIC8259IMR&0xef;
				sysOutByte(0xa1,PIC8259IMR);
				intUnlock(oldlevel);					
			break;														
		}	
	}
}



STATUS	PCI954DRV(void)
{
	int BusNo,DeviceNo,FuncNo,index=0;
	int BusNo1,DeviceNo1,FuncNo1;
	int status=OK;
	int BaseAddr;	
	int BaseAddr1;	
	char IntNo;
	char IntNo1;
	char PIC8259IMR;
	int oldlevel;	
	

	status=pciFindDevice(VENDOR_ID,DEVICE_ID_UART,index,&BusNo,&DeviceNo,&FuncNo);
	if(status==ERROR)	
	{
		perror("\nCan't find PCI device\n");
		return(status);	
	}


	status=pciFindDevice(VENDOR_ID,DEVICE_ID_EUART,index,&BusNo1,&DeviceNo1,&FuncNo1);
	if(status==ERROR)	
	{
		perror("\nCan't find the extended 4 serial ports.\n");
		return(status);	
	}


	pciConfigInLong (BusNo,DeviceNo,FuncNo,PCI_CFG_BASE_ADDRESS_0,&BaseAddr);
	regbase = BaseAddr | 0xc0000000;
	BaseAddr--;
	
	PCI954UARTdev0.BaseAddr=BaseAddr;
	PCI954UARTdev1.BaseAddr=BaseAddr+UART1_OFFSET;	
	PCI954UARTdev2.BaseAddr=BaseAddr+UART2_OFFSET;		
	PCI954UARTdev3.BaseAddr=BaseAddr+UART3_OFFSET;		
	/*获取扩展UART的I/O空间基址*/
	pciConfigInLong (BusNo1,DeviceNo1,FuncNo1,PCI_CFG_BASE_ADDRESS_0,&BaseAddr1);
	regbase1 = BaseAddr1 |0xc0000000;
	BaseAddr1--;
	
	PCI954UARTdev4.BaseAddr=BaseAddr1;
	PCI954UARTdev5.BaseAddr=BaseAddr1+UART1_OFFSET;	
	PCI954UARTdev6.BaseAddr=BaseAddr1+UART2_OFFSET;		
	PCI954UARTdev7.BaseAddr=BaseAddr1+UART3_OFFSET;			
		
	
	PCI954UARTDrv(&PCI954UARTdev0);
	PCI954UARTDrv(&PCI954UARTdev1);	
	PCI954UARTDrv(&PCI954UARTdev2);
	PCI954UARTDrv(&PCI954UARTdev3);		
	
	PCI954UARTDrv(&PCI954UARTdev4);
	PCI954UARTDrv(&PCI954UARTdev5);	
	PCI954UARTDrv(&PCI954UARTdev6);
	PCI954UARTDrv(&PCI954UARTdev7);	
	

	PCI954UARTDevCreate(&PCI954UARTdev0,"/tyCo/4");	
	PCI954UARTDevCreate(&PCI954UARTdev1,"/tyCo/5");	
	PCI954UARTDevCreate(&PCI954UARTdev2,"/tyCo/6");	
	PCI954UARTDevCreate(&PCI954UARTdev3,"/tyCo/7");	
	
	PCI954UARTDevCreate(&PCI954UARTdev4,"/tyCo/8");	
	PCI954UARTDevCreate(&PCI954UARTdev5,"/tyCo/9");	
	PCI954UARTDevCreate(&PCI954UARTdev6,"/tyCo/10");	
	PCI954UARTDevCreate(&PCI954UARTdev7,"/tyCo/11");			
	/*	*/
	/*中断连接部分*/		
	pciConfigInByte (BusNo, DeviceNo, FuncNo, PCI_CFG_DEV_INT_LINE,(UINT8 *)&IntNo);
	#if 1
	printf("The interrupt number is %d\n",IntNo);
	#endif

	pciConfigInByte (BusNo1, DeviceNo1, FuncNo1, PCI_CFG_DEV_INT_LINE,(UINT8 *)&IntNo1);
	#if 1
	printf("The EXTENDED SERIAL interrupt number is %d\n",IntNo1);
	#endif

	OpenIntShield((int)IntNo);	
	OpenIntShield((int)IntNo1);	
	if(pciIntConnect(INUM_TO_IVEC((int)IntNo+INT_NUM_IRQ0),(VOIDFUNCPTR)IntPCI954,0)==ERROR)
	{	

		logMsg("\npciIntConnect ERROR\n",0,0,0,0,0,0);
		status=ERROR;
	}
	if(pciIntConnect(INUM_TO_IVEC((int)IntNo1+INT_NUM_IRQ0),(VOIDFUNCPTR)IntPCI954,0)==ERROR)
	{	

		logMsg("\nEXTENDED SERIAL pciIntConnect ERROR\n",0,0,0,0,0,0);
		status=ERROR;
	}
						
	return(status);
}

void setExtenComBaud (int  exComDescrip ,int baudRate)
{
	ioctl(exComDescrip,FIOBAUDRATE,baudRate/2);
}

void setPciComBaud (int  ComDescrip ,int baudRate)
{
	ioctl(ComDescrip,FIOBAUDRATE,baudRate/8);
}

void setDataPariStop (int  dataBit ,int stopBit,int parityBit)
{
	uartdataformat.DataBit=dataBit;
	uartdataformat.StopBit=stopBit;	
	uartdataformat.ParityBit=parityBit;	

}

⌨️ 快捷键说明

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