どのレベルで問題が発生しているかわかりません。
システムは、TI 独自の SDK / LSP / BusyBox カーネルを実行する LeopardBoard DM368 であり、コア Linux カーネルは 2.6.x なので、serial_core.c ドライバー モデルを使用します。
デフォルトでは、システムには 1 つの UART (UART0) が有効になっており、/dev/ttyS0
bootargs 経由でも使用/呼び出されるとしてマウントされますconsole=ttyS0,115200n8 earlyprintk
。
UART1 を有効にしたいので/dev/ttyS1
、ピンマックスやクロックなどを設定する低レベルのボード初期化コードを実行しました。
起動時に、低レベルの init は (私が追加した printk を介して) UART1 が有効になっていることを報告し、ドライバー コードも正常であることを報告します。
[ 0.547812] serial8250.0: ttyS0 at MMIO 0x1c20000 (irq = 40) is a 16550A
[ 0.569849] serial8250.0: ttyS1 at MMIO 0x1d06000 (irq = 41) is a 16550A
ただし、ポートは/dev/
( として/dev/ttyS1
) に表示されず、そのステータス (フロー制御ビット) に矛盾があるため、ハングしたり、送信されなかったりする原因になっていると思われます。
cat /proc/tty/driver/serial
serinfo:1.0 driver revision:
0: uart:16550A mmio:0x01C20000 irq:40 tx:97998 rx:0 CTS|DSR
1: uart:16550A mmio:0x01D06000 irq:41 tx:0 rx:0 DSR
コマンドラインから設定または変更しようとすると、エラーが発生します。
>: stty -F /dev/ttyS1
stty: can't open '/dev/ttyS1': No such file or directory
奇妙なことに、bootargs をconsole=ttyS1,115200n8 earlyprintk
ポートに変更すると、完全に機能し、ttyS0 も正しく初期化されて機能します。
cat /proc/tty/driver/serial
serinfo:1.0 driver revision:
0: uart:16550A mmio:0x01C20000 irq:40 tx:0 rx:0 CTS|DSR
1: uart:16550A mmio:0x01D06000 irq:41 tx:11563 rx:0 RTS|DTR|DSR
それは問題ありませんが、ブートローダは UART0 を使用する必要があるため、コンソール関連のすべてを ttyS0 に保持し、セカンダリ通信用に ttyS1 を使用するとよいでしょう。
serial_core.c に printk をいくつか挿入しましたが、ttyS1 に対して uart_open() が呼び出されていないようです。これは、Linux の init/startup シーケンスで変更が必要な部分だと思います。
編集済み:私は自分自身を騙してecho >/dev/ttyS1
、ファイルと呼ばれ/dev/ttyS1
、少し問題を曖昧にしていました。私は今、99%確信して/dev/ttyS1
います一度もない作成した。
答え1
mknod /dev/ttyS1 c 4 65
(/dev
読み取り専用の場合は、オプションなしでマウントされた書き込み可能なディレクトリを使用しますnodev
)
ノードがエラーなしで作成された場合は、パッチがノードへの読み取り/書き込み、または任意のターミナル エミュレーターで動作しているかどうかを確認できます。
問題はノードが作成されないことですか?
自動マジックダイナミック開発FSを使用している場合、devfs
またはudev
おそらく登録途中で問題が発生しました (ただし、ほとんどのコードは ttyS0 を起動するためのものと同じであり、シリアル ポートを追加することは、一部のプラットフォーム ファイルの配列に構成行を追加するようなものなので、問題はないと思います)。
そのような dev fs を使用していない場合は、ビルド ツリーのどこかに、新しいデバイスを静的に作成するための行を手動で追加するファイルがあるはずですMAKEDEV
。また、init スクリプトによって dev ノードが作成されたシステムも見たことがあります。