16550A UART kann bei ungewöhnlicher E/A-Portadresse nicht initialisiert/erkannt werden

16550A UART kann bei ungewöhnlicher E/A-Portadresse nicht initialisiert/erkannt werden

Ich habe eine Platine, die auf der Vortex86DX-CPU basiert, einem x86-basierten Mikrocontroller. Sie hat fünf 16550A-UARTS, von denen sich vier (COM1-COM4) an den üblichen E/A-Port-Adressen (0x3f8, 0x2f8, 0x3e8, 0x2e8) befinden, aber der fünfte (COM9) ist bei 0x010, IRQ 9.

Vortex86DX

Die ersten vier UARTS werden erkannt, ich habe damit kein Problem. Das Problem ist, dass ich den fünften (COM9) unter Linux nicht zum Laufen bekomme. COM9 funktioniert in einer eigenständigen DOS-Anwendung, aber ich kann es unter Linux nicht einmal erkennen.

Was ich bisher getan habe:

Ergebnis: Der Kernel konnte den UART an der Adresse 0x010 nicht prüfen.

Also habe ich ein Dienstprogramm zum Prüfen von E/A-Ports geschrieben, um direkt vom E/A-Port 0x010 zu lesen, und ich konnte keine 16550A-Register im Bereich 0x010 bis 0x017 erkennen. Es scheint, als wäre dort nichts. Ich habe versucht, Daten in das Scratch-Register (Offset +7) zu schreiben und daraus zurückzulesen, aber ich bekomme nichts an der Adresse 0x017.

Das Datenblatt der CPU sagt nicht viel. Es zeigt an, dass es in einem Southbridge-Register ein Steuerbit gibt, das „etwas“ für COM9 tut. Ich habe ein PCI-Dienstprogramm geschrieben, das in dieses Bit geschrieben hat, aber es schien den COM-Port nicht zu aktivieren oder irgendetwas zu ändern, als ich den IO-Port prüfte.

An dieser Stelle wäre jede Hilfe willkommen!

Antwort1

Ich verstehe nicht, warum Sie sich die Mühe gemacht haben, den Kernel-Quellcode zu ändern, um Unterstützung für diesen nicht standardmäßigen seriellen E/A-Port und IRQ hinzuzufügen. Das setserial(8)Programm sollte in der Lage sein, dies für Sie zu konfigurieren. Etwa so:

# setserial ttyS4 address 0x10 irq 9

Sehendas Linux Serial HOWTOfür mehr Details.

Antwort2

Es scheint, dass entweder das BIOS oder Linux den COM9-Port in den Southbridge-Registern deaktiviert.

Register:

  • „Internal UART9 Control Register“ muss auf den Standardwert 0x00810010 zurückgesetzt werden.
  • Um COM9 wieder zu aktivieren, muss Bit 9 im „On-Chip Device Control Register“ gelöscht werden.

Ich weiß nicht, warum oder wo diese deaktiviert sind.

Als ich sie in meinem Gerätetreiber auf sinnvolle Werte einstellte, konnte ich den COM9 UART erkennen.

Linux erfordert für den Vortex86DX einen neuen x86-Chiptyp. Er ist nicht 100% kompatibel.

verwandte Informationen