如何訪問我的 8 埠串列 PCI 卡上的所有 8 個串列埠
我在我的 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
我得到的另一個線索(來自下面的答案)是我的 PC
ttyS5
中 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 個埠?
經過深入研究,我從這裡得到了一個自定義驅動程序:
由於某種原因(我不知道),核心似乎無法辨識其他串列埠。所以,我通過執行以下操作來修復它:
從上面的連結下載驅動程序。“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
驗證。創建新設備文件時應使用前綴 asttySNX
(而不是ttyS
)。可以使用 來檢查相同ls /dev/ttySNX*
的內容,它應該給出以下輸出:/dev/ttySNX0 /dev/ttySNX1 /dev/ttySNX2 /dev/ttySNX3 /dev/ttySNX4 /dev/ttySNX5 /dev/ttySNX6 /dev/ttySNX7
因此,底線是:Linux 可能無法發揮作用(它經常這樣做)並使每個設備都以即插即用的方式工作,它可能需要某些特定設備的驅動程序。