USB接続のカウンタ制御 : CentOS6.2での動作について
現象、問題点
- CentOS 5 からは問題無く制御出来るが、CentOS 6 ではなぜか制御できない
- DACS社のページにある通り、http://www.dacs-giken.co.jp/DA15Linux.pdf でチェック
- カウンタをUSBで接続し、dmesg, lsmod で仮想COMドライバがロードされていることを確認。
- Teminal を2つ開き
入力デバイスをリダイレクト # cat < /dev/ttyUSB0
出力デバイスをリダイレクト # cat > /dev/ttyUSB0 こちらのターミナルで W0000000 と入力すると、もう1つの端末でR0000000と表示されるはず
- この方法で、CentOS5では問題無く動作するが、CentOS6では何も表示されなかった
対処
最初に結果だけ書いておく:マシンを再起動した後は、USBカウンタをつないでから
# modprobe -r ftdi_sio
と入力する(rootになってから)。一度だけやればOK。それだけ。
これでW0000000を入力すると、R0000000と表示されるようになった。
原因調査
根本的にはまだ分かっていない。
dmesg, lsusb, lsmodの出力は以下の通り
# dmesg usb 3-1: new full speed USB device using uhci_hcd and address 2 usb 3-1: New USB device found, idVendor=0403, idProduct=6001 usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0 usb 3-1: Product: DACS-2500 V1.0 usb 3-1: Manufacturer: DACS usb 3-1: configuration #1 chosen from 1 choice usbcore: registered new interface driver usbserial USB Serial support registered for generic usbcore: registered new interface driver usbserial_generic usbserial: USB Serial Driver core USB Serial support registered for FTDI USB Serial Device ftdi_sio 3-1:1.0: FTDI USB Serial Device converter detected usb 3-1: Detected FT232BM usb 3-1: Number of endpoints 2 usb 3-1: Endpoint 1 MaxPacketSize 64 usb 3-1: Endpoint 2 MaxPacketSize 64 usb 3-1: Setting MaxPacketSize 64 usb 3-1: FTDI USB Serial Device converter now attached to ttyUSB0 usbcore: registered new interface driver ftdi_sio ftdi_sio: v1.5.0:USB FTDI Serial Converters Driver
# lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 003 Device 002: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
# lsmod Module Size Used by ftdi_sio 32115 0 usbserial 31340 1 ftdi_sio ............
特にエラーも出ていないし、ドライバのロード順も正しいように思える。
ハード的には、単にFTDI社のSerial-USBチップがあるだけなので、 これのドライバがあれば良いはず。CentOS5, 6 ともにOS標準のパッケージに含まれている。
- USBを抜き差ししてみる → 改善せず
- USBを抜いた状態でlsmodしてみると、ftdi_sio, usbserialは残っている
→ 手動でアンロードしてみる
# modprobe -r ftdi_sio
- その後、USBケーブルを差し込む。lsmodで見ると、ftdi_sioは自動でロードされている。
- ターミナルを開いて動作確認 → 動いた!!
- W0000000 を入れると、R0000000 が戻ってくる
- 再現するかどうか、色々なパターンを試す。分かったのは
- リブート後、最初にUSBを差し込んだときには動かない(最初と同じ状況)
- modprobe -r ftdi_sio を一度実行すれば、後は何回やっても動く
(USBデバイスを差し込んだままでも、外した状態でも、どちらでもOK) - dmesg, lsmod など、通常のログに出てくる範囲では、最初のロード時と2回目のロード時では何も変わっていないように見える。
なんとなく、デバイスドライバをロードする微妙なタイミングに依存している 感じがします。以前は/etc/modprobe.conf経由だったものがCentOS6では udev経由になったため、/etc/udev/rules.d で制御するようになっています。
実はFTDI社の仮想COMドライバのページにある http://www.ftdichip.com/Drivers/VCP.htm そこにあるテクニカルノート http://www.ftdichip.com/Support/Documents/TechnicalNotes/TN_101_Customising_FTDI_VID_PID_In_Linux(FT_000081).pdf にも類似の方法は書いてあり、これも試したのですがダメでした。
納得のいかないところもありますが、 とりあえず CentOS6.2 でも使えそうです。