Linux + UART im FPGA

Gast #1801318
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
Gast #1801336
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
Gast #1801355
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.

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