beautypg.com

Rockwell Automation 6182 SDK User Manual

Page 66

background image

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(“\n”));

// 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);

This manual is related to the following products: