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 で「はい」を選択

これでドライバ設定と通信の確認ができました。
以降はシリアルプログラミングの話になります。