setserial /dev/ttyS4: シリアル情報を設定できません。

setserial /dev/ttyS4: シリアル情報を設定できません。

したがって、6つのハードウェアシリアルポートを備えたボードがあります。最初の2つはETXバスにあり、最後の4つはISAバスにあります。次の構成は次のようにする必要があります。

/dev/ttyS0 port 0x03F8 irq 4
/dev/ttyS1 port 0x02F8 irq 3
/dev/ttyS2 port 0x0100 irq 5
/dev/ttyS3 port 0x0108 irq 5
/dev/ttyS4 port 0x0110 irq 5
/dev/ttyS5 port 0x0118 irq 5

起動時に以下を実行します。

# dmesg | egrep -i 'serial|ttys'
Serial: 8250/16550 driver, 6 ports, IRQ sharing enabled
serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
serial8250: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
00:06: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
00:07: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A

# cat /proc/tty/driver/serial
Serinfo:1.0 driver revision:
0: uart:16550A port: 000003F8 irq:4 tx:0 rx:0
1: uart:16550A port: 000002F8 irq:3 tx:0 rx:0
2: uart:unknown port:000003E8 irq:4
3: uart:unknown port:000002E8 irq:3
4: uart:unknown port:00000000 irq:0
5: uart:unknown port:00000000 irq:0

そこで、setserialを使ってポートttyS2-ttyS5を正しい値に設定してみました。

# setserial /dev/ttyS2 irq 5 port 0x100 uart 16550A
# setserial /dev/ttyS3 irq 5 port 0x108 uart 16550A
# setserial /dev/ttyS4 irq 5 port 0x110 uart 16550A
Cannot set serial info: Invalid argument
# setserial /dev/ttyS5 irq 5 port 0x118 uart 16550A
Cannot set serial info: Invalid argument

最後のコマンドからuartオプションを削除します。

# setserial /dev/ttyS4 irq 5
Cannot set serial info: Invalid argument

setserialでttyS4とttyS5を設定するにはどうすればよいですか?

答え1

/procあなたの結果と結果から私が見たことについてdmesgいくつかのことが私に衝撃を与えました。

  • デバイス間でIRQを共有しようとしないでください。動作するかもしれませんが、ISAの目的は、動作に割り込みラインが必要なバス上のすべてのデバイスに独自のIRQがあることです。シリアルポートカードが十分なIRQオプションを提供しない場合、PCは両方のオプションを使用できない可能性があります。

  • 2番目のシリアルポートペアに使用されるI / Oアドレスは非標準です。ttyS2通常は0x3E8、ttyS3通常は0x2E8にあります。シリアルカードオプションがある場合は、このカードを移動します。 (バージョン1以降には標準I / OアドレスまたはIRQはありませんttyS4。)

それ以外に、Linuxシステムに6つのシリアルポートが必要な場合は、従来の汎用シリアルポートアダプタカードを使用しません。私は次のようなものを使用します。デジタル加速ポート。彼らはまだISAスロットで動作するXeモデルを提供しています。安いものが必要な場合は、当時非常に人気があった中古市場で見つけることができます。

答え2

カーネルブートパラメータにまたはを追加してみてください8250.nr_uarts=6 nr_uarts=6

編集:(希望的に)役に立つかもしれないいくつかの情報。

答え3

baud_rate 115200パラメータを試してくださいsetserial

答え4

この質問に対する他の回答で述べたbase_baudに加えて、パラメータの順序である可能性があります。 (base_baudが機能したため、正確に何が修正されたかを確認するために他の順序を試す時間はありませんでした。)

組み込みx86アプリケーションに新しいシリアルポートをインストールしようとしたとき、同様の問題に直面しました。私にとって問題は、setserialプログラムがコマンドライン引数を対応するioctl()操作に順次変換してさまざまなデバイスパラメータを設定することです。デフォルトでは、seterial は次の戦略を適用します。 1) 特定の /dev/ttySx の現在の設定を読みます。 2)各コマンドラインパラメータで指定された値を変更します。各個別のコマンドラインパラメータまたはフラグはioctlになります。

したがって、ポートまたはirqを指定する前にuartタイプ(または自動設定)を指定すると、/ dev / ttyS3のポート値がどの値でも初期化されないため、/ dev / ttyS3より大きいポートでは正しく機能しません。これにより、ioctl()操作はerrnoがEINVAL(無効な引数)に設定された状態で返されます。私は ioctl() の ^fourport フラグと low_latency フラグのチェーンがドライバに意味がないと疑われます。https://bugzilla.kernel.org/show_bug.cgi?id=8458

関連情報