PCI Express のシリアルインターフェースカードを Linux で使う †先日,Linux PC を買い換えた. root fs を SSD にして,CPU や RAM 容量もグレードアップ. と,ここまでは良いのだが,問題が1つ.
仕事柄,シリアルインターフェースは必須である. が,この PC,リアのポートにもマザー上にもシリアルのコネクタが無い. PL2303 なんかの USB ポート接続の シリアルインターフェースをつなぐという手もあるけど,こいつはイマイチ不安定なところもあるので,あまり使いたくない. 困った. シリアルインターフェースカード †無いなら増設してしまえ,と購入したのがこれ→. ボードの型番でググってみると「ubuntu で動いたぜ」という噂を発見したので. これも検討してみたのだけど,amazon のレビューが良くない. 「Linux で動作しない」「長期動作で不安定になる(おそらく Windows)」など. チップの型番(MCS9922)でググってみると,「うちの Linux マシンで動かない,どうしたらいいでしょう」「うちでは動いてるぜ」みたいな Q&A ページが引っかかる. あまり参考にならない. どっちのカードもだけど,動くにしろ動かないにしろ,「どこまで動いている」「どこから動いていない」の切り分けがされている web ページが全然引っかからない. まぁ「動いた」って実績だけでも無いよりはマシなのだけど. 環境 †
カーネルは,今現在の debian jessie が配布している吊るしのもので,自分でビルドはしていない. BIOS の設定 †まずは,BIOS の設定画面を開いて,オンボードのシリアルインターフェースの設定がある場合は無効にしておく. マザーボード上にシリアルのコネクタが無くてもチップセットにはシリアルインターフェースが乗っかっているので,こんな設定項目があるのだろう. 起動 †カードを装着して起動. 起動時にこのようなメッセージが現れる. [ 0.504213] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled [ 0.525725] 0000:04:00.0: ttyS0 at I/O 0xd010 (irq = 19, base_baud = 115200) is a ST16650V2 [ 0.547085] 0000:04:00.1: ttyS1 at I/O 0xd000 (irq = 16, base_baud = 115200) is a ST16650V2 カードは認識されていて,I/O アドレス・IRQ が割り当てられていることがわかる. lspci †lspci コマンドでの出力 # lspci -v …(略)… 04:00.0 Serial controller: MosChip Semiconductor Technology Ltd. MCS9922 PCIe Multi-I/O Controller (prog-if 02 [16550]) Subsystem: Device a000:1000 Flags: bus master, fast devsel, latency 0, IRQ 19 I/O ports at d010 [size=8] Memory at f7c03000 (32-bit, non-prefetchable) [size=4K] Memory at f7c02000 (32-bit, non-prefetchable) [size=4K] Capabilities: [50] MSI: Enable- Count=1/8 Maskable- 64bit+ Capabilities: [78] Power Management version 3 Capabilities: [80] Express Legacy Endpoint, MSI 00 Capabilities: [100] Virtual Channel Capabilities: [800] Advanced Error Reporting Kernel driver in use: serial 04:00.1 Serial controller: MosChip Semiconductor Technology Ltd. MCS9922 PCIe Multi-I/O Controller (prog-if 02 [16550]) Subsystem: Device a000:1000 Flags: bus master, fast devsel, latency 0, IRQ 16 I/O ports at d000 [size=8] Memory at f7c01000 (32-bit, non-prefetchable) [size=4K] Memory at f7c00000 (32-bit, non-prefetchable) [size=4K] Capabilities: [50] MSI: Enable- Count=1/8 Maskable- 64bit+ Capabilities: [78] Power Management version 3 Capabilities: [80] Express Legacy Endpoint, MSI 00 Capabilities: [100] Advanced Error Reporting Kernel driver in use: serial あら,こいつも MCS9922 なのね. dmesg にも現れていたように,I/O アドレス・IRQ の割り当ては問題無いようだ. setserial †setserial コマンドの出力. $ setserial /dev/ttyS0 /dev/ttyS0, UART: 16650V2, Port: 0xd010, IRQ: 19 $ setserial /dev/ttyS1 /dev/ttyS1, UART: 16650V2, Port: 0xd000, IRQ: 16 MCS9922 でググったときに「setserial コマンドで設定を変更すると動いたよ」みたいな Q&A があったが,オイラの環境では特に何もいじる必要は無いようだ. このままにしておく. 動かしてみる †というわけで,シリアルポートにデータを流し,実際に動かしてみる. 「何をつなごうか」と部屋を見渡してみたが適当なボードが無かったので,2つのシリアルポートをクロスケーブルでつないで相互に通信させてみることにする.
動いた.おっけー. とりあえずは問題なさそうだ. |