irport 対 irtty
irport は使ったことがありません。というのは、irtty で困っていないためです。 但し、この選択は使っている低レベルドライバの種類には依存しないはずです。 私は今のところ irtty、nec-ircc と irda-usb がうまく使えています (私のハードウェアでは、ですが)。
Q1 - 質問: ポートとか割り込みとかいう話は全然分かりません。 どこから始めたらいいんでしょうか。
A1 : その一 ハードウェア設定
まず、ハードウェアの仕様を調べます。見あたらなかったらベンダのサポートページを当たったり、サポートホットラインに電話して聞きます。 この文書の前の方にあるハードウェアサーベイで情報を見つけることができるかもしれません。
最新の BIOS を使う。通常ベンダのサポートページに置かれています。
"setserial /dev/ttyS? -g -a | egrep 16550A" を実行してみる。 表示されたデバイスのどれかが、多分さがしている IrDA ポートです。 二番目であることが多いですが、これは保証の限りではありません。
ここで UART (非同期シリアルコントローラ。代表的なものは上記 16550A) のようにみえるものが、物理的には IrDA コントローラであることに注意してください。私の HP Omnibook 800 では、実際の IC は VLSI 社の VL82C147 PCI-IrDA コントローラです。 このコントローラは速度 115,200bps までは UART のように振る舞います。 但し、時として正しい設定情報を得るのが非常に難しいことがあります。
その二: カーネルにハードウェア情報を与える
cat /proc/ioports としてどのポートが現在使われているかを見ます。
cat /proc/interrupts として、どの割り込みが現在使われているのかを見ます。
ポートと割り込みが IR デバイスで使えるようにします。例えば、PCMCIA サービスを停止したり、/etc/sysconfig/pcmcia に PCIC_OPTS="irq_list=3,4,5,7,9,10,12,14,15" のような行を加えます。
ここまで分かったなら、正しい割り込みとポートがどれかを調べます。これには setserial /dev/ttySx irq M port 0xNNNN としてカーネルに教えてみます。 M と NNNN に複数の可能性があるなら、全部試してみます (注意: Serial-HOWTO に記載のとおり、割り込み 0, 1, 6, 8, 13, 14 を試すのは避けてください) [1]。
うまくいったなら、そのときのパラメータを原作者まで送ってください。 送っていただいたものは赤外線ハードウェアサーベィに含めたいと思います。
幸運を祈ります
Q3 - 質問: tcsetattr read/write error というメッセージが /var/log/messages に出るんですが
A3 : 多分 /dev/ttyS* の選択を間違っているか、割り込みかポートの設定が違っています。
Q4 - 質問: すべての設定は正しそうで、それを裏付ける妥当なメッセージが返ってきます。それなのに動きません。
A4 : デバイスを 0.5m (1.5 フィート) 以内に置いてください。 赤外線ポートを使うアプリケーションがただ一つのみとなっているかを確認してください。 両方のデバイスが同じプロトコル、例えば IrOBEX や IrCOMM を使っているかを確認してください。
Q7 - Ho Chin Keong さんの質問「2台のラップトップ間で通信を行うのに、この2台間で LAN ルートの設定を行う以外の方法はありますか?」
A7 : Dag Brattli さんによる回答「あるともないともいえますね。IrDA 標準の一つ IrCOMM を使えば二台のラップトップ間のシリアルケーブル接続がエミュレートできます。 これを使えば、シリアルポート向けに書かれたアプリケーション (ターミナル、PPP、 slip など) は使えます。但し、この機能はまだ Linux/IrDA には実装されていません。Linux/IrDA でサポートのある IrLPT (プリンタ) は、実際には IrCOMM のサブセットですから、機能の一部は動くと思います」
Q8 - Ho Chin Keong さんの質問「赤外線パスをえいやと 10 秒以上ふさぐと、通信が再開できません。この場合、赤外線通信を再開するには irattach を殺して全体を再起動してやる必要があります。但し、ふさいでいる時間が 10 秒以内なら接続は維持されたままです。 これは仕様、それともバグなんでしょうか? この時間を 10 秒以上、または無限時間まで伸ばす方法はあるんでしょうか?
A8 : Thomas Davis さんによる回答「これは IrLAP/IrLMP コードのプライマリ側のバグのようです。スタックを逆に辿って reset/disconnect 通知を送っていないようですね。 このことは、プリンタと通信しようとしている間や、ハンドシェークしている際に ディスコネクトや割り込みを行った時に、 クエリモードで IrLPT が固まることで気がつくと思います (現在は、IrLAN 処理中に 起きます)」
Q11 - IrDA を BSD で使えるのでしょうか?
A11 : 今のところ Linux/IrDA が唯一の入手可能な GPL ソースです [2]。
Q12 - Rui Oliveira さんの質問「Palm III と Actisys 220L アダプタをつけたLinux マシン間で、通信がうまくいきません。マザーボードアダプタ (メーカー名がありませんが、Actisys 210L に似たものだと思います) では、pilot 同期ツール (pilot-xfer) を赤外線アダプタのつながっている /dev/ttyS1 に向け、SIR モードで IrLink を使ってあっさりと Palm III と Linux マシン間の通信ができています。これをシリアル - IrDA アダプタの Actisys 220L 経由でシリアルポートから行おうとすると、うまくいきません。質問は、IrDA アダプタ付きのシリアルポートに単にデータを送り込むだけだと、実際には何が起きているのか、が知りたいのです」
A12 : Lichen Wang さんによる答え「ハードウェア的には、IrDA SIR ではシリアルパラレル変換、エンコーダ・デコーダ、それにトランシーバが必要です。 COM ポートをドライブしている UART はどの PC でもシリアルパラレル変換ハードウェアに相当します。一部の PC ではエンコーダ・デコーダを持っており、BIOS で有効と無効の選択ができます。 無効と指定しているときには、COM ポートは昔ながらの COM ポートとして使えます。 エンコーダ・デコーダを有効としているときには、通常 COM ポートは使えなくなりますが、代わりに IrDA ポートが使えるようになります。 Actisys IR-210 は SIR トランシーバに相当するので、上に書いたような IrDA エンコーダ・デコーダ付きの UART を持つ PC で、エンコーダ・デコーダを有効にした状態で使うことができます。 このハードウェア構成では、Windows 向けのセットアッププログラムに、この PC は "赤外線デバイス" と "ラップトップとデスクトップ向け内蔵赤外線ポート" を持っている、と指定してやる必要があります。これに対して、Actisys IR-220 はエンコーダ・デコーダとトランシーバの両方が含まれています。これは普通の UART と組み合わせて使うよう設計されたものです。もし、PC の UART にもエンコーダ・デコーダが組み込まれている場合、BIOS からそれを無効にしなければいけません。こちらのハードウェア構成では、 Windows 向けのセットアッププログラムには、"ACTiSTS" 社の "ACT-IR220L Infrared Wireless Interface" を持っていると指定してやる必要があります。 というわけで、質問の答えです。シリアルポートにデータを投げるのに加えて、UART とエンコーダ・デコーダに、使用するデータレートを与える必要があります。 また内蔵エンコーダ・デコーダを持っている場合、UART にデータレートを与える際に、エンコーダ・デコーダの設定も正しく行う必要があります。 UART とエンコーダ・デコーダが独立になっている場合、両方にデータレートを正しく設定する必要があります。」
Q13 - 接続を行う際に、例えば Telnet を使った場合、login プロンプトが出てくるまで信じがたいほど時間がかかるんですが、これは何故?
A13 : Renaud Baldura さん、Dag Brattli さんと Hee Thong さんによる回答「これは DNS 設定の問題です。リゾルバが、入ってくるコネクションの IP アドレスの逆引きをしようとしてタイムアウトしているためです。単に /etc/resolv.conf の名前を変更して他のものに面倒を見させるようにするか、 単に /etc/hosts にあなたの (Ir) 専用ネットワークのアクセスするマシン名を静的バインディングとして与えることで、DNS 検索を避けることができます。 両方のマシンがプライベートのテスト環境にあるなら、/etc/host.conf に "order hosts, bind" という行を加えてください。これによって、DNS 検索の前に /etc/hosts ファイルを見るようになります。両方のマシンで、2台のマシンの IP とホスト名を反映するよう /etc/hosts を更新するようにしてください [3]。
Q14 - David LaPorte さんの質問「Toshiba Tecra 740cdt で IrDA ポートを動くようにした人はいませんか。読む限りでは、これは IRQ 11 で、ttyS2 に現れるはずです。えと、残念ながら PCMCIA モデムがついていて、これが ttyS2 を押さえてしまっており、PCMCIA コントローラが IRQ 11 を押さえてしまっています。どなたか助言をいただけませんか?」
A14 : Dag Brattli さんによる回答「まだマシンに Win95 が残してあるなら、 デバイスマネージャを起動して IrDA ポートの PnP セットアップを変更して (既に使っているところではないところに移して) ください。例えば ttyS1 (Win95 で) を移動して PCMCIA カードが使おうとしている側に移し、ttyS2 用に ttyS1 の設定を使えば良いでしょう。
dagbnb ~/linux/test/ > cat /etc/sysconfig/pcmcia PCMCIA=yes PCIC=i82365 PCIC_OPTS="irq_list=7,9,10" CORE_OPTS= |
PCMCIA コントローラが IRQ 11 から移動したことを確認してください。 また、Win95 上で IrDA ポートが有効になっていることを確認してください。 標準設定では IrDA ポートは無効になっていますので。
[1] | 訳注: PC-AT アーキテクチャでは、0,1,6,8,13 は全部決まったデバイスに固定的に割り当てられています。14 だけは IDE を使ってないなら使える可能性有り。これに加えて、IDE RAID カードやコントローラ等を使っているなら、それが使っているものも避けてください。 |
[2] | 訳注: BSD なソースはない、ということを含むと思われる。 |
[3] | 訳注: host.conf ではなく /etc/nsswitch.conf の方を修正するディストリビューションもあり。当該ファイルの man ページや、所定 HOWTO 参照。 |