これがこの質問の間違った場所である場合はお詫びします。現在、問題がどのレベルにあるかがわからないため、賭けを少しヘッジしています.
システムは、TI 独自の SDK / LSP / BusyBox カーネルを実行する LeopardBoard DM368 です。
デフォルトでは、システムには 1 つの UART が有効な UART0 があり、これは /dev/ttyS0 としてマウントされ、これも bootargs を介して使用/起動されますconsole=ttyS0,115200n8 earlyprintk
。
UART1 を /dev/ttyS1 として有効にしたいので、pinmux、クロックなどを設定する低レベルのボード初期化コードを実行しました。
起動時に、低レベルの 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/ に表示されず、ステータス (フロー制御ビット) に不一致があり、ハングしたり、送信されなかったりする可能性があると思われます。
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: /dev/ttyS1: Inappropriate ioctl for device
奇妙なことに、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 に保持し、2 次通信用に ttyS1 を使用するとよいでしょう。
追加する編集: いくつかの printk を serial_core.c に挿入しましたが、ttyS1 に対して uart_open() が呼び出されないようです。Linux の init/startup シーケンスで変更が必要なものだと思いますか?
私は頑固な Linux ハッカーではないので、カーネル コードや初期化シーケンスなどで明らかな/ばかげたことを見逃している可能性は十分にあります。
どんな考えでも大歓迎です!