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