4.6. IrDA と USB

最近の 2.4 カーネルには IrDA USB ドライバが含まれています。他の FIR ハードウェアほどは効率は良くありませんが、少なくともサポートされており、 また動作させるのも容易です。 また、現行のプロダクトはすべて同一のハードウェアを元にしているので、そのハードウェアの殆どのバグも分かっています。

知る限り、Actisys 2000U と Extended System ESI-9685 は同一のハードウェアを用いているようです。 どちらの USB ドングルも Linux ドライバで良好に動作します。また、複数の USB ドングルを一台のマシンに接続する (現在は4個までですが) ことも可能です。

最新版のドライバは usb-uhciusb-ohci でテストされています。 また、ソースコード中のドライバ情報、例えば USB 2.0 も参照下さい。

IrDA ブリッジ仕様書の Rev 0.9B 版が出ています。これは USB クラス仕様として採用が広がりつつあります。この仕様は 0.9 クラス仕様ヘッダ (USB.org にあります) で見ることができます。

最近 SigmaTel から新型の USB ドングルが市場に投入されましたが、これは IrDA-USB 仕様とは互換でなく、従ってこのドライバでは動作しません。 一方、SigmaTel は 詳細技術仕様 を公開していますので、ドライバを書くことは可能ではあります。

4.6.1. 動作環境

私はこの章の内容を以下の環境でチェックしました。

4.6.2. 前提条件

IrDA と USB がサポートされたカーネル、/etc/modules.conf に標準的エントリいくつか、そしてこれまでの章に記載の通りデバイスファイル /dev/ir* が必要です。加えて二台目の IrDA デバイス (ラップトップか、IrDA ポートを持つプリンタか、携帯電話) が必要です。 こちらは Linux がインストールされたものでも、そうでないものでも構いません。

USB コントローラが動作している必要があります。lsmod で所定のモジュールが組み込まれているかを確認してください。 組み込まれていない場合、Intel/Via USB コントローラの場合 modprobe usb-uhci で、その他のコントローラの場合 modprobe usb-ohci を実行して組み込んでください。

注意して欲しいのは、このドライバはまだ usb-ehci (USB 2.0 コントローラ) ドライバとの組み合わせでは テストされていない ことです。 また、uhci ドライバ (Intel/Via USB コントローラの追加ポート/JE ドライバ) との組み合わせでは動きません。

Warning

また、(Linux USB Project で提供されている) 別系統のドライバがあり、こちらではデバイスは ir-usb と呼ばれています。このモジュールは IrDA スタックとは非互換で、irda-usb と競合します。 こちらのドライバは常に最初にロードされるように出来ているため、 ir-usb は完全に削除する必要があります。

ルーティング関連について十分な知識がないなら、ifconfig を使って最初の設定の間外部ネットワークを切っておくことを勧めます。 その後で route -n の使い方をチェックしてください。 また、ネットワークフィルタ (iptables) は問題を起こす可能性があるので、 ネットワークにつなげていない間は無効にして置いてください。

以下では詳細について、細かなこつを含め出来るだけはっきり書いていきます。 このため、実際の設定はもっとずっと作業が少なく簡単です。 設定の間は、個々のプログラムのログメッセージを監視するため、三つのウィンドウを開くようにしています。

4.6.3. ドングルを挿入する

まずドングルを挿入して、dmesg でカーネルメッセージを調べます。

hub.c: USB new device connect on bus1/1, assigned device number 2
usb.c: USB device 2 (vend/prod 0x50f/0x180) is not claimed by any active driver.
usb.c: registered new driver irda-usb
IRDA-USB found at address 2, Vendor: 50f, Product: 180
irda_usb_parse_endpoints(), And our endpoints are : in=02, out=01 (64), int=03
irda_usb_init_qos(), dongle says speed=0x13E, size=0x20, window=0x2, bofs=0x4, turn=0x2
IrDA: Registered device irda1
USB IrDA support registered

他の IrDA ハードウェアが PC 上で設定されている場合には、ドライバ名は irda0 にはなりませんので、上記のように表示されているメッセージログをチェックする作業が重要になります。 ドライバは一台の PC で四つまでの IrDA-USB ドングルを扱え、ソースコードを修正することで更に増やすことも可能です。

この例では、デバイスは irda1 です。 これは ifconfig でもチェックできます。

irda1     Link encap:IrLAP  HWaddr 2c:52:61:ec
          EtherTalk Phase 2 addr:140/191
          UP RUNNING NOARP  MTU:2048  Metric:1
          RX packets:2278 errors:0 dropped:0 overruns:0 frame:0
          TX packets:844 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0
          RX bytes:33848 (33.0 KiB)  TX bytes:15116 (14.7 KiB)

4.6.4. ドライバを組み込む

次に行うことは、ドングル用の Linux/IrDA サービスを irattach irda1 -s で組み込むことです。 ここで用いるデバイス名は前の章を参照下さい。

組み込み後、アダプタの LED はだいたい三秒ごとに点滅するはずです。 また、dmesg を実行すれば以下のメッセージが表示されるでしょう。

irlap_change_speed(), setting speed to 9600
irlap_recv_discovery_xid_cmd(), discovery frame to short!

次に irdadump を実行すれば、届く範囲にある IrDA デバイスが全て表示されるはずです。少なくとも一つ (ここでは "japh") は最低見えます (この例ではもう一つの IrDA デバイスの名前は "Olga" です)。デバッグのため、ここで irdadump を実行しているターミナルウィンドウはそのままにしておき、 別のウィンドウで以降の作業を進めましょう。

07:58:40.889590 xid:cmd ffffffff < 4fe026d8 S=6 s=3 (14)
07:58:40.979575 xid:cmd ffffffff < 4fe026d8 S=6 s=4 (14)
07:58:40.979679 xid:rsp 2c5261ec > 4fe026d8 S=6 s=4 japh hint=0400 [ Computer ] (20)
07:58:41.069571 xid:cmd ffffffff < 4fe026d8 S=6 s=5 (14)
07:58:41.166552 xid:cmd ffffffff < 4fe026d8 S=6 s=* Olga hint=0400 [ Computer ] (20)
07:58:43.620104 xid:cmd ffffffff < 4fe026d8 S=6 s=0 (14)
07:58:43.709078 xid:cmd ffffffff < 4fe026d8 S=6 s=1 (14)

4.6.5. IrCOMM モジュールの組み込み

次に IrCOMM モジュールをロードします。通常使う場合には PPP や IrDA 経由の印刷時に、カーネルデーモンの kmod がこのロードを自動で実行しますが、最初は手で行う必要があります。 modprobe ircomm を行い、次に modprobe ircomm-tty とします。

dmesg には次のように表示されます。

IrCOMM protocol (Dag Brattli)
ircomm_open_lsap()
ircomm_tty_attach_cable()
ircomm_tty_ias_register()
ircomm_tty_close()
ircomm_tty_shutdown()
ircomm_tty_detach_cable()
ircomm_close()

そして、lsmod を実行すれば以下が表示されるでしょう。

Module                  Size  Used by    Tainted: P
ircomm-tty             30080   0  (autoclean)
ircomm                 13164   0  (autoclean) [ircomm-tty]
irda-usb               13776   1
...
irtty                   7264   0  (autoclean)
irda                  141648   1  (autoclean) [ircomm-tty ircomm irda-usb irtty]

4.6.6. ネットワーク (PPP) 設定

コマンド行引数を与えて pppd を実行しても良いですが、設定ファイル /etc/ppp/peers/irda を用意した方が便利だと思います。

connect /bin/true
noauth
persist
debug
kdebug 7
nodetach
115200
local
/dev/ircomm0
192.168.0.2:192.168.0.3

設定に関しての注意として、ここではデバイス名が正しくとも USB デバイスの方は指定しないでください。Linux ラップトップにこれ以外の IrDA デバイスがあった場合、同じ PPP オプションで、最後のローカルとリモート IP アドレスを設定している部分だけ削除した同じ設定ファイルが使えます。 以下のエントリはデバッグ目的で、全部うまく動くようになったら削除可能です。

persist
debug
kdebug 7
nodetach

ここで、pppd call irda として PPP を開始しましょう。 デバッグのため、ここで pppd を実行したターミナルウィンドウはそのままにしておき、 別のウィンドウで以降の作業を進めましょう。

Serial connection established.
using channel 3
Using interface ppp0
Connect: ppp0 <--> /dev/ircomm0
sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x4592a46e> <pcomp> <accomp>]
sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x4592a46e> <pcomp> <accomp>]
...

次にリモート側の IrDA デバイスで PPP を開始すれば、以下のメッセージが出るはずです。

sent [LCP EchoReq id=0x0 magic=0x3c8803b1]
sent [IPCP ConfReq id=0x1 <addr 192.168.0.2> <compress VJ 0f 01>]
sent [CCP ConfReq id=0x1 <deflate 15> <deflate(old#) 15> <bsd v1 15>]
rcvd [LCP ConfAck id=0x1 <asyncmap 0x0> <magic 0x3c8803b1> <pcomp> <accomp>]
rcvd [LCP ConfAck id=0x1 <asyncmap 0x0> <magic 0x3c8803b1> <pcomp> <accomp>]
rcvd [LCP EchoReq id=0x0 magic=0xa922f0e8]
sent [LCP EchoRep id=0x0 magic=0x3c8803b1]
rcvd [IPCP ConfReq id=0x1 <addr 0.0.0.0> <compress VJ 0f 01>]
sent [IPCP ConfNak id=0x1 <addr 192.168.0.3>]
rcvd [CCP ConfReq id=0x1 <deflate 15> <deflate(old#) 15> <bsd v1 15>]
sent [CCP ConfAck id=0x1 <deflate 15> <deflate(old#) 15> <bsd v1 15>]
rcvd [LCP EchoRep id=0x0 magic=0xa922f0e8]
rcvd [IPCP ConfAck id=0x1 <addr 192.168.0.2> <compress VJ 0f 01>]
rcvd [CCP ConfAck id=0x1 <deflate 15> <deflate(old#) 15> <bsd v1 15>]
Deflate (15) compression enabled
rcvd [IPCP ConfReq id=0x2 <addr 192.168.0.3> <compress VJ 0f 01>]
sent [IPCP ConfAck id=0x2 <addr 192.168.0.3> <compress VJ 0f 01>]
Cannot determine ethernet address for proxy ARP
local  IP address 192.168.0.2
remote IP address 192.168.0.3
Script /etc/ppp/ip-up started (pid 3975)
Script /etc/ppp/ip-up finished (pid 3975), status = 0x1

irdadump を実行しているウィンドウには、以下の IrDA 通信メッセージが表示されているでしょう。

08:17:11.179260 i:rsp  > ca=08 pf=1 nr=1 ns=2 LM slsap=00 dlsap=19 CONN_RSP (6)
08:17:11.199127 i:cmd  < ca=08 pf=1 nr=3 ns=1 LM slsap=00 dlsap=1d CONN_RSP (6)
08:17:11.199226 i:rsp  > ca=08 pf=1 nr=2 ns=3 LM slsap=1d dlsap=00 GET_VALUE_BY_CLASS: "IrLPT" "IrDA:IrLMP:LsapSel" (30)
08:17:11.219123 i:cmd  < ca=08 pf=1 nr=4 ns=2 LM slsap=00 dlsap=1c CONN_RSP (6)
08:17:11.219207 i:rsp  > ca=08 pf=1 nr=3 ns=4 LM slsap=1c dlsap=00 GET_VALUE_BY_CLASS: "IrDA:IrCOMM" "Parameters" (28)
08:17:11.241117 i:cmd  < ca=08 pf=1 nr=5 ns=3 LM slsap=19 dlsap=00 GET_VALUE_BY_CLASS: "IrDA:IrCOMM" "Parameters" (28)
08:17:11.241213 i:rsp  > ca=08 pf=1 nr=4 ns=5 LM slsap=00 dlsap=19 GET_VALUE_BY_CLASS: Success N/A (19)
08:17:11.259114 i:cmd  < ca=08 pf=1 nr=6 ns=4 LM slsap=00 dlsap=1d GET_VALUE_BY_CLASS: No such class (11)
08:17:11.259216 i:rsp  > ca=08 pf=1 nr=5 ns=6 LM slsap=1d dlsap=00 DISC (6)
08:17:11.280107 i:cmd  < ca=08 pf=1 nr=7 ns=5 LM slsap=00 dlsap=1c GET_VALUE_BY_CLASS: Success N/A (19)
08:17:11.280281 i:rsp  > ca=08 pf=0 nr=6 ns=7 LM slsap=1c dlsap=00 DISC (6)
08:17:11.282124 i:rsp  > ca=08 pf=1 nr=6 ns=0 LM slsap=1e dlsap=00 CONN_CMD (6)
08:17:11.299104 i:cmd  < ca=08 pf=1 nr=1 ns=6 LM slsap=19 dlsap=00 DISC (6)
08:17:11.299204 rr:rsp > ca=08 pf=1 nr=7 (2)
08:17:11.319102 i:cmd  < ca=08 pf=1 nr=1 ns=7 LM slsap=1a dlsap=00 CONN_CMD (6)
08:17:11.319209 i:rsp  > ca=08 pf=1 nr=0 ns=1 LM slsap=00 dlsap=1a CONN_RSP (6)
08:17:11.339100 i:cmd  < ca=08 pf=1 nr=2 ns=0 LM slsap=00 dlsap=1e CONN_RSP (6)
08:17:11.339197 i:rsp  > ca=08 pf=1 nr=1 ns=2 LM slsap=1e dlsap=00 GET_VALUE_BY_CLASS: "IrDA:IrCOMM" "IrDA:TinyTP:LsapSel" (37)
08:17:11.361096 i:cmd  < ca=08 pf=1 nr=3 ns=1 LM slsap=1a dlsap=00 GET_VALUE_BY_CLASS: "IrDA:IrCOMM" "IrDA:TinyTP:LsapSel" (37)
08:17:11.361191 i:rsp  > ca=08 pf=1 nr=2 ns=3 LM slsap=00 dlsap=1a GET_VALUE_BY_CLASS: Success Integer: 14 (15)
08:17:11.380092 i:cmd  < ca=08 pf=1 nr=4 ns=2 LM slsap=00 dlsap=1e GET_VALUE_BY_CLASS: Success Integer: 14 (15)
08:17:11.380214 i:rsp  > ca=08 pf=0 nr=3 ns=4 LM slsap=1e dlsap=00 DISC (6)
08:17:11.382104 i:rsp  > ca=08 pf=1 nr=3 ns=5 LM slsap=14 dlsap=14 CONN_CMD TTP credits=0(7)
08:17:11.399090 i:cmd  < ca=08 pf=1 nr=6 ns=3 LM slsap=1a dlsap=00 DISC (6)
08:17:11.399190 rr:rsp > ca=08 pf=1 nr=4 (2)
08:17:11.419082 i:cmd  < ca=08 pf=1 nr=6 ns=4 LM slsap=14 dlsap=14 CONN_CMD TTP credits=0(7)
08:17:11.419159 rr:rsp > ca=08 pf=1 nr=5 (2)
08:17:11.438080 rr:cmd < ca=08 pf=1 nr=6 (2)

別のターミナルウィンドウを開き、ifconfig で PPP デバイスをチェックしましょう。

ppp0      Link encap:Point-to-Point Protocol
          inet addr:192.168.0.2  P-t-P:192.168.0.3  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:9 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0
          RX bytes:318 (318.0 b)  TX bytes:708 (708.0 b)

ps aux | grep irda を実行すれば、以下のプロセスが表示されるはずです。

root      3534  0.0  0.2  1272  464 ?        S    06:51   0:00 irattach irda1 -s
root      3579  0.3  0.2  1400  476 tty1     S    06:55   0:06 irdadump
root      4312  0.1  0.4  2088  948 tty2     S    07:18   0:00 pppd call irda

route -n を実行すれば、以下のように PPP デバイスが表示されます。

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.3     0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
0.0.0.0         192.168.0.3     0.0.0.0         UG    0      0        0 ppp0

そして、リモートホストに対して ping 192.168.0.3 が動作するようになっているはずです。

PING 192.168.0.3 (192.168.0.3): 56 data bytes
64 bytes from 192.168.0.3: icmp_seq=0 ttl=64 time=290.7 ms
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=146.6 ms

これで TCP/IP アプリケーションは使えるようになりました。例えば、 ssh などが使えます。 但し、コネクションの確立まで多少の時間を要しますので、ちょっと辛抱が必要です。

ssh -v USER@192.168.0.3

4.6.7. プリンタ接続 (IrLPT) の設定

ドングルを TCP/IP 代わりのプリンタ接続にも使うことが出来ます。 デバイス名は /dev/irlpt0 になります。IrDA プリンタ接続の詳細は、関連の章を参照下さい。

4.6.8. 後片づけ

最後に設定の微調整 (ルーティングの設定) などを行います。 さらに高速度に設定することも出来ますが、私はまだ試していません。 全て動くようになったら、設定を保存していつも使うようにしましょう。 /etc/irda.conf 設定ファイルや、System V init スクリプト (IrDA やネットワーク関連の) などを編集してください。 このあたりのやり方は Linux ディストリビューション毎に異なります。

4.6.9. 残っている問題

奇妙な問題が残っています。IrDA-USB ドングルを挿入した後、微かではあるものも連続したビープ音がシステムスピーカから出ています。