#include "RTX_PCI6208.h"
/*
本文件中的几个函数曾经在Ardence RTX下检测通过。用于PCI-6208/16的DA输出。
用法:
(1)、DWORD dwBaseAddr = _6208_Init(PCI卡序号,设备ID,制造商号);只有一块PCI卡时,PCI卡序号为0.多块卡时,在机器主板上PCI插槽从0开始检测,
第一次遇到的插槽不为空时,PCI卡序号 = 0,第二次遇到的插槽不为空时,PCI卡序号 = 1, ... ,PCI卡序号 = n.
(2)、int nStatus = _6208_GetDAStatus(dwBaseAddr);获取端口状态寄存器的状态。当寄存器为空就输出。
(3)、void _6208_DAOutPut(dwBaseAddr,输出通道Channel,输出数字量Value);
(4)、void _6208_Fail("想要输出的错误提示信息");初始化发生错误时,输出错误信息并终止程序
(5)、UCHAR _6208_DI_ReadPort(DWORD dwAddr);从dwAddr端口读取数字信号
(6)、void _6208_DO_WritePort(DWORD dwAddr,UCHAR uValue);从dwAddr端口输出数字信号
(7)、BOOL _6208_CloseCard(DWORD dwAddr);关闭PCI6208卡初始化时返回的地址。
*/
DWORD _6208_Init(const UINT CardIndex,unsigned short DeviceID,unsigned short VendorID)
{
ULONG uDeviceNum = 0; //设备号
ULONG uFunNum = 0; //功能号
ULONG uBusNum = 0; //总线号
ULONG uOffset = 0; //偏置,用于检索插槽是否为空,空则为0,相邻插槽关联常数为256。
ULONG uNothingToWrite = 0; //获取PCI配置空间失败.
ULONG uBytesWritten = 0; //获得PCI配置空间信息。一般为64字节。
BOOL bFlag = 0;
// UINT uIndex = 0; //当系统中存在多块相同PCI卡时检索之用。
DWORD _base_addr = 0; //返回的基地址
//================================================================================================
PCI_SLOT_NUMBER SlotNumber;
PPCI_COMMON_CONFIG PciData;
UCHAR chBuffer[PCI_COMMON_HDR_LENGTH];
PciData = (PPCI_COMMON_CONFIG)chBuffer;
SlotNumber.u.bits.Reserved = 0;
bFlag = TRUE;
for(uBusNum = 0; bFlag ;uBusNum++)
{
for(uDeviceNum = 0;uDeviceNum < PCI_MAX_DEVICES && bFlag ;uDeviceNum++)
{
SlotNumber.u.bits.DeviceNumber = uDeviceNum;
for(uFunNum = 0; uFunNum < PCI_MAX_FUNCTION; uFunNum++)
{
SlotNumber.u.bits.FunctionNumber = uFunNum;
uBytesWritten = RtGetBusDataByOffset(PCIConfiguration,uBusNum,SlotNumber.u.AsULONG,PciData,uOffset,PCI_COMMON_HDR_LENGTH);
if(uBytesWritten == uNothingToWrite)
{
RtWprintf(L"NothingWritten!");
printf("Error ByteWritten = %d\n",uBytesWritten);
uDeviceNum = PCI_MAX_DEVICES;
bFlag = FALSE;
break;
}
if(PciData->VendorID == PCI_INVALID_VENDORID) //如果VendorID等于0xFFFF,表示PCI卡错误,进行下一个循环
{
break;
}
if((PciData->DeviceID == DeviceID) && (PciData->VendorID == VendorID) && uDeviceNum == CardIndex)
{
//设置命令参数用于访问PCI设备的控制寄存器
PciData->Command = (PCI_ENABLE_IO_SPACE | PCI_ENABLE_MEMORY_SPACE | PCI_ENABLE_BUS_MASTER | PCI_ENABLE_WRITE_AND_INVALIDATE);
RtSetBusDataByOffset(PCIConfiguration,uBusNum,SlotNumber.u.AsULONG,PciData,0,PCI_COMMON_HDR_LENGTH);
_base_addr = PciData->u.type0.BaseAddresses[2] & 0xfffffffe;
return _base_addr;
}
}
}
}
return 0;
}
int _6208_GetDAStatus(DWORD dwAddr)
{
if(dwAddr == 0)
{
return -1;
}
return (RtReadPortUshort((PUSHORT)dwAddr) & 0x0001);
}
//DA输出
void _6208_DAOutPut(DWORD dwAddr,int nChannel,double dValue)
{
if(dValue < -9.9999999)
{
dValue = -9.9999999;
}
else if(dValue > 9.9999999)
{
dValue = 9.9999999;
}
while(_6208_GetDAStatus(dwAddr));
RtWritePortUshort((PUSHORT)(dwAddr + nChannel*2),(USHORT)(dValue * 32767/10.0));
}
void _6208_DO_WritePort(DWORD dwAddr,UCHAR nValue)
{
RtWritePortUchar((PUCHAR)(dwAddr + 0x40),nValue);
}
UCHAR _6208_DI_ReadPort(DWORD dwAddr)
{
UCHAR nValue = 0;
nValue = RtReadPortUchar((PUCHAR)(dwAddr + 0x40)) >> 4;
return nValue;
}
BOOL _6208_CloseCard(DWORD dwAddr)
{
if(dwAddr != 0)
{
dwAddr = 0;
return TRUE;
}
else
{
return FALSE;
}
}
//初始化发生错误时,输出错误信息并终止程序
void _6208_Fail(char *mesg)
{
RtPrintf("Fatal Error: %s (0x%X)\n", mesg, RtGetLastError());
ExitProcess(1);
}
- 1
- 2
前往页