1.26 -> 1.27	hw/chapter.sgml

Submitted by:	Hiroki Sato <hrs@geocities.co.jp>
References:	[doc-jp 6824]
This commit is contained in:
Jun Kuriyama 1999-11-07 22:00:28 +00:00
parent 50ff384ea2
commit bf2f7282fc
Notes: svn2git 2020-12-08 03:00:23 +00:00
svn path=/head/; revision=6027

View file

@ -2,8 +2,8 @@
The FreeBSD Documentation Project
The FreeBSD Japanese Documentation Project
Original revision: 1.26
$FreeBSD: doc/ja_JP.eucJP/books/handbook/hw/chapter.sgml,v 1.5 1999/09/11 03:14:25 kuriyama Exp $
Original revision: 1.27
$FreeBSD: doc/ja_JP.eucJP/books/handbook/hw/chapter.sgml,v 1.6 1999/09/11 11:04:03 kuriyama Exp $
-->
<chapter id="hw">
@ -2889,7 +2889,7 @@ device sio4 at isa? port 0x100 tty flags 0xb05 device
<sect4>
<title>Boca 16</title>
<para><emphasis>´ó£ &a.whiteside;.<!-- <br> -->
<para><emphasis>寄稿: &a.whiteside;.<!-- <br> -->
1995年8月26日</emphasis></para>
<para>FreeBSD で Boca 16pord
@ -3082,6 +3082,142 @@ sio16: type 16550A (multiport master)</screen>
</step>
</procedure>
</sect4>
<sect4>
<title>安価な Multi-UART カードのサポート</title>
<para><emphasis>寄稿: Helge Oldach
<email>hmo@sep.hamburg.com</email>, September
1999</emphasis></para>
<para>二つ(またはもっと多くの) COM ポートを備えた
20$ のマルチ I/O カードでの IRQ 共有が,
FreeBSD でサポートされているか心配ですって?
次のようにすれば使うことができます.</para>
<para>通常, この種のボードをサポートする場合には,
各ポートに対して個別に IRQ を割り当てて利用します.
例えば, マザーボード上に <devicename>COM1</devicename> ポート
(<devicename>sio0</devicename>&ndash;I/O アドレス 0x3F8, IRQ 4)
があり, 二つの UART ポートがついている拡張カードがあるとしましょう.
その場合, この二つのポートには, 二番目のポートを
<devicename>COM2</devicename>(<devicename>sio1</devicename>&ndash;I/O
アドレス 0x2F8, IRQ 3) に, 三番目のポート(<devicename>sio2</devicename>)を
I/O アドレス 0x3E8, IRQ 5 に設定する必要があります.
しかしすぐわかるとおり, この方法では IRQ 資源を無駄に浪費します.
基本的に前セクションに記されている <literal>COM_MULTIPORT</literal>
の設定に従えば, 拡張カード上の二つのポートで一つの IRQ を使用するように
セットアップすることができます.</para>
<para>そのような安価な I/O ボードには大抵,
次に示すような, COM ポートを選択する 4x3
のジャンパマトリクスがついています.</para>
<programlisting> o o o *
Port A |
o * o *
Port B |
o * o o
IRQ 2 3 4 5</programlisting>
<para>これは, Port A が IRQ 5 に, Port B が IRQ 3
に結線されていることを示しています.
IRQ の並びはボードにより異なるでしょう&mdash;例えば, 他のボードは
IRQ として 3,4,5,7 が選択できるようになっているかも知れません.</para>
<para>「ああ, IRQ を共有するには IRQ 3 の列にある 3
つの接続点をつなぐようなジャンパ線を手作りして,
両方のポートが IRQ 3 になるように結線すれば良いのか」と
考えるかも知れませんが, それは正しくありません.
UART の出力段は &ldquo;トーテムポール&rdquo; 接続(*)されているので,
IRQ 3 に複数接続することはできないのです.
そのため, もし UART のどれか一つが IRQ 3 を発行したとしても,
それが期待するような動作になりません.
拡張ボードやマザーボードの実装に依存することですが,
IRQ 3 信号線は常時 H レベルか, L レベルを保っています.
</para>
<note>
<para><emphasis>訳注:</emphasis>
&ldquo;トーテムポール&rdquo; とは, ディジタル論理回路を構成する
TTL ロジック IC の内部構造の一種です. トーテムポール型出力の場合には
出力同士を接続すると短絡電流が流れてしまうため,
CPU やメモリで使われている, いわゆるバス接続が使えないという特徴を持っています.
IRQ 信号線が常時 H か L レベルに保たれる, というのは,
割り込み信号線が正論理/負論理のどちらになっているかが実装に依存することによります.
以降の解説は, 正論理を仮定して書かれていますのご注意下さい.</para>
</note>
<para>したがって, 二つの UART の IRQ 出力を分離する必要があります.
そのためには, どちらかの UART が IRQ を発行した時にだけ,
ボード上の IRQ 信号線が H レベルになり,
そうでない時には L レベルになるようにします.
以下の解決法は, Jrg Wunsch
<email>j@ida.interface-business.de</email>
から提案されたものです:
二つのダイオード(ゲルマニウム, あるいはショットキー型を強く推奨)と
1 キロオームの抵抗器一本で, ワイヤード OR を構成します.
以下に示すのは, 上に示した 4x3 ジャンパの回路図です.</para>
<programlisting> Diode
+---------->|-------+
/ |
o * o o | 1 kOhm
Port A +----|######|-------+
o * o o | |
Port B `-------------------+ ==+==
o * o o | Ground
\ |
+--------->|-------+
IRQ 2 3 4 5 Diode</programlisting>
<para>各ダイオードのカソード側は接地点に,
1 キロオームのプルダウン抵抗器と直列にして接続します.
プルダウン抵抗を接続することはとても重要です.
これはバス上の IRQ 信号線がフロート状態になるのを防ぎます.</para>
<para>さあ, これでカーネルの設定を変更する準備ができました.
上に示すような例の場合, 次のような設定になります.</para>
<programlisting># standard on-board COM1 port
device sio0 at isa? port "IO_COM1" tty flags 0x10
# patched-up multi-I/O extension board
options COM_MULTIPORT
device sio1 at isa? port "IO_COM2" tty flags 0x205
device sio2 at isa? port "IO_COM3" tty flags 0x205 irq 3</programlisting>
<para><devicename>sio1</devicename> と
<devicename>sio2</devicename> の <literal>flags</literal>
設定は非常に重要です. 詳細は &man.sio.4; をご覧ください.
(一般的には, "flags" 属性の <literal>2</literal> は,
<devicename>sio</devicename>2 の IRQ
を使用するということを示します.
下位ニブル(訳注: 16 進数一桁のこと) は間違いなく
<literal>5</literal> とするでしょう.)
カーネルの verbose モードが ON になっていると,
こんな風な出力が得られます.</para>
<screen>sio0: irq maps: 0x1 0x11 0x1 0x1
sio0 at 0x3f8-0x3ff irq 4 flags 0x10 on isa
sio0: type 16550A
sio1: irq maps: 0x1 0x9 0x1 0x1
sio1 at 0x2f8-0x2ff flags 0x205 on isa
sio1: type 16550A (multiport)
sio2: irq maps: 0x1 0x9 0x1 0x1
sio2 at 0x3e8-0x3ef irq 3 flags 0x205 on isa
sio2: type 16550A (multiport master)</screen>
<para><filename>/sys/i386/isa/sio.c</filename> は
&ldquo;irq maps&rdquo; 配列を使っているために
表示が少々難解なのですが, 基本的なアイデアは
1,3,4 番目の場所に <literal>0x1</literal>
があるかどうか調べる, というものです.
これはつまり, 対応する IRQ が出力された時にセットされ,
その後クリアされるという, ちょうど期待する動作が
行なわれることを意味します.
もし, カーネルがこのような表示を出力しない場合,
大部分は結線の誤りによるものでしょう.</para>
</sect4>
</sect3>
<sect3 id="cy">