Ubuntu

如何訪問我的 8 埠串列 PCI 卡上的所有 8 個串列埠

  • August 10, 2017

我在我的 Ubuntu PC 中安裝了Sunix的 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

現在,我希望以上 8 個中的任何一個成為我的串列埠設備,並設置使用該udevadm實用程序來確定哪個,如下所示:

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

奇怪的是,沒有 8 個,而只有一個埠(/dev/ttyS5)可以訪問。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

其餘 22 個埠/設備/dev/ttyS31, UART: unknown, Port: 0x0000, IRQ: 0也返回了類似的結果。

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

我得到的另一個線索(來自下面的答案)是我的 PCttyS5中 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 個埠?

經過深入研究,我從這裡得到了一個自定義驅動程序:

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 可能無法發揮作用(它經常這樣做)並使每個設備都以即插即用的方式工作,它可能需要某些特定設備的驅動程序。

引用自:https://unix.stackexchange.com/questions/384935