Serial Device

Post Reply
Message
Author
volker
Posts: 2
Joined: 02. Sep 2002 9:25
Location: Reutte
Contact:

Serial Device

#1 Post by volker »

Hallo

Wir haben einen UART (kompatibel mit 16550) in einen FPGA (Field Programmable Gate Array) auf unserem Development-Board (ZFx86 von ZF Microdevices) implementiert.
Der ZFx86 ist ein Single-Chip-Computer, und ist ein 486er mit P1-Features.
Das FPGA ist über den ISA-Bus zum ZFx86 verbunden. Der Addressbereich der implementierten UARTs liegt zwischen 0x2e8 und 0x2ef und belegt den Interrupt 3.
Wenn wir nun den FPGA beim Booten von Linux downloaden, dann wird der UART automatisch als 16550A an ttyS3 erkannt, was auch korrekt ist.

Wenn wir dann nach dem Booten von Linux einige Bytes (mehr als 16)(mit ECHO...) senden, dann ist die Übertragung bei einer Baudrate von 9600 extrem langsam. Circa alle 5 Sekunden wird ein UARD-Buffer (16 bytes) über die Serial-Line gesendet. Nun haben wir herausgefunden, daß der ZFx86 nicht mit allen Interrupt-Sources vom UART arbeitet, da der "Transmitter Empty Interrupt" nicht enabled ist. Man kann ihn aber via "Interrupt Enable Register" (IER) auf Addresse 0x2e9 vom UART enablen. (siehe : http://www.national.com/ds/PC/PC16550D.pdf Page 14). Anstelle der Benutzung der Interrupt-Quellen pollt der ZFx86 auf dem Line Status Register (LSR) auf Addresse 0x2ed ungefähr alle 5 Sekunden und beobachtet dabei Bit 5 und Bit 6 welche ihm anzeigen, ob der interne Buffer des UARTs geleert ist. Diese zwei Bits heisen "Transmitter Holding Register Empty" und "Transmitter Empty".

Wie können wir beim ZFx86 und Linux den UART so initialisieren, daß der "Transmitter Holding Register Empty"-Interrupt zur schnelleren Datenübertragung (anstelle Pollen) verwendet wird?

mfG vost

Post Reply