HAYES ESP ドライバ バージョン 2.1 Hayes の方々、特に Alan Adamson に大いに感謝します。彼らのサポートの おかげで、ドライバを強化することができました。 このドライバで体験されたことを、私 (arobinso@nyx.net) に報告してくだ さい。肯定的なフィードバック、否定的なフィードバック、双方とも求めて います。 *** 2.1 での重要な変更 *** PIO モードのサポート。5 つの状況のいずれかに該当する場合、PIO モードが 使用されます。 1) マルチポートカードが検出されたとき。常に PIO モードが使用されます。 (8 ポートカードは DMA をサポートしません) 2) DMA チャネルが無効な値 (1 または 3 以外のもの) にセットされたとき。 3) DMA バッファ/チャネルを割り当てられなかったとき。ポートは、再度 オープンされるまで、PIO モードに戻ります。 4) 指定されたものよりも少ないバイト数を FIFO へ転送または FIFO から 転送する必要があるとき。PIO モードは、この転送中のみ使用されます。 5) あるポートで DMA 転送をする必要があり、他のポートで既に当該 DMA チャネルを使用しているとき。PIO モードは、この転送中のみ使用され ます。 DMA を使用すると、Hayes ESP は他のカード (特にサウンドカード) と競合 するようなので、デフォルトでは DMA はオフにしています。DMA を使用する ためには、あとで説明する "dma=" オプションか、または setserial で、 明示的にオンにする必要があります。マルチポートカードは、setserial を 使って強制的に DMA モードにすることができます。しかし、ほとんどのマルチ ポートカードは DMA をサポートしません。 最新バージョンの setserial では、ESP カードの拡張設定を参照したり変更 したりすることができます。 *** このパッケージには、Hayes ESP カードをサポートするモジュールをコンパイル するのに必要なファイル群が含まれています。ドライバ群は、基本的にシリアル ドライバに手を加えたものです。 機能: - ESP カードの拡張モードを使用し、互換モードよりも広範囲の割込みと 機能を提供します。 - ESP の FIFO へのデータ転送または FIFO からのデータ転送をおこなう のに、DMA と 16 ビット PIO モードを使用し、CPU 負荷を軽減します。 - プライマリポートとセカンダリポートをサポートします。 ドライバがモジュールとしてコンパイルされた場合、irq= オプションを使って 使用する IRQ を指定することができます。書式は次のとおりです。 irq=[0x100],[0x140],[0x180],[0x200],[0x240],[0x280],[0x300],[0x380] ブラケット内のアドレスは、カードのベースアドレスです。存在しないカード の IRQ は 0 にセットできます。存在するカードの IRQ が 0 にセットされた 場合、ドライバは正しい IRQ を推測しようとします。例えば、アドレス 0x300 にあるカードの IRQ を 12 にセットする場合、insmod コマンドは次のように なります。 insmod esp irq=0,0,0,0,0,0,12,0 divisor= オプションで、独自の除数をセットすることができます。書式は irq= オプションと同じです。各除数の値は 16 進数字が並んだもので、各 数字は対応するポートに対して使用される除数を表しています。除数の値は 右から左へと構成されます。ゼロ以外の除数値を指定すると、自動的に spd_cust フラグがセットされます。あるボーレート用に使う除数を計算する には、当該ポートのボーレート (一般的には 921600) を希望するレートで 割ってください。例えば、0x300 にあるプライマリポートの除数を 4 に、 0x308 にあるセカンダリポートの除数を 8 にセットする場合、insmod コマ ンドは次のようになります。 insmod esp divisor=0,0,0,0,0,0,0x84,0 dma= オプションで DMA チャネルをセットすることができます。チャネルは 1 または 3 のどちらかです。他の値を指定すると、ドライバは強制的に PIO モードを使用するようになります。例えば、DMA チャネルを 3 にセットする 場合、insmod コマンドは次のようになります。 insmod esp dma=3 rx_trigger= オプションと tx_trigger= オプションで、FIFO のトリガレベル をセットすることができます。これらは、ESP カードがいつ割込みを送信する べきかを指定するものです。値を大きくすると、割込みの回数は減ります。 しかし、あまりに高い値をセットすると、データロスが起こりえます。例えば、 受信トリガレベルを 512 バイトに、送信トリガレベルを 700 バイトにセット する場合、insmod コマンドは次のようになります。 insmod esp rx_trigger=512 tx_trigger=700 flow_off= オプションと flow_on= オプションで、ハードウェアフロー制御の オフレベルとオンレベルをセットできます。フローオンレベルはフローオフ レベルよりも低くなければなりません。また、フローオフレベルは、rx_trigger よりも高くしてください。有効な値は 1 から 1023 までで、フローオフレベル は 1016, フローオンレベルは 944 がデフォルト値となっています。例えば、 フローオフレベルを 1000 バイトに、フローオンレベルを 935 バイトにセット する場合、insmod コマンドは次のようになります。 insmod esp flow_off=1000 flow_on=935 rx_timeout= オプションで受信タイムアウト値をセットできます。この値は、 最後のキャラクタを受信してから割込みを送信するまでに ESP カードがどれ くらい待つべきかを示すものです。有効な値は 0 から 255 までで、128 が デフォルト値となっています。高すぎる値はレイテンシーを増大させ、低す ぎる値は、不必要な割込みを引き起こします。例えば、受信タイムアウトを 255 にセットする場合、insmod コマンドは次のようになります。 insmod esp rx_timeout=255 pio_threshold= オプションで、DMA モードのかわりに PIO モードを使用する ための閾値 (キャラクタ数単位) をセットできます。例えば、この値が 32 の 場合、32 バイト以下の転送では、常に PIO モードが使われます。 insmod esp pio_threshold=32 各オプションをスペースで区切ることにより、複数のオプションを insmod の コマンドラインに渡すことができます。例えば次のようにします。 insmod esp dma=3 trigger=512 必要なときに esp モジュールを自動的にロードさせることができます。これ をおこなうには、次の行を /etc/modprobe.conf に追加してください (最後の 行をあなたの設定用オプションで置き換えてください)。 alias char-major-57 esp alias char-major-58 esp options esp irq=0,0,0,0,0,0,3,0 divisor=0,0,0,0,0,0,0x4,0 また、おそらく 'depmod -a' を実行する必要があるでしょう。 デバイスは手動で作成する必要があります。デバイスを作成するためには、 モジュールをロードしたあとの出力を書きとってください。カーネルメッ セージが通常書き込まれる場所 (普通は /var/adm/messages) に、ドラ イバの出力がおこなわれます。出力されている各 'tty' 用のデバイスを 二つ作成してください。一つはメジャー番号 57 で、もう一方はメジャー 番号 58 です。マイナー番号は、出力されている tty 番号と同じにして ください。コマンドは次のようになります (? を tty 番号で置き換えて ください)。 mknod /dev/ttyP? c 57 ? mknod /dev/cup? c 58 ? 例えば、次の行があったとした場合、 Oct 24 18:17:23 techno kernel: ttyP8 at 0x0140 (irq = 3) is an ESP primary port 二つのデバイスは次のように作成します。 mknod /dev/ttyP8 c 57 8 mknod /dev/cup8 c 58 8 デバイスに対してパーミッションを設定する必要があるかもしれません。 chmod 666 /dev/ttyP* chmod 666 /dev/cup* ESP モジュールとシリアルモジュールが競合していてはいけません (これらは 同時に使用できます)。ESP モジュールがロードされたあとは、ESP カード上の ポートには、シリアルドライバからはアクセスすることができなくなります。 ポートにアクセスしたときに I/O エラーが発生した場合は、IRQ と DMA が 競合していないかチェックしてください ('cat /proc/interrupts' と 'cat /proc/dma' で、現在使用中の IRQ と DMA のリストが得られます)。 Enjoy! Andrew J. Robinson ------------------------------------------------------------ 翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ > 翻訳日: 2004/07/29 翻訳者: 川崎 貴彦 校正者: Seiji Kaneko