Forum: PC-Programmierung IRQ einer PCI->COM-Karte unter DOS ermitteln


von Michael M. (Gast)


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

von Ingo H. (putzlowitsch)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Bist Du Dir wirklich sicher, daß die I/O-Adressen der auf Deiner
Schnittstellenkarte vorhandenen Schnittstellen im BIOS-Datenbereich
untergebracht werden? Das würde mich wundern ...

von Frankieboy (Gast)


Lesenswert?

@Michael

Hallo,
wenn der Treiber dem Baustein ein Gerät zuordnet, hilft vielleicht das
uralte DOS Diagnoseprogramm Syscheck unter http://www.syschk.com/

Gruss
Frank

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.