8포트 직렬 PCI 카드의 직렬 포트 8개 모두에 어떻게 액세스합니까?

8포트 직렬 PCI 카드의 직렬 포트 8개 모두에 어떻게 액세스합니까?

8포트 PCI 기반 직렬 카드를 설치했습니다.수닉스내 우분투 컴퓨터에서.

프로브에는 lspci -v다음이 표시됩니다.

03:02.0 Multiport serial controller: SUNIX Co., Ltd. Multiport serial controller
        Subsystem: SUNIX Co., Ltd. Multiport serial controller
        Flags: medium devsel, IRQ 18
        I/O ports at 2100 [size=32]
        I/O ports at 2000 [size=256]
        I/O ports at 2120 [size=16]
        Capabilities: <access denied>
        Kernel driver in use: serial

또한 다음의 출력은 다음과 같습니다 ls /dev/ttyS*.

/dev/ttyS0   /dev/ttyS11  /dev/ttyS14  /dev/ttyS17  /dev/ttyS2   /dev/ttyS22  /dev/ttyS25  /dev/ttyS28  /dev/ttyS30  /dev/ttyS5  /dev/ttyS8
/dev/ttyS1   /dev/ttyS12  /dev/ttyS15  /dev/ttyS18  /dev/ttyS20  /dev/ttyS23  /dev/ttyS26  /dev/ttyS29  /dev/ttyS31  /dev/ttyS6  /dev/ttyS9
/dev/ttyS10  /dev/ttyS13  /dev/ttyS16  /dev/ttyS19  /dev/ttyS21  /dev/ttyS24  /dev/ttyS27  /dev/ttyS3   /dev/ttyS4   /dev/ttyS7

udevadm이제 위의 8개 중 하나를 직렬 포트 장치로 만들고 다음 유틸리티를 사용하여 어느 장치를 결정하도록 설정하고 싶습니다.

udevadm info -a -p $(udevadm info -q path -n /dev/ttyS<0-31>)

/dev/ttyS5이상한 점은 접속 가능한 포트가 8개가 아니고 1개( )뿐이라는 점이다. 32개의 포트 중 2개(0-31, 예, 실제로 모든 포트를 조사했습니다!)만이 이 속성으로 감지되었습니다 SUBSYSTEMS=="pci". udevadm info -a -p $(udevadm info -q path -n /dev/ttyS4)출력은 다음과 같습니다.

looking at device '/devices/pci0000:00/0000:00:16.3/tty/ttyS4':
    KERNEL=="ttyS4"
    SUBSYSTEM=="tty"
    DRIVER==""

looking at parent device '/devices/pci0000:00/0000:00:16.3':
    KERNELS=="0000:00:16.3"
    SUBSYSTEMS=="pci"
    DRIVERS=="serial"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x070002"
    ATTRS{consistent_dma_mask_bits}=="32"
    ATTRS{d3cold_allowed}=="1"
    ATTRS{device}=="0x1c3d"
    ATTRS{dma_mask_bits}=="32"
    ATTRS{driver_override}=="(null)"
    ATTRS{enable}=="1"
    ATTRS{irq}=="17"
    ATTRS{local_cpulist}=="0-7"
    ATTRS{local_cpus}=="00ff"
    ATTRS{msi_bus}=="1"
    ATTRS{numa_node}=="-1"
    ATTRS{subsystem_device}=="0x047e"
    ATTRS{subsystem_vendor}=="0x1028"
    ATTRS{vendor}=="0x8086"

looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""

다음 과 udevadm info -a -p $(udevadm info -q path -n /dev/ttyS5)같은 출력을 제공합니다.

looking at device '/devices/pci0000:00/0000:00:1e.0/0000:03:02.0/tty/ttyS5':
  KERNEL=="ttyS5"
  SUBSYSTEM=="tty"
  DRIVER==""

looking at parent device '/devices/pci0000:00/0000:00:1e.0/0000:03:02.0':
  KERNELS=="0000:03:02.0"
  SUBSYSTEMS=="pci"
  DRIVERS=="serial"
  ATTRS{broken_parity_status}=="0"
  ATTRS{class}=="0x070200"
  ATTRS{consistent_dma_mask_bits}=="32"
  ATTRS{d3cold_allowed}=="1"
  ATTRS{device}=="0x1999"
  ATTRS{dma_mask_bits}=="32"
  ATTRS{driver_override}=="(null)"
  ATTRS{enable}=="1"
  ATTRS{irq}=="18"
  ATTRS{local_cpulist}=="0-7"
  ATTRS{local_cpus}=="00ff"
  ATTRS{msi_bus}=="1"
  ATTRS{numa_node}=="-1"
  ATTRS{subsystem_device}=="0x0008"
  ATTRS{subsystem_vendor}=="0x1fd4"
  ATTRS{vendor}=="0x1fd4"

looking at parent device '/devices/pci0000:00/0000:00:1e.0':
  KERNELS=="0000:00:1e.0"
  SUBSYSTEMS=="pci"
  DRIVERS==""
  ATTRS{broken_parity_status}=="0"
  ATTRS{class}=="0x060401"
  ATTRS{consistent_dma_mask_bits}=="32"
  ATTRS{d3cold_allowed}=="0"
  ATTRS{device}=="0x244e"
  ATTRS{dma_mask_bits}=="32"
  ATTRS{driver_override}=="(null)"
  ATTRS{enable}=="1"
  ATTRS{irq}=="0"
  ATTRS{local_cpulist}=="0-7"
  ATTRS{local_cpus}=="00ff"
  ATTRS{msi_bus}=="1"
  ATTRS{numa_node}=="-1"
  ATTRS{subsystem_device}=="0x047e"
  ATTRS{subsystem_vendor}=="0x1028"
  ATTRS{vendor}=="0x8086"

looking at parent device '/devices/pci0000:00':
  KERNELS=="pci0000:00"
  SUBSYSTEMS==""
  DRIVERS==""

또한 출력도 확인했습니다 sudo setserial -g /dev/ttyS[0123456789].

/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4
/dev/ttyS1, UART: unknown, Port: 0x02f8, IRQ: 3
/dev/ttyS2, UART: unknown, Port: 0x03e8, IRQ: 4
/dev/ttyS3, UART: unknown, Port: 0x02e8, IRQ: 3
/dev/ttyS4, UART: 16550A, Port: 0x4140, IRQ: 17
/dev/ttyS5, UART: 16550A, Port: 0x2100, IRQ: 18
/dev/ttyS6, UART: unknown, Port: 0x0000, IRQ: 0
/dev/ttyS7, UART: unknown, Port: 0x0000, IRQ: 0
/dev/ttyS8, UART: unknown, Port: 0x0000, IRQ: 0
/dev/ttyS9, UART: unknown, Port: 0x0000, IRQ: 0

/dev/ttyS31, UART: unknown, Port: 0x0000, IRQ: 0나머지 22개 포트/장치도 비슷한 결과를 반환했습니다.

다음과 같은 출력이 제공됩니다 dmesg(PCI 장치와 관련된 로그만 얻었습니다).

[    0.147241] pci 0000:03:02.0: [1fd4:1999] type 00 class 0x070200
[    0.147261] pci 0000:03:02.0: reg 0x10: [io  0x2100-0x211f]
[    0.147269] pci 0000:03:02.0: reg 0x14: [io  0x2000-0x20ff]
[    0.147285] pci 0000:03:02.0: reg 0x1c: [io  0x2120-0x212f]
[    0.147326] pci 0000:03:02.0: PME# supported from D3hot
[    0.644260] 0000:03:02.0: ttyS5 at I/O 0x2100 (irq = 18, base_baud = 921600) is a 16550A

아래 답변에서 얻은 또 다른 단서는 이것이 ttyS5내 PC의 PCI 장치 아래에 나열된 유일한 항목이라는 것입니다 /sys/devices/pci0000:00/0000:00:16.3(이 특정 PCI 카드는 Windows 7 기반 PC에 설치하면 제대로 작동합니다). 출력은 다음과 같습니다 find /sys/devices/ -type d -name ttyS*.

/sys/devices/pnp0/00:04/tty/ttyS0
/sys/devices/pci0000:00/0000:00:16.3/tty/ttyS4
/sys/devices/pci0000:00/0000:00:1e.0/0000:03:02.0/tty/ttyS5
/sys/devices/platform/serial8250/tty/ttyS1
/sys/devices/platform/serial8250/tty/ttyS2
/sys/devices/platform/serial8250/tty/ttyS3
/sys/devices/platform/serial8250/tty/ttyS6
/sys/devices/platform/serial8250/tty/ttyS7
/sys/devices/platform/serial8250/tty/ttyS8
/sys/devices/platform/serial8250/tty/ttyS9
/sys/devices/platform/serial8250/tty/ttyS10
/sys/devices/platform/serial8250/tty/ttyS11
/sys/devices/platform/serial8250/tty/ttyS12
/sys/devices/platform/serial8250/tty/ttyS13
/sys/devices/platform/serial8250/tty/ttyS14
/sys/devices/platform/serial8250/tty/ttyS15
/sys/devices/platform/serial8250/tty/ttyS16
/sys/devices/platform/serial8250/tty/ttyS17
/sys/devices/platform/serial8250/tty/ttyS18
/sys/devices/platform/serial8250/tty/ttyS19
/sys/devices/platform/serial8250/tty/ttyS20
/sys/devices/platform/serial8250/tty/ttyS21
/sys/devices/platform/serial8250/tty/ttyS22
/sys/devices/platform/serial8250/tty/ttyS23
/sys/devices/platform/serial8250/tty/ttyS24
/sys/devices/platform/serial8250/tty/ttyS25
/sys/devices/platform/serial8250/tty/ttyS26
/sys/devices/platform/serial8250/tty/ttyS27
/sys/devices/platform/serial8250/tty/ttyS28
/sys/devices/platform/serial8250/tty/ttyS29
/sys/devices/platform/serial8250/tty/ttyS30
/sys/devices/platform/serial8250/tty/ttyS31

1내 Sunix에 표시된 포트만 액세스할 수 있는 이유와 나머지 7개 포트에 어떻게/어디서 ​​액세스할 수 있는지 알고 싶습니다 .

답변1

심층적인 조사 끝에 여기에서 사용자 정의 드라이버를 얻었습니다.

www.sunix.com/en/download.php?pid=970&file=driver&file_link=download/driver/2016/20160706173626_snx_V2.0.4.2.tar.gz

어떤 이유에서인지(모르겠습니다) 커널이 다른 직렬 포트를 인식하지 못하는 것 같습니다. 그래서 다음을 수행하여 문제를 해결했습니다.

위 링크에서 드라이버를 다운로드하세요. "ncurses.h"는 위 드라이버의 종속성입니다. 다음을 사용하여 설치하십시오 apt.

sudo apt-get install libncurses5-dev

루트 디렉터리(드라이버 설치용)로 변경하고 새 디렉터리를 생성한 후 작업 디렉터리를 temp생성합니다 .temp

cd /
sudo mkdir temp
cd /temp

tar파일을 복사 하고 내용을 다음 위치에 추출합니다 /temp.

sudo cp ~/Downloads/20160706173626_snx_V2.0.4.2.tar.gz /temp/snx_V2.0.4.2.tar.gz
sudo tar xvf snx_V2.0.4.2.tar.gz

드라이버를 설치하려면 다음 단계를 따르십시오.

sudo make clean
sudo make install
sudo modprobe snx

실행 lsmod | grep snx하여 확인하세요. 새 장치 파일은 ttySNX(대신 ) 접두사를 사용하여 생성되어야 합니다 ttyS. ls /dev/ttySNX*다음과 같은 출력을 제공해야 하는 를 사용하여 동일한 내용을 확인할 수 있습니다 .

/dev/ttySNX0  /dev/ttySNX1  /dev/ttySNX2  /dev/ttySNX3  /dev/ttySNX4  /dev/ttySNX5  /dev/ttySNX6  /dev/ttySNX7

따라서 결론: Linux는 (종종 그렇듯이) 마법을 발휘하지 못할 수 있으며 모든 장치가 플러그 앤 플레이 방식으로 작동하도록 만들 수 없으며 일부 장치별 드라이버가 필요할 수 있습니다.

답변2

너무 많은 장치를 생성해서는 안 되기 때문에 이는 커널 드라이버의 버그처럼 보입니다. 드라이버 초기화 중에 문제가 발생했는지 알아보려면 커널 디버그 메시지를 확인해야 합니다.

관련 정보