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

📄 16pci954driver.c

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





 
#include	"vxworks.h" 
#include	"16PCI954driver.h" 
#include	"stdio.h" 
#include	"intLib.h"
#include	"iv.h"
#include 	"drv\pci\pciConfigLib.h"
#include 	"sysLib.h"
 #define IER_OFFSET                     0x1
#define IER_RTS_INTERRUPT_EN 0x40
#define IER_CTS_INTERRUPT_EN 0x80 
int regbase;
int regbase1;



int PCI954UARTOpen(
			PCI954UARTdev * pPCI954UARTdev,
			char * remainder,		
  			int mode			
			)
{
	sysOutByte(pPCI954UARTdev->BaseAddr+IER,0x05);	
							
	#ifdef DEBUGDRIVER
	logMsg("\nPCI954UARTOpen\n",0,0,0,0,0,0);
	#endif
		
	return((int)pPCI954UARTdev);	
}



int PCI954UARTRead (
  			PCI954UARTdev * pPCI954UARTdev,
  			char * buffer,
  			int nBytes
  			)
{
	int ReadByte;
	semTake(pPCI954UARTdev->rdSyncSem,WAIT_FOREVER);
	ReadByte=rngBufGet(pPCI954UARTdev->rdBuf,buffer,nBytes);
	if(rngIsEmpty(pPCI954UARTdev->rdBuf)==FALSE) semGive(pPCI954UARTdev->rdSyncSem);

	#ifdef DEBUGDRIVER
	logMsg("\nPCI954UARTRead\n",0,0,0,0,0,0);
	#endif	
	
		
	return(ReadByte);
}


int PCI954UARTWrite(
  			PCI954UARTdev * pPCI954UARTdev,
  			char * buffer,
  			int nBytes
  			)
{
	int writeByte;
	char temp;
	int LeftNum;	
	int IdleNum;	
	
	LeftNum=nBytes;
	while(LeftNum>0)
	{
		semTake(pPCI954UARTdev->wrtSyncSem,WAIT_FOREVER);	
		IdleNum=rngFreeBytes(pPCI954UARTdev->wrtBuf);
		if(IdleNum>=LeftNum)
		{
			writeByte=rngBufPut(pPCI954UARTdev->wrtBuf,buffer,LeftNum);
			temp=sysInByte(pPCI954UARTdev->BaseAddr+IER);
			temp=temp|0x02;
			sysOutByte(pPCI954UARTdev->BaseAddr+IER,temp);			
			if(!(rngIsFull(pPCI954UARTdev->wrtBuf)))
				semGive(pPCI954UARTdev->wrtSyncSem);								
			LeftNum-=writeByte;
			writeByte=0;
		}
		else
		{
			writeByte=rngBufPut(pPCI954UARTdev->wrtBuf,buffer,IdleNum);
			temp=sysInByte(pPCI954UARTdev->BaseAddr+IER);
			temp=temp|0x02;
			sysOutByte(pPCI954UARTdev->BaseAddr+IER,temp);									
			LeftNum-=writeByte;
			writeByte=0;		
			
				
		}
	}
	#ifdef DEBUGDRIVER
	logMsg("\nPCI954UARTWrite\n",0,0,0,0,0,0);
	#endif
	return(nBytes);
}


int PCI954UARTClose(
  			PCI954UARTdev * pPCI954UARTdev
  			)
{		
	char tempIER;
	tempIER=sysInByte(pPCI954UARTdev->BaseAddr+IER);
	tempIER&=0xfa;
	sysOutByte(pPCI954UARTdev->BaseAddr+IER,tempIER);	
	
	rngFlush(pPCI954UARTdev->rdBuf);			
	return(0);
}


STATUS PCI954UARTIoctl(
  			PCI954UARTdev * pPCI954UARTdev,
  			int request,	
  			int arg		
  			)
{
	int i,oldlevel;
	int status;
	char *pchar;
	char tempchar;
	char dataformat;	/*用于设置串口通道的数据位,奇偶校验位和停止位*/
	switch (request) 
        { 
 
        	case FIOSELECT:

            		selNodeAdd (&pPCI954UARTdev->selWakeupList, (SEL_WAKEUP_NODE *) arg);
 
            		if (selWakeupType ((SEL_WAKEUP_NODE *) arg) == SELREAD  
                	&& ((!rngIsEmpty(pPCI954UARTdev->rdBuf))==TRUE)) 
                	{ 
                	
                	selWakeup ((SEL_WAKEUP_NODE *) arg); 
                	}  
            		
            		if (selWakeupType ((SEL_WAKEUP_NODE *) arg) == SELWRITE  
                	&& ((!rngIsFull(pPCI954UARTdev->wrtBuf))==TRUE)) 
                	{ 
                	
                	selWakeup ((SEL_WAKEUP_NODE *) arg);  
                	} 
                	status=OK;
                	#ifdef DEBUGDRIVER
                	perror("\nPCI954UARTIoctl  FIOSELECT");	
                	#endif
            	break;
        	case FIOUNSELECT:
        	
            		selNodeDelete (&pPCI954UARTdev->selWakeupList, (SEL_WAKEUP_NODE *) arg); 
            		status=OK;
            	break;	
            	case FIOBAUDRATE:
            		if (arg < 50 || arg > 38400)
	        	{
			status = ERROR;		
			break;
	        	}
			
			i=1843200/(16*arg);
			pchar=(char *)&i;
			
	    	
	    		oldlevel = intLock ();    		
			tempchar=sysInByte(pPCI954UARTdev->BaseAddr+LCR);	
    	    		sysOutByte(pPCI954UARTdev->BaseAddr+LCR,tempchar|0x80);       		
    	    		sysOutByte(pPCI954UARTdev->BaseAddr+DLL,*pchar);
     	    		sysOutByte(pPCI954UARTdev->BaseAddr+DLM,*(pchar+1));
    	    		sysOutByte(pPCI954UARTdev->BaseAddr+LCR,tempchar);		
	    		intUnlock (oldlevel);
	    		status = OK;
	    		#ifdef DEBUGDRIVER
                	perror("\nPCI954UARTIoctl  FIOBAUDRATE");
                	#endif		    		
            	break;
            	case  SIO_HW_OPTS_SET:
            		dataformat=sysInByte(pPCI954UARTdev->BaseAddr+LCR);
            		switch(((UARTDATAFORMAT *)arg)->DataBit)
            		{
            			
            			case 5:		
            				dataformat&=0xfc;
            			break;
            			case 6:
            				dataformat&=0xfd;
            				dataformat|=0x1;
            			break;      
            			case 7:
            				dataformat&=0xfe;
            				dataformat|=0x2;            			          			
            			break;
            			case 8:
            				dataformat|=0x3;             			
            			break;  
            			default:
            				logMsg("\ndata length must be one in 5,6,7,8\n",0,0,0,0,0,0);
            			break;            			             						      				
            		}
            		
            		switch(((UARTDATAFORMAT *)arg)->StopBit)
            		{
            			          			
            			case 1:		
            				dataformat&=0xfb;	
            			break;
            			case 2:		
            				dataformat|=0x04;		
            			break; 
            			default:
             				logMsg("\nNumber of stop bits  must be one in 0,1\n",0,0,0,0,0,0);           			
            			break;             			           			           				
            		}
            		
            		switch(((UARTDATAFORMAT *)arg)->ParityBit)
            		{
            		
            			case 0:		
            				dataformat&=0xf7;
            			break;
            			case 1:		
            				dataformat&=0xcf;
            				dataformat|=0x08;
            			break;            			
            			case 2:		
            				dataformat&=0xdf;
            				dataformat|=0x18;            			            			
            			break;            				
            			default:
             				logMsg("\nParity type must be one in 0,1,2\n",0,0,0,0,0,0);           			
            			break;            			
            		}
            		
            		sysOutByte(pPCI954UARTdev->BaseAddr+LCR,dataformat);
            		#ifdef DEBUGDRIVER
            		perror("\nPCI954UARTIoctl  SIO_HW_OPTS_SET");
            		#endif	
            	break;            	
            	default:
            	break;
	}
	
	return(status);
}


void InitUART
		(
		PCI954UARTdev * pPCI954UARTdev	
		)
{
	

	#ifdef DEBUGDRIVER
	int i;
	i=pPCI954UARTdev->BaseAddr+FCR;
	#endif

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

	sysOutByte(pPCI954UARTdev->BaseAddr+FCR,0xa1);	
	
	sysOutByte(pPCI954UARTdev->BaseAddr+LCR,0x80);	
	sysOutByte(pPCI954UARTdev->BaseAddr+DLL,0x0c);	
	sysOutByte(pPCI954UARTdev->BaseAddr+DLM,0x0);	
	
	sysOutByte(pPCI954UARTdev->BaseAddr+LCR,0x03);	
	
	sysOutByte(pPCI954UARTdev->BaseAddr+MCR,0x0);
	sysOutByte(pPCI954UARTdev->BaseAddr+IER,0x0);		
				
}
PCI954UARTdev *  comNameAttach( char *name)
{
	PCI954UARTdev * pPCI954UARTdev;
	if (strncmp(name,"/tyCo/4",7)==0)
	{
		pPCI954UARTdev = &PCI954UARTdev0;

		return pPCI954UARTdev;
	}
	if (strncmp(name,"/tyCo/5",7)==0)
	{
		pPCI954UARTdev = &PCI954UARTdev1;

		return pPCI954UARTdev;
	}
	if (strncmp(name,"/tyCo/6",7)==0)
	{
		pPCI954UARTdev = &PCI954UARTdev2;
	
		return pPCI954UARTdev;
	}
	if (strncmp(name,"/tyCo/7",7)==0)
	{
		pPCI954UARTdev = &PCI954UARTdev3;
		
		return pPCI954UARTdev;
	}
	if (strncmp(name,"/tyCo/8",7)==0)
	{
		pPCI954UARTdev = &PCI954UARTdev4;

		return pPCI954UARTdev;
	}
	if (strncmp(name,"/tyCo/9",7)==0)
	{
		pPCI954UARTdev = &PCI954UARTdev5;

		return pPCI954UARTdev;
	}
	if (strncmp(name,"/tyCo/10",8)==0)
	{
		pPCI954UARTdev = &PCI954UARTdev6;
	
		return pPCI954UARTdev;
	}
	if (strncmp(name,"/tyCo/11",8)==0)
	{
		pPCI954UARTdev = &PCI954UARTdev7;
	
		return pPCI954UARTdev;
	}


}
void ENABLE_RTS(PCI954UARTdev * pPCI954UARTdev)
{
	unsigned char msr;
	msr = sysInByte(pPCI954UARTdev->BaseAddr+MCR);
	sysOutByte(pPCI954UARTdev->BaseAddr+MCR,msr |MCR_RTS);
	#if 1
	printf("RTS set is %x\n",sysInByte(pPCI954UARTdev->BaseAddr+MCR));
	#endif
	
}
void disableRTS(PCI954UARTdev * pPCI954UARTdev)
{
	DISABLE_RTS(pPCI954UARTdev);
}
void disableDTR(PCI954UARTdev * pPCI954UARTdev)
{
	DISABLE_DTR(pPCI954UARTdev);
}
void DISABLE_RTS(PCI954UARTdev * pPCI954UARTdev)
{
	unsigned char msr;
	msr = sysInByte(pPCI954UARTdev->BaseAddr+MCR);
	sysOutByte(pPCI954UARTdev->BaseAddr+MCR,(~MCR_RTS) &msr);
}
void ENABLE_DTR(PCI954UARTdev * pPCI954UARTdev)
{
	unsigned char msr;
	msr = sysInByte(pPCI954UARTdev->BaseAddr+MCR);
	sysOutByte(pPCI954UARTdev->BaseAddr+MCR,msr|MCR_DTR);
}
void DISABLE_DTR(PCI954UARTdev * pPCI954UARTdev)
{
	unsigned char msr;
	msr = sysInByte(pPCI954UARTdev->BaseAddr+MCR);
	sysOutByte(pPCI954UARTdev->BaseAddr+MCR,(~MCR_DTR)&msr);
}

unsigned char   READ_CTS (PCI954UARTdev * pPCI954UARTdev)
{
	unsigned char  msr;
	msr = sysInByte(pPCI954UARTdev->BaseAddr+MSR);
	return msr & 0x11;
}

unsigned char  READ_DSR (PCI954UARTdev * pPCI954UARTdev)
{
	unsigned char  msr;
	msr = sysInByte(pPCI954UARTdev->BaseAddr+MSR);
	return msr & 0x22;
}
unsigned char  READ_RTS (PCI954UARTdev * pPCI954UARTdev)
{
	unsigned char  msr;
	msr = sysInByte(pPCI954UARTdev->BaseAddr+MCR);
	return msr;
}
unsigned char  READ_DTR (PCI954UARTdev * pPCI954UARTdev)
{
	unsigned char  msr;
	msr = sysInByte(pPCI954UARTdev->BaseAddr+MCR);
	if ((msr && MCR_DTR) == MCR_DTR)
	{
		return msr;
	}
	return 0;
}
void setDTR(char *comName, char flag)
{
	PCI954UARTdev  *temPCI954UARTdev ;
	temPCI954UARTdev=comNameAttach(comName);
	if (flag ==1)
	{
		ENABLE_DTR(temPCI954UARTdev);
	}
	else if (flag ==0)
	{
		DISABLE_DTR(temPCI954UARTdev);
	}
	else
	{
		printf("Wrong flag,reset it again.\n");
	}
}
void setRTS(char *comName, char flag)
{
	PCI954UARTdev  *temPCI954UARTdev ;
	temPCI954UARTdev=comNameAttach(comName);
	if (flag ==1)
	{
		ENABLE_RTS(temPCI954UARTdev);
	
		
	}
	else if (flag ==0)
	{
		DISABLE_RTS(temPCI954UARTdev);
	}
	else
	{
		printf("Wrong flag,reset it again.\n");
	}
}

⌨️ 快捷键说明

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