IRQ einer PCI->COM-Karte unter DOS ermitteln

Gast #249840
Lesenswert?

Hallo,

habe eine PCI-Karte mit dem Baustein NM9835. Lieferumfang ist auch
eine .exe für DOS. Gestartet, macht sie die Karte bekannt und versucht,
sie Legacy zuzuordnen und gibt am Bildschirm die belegten Resourcen
aus.

Nun will ich die Karte in einem eigenen TurboPascal-Programm benutzen.
Die Ports der Schnittstellen kann ich bereits im BIOS-Datenbereich 40:0
ermitteln. Was ich jetzt suche, ist eine Idee, auch den benutzten
Interrupt herauszufinden. PCI-Vendor-ID etc. ist bekannt.

Dankeschön - Michael
#249841
Lesenswert?

Unter DOS kann man die PCI-Konfiguration mit dem Interrupt 0x1a lesen.
Ich habe das mal für eine I/O-Karte von KOLTER gemacht, allerding nur
die Ports, vermutlich erlaubt aber eine andere Unterfunktion des Int
auch das ermittlen weiterer Daten. Hier die originale KOLTER get_io_adr
Funktion:
1
/*  Die folgende Funktion zeigt eine M”glichkeit auf, wie die
2
    I/O-Adresse einer KOLTER-Karte ermittelt werden kann.
3

4
    Als šbergabewert der Funktion ist die Device ID der
5
    entsprechenden Karte anzugeben (Beispiel: PCI-16/16 = 0x0010).
6

7
    Der Rckgabewert der Funktion beinhaltet die I/O-Adresse
8
    der Karte oder 0, wenn keine Karte gefunden wurde bzw. keine
9
    Plug'n Play-Adresse vergeben wurde. 
10

11
    Wichtig:
12
    Bei der Einbindung dieser Funktion in ein Programm
13
    ist zu beachten, dass fr den Compiler der 386er
14
    Befehlssatz verwendet wird, da sonst Zugriffe
15
    auf erweiterten Register (ECX) nicht untersttzt werden.
16
*/
17

18
unsigned long get_io_adr(unsigned int Device)
19

20
{
21

22
unsigned short slot_no;
23
unsigned long io_adr;
24
unsigned long ven_dev;
25
unsigned long K_ven_dev;
26

27
io_adr = 0;
28

29
K_ven_dev = Device;                       /* Device und VendorID
30
werden*/
31
K_ven_dev = K_ven_dev << 16 | 0x1001;     /* verknpft                
32
*/
33
for (slot_no = 0;(slot_no <= 0x00F8) && (io_adr == 0);slot_no += 8)
34
  {
35
  asm mov bx,slot_no
36
        asm mov di,0x0000                 /* Alle PCI-Einheiten werden
37
*/
38
        asm mov ax,0xb10a                 /* nach der entsprechenden  
39
*/
40
        asm int 0x1a                      /* KOLTER-Karten durchsucht.
41
*/
42
  asm mov ven_dev,ecx
43
        if (K_ven_dev == ven_dev)         /* Konnte die Karte gefunden
44
*/
45
                {                         /* werden, so wird die ent- 
46
*/
47
                asm mov ax,0xb10a         /* sprechende I/O-Adresse   
48
*/
49
                asm mov bx,slot_no        /* ausgelesen.              
50
*/
51
    asm mov di,0x0010
52
    asm int 0x1a
53
    asm mov io_adr,ecx
54
    }
55
  }
56
io_adr &= 0xFFFFFFF0;                     /* I/O-Adresse wird maskiert
57
*/
58
return(io_adr);                           /* Rckgabe der I/O-Adresse 
59
*/
60

61
}

ist vielleicht als erster Ansatz hilfreich.

Gruß
Ingo

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren