Forum: FPGA, VHDL & Co. Linux + UART im FPGA


von Lisa G. (Gast)


Lesenswert?

Hallo zusammen,

Meine CPU ist über den LPC-Bus mit einem UART in einem FPGA (Adresse 
0x1900) verbunden. Der Kernel erkennt den UART wie folgt:
1
# setserial -a /dev/ttyS1
2
3
/dev/ttyS1, Line 1, UART: 16550A, Port: 0x1900, IRQ: 3
4
        Baud_base: 115200, close_delay: 50, divisor: 0
5
        closing_wait: 3000
6
        Flags: spd_normal skip_test auto_irq

In der Datei /etc/inittab habe ich folgendes eingetragen, um die 
serielle Schnittstelle zu initialisieren:
1
T1:2345:respawn:/sbin/getty -L ttyS1 38400 vt100

Der Kernel wird mit Hilfe von Grub legacy wie folgt gestartet (Auszug 
aus /boot/grub/menu.lst):
1
kernel /boot/vmlinuz-2.6.30 root=UUID=xxxxxxxxxx ro console=tty0 console=ttyS1,38400

Die Schnittstelle ist laut stty auf 38400 Baud eingestellt:
1
# stty -F /dev/ttyS1
2
speed 38400 baud; line = 0;
3
kill = ^X; min = 1; time = 0;
4
-brkint -icrnl -imaxbel
5
-opost -onlcr
6
-isig -icanon -iexten -echo -echoe -echok -echoctl -echoke


Nun zu meinem Problem:

Ich will mittels
1
# while [ 1 ]; do `echo "hallo" > /dev/ttyS1 `; done

"hallo" auf der der empfangenden Konsole ausgeben und bekomme nur 
Hieroglyphen zurück.

Erst wenn ich mittels
1
# setserial -a  /dev/ttyS1 spd_cust divisor 57

den Divisor verändere und das empfangende Terminalprogramm auf 57600 
Baud einstelle, dann bekomme ich das richtige gesendet.

Das klappt im übrigen auch mit
1
# setserial -a  /dev/ttyS1 spd_cust divisor 342

und der Einstellung 9600 Baud im empfangenden Terminalprogramm.


Im Kernelquellcode bin ich auf folgendes gestoßen 
(arch/x86/include/asm/serial.h):
1
/*
2
 * This assumes you have a 1.8432 MHz clock for your UART.
3
 *
4
 * It'd be nice if someone built a serial card with a 24.576 MHz
5
 * clock, since the 16550A is capable of handling a top speed of 1.5
6
 * megabits/second; but this requires the faster clock.
7
 */
8
#define BASE_BAUD ( 1843200 / 16 )

Kann mir jemand sagen, welche Einstellung ich hier (oder vielleicht auch 
irgendwo anders) vornehmen muss, damit mein UART auch schon während des 
Bootvorgangs und nicht erst nach Ändern des Divisors korrekte Meldungen 
ausgibt?


Vielen Dank im Voraus

Lisa

von Duke Scarring (Gast)


Lesenswert?

Mir ist nach Deiner Beschreibung noch nicht klar, wo Dein 
Terminalprogramm und wo Dein Linux läuft.

Hier die funktionierenden Werte:
57 * 57600 = 3283200
342 * 9600 = 3283200

Also scheint da intern irgendwo was mit 3.283 MHz zu laufen. Was sind 
denn da für Quarze im System verbaut?

Allerdings passt das gar nicht zu den anderen Werten:
1843200 / 16 = 115200

Duke

von Lisa G. (Gast)


Lesenswert?

Hallo,

vielen Dank für die schnelle Antwort! Mein Terminalprogramm läuft auf 
einem normalen Windows-Rechner, das über ein serielles Kabel mit dem 
Target verbunden ist. Hier mal eine der Versuch das Ganze bildlich 
darzustellen:


              RS232                      LPC-Bus
Windows-Host ------- LineDriver----FPGA----------Target-CPU


Das FPGA wird mit 25 MHz getaktet.

von Keller T. (fabito)


Lesenswert?

Hallo,

Ich habe gerade das Problem UART über PCIe mit dem Ziel Modem Leitungen 
zu testen.
Hier meine Frage ist:

               /dev/ttyS1, Line 1, UART: 16550A, Port: 0x1900, IRQ: 3

Ist das eine IO /Port Adresse oder Memory Map Adresse ???

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.