2016-08-02 21 views
2

Ich verwende derzeit eine 16550-kompatible UART, und ich möchte in der Lage sein, die FIFO-Interrupt-Trigger-Ebene zu ändern (ich fallen Bytes unter hohen UART-Lasten und ich möchte reduzieren die Schwelle - es ist ein unterentwickeltes eingebettetes System). Natürlich kann ich es im 8250_port.c Fahrer ändern, wenn ich will: von AnwenderseiteSet 16550A UART Hardware FIFO-Interrupt-Ebene von Linux Userspace

[PORT_NS16550A] = { 
    .name  = "NS16550A", 
    .fifo_size = 16, 
    .tx_loadsz = 16, 
    .fcr  = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, 
    .flags  = UART_CAP_FIFO | UART_NATSEMI, 
}, 

Aber es wäre viel bequemer sein, um es zu ändern, ohne einen Kernel neu kompilieren zu müssen.

Ich hoffe, dass die following documentation veraltet ist:

Ab Ende des Jahres 2000 gibt es keine Möglichkeit der Benutzer Linux war diese direkt einstellen konnte (kann setserial es nicht tun). Während viele PCs nur eine 16550 mit 16-Byte-Puffer haben, haben bessere UARTS sogar größere Puffer.

Wenn es ein Mittel ist, dies zu tun (zum Beispiel einige neue-ish ioctl), dann seterial (8) und stty (1) Bestrahlung noch die Schnittstelle.

+0

Oh, und isaset -y -f 0x3fA 0x07 (welches direkt das FCR-Register von/dev/ttyS0 anstößt) zählt nicht! – Damien

+0

Wenn 'isaset' nicht zählt, warum sollten andere Lösungen zählen? –

+0

Da die Änderungen verloren gehen, wenn der Port erneut geöffnet wird. Darüber hinaus muss es von einem privilegierten Benutzer ausgeführt werden - und zufällige IO-Ports vom Userspace zu stossen ist im Allgemeinen keine sichere Option! – Damien

Antwort

0

Ich denke, die allgemeine Lösung für dieses Problem besteht darin, setserial zu verwenden, um den Modus zu ändern. Zum Beispiel mit dem Pericom PI7C9X7958, haben Sie mehrere Betriebsarten wie die "550" und die 950-Modi. Diese entsprechen einem 16550- oder 16950-Standard-UART-Typ. Jeder Modus hat eine bestimmte Fifo-Größe und einige andere Funktionen.

Also, wenn Ihr Gerät unterstützt können Sie

setserial -v/dev/ttyS1 uart 16950

versuchen und dann

setserial -g/dev/ttyS1 /dev/um zu überprüfen, ttyS1, UART: 16950/954, Port: 0xc800, IRQ: 16

+0

Ich versuche nicht, den UART zu ändern Art; Ich versuche, den FIFO-Schwellenwert zu ändern, d.h. das Flag "UART_FCR_R_TRIG_10" im ursprünglichen Post. – Damien