私は2つの内蔵シリアルポートと8つの追加のシリアルポートを追加するPCIボードを備えた組み込みLinuxシステムを持っています。
カーネルは、ポート番号がインターリーブされるようにデバイスを列挙します(例:からdmesg
)。
[ 5.964467] 0000:03:00.0: ttyS4 at MMIO 0xd0600000 (irq = 105, base_baud = 7812500) is a XR17V35X
[ 5.964934] 0000:03:00.0: ttyS5 at MMIO 0xd0600400 (irq = 105, base_baud = 7812500) is a XR17V35X
[ 5.965213] 0000:03:00.0: ttyS6 at MMIO 0xd0600800 (irq = 105, base_baud = 7812500) is a XR17V35X
[ 5.965519] 0000:03:00.0: ttyS7 at MMIO 0xd0600c00 (irq = 105, base_baud = 7812500) is a XR17V35X
[ 5.965879] 0000:03:00.0: ttyS8 at MMIO 0xd0601000 (irq = 105, base_baud = 7812500) is a XR17V35X
[ 5.966755] 0000:00:1e.3: ttyS9 at MMIO 0xd091c000 (irq = 18, base_baud = 2764800) is a 16550A
[ 5.967123] 0000:03:00.0: ttyS10 at MMIO 0xd0601400 (irq = 105, base_baud = 7812500) is a XR17V35X
[ 5.967411] 0000:03:00.0: ttyS11 at MMIO 0xd0601800 (irq = 105, base_baud = 7812500) is a XR17V35X
[ 5.967705] 0000:03:00.0: ttyS12 at MMIO 0xd0601c00 (irq = 105, base_baud = 7812500) is a XR17V35X
[ 5.976690] 0000:00:1e.4: ttyS13 at MMIO 0xd091a000 (irq = 19, base_baud = 2764800) is a 16550A
ここで、組み込みポートにはとttyS9
名前が割り当てられttyS13
、拡張ポートにはとttyS4-8
名前が割り当てられますttyS10-12
。次に再起動すると、割り当てが異なります。
ポート名が混在しているため、カーネルコマンドラインオプションconsole=ttyS4,115200
またはgetty
。
udev
カーネルコマンドラインでは機能しますgetty
が、カーネルコマンドラインでは機能しない安定したシンボリックリンクを作成するためのルールを作成できます。
console=uart,mmio32,0xd091c000,115200
システムの起動時にカーネル出力が得られないようで、LinuxコマンドラインでMMIOアドレスを試してみました。
これらの識別子を安定させる方法は?
答え1
よくわかりませんが、まだ試していない場合は、カーネルのbiosdevname = 0 | 1パラメータを変更してみてはいかがでしょうか?
その値は通常、GRUB2-mkconfigをPCで実行する前にGRUB_CMDLINE_LINUXで変更されます。もちろん、この部分は組み込み状況によって異なります。
答え2
私の役割解決策(理想的な解決策ではありません)udevヘルパースクリプトを使用してカーネルのデバイス名などを調べ、ttyS5
シンボリックリンクを確認して、PCIデバイスツリーでそのデバイスがどこにあるかを確認します/sys/class/tty/ttyS5
。次に、同じノード上の他のすべてのTTYデバイスを調べて、次のようにします。索引類似デバイスのうち、そのデバイスのランクです。デバイス名が不安定であっても、ノード内のデバイス順序は安定していると仮定します。
#!/usr/bin/env python3
import argparse
import os
# Parse arguments
parser = argparse.ArgumentParser()
parser.add_argument("kernel_dev")
args = parser.parse_args()
# Find peer devices of this one
sysfspath = os.path.realpath(f"/sys/class/tty/{args.kernel_dev}")
peer_devices = os.listdir(os.path.dirname(sysfspath))
peer_devices.sort(key=lambda d: (len(d), d)) # natural sort
# Print the index of this device among its peers
print(peer_devices.index(args.kernel_dev) + 1)
udevルールは次のとおりです。
... PROGRAM="/usr/bin/serial_device_index %k", SYMLINK+="ttyEXP%c" ...
このソリューションは、他のハードウェア構成に合わせて調整する必要があります。
私が嫌いなこと
これは安定したシンボリックリンク名のみを生成し、安定した名前は生成しません。これは、デバイスをカーネルパラメータに割り当てたり、console
Ubuntuのgetty
ログインコンソールsystemdサービスを使用したりするのに役立ちます。