Rockwell Automation 6182 SDK User Manual
Page 66
![background image](/manuals/580154/66/background.png)
4–26
RAC6182-Specific Extensions to the CE API
Publication 6182-UM002B-EN-P
NKDbgPrintfW(TEXT(“failed to set device specific PCI config
value\n”));
return(-1);
}
// get virtual interrupt #
interrupt=PCIConfig.u.type0.InterruptLine;
// can use manual reset or named event if desired
waitevent=CreateEvent(NULL,FALSE,FALSE,NULL);
if(!waitevent || waitevent==INVALID_HANDLE_VALUE) {
NKDbgPrintfW(TEXT(“failed createevent()\n”));
return(-1);
}
if(!InterruptInitialize(interrupt,waitevent,NULL,0)) {
NKDbgPrintfW(TEXT(”failed claiming interrupt %d\n”),interrupt);
return(-1);
}
// handle 1st address space – 4K memory
pa.HighPart=0;
pa.LowPart=PCIConfig.u.type0.BaseAddresses[0]&
PCI_ADDRESS_MEMORY_ADDRESS_MASK);
value=0;
if(!HalTranslateBusAddress(PCIBus,PCI_SLOT_BUS_NUMBER,pa,&value,&pa
2)) {
NKDbgPrintfW(TEXT(“failed translating mem address\n”));
return(-1);
}
if(!(MemSpace=MmMapIoSpace(pa2,CARD_MEMORY_SIZE,FALSE))) {
NKDbgPrintfW(TEXT(“failed mapping mem address\n”));
return(-1);
}
// handle 2nd address space – 16K IO
pa.HighPart=0;
pa.LowPart=PCIConfig.u.type0.BaseAddresses[1]&
PCI_ADDRESS_IO_ADDRESS_MASK);
value=1;
if(!HalTranslateBusAddress(PCIBus,PCI_SLOT_BUS_NUMBER,pa,&value,&pa2))
{
NKDbgPrintfW(TEXT(“failed translating io address\n”));
return(-1);
}
if(!(IOSpace=MmMapIoSpace(pa2,CARD_MEMORY_SIZE,FALSE))) {
NKDbgPrintfW(TEXT(“failed mapping IO address\n”));
return(-1);
}
// everything mapped and initialized OK, now we become an interrupt
handler
while(1) {
value=WaitForSingleObject(waitevent,1000);
if(value==WAIT_TIMEOUT) {
NKDbgPrintfW(TEXT(“
// do not InterruptDone() on a time out or if event other
// than the interrupt-associated event triggered
} else if(value==WAIT_OBJECT_0) {
// interrupt occurred on PCI slot device
if(*(ULONG *)MemSpace==CARD_SIGNAL_DEAD ||
*(ULONG *)IOSpace==CARD_SIGNAL_DEAD) {
// demonstrate InterruptDisable()
NKDbgPrintfW(TEXT(“card dead\n”));
InterruptDisable(interrupt);