>> wisen: Det er en udemærket side der er henvist til. Læsning af MAC adressen (og meget andet fra net-adapteren) gennem API og netBIOS kald gennemgås med gode eksempler. Desværre er et eksempel på direkte læsning af Ethernet controlleren ikke vist. Jeg vil alligevel gerne give 15-20 point for linket -men hvordan?
Hvis nogen kan fortælle mig hvordan man mere generelt finder I/O området for et PCI PnP kort, hvilket må give adgang til net-controllerens register vil det hjælpe meget.
Hvis du mener, at du vil give mig 15-20 point, kan du enten oprettet et nyt spg, eller under pointgivningen tage avanceret/udvidet (kan ikke lige huske hvad knappen hedder).
Jeg kender ikke lige til steder, hvor der er noget med direkte tilgang til et netkort. Det kan jeg vist ikke hjælpe dig med :(
Hvis du skal have fat i det aktuelle I/O område for et PnP kort, findes der nogle bios interrupt kald der kan returnere dem til dig - forudsat at du kender kortets ID.
Jeg har følgende lidt lange eksempel på hvordan man finder den for et PCI I/O kort fra Arcom. Det er FIND_PCIDEVICE funktionen der er interessant for dig.
/****************************** Global Variables ****************************/
int NOBOARD = TRUE; /* ARCOM PCI not found*/ int ERROR = FALSE; /* Global Error Flag */
union REGS inregs, outregs;
/* Definitions so that BYTE is 8-bits, WORD is 16-bits, and DWORD is 32-bits */
typedef unsigned char BYTE ; typedef unsigned short WORD ; typedef unsigned long DWORD ;
/****************************** Function Prototypes *************************/
void main (void); WORD FIND_PCI_DEVICE(WORD device, WORD vendor, WORD index); WORD READ_CONFIG_WORD(WORD PCIdevice, BYTE Regnum); WORD READ_CONFIG_BYTE(WORD PCIdevice, BYTE Regnum); void WRITE_CONFIG_WORD(WORD PCIdevice, BYTE Regnum, WORD Value); void Verifyboard(WORD board); WORD IOaddrange(WORD PCIdevice); void Testboard(WORD base, WORD board); void IoWrite(int base, int ioaddr, int value);
/******************************** Main Program ******************************/
void main(void) { int c; int Index = 0; /* Instance of device */ WORD PCIdevice; /* Bus number, Device nuber and Function number */ WORD board; /* APCI board ID */ WORD regval; /* Register Value */ WORD base; /* Base address */
printf(\"\\nTest Board access Y/N ?\"); /* Ask if user wants to test board */ c=getch();
if ((c=toupper(c))==\'Y\') { Testboard(base,board); /* Flash board LED */ } else { printf(\"\\n\\n\"); /* Format display correctly */ } } ++Index; /* Increase index and search for next device */ } if (NOBOARD==TRUE) printf(\"No Arcom PCI boards detected\\n\");
}
/***************************************************************************** * Find_pci_device - Uses INT 1A to find a specified PCI device * * * * parameters passed : Device - PCI chip * * Vendor - Manufacturers ID * * Index - Instance of device * * Return values : PCIdevice - bus, device and function number * ****************************************************************************/
WORD FIND_PCI_DEVICE(WORD device, WORD vendor, WORD index) { WORD PCIdevice = 0;
inregs.h.ah = 0xb1; /* PCI function ID */ inregs.h.al = 0x02; /* FIND_PCI_DEVICE Function */ inregs.x.cx = device; /* Device ID */ inregs.x.dx = vendor; /* Vendor ID */ inregs.x.si = index; /* Instance of device */
/***************************************************************************** * Read_Config_Word - Uses INT 1A to read a specified word * * * * parameters passed : PCIdevice - bus, device and function number * * Regnum - register to read * * Return values : Regval - Value returned from register * ****************************************************************************/
WORD READ_CONFIG_WORD(WORD PCIdevice, BYTE Regnum) { WORD Regval;
inregs.h.ah = 0xb1; /* PCI function ID */ inregs.h.al = 0x09; /* READ_CONFIG_WORD Function */ inregs.x.bx = PCIdevice; /* Device */ inregs.x.di = Regnum; /* Register number to read */
/***************************************************************************** * Read_Config_Byte - Uses INT 1A to read a specified byte * * * * parameters passed : Regnum - Register to write * * Value - Value to be written * * Return values : Regval - value read * ****************************************************************************/
WORD READ_CONFIG_BYTE(WORD PCIdevice, BYTE Regnum) { BYTE Regval;
inregs.h.ah = 0xb1; /* PCI function ID */ inregs.h.al = 0x08; /* READ_CONFIG_WORD Function */ inregs.x.bx = PCIdevice; /* Device */ inregs.x.di = Regnum; /* Register number to read */
/***************************************************************************** * Write_Config_Word - Uses INT 1A to wrie a specified word * * * * parameters passed : PCIdevice - Bus, device and function number * * Regnum - Register to write * * Value - Value to be written * * Return values : None * ****************************************************************************/
void WRITE_CONFIG_WORD(WORD PCIdevice, BYTE Regnum, WORD Value) { inregs.h.ah = 0xb1; /* PCI function ID */ inregs.h.al = 0x0c; /* WRITE_CONFIG_WORD Function */ inregs.x.bx = PCIdevice; /* Device */ inregs.x.di = Regnum; /* Register number to write */ inregs.x.cx = Value;
/***************************************************************************** * Verifyboard - Checks which board has been found and prints a message to * * the display * * parameters passed : Board - name of board found * * Return values : None * ****************************************************************************/
switch(board) { case IB40 :printf(\"APCI-IB40\\n\"); break; case SER4 :printf(\"APCI-SER4\\n\"); break; case RELAY8 :printf(\"APCI-RELAY8/IN8\\n\"); break; case ADADIO :printf(\"APCI-ADADIO\\n\"); break; default :printf(\"UNKNOWN\\n\"); break; } }
/***************************************************************************** * IOaddrange - Determines I/O address range allocated to PCI card * * * * parameters passed : PCIdevice - Bus, device and Function number * * Return values : lower - Base address * ****************************************************************************/
WORD IOaddrange(WORD PCIdevice) { WORD lower, upper;
lower = READ_CONFIG_WORD(PCIdevice, BASEADDRREG); /* Read Base addr register */ WRITE_CONFIG_WORD(PCIdevice, BASEADDRREG,0xFFFF); /* Write all 1\'s to base addr register */ upper = READ_CONFIG_WORD(PCIdevice, BASEADDRREG); /* Read base addr register */ WRITE_CONFIG_WORD(PCIdevice, BASEADDRREG, lower); /* Restore orignal value */ --lower; /* Strip off I/O bit */ --upper; upper = ~upper; /* Invert upper */ upper = upper + lower; /* Add to base addr to give range */ printf(\"\\tAddrees Range\\t%xH - %xH\\n\",lower,upper);
return(lower); /* Return base address */
}
/***************************************************************************** * Testboard - Flashes user led until key is pressed * * * * parameters passed : Base - base address of board * * Board - board name * * Return values : None * ****************************************************************************/ void Testboard(WORD base, WORD board)
{ if (board == RELAY8) { printf(\"\\n\\nThe RED ACCESS LED should be ON, press any key to turm OFF\\n\\n\"); while(!kbhit()) { IoWrite(base,0,0); } getch(); }
else { printf(\"\\n\\nThe GREEN user LED shoud be flashing, press any Key to continue.\\n\\n\");
while (!kbhit()) { IoWrite(base,USERLED, LEDON); /* Turn User LED ON */ delay(500); /* Wait 500ms */ IoWrite(base,USERLED, LEDOFF); /* Turn user LED OFF */ delay(500); /* Wait 500ms */ } getch(); } }
/*************************************************************************** * IoWrite - write to the port. * * * * Paramters passed : BASE - base address of board under test. * * ioaddr - address pointer to the port. * * value - data to be output. * * Return : None. * ****************************************************************************/
void IoWrite(int base, int ioaddr, int value) { outp(base,ioaddr); /* Set up I/O address */ outp(base+1,value); /* Write value to I/O address */ }
Nej, jeg har fået det fra producenten af I/O kortet for ½ års tid tilbage, og selv lavet modificationer til det, så jeg kunne bruge det i min applikation. Ovenstående er simpelthen blot den oprindelige code - med venlig hilsen Arcom Control Systems Inc. i England - besøg dem på http://www.arcom.co.uk
>> soepro Jeg havde nok gættet at det ikke var dit eget værk (navnene PLX og Arcom går igen flere gange, og deres Vendor ID\'er er jo brugt). Kommentaren gik mere på længden....
Jeg har kigget på Arcom\'s side, der ligger jo faktisk en del guld og venter. Dit eksempel har allerede været til stor hjælp og er så absolut de 60 point værd :)
Igen tak for hjælpen
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.