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つのうちの1つをシリアルポートデバイスにし、次のユーティリティを使用してどのデバイスを決定するかを設定したいと思います。
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
あまりにも多くのデバイスを作成してはいけないので、これはカーネルドライバのバグのようです。ドライバの初期化中に問題が発生したかどうかを確認するには、カーネルのデバッグメッセージを確認する必要があります。