Linuxでリモコンを使う
前回の続きです。
PC-OP-RS1をLinuxで使ってみます。
デバイスとしてはUSB-serialに見え、ドライバはftdi-sioを使います。
まず、デバイスをUSBに挿したときのdmesgはこんな感じ。
[ 6291.206109] usb 6-2: new full speed USB device number 4 using uhci_hcd [ 6291.400045] usb 6-2: New USB device found, idVendor=0411, idProduct=00b3 [ 6291.400055] usb 6-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 6291.400063] usb 6-2: Product: BUFFALO RemoteStation PC-OP-RS1 [ 6291.400072] usb 6-2: Manufacturer: BUFFALO [ 6291.400079] usb 6-2: SerialNumber: 000020b9
デバイス情報は読めていますが、vanillaカーネル(とかふつうのdistroのカーネルとか)では自動でドライバはロードされません。
とりあえず手動でvendorとproductを指定してドライバをロードします。
# /sbin/modprobe ftdi-sio vendor=0x0411 product=0x00b3
dmesg
[ 8049.790523] USB Serial support registered for FTDI USB Serial Device [ 8049.790717] ftdi_sio 6-2:1.0: FTDI USB Serial Device converter detected [ 8049.790759] usb 6-2: Detected FT232BM [ 8049.790762] usb 6-2: Number of endpoints 2 [ 8049.790765] usb 6-2: Endpoint 1 MaxPacketSize 64 [ 8049.790768] usb 6-2: Endpoint 2 MaxPacketSize 64 [ 8049.790770] usb 6-2: Setting MaxPacketSize 64 [ 8049.793408] usb 6-2: FTDI USB Serial Device converter now attached to ttyUSB0 [ 8049.793432] usbcore: registered new interface driver ftdi_sio [ 8049.793435] ftdi_sio: v1.6.0:USB FTDI Serial Converters Driver
毎回手動でロードするのが面倒な場合はrc.localあたりに書いておくか、
hotplugで自動で認識されないと眠れないという人はドライバに下記のようなパッチを当ててモジュールを作り直しておくのが吉です。
(これはlinux-3.3用)
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index f770415..416a08f 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c @@ -846,6 +846,7 @@ static struct usb_device_id id_table_combined [] = { { USB_DEVICE(ST_VID, ST_STMCLT1030_PID), .driver_info = (kernel_ulong_t)&ftdi_stmclite_quirk }, { USB_DEVICE(FTDI_VID, FTDI_RF_R106) }, + { USB_DEVICE(BUFFALO_VID, BUFFALO_PC_OP_RS1_PID) }, { }, /* Optional parameter entry */ { } /* Terminating entry */ }; diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h index 6f6058f..cb32570 100644 --- a/drivers/usb/serial/ftdi_sio_ids.h +++ b/drivers/usb/serial/ftdi_sio_ids.h @@ -1194,3 +1194,9 @@ * ATI command output: Cinterion MC55i */ #define FTDI_CINTERION_MC55I_PID 0xA951 + +/* + * BUFFALO PC-OP-RS1 + */ +#define BUFFALO_VID 0x0411 +#define BUFFALO_PC_OP_RS1_PID 0x00b3
(さっくりパッチ送ってmainlineに取り込んでもらえばよいのですが、もういまさらという感じなんで...)
で、さきほどのdmesgにも出てましたが /dev/ttyUSB0 というファイルができます。
crw-rw---- 1 root dialout 188, 0 3月 22 23:55 /dev/ttyUSB0
ここでファイルのパーミッションが660とかになってる場合は、一般ユーザーでアクセスできないので不便です。
ユーザーをこのファイルのグループ(ここではdialoutですが、システムによって違うかもしれません)に登録するか、udevのruleでファイルの作成モードを変えておきます。
例:/etc/udev/rules.d/96-usb-serial.rules
KERNEL=="ttyUSB[0-9]", MODE="0666"
これで
# /sbin/udevadm control --reload-rules
してからデバイスを抜き揷しすると
crw-rw-rw- 1 root dialout 188, 0 3月 23 00:12 /dev/ttyUSB0
こんな感じになるでしょうか。
そんで、実際にデバイスと通信できるところまで確認しておきます。
PC-OP-RS1のコマンド体系は全部可読文字になっているようなので、ここではminicomを使って通信を確認します。ない場合は適当にインストールしてください。Fedoraの場合は yum install minicom で入ります。
minicom -s で起動して、
シリアルポート→シリアルデバイス:/dev/ttyUSB0
速度/パリティ/ビット: 115200 8N1
フロー制御なし
モデムとダイヤルの設定→初期化文字列 (クリアする)
の設定をしてから「終了する」を選択。(設定を終了する、の意です)
これでコネクトしているはずです。
LEDを光らせるコマンドは0x69('i')です。iと入力すると、デバイス本体の赤LEDが光り、画面には'O'と出るはずです。デバイスからのOKの反応が0x4f('O')なのです。
minicomを終了させるには C-a x で「はい」を選択
これでドライバ設定と通信の確認ができました。
以降はシリアルプログラミングの話になります。