Tweet

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 (現在の testing) amd64
カーネル
$ uname -a
Linux JR0BAK 3.16.0-4-amd64 #1 SMP Debian 3.16.7-2 (2014-11-06) x86_64 GNU/Linux

カーネルは,今現在の 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つのシリアルポートをクロスケーブルでつないで相互に通信させてみることにする.

  1. cu をインストールし,dialout グループに自分のユーザ名を追加する
  2. 端末画面を開き,cu を起動する
    $ cu -l ttyS0 -s 115200
  3. もう一枚端末画面を開き,cu を起動する
    $ cu -l ttyS1 -s 115200
  4. 片方の画面で適当な文字を打つと,その内容がもう一方の画面に現れることを確認する

動いた.おっけー. とりあえずは問題なさそうだ.


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-11-27 (木) 21:38:58 (1881d)