나는 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 매개변수를 변경해 보시는 것이 어떨까요?
해당 값은 일반적으로 PC에서 grub2-mkconfig를 실행하기 전에 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 서비스를 사용하는 데 유용할 수 있습니다.