2016-08-02 19 views
2

現在、16550互換のUARTを使用していますが、FIFO割り込みトリガレベルを変更することができます(高UART負荷の下でバイトを削除します。このスレッショルドは、低消費電力の組込みシステムです)。Linuxユーザ空間から16550A UARTハードウェアFIFO割り込みレベルを設定する

[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, 
}, 

をしかし、カーネルを再コンパイルすることなくユーザ空間からそれを変更することがはるかに便利になります:もちろん、私は私がしたい場合8250_port.cドライバでそれを変更することができます。

私はfollowing documentationが古くなっていることを期待しています:Linuxユーザは、(setserialには、それを行うことはできません)を直接これら 設定することができます方法はありませんでした

2000年後半のとおり。多くのPCは16バイトのバッファを持つ16550 しか持っていませんが、より良いUARTSにはさらに大きなバッファがあります。そうするための手段(例えば、いくつかの新しいっぽいのioctl)がある場合、seterial (8)stty (1)はまだインターフェイスを公開していない

+0

ああ、isaset -y -f 0x3fA 0x07(/ dev/ttyS0のFCRレジスタを直接ポークする)はカウントされません! – Damien

+0

'isaset'がカウントされない場合、他の解決策はなぜカウントされますか? –

+0

ポートが再オープンされると変更が失われるためです。さらに、特権を持つユーザが行う必要があります。また、ユーザ空間からランダムなIOポートを突き出すことは、一般的に安全な選択肢ではありません! – Damien

答えて

0

私はこの問題の一般的な解決策は、setserialを使ってUART変更モードを作ることだと思います。たとえば、ペリコンPI7C9X7958の場合、「550」モードや950モードなど、複数の操作モードがあります。これらは、16550または16950標準のUARTタイプに対応しています。各モードには、それに関連する特定のFIFOサイズとその他の機能があります。お使いのデバイスがサポートしている場合

だから、あなたは

setserialの-vは/ dev/ttyS1のUART 16950

してから検証する

setserialを-gは/ dev/ttyS1の は/ dev /を試すことができます0x00800、IRQ:16

+0

私はUARTを変更しようとしていませんタイプ; FIFOのしきい値レベル、つまり元の投稿の「UART_FCR_R_TRIG_10」フラグを変更しようとしています。 – Damien

関連する問題