* PC16550(AT互換機についているシリアルポートチップ)のページ [#e3eb6f6c]
-(by [[K]] & penさん, 2006.04.14)

** おもにpenさんによる情報 [#t3a2adfc]
-OS開発時においての活用方法を中心とした、9pinシリアルポートに関する資料です
-別名、COM1 COM2 ポート
-COM1 = IRQ4, 0x03F8~0x3FF(8bitアクセス)
-COM2 = IRQ3, 0x02F8~0x2FF(8bitアクセス)
-転送レート 300~115200bps (max 11.25kByte/sec)
-by pen
* 他のPCへの「データ送信」 [#z9845dfe]
** 受信側PCの設定 [#f0b51856]
PC同士の結線には、クロスケーブルが使われます (両端が9PinメスのRS232Cクロスケーブル)

(参考)[[千石電商:http://www.e-netten.jp/sengoku2/cgi/search.cgi?toku=PC%82%B3%82%D5%20RS232C&cond8=and&dai=%82%AD%82%EB%82%B7&chu=&syo=&k3=0&pflg=n&list=2]] @秋葉原 @sengoku.co.jp

それでは、受信側のPCでwindowsが使われると仮定した上で、設定へと進みます
-ハイパーターミナルを使用します。新規に起動した場合には、設定名を聞いてくるので「COM1-19200bps」などと付け、次画面でCOM1を選択します
  スタートメニュー > プログラム > アクセサリ > 通信 > ハイパーターミナル
-さらにポートの設定を行います
--ビット/秒 「19200」
--データビット 「8」
--パリティ 「なし」
--ストップビット 「1」
--フロー制御 「なし」

以上で受信側の設定は完了です

なおQEMU内から送信した場合、QEMUの仮想シリアルコンソール(Alt+Ctrl+3)に受信されるため、これらの準備は不要です

** 開発中OSからの文字の送信 [#y255caef]
ここでは、次の設定で利用してみます。レジスタは全て8bitです
 COM1
 通信スピード(19200)
 ラインコントロール(データbit=8, ストップビット=1, パリティ=なし)
 制御pin(DTR=1,RTS=1)
 IRQ(なし)

-通信スピード
--[0x03FB] に 0x80をセット /* baud-rate */
--[0x03F8] に 0x06をセット /* 0x06=19200, 0x01=115200 */
-ラインコントロール
--[0x03FB] に 0x03をセット /* 8bit */
-制御pin
--[0x03FC] に 0x0bをセット /* pin */
-割り込み要因
--[0x03F9] に 0x00をセット(デフォルト) /* irq */

以上で初期設定は完了です。データ送信については、

--[0x03F8] に ASCIIコードをセット。必要ならば続いて、
--[0x03F8] に 2つ目のASCIIコードをセット

セットされると、すぐに送信されます。実質2バイト分のバッファがあります

--[0x03FD] の bit:6

このビットが1にセットされていれば、データ送信済みです

* レジスタ構成 [#u74a9770]
|COM1(hex)|COM2(hex)|名称|R/W|説明|h
|03F8|02F8|レシーブデータ|R|受信データを読み出す(DLAB=0)|
|03F8|02F8|トランスミットデータ|W|送信データを書き込む(DLAB=0)|
|03F8|02F8|ボーレート・LSB|R/W|通信スピードの下位情報を書き込む(DLAB=1)|
|03F9|02F9|ボーレート・MSB|R/W|通信スピードの上位情報を書き込む(DLAB=1)|
|03F9|02F9|インタラプトイネーブル|R/W|IRQ要因を書き込む(DLAB=0)|
|03FA|02FA|インタラプトID|R|現在の割り込み要因を読み出す|
|03FA|02FA|FIFOコントロール|W|内蔵FIFOの動作を書き込む|
|03FB|02FB|ラインコントロール|R/W|送受信データのフォーマットを書き込む(bit7がDLAB)|
|03FC|02FC|モデムコントロール|R/W|9Pinの制御ピンからの割り込みフラグを読み出す。制御ピンの操作を書き込む|
|03FD|02FD|ラインステータス|R|通信状態を読み出す|
|03FE|02FE|モデムステータス|R|9Pinの制御ピンを読み出す|
|03FF|02FF|スクラッチ|R/W|制御に関係のないレジスタ|

**ボーレート MSB/LSB [#b92225f8]
1.8432Mhzから16分周されたクロックを元に、通信スピードを指定します

|speed|fast|||||||||slow|h
|MSB/LSB(hex)|00/01|00/02|00/03|00/06|00/0c|00/18|00/30|00/60|00/c0|01/80|
|bps|115.2k|57.6k|38.4k|19.2k|9600|4800|2400|1200|600|300|

**インタラプトイネーブル [#rd6f6e0d]
IRQ発生要因を指定します
|bit|7|6|5|4|3|2|1|0|h
||rsv|rsv|rsv|rsv|modem|Rx line|Tx data|Rx data|
|R/W|R=0|R=0|R=0|R=0|R/W|R/W|R/W|R/W|

-[bit3=1] モデムステータス割り込み
-[bit2=1] ラインステータス(Rx)割り込み
-[bit1=1] 送信データエンプティ割り込み
-[bit0=1@16450互換モード] データ受信割り込み
-[bit0=1@16550互換モード] Rx FIFOトリガーレベル&タイムアウト割り込み

**インタラプトID [#had66916]
割り込み発生時の発生要因が示されます
|bit|7|6|5|4|3|2|1|0|h
||FIFO|FIFO|rsv|rsv|ID|ID|ID|pending|
|R/W|R|R|R=0|R=0|R|R|R|R|

-[bit7,6=11b] 16550互換モード
-[bit7,6=00b] 16450互換モード
-[bit3,2,1] 割り込みがある場合に更新(複数割り込み時は高優先度を示す)
--(011b) Rx line status /優先度1st
--(010b) Rx data @16450互換モード /優先度2nd
--(010b) Rx FIFO trigger @16550互換モード /優先度2nd
--(110b) Rx FIFO time-out /優先度3rd
--(001b) Tx data empty @16450互換モード /優先度4th
--(001b) Tx FIFO empty @16550互換モード /優先度4th
--(000b) modem status /優先度5th
-[bit0=0] 割り込み有り(初期値1b)

**FIFOコントロール [#j3d82079]
内蔵Tx/Rx FIFO(各16Byte)を使用する場合は16550互換モードへ移行し、FIFOの設定を行います
|bit|7|6|5|4|3|2|1|0|h
||Rx trigger|Rx trigger|rsv|rsv|DMA|Tx clear|Rx clear|enable|
|R/W|W|W|W=0|W=0|W|W|W|W|

-[bit7,6] Rx FIFOが割り込みを起動する、受信データ数(Rx FIFO trigger)
--(00b) 1Byte
--(01b) 4Byte
--(10b) 8Byte
--(11b) 14Byte
-[bit3] 送受信割り込み要因
--(1b) Rx FIFO trigger, Rx FIFO time-out, Tx FIFO emptyを有効化
--(0b) 上記は無視され、1キャラクタ毎に割り込みを起動
-[bit2=1] Tx FIFOのデータをクリア。フラグは自動で0クリアされる
-[bit1=1] Rx FIFOのデータをクリア。フラグは自動で0クリアされる
-[bit0=1] 16550互換モードへ移行(初期値0b)

受信データ数が設定されたレベルに満たない場合、4キャラクタ時間後にタイムアウト割り込みが発生される

**ラインコントロール [#f6d3a8aa]
|bit|7|6|5|4|3|2|1|0|h
||DLAB|break|parity|parity|parity|stop|word|word|
|R/W|R/W|R/W|R/W|R/W|R/W|R/W|R/W|R/W|

-[bit7=1] ボーレートMSB/LSBへのアクセスを可能にする
-[bit6=1] ブレーク出力 ※
-[bit5=1] 送信データのパリティ値を固定
-[bit4] (0b)奇数パリティ(1b)偶数パリティ
-[bit3=1] 送受信データのパリティ有効
-[bit2=1] ストップビット長を2にする
-[bit1,0=11b] 送受信データを8bitにする

※動作は未確認です

**モデムコントロール [#m60f7b04]
|bit|7|6|5|4|3|2|1|0|h
||rsv|rsv|rsv|loop|out2|out1|RTS|DTR|
|R/W|R=0|R=0|R=0|R/W|R/W|R/W|R/W|R/W|

-[bit4=1] ループバックモード※
-[bit3=1] 割り込みの発生を有効化
-[bit2=1] ループバックモード用※
-[bit1=1] RTSピンをアクティブ(アサート)にする
-[bit0=1] DTRピンをアクティブ(アサート)にする


※ロジックの診断を行う場合に使用するようです

**ラインステータス [#f1e1533e]

|bit|7|6|5|4|3|2|1|0|h
||Rx FIFO|Tx|Tx|break|framing|prarity|overrun|Rx|
|R/W|R|R|R|R|R|R|R|R|

-[bit7=1] エラーのある受信データがRx FIFOにセットされた(パリティ、フレーミング、ブレーク)
-[bit6=1] データの送信が完了
-[bit5=1] 送信動作の開始によって、トランスミットデータレジスタ or Tx FIFOが空になった
-[bit4=1] ブレーク受信の発生
-[bit3=1] フレーミングエラー発生
-[bit2=1] パリティーエラーの発生
-[bit1=1] 受信データがあふれた
-[bit0=1] データを受信した

bit4~1のフラグが、ラインステータス割り込みの要因になる

**モデムステータス [#s474f95f]

|bit|7|6|5|4|3|2|1|0|h
||DCD|RI|DSR|CTS|DCDx|RIx|DSRx|CTSx|
|R/W|R|R|R|R|R|R|R|R|

-[bit7=1] 現在DCDピンは、アクティブ(アサート)な状態を受けている
-[bit6=1] 現在RIピンは、アクティブ(アサート)な状態を受けている
-[bit5=1] 現在DSRピンは、アクティブ(アサート)な状態を受けている
-[bit4=1] 現在CTSピンは、アクティブ(アサート)な状態を受けている
-[bit3=1] DCDピンが変化された
-[bit2=1] RIピンがインアクティブ(ネゲート)への変化を受けた
-[bit1=1] DSRピンが変化された
-[bit0=1] CTSピンが変化された

bit3~0のフラグが、モデムステータス割り込みの要因になる

*おまけ [#cda7e45f]
**ここでの用語解説 [#zc803cbd]
-Tx : トランスミット, 送信
-Rx : レシーブ, 受信
-FIFO : ハードウェアで組まれているリングバッファ
-rsv : リザーブ, 予約。該当部分の読み出しは bit=0、書き込みも bit=0
-IRQ : PICへのインタラプト
-割り込み~ : デバイス内部のインタラプト
-キャラクタ : スタートビット+データ列+(パリティ)+ストップビット
-アサート : 起きている状態, RS232Cでは bit=1 はマイナス電圧
-ネゲート : 寝ている状態, RS232Cでは bit=0 はプラス電圧
-9Pinの制御ピン : TxD/RxD/GND 以外の端子
|Pin No.|1|2|3|4|5|6|7|8|9|
|記号|CD|RxD|TxD|DTR|GND|DSR|RTS|CTS|RI|
|In/Out|In|In|Out|Out|-|In|Out|In|In|

**junk [#rc87744d]
ここは、メモ書きです

|(無接続)|GNDピン|非通信時|スタートビット|データ(1b)|データ(0b)|ストップビット|
|0ボルト/あいまい|0ボルト/しっかり|↑プラス|↓マイナス|↓マイナス|↑プラス|↑プラス|

-リニアモード時には、BIOSで9600bps(max)通信。いいと思います
-モデム接続 & 68kMac時代には、お世話になった低速シリアル通信
-過去にRS422に変換して50mほど引き回しました
-アサートは朝、ネゲートは、、
- 
-happy hacking!

* こめんと欄 [#x7da2518]
-まだ書いてる途中です。ごめんなさいねぇ -- ''pen'' SIZE(10){2006-04-15 (土) 01:19:51}
-http://www.linux.or.jp/JF/JFdocs/Modem-HOWTO-15.html 読み物 -- ''pen'' SIZE(10){2006-04-15 (土) 12:57:04}
-fixいたしました。ご指摘頂戴します -- ''pen'' SIZE(10){2006-04-16 (日) 08:49:26}
-penさんのおかげで、「はりぼてOS」にRS232制御プログラムを実装できました。ありがとうございました。今度の10月28日のOSCで展示する予定です。 -- ''uchan'' SIZE(10){2006-10-12 (木) 22:11:22}
-オメデト! -- ''pen'' SIZE(10){2006-12-02 (土) 19:16:31}

#comment


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS