📄 16pci954driver.c
字号:
#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 + -