如何访问我的 8 端口串行 PCI 卡上的所有 8 个串行端口

如何访问我的 8 端口串行 PCI 卡上的所有 8 个串行端口

我已经安装了基于 8 端口 PCI 的串行卡苏尼克斯在我的 Ubuntu 电脑上。

探针通过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 个,而只有一个 ( )。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

我想了解并知道为什么只有我的1Sunix 上标记的端口可以访问,以及如何/在哪里可以访问剩余的 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验证一下。新的设备文件应使用前缀 as ttySNX(而不是ttyS)创建。可以使用检查相同的内容ls /dev/ttySNX*,它应该给出以下输出:

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

因此,底线是:Linux 可能无法发挥魔法(它经常这样做)并使每个设备以即插即用的方式工作,它可能需要某些特定设备的驱动程序。

答案2

这看起来像是内核驱动程序中的错误,因为它不应该创建这么多设备。您应该检查内核调试消息以查看驱动程序初始化期间是否出现任何问题。

相关内容