| SHA-Programmierbeispiel
//Declare some globals
PCI_INFO PciInfo;
HANDLE hPort;
HANDLE hMem;
HANDLE hDma;
HANDLE hIntr;
UCHAR InterruptLine;
DWORD MemBasePA;
DWORD DmaBasePA;
long DmaSize = 0x20000;
DWORD Error;
char szEventName[EVENT_NAME_SIZE];
//System data declaration
for use in ring0
#pragma data_seg(".sdata")
USHORT
IoBasePA = 0;
UCHAR
Istat = 0;
UCHAR
Dstat = 0;
UCHAR
Sist0 = 0;
UCHAR
Sist1 = 0;
#pragma data_seg()
//System code declaration
for use in ring0
//This routine really
runs at RING0 in Kernel mode
//and has IOPL privileges.
#pragma code_seg(".scode")
void static IsrRoutine(void)
{
//Reset
interrupts by reading registers
SHA_SYSTEM_READPORT(IoBasePA
+ 0x14, &Istat);
SHA_SYSTEM_READPORT(IoBasePA
+ 0x0C, &Dstat);
SHA_SYSTEM_READPORT(IoBasePA
+ 0x42, &Sist0);
SHA_SYSTEM_READPORT(IoBasePA
+ 0x43, &Sist1);
}
#pragma code_seg()
//Get PCI BIOS configuration
Error = ShaScanPciBus(
0x1001, //Vendor ID
0x0010, //Device ID
&PciInfo); //OUT : Pointer to PCI info
IoBasePA = (USHORT)(PciInfo.BaseAddr[0]
& (~1));
MemBasePA = (ULONG)(PciInfo.BaseAddr[1]);
InterruptLine = (UCHAR)PciInfo.IntrLine;
//Register IO address
space
Error = ShaRegisterPort(
IFT_PCIBUS, //Interface type
IoBasePA, //Physical IO
base address
0x100,
//Memory range
&hPort); //Port
handle
//Map physical memory
and get pointer to it
Error = ShaMapMem(
IFT_PCIBUS,
//Interface type
MemBasePA,
//Physical memory mapped base address
0x100,
//Memory range
(void**)&pPort, //Pointer
to port memory
&hMem);
//Port handle
//Allocate DMA memory
Error = ShaAllocMem(
IFT_PCIBUS,
//Interface type
TRUE,
//Set busmaster DMA
0,
//Required channel for system DMA
&DmaBasePA,
//Physical address
&DmaSize,
//Memory range
(void**)&pDma, //Pointer
to user DMA memory
&hDma);
//Handle to DMA device
//Set interrupt for busmaster
DMA
Error = ShaConnectInterrupt(
IFT_PCIBUS, //Interface type
IsrRoutine, //Optional fast ISR function
NULL,
//Optional handle to DMA device (only required for slave DMA)
InterruptLine, //Interrupt number
szEventName, //Interrupt event name
&hIntr); //Interrupt
handle
//Reset interrupts by
reading registers (IO space access)
Error = ShaReadPort(IoBasePA
+ ISTAT, &Istat);
Error = ShaReadPort(IoBasePA
+ DSTAT, &Dstat);
Error = ShaReadPort(IoBasePA
+ SIST0, &Sist0);
Error = ShaReadPort(IoBasePA
+ SIST1, &Sist1);
//Start the programm (mapped
memory access)
pPort[0x2C] = (UCHAR)(DmaBasePA);
pPort[0x2D] = (UCHAR)(DmaBasePA
>> 8);
pPort[0x2E] = (UCHAR)(DmaBasePA
>> 16);
pPort[0x2F] = (UCHAR)(DmaBasePA
>> 24);
//Open interrupt event
with the received
//event name by ShaConnectInterrupt
HANDLE hEvent = OpenEvent(SYNCHRONIZE,
FALSE, szEventName) ;
if (hEvent)
{
//Wait
for interrupt event
WaitForSingleObject(hEvent,
INFINITE);
}
//Note: After usage, clean
up all requested resources
//
CloseHandle(hEvent);
ShaDisconnectInterrupt(hIntr);
ShaFreeMem(hDma);
ShaUnmapMem(hMem);
ShaUnregisterPort(hPort);
KOLTER ELECTRONIC
ist nicht für die Inhalte fremder Seiten verantwortlich.
Es gelten ausschließlich
die AGB der Firma KOLTER ELECTRONIC.
Für die Richtigkeit
der Angaben wird keine Gewähr übernommen.
Alle Preisangaben sind gewerblich.
Das Zahlungsmittel ist EURO.
Alle Rechte vorbehalten.
(c)
copyright H.Kolter
[ Zur
KOLTER ELECTRONIC® Hauptseite ]
|