ウォンツテック

そでやまのーと

OS作成

タスクスイッチを進める前に箱物機器には欠かせないシリアル入出力のドライバを無性に書きたくなったので事前に必要な情報をメモ。

前提

・現在コントローラはNS16550相当の物が使われている。※UARTと呼ばれている
・I/OポートはCOM1〜COM4でそれぞれ以下の番号
COM1 0x3F8〜0x3FF
COM2 0x2F8〜0x2FF
COM3 0x3E8〜0x3EF
COM4 0x2E8〜0x2EF
・ディバイザラッチ
シリアルのビット・レート(9600bpsなど)を定める整数値
※ビット・レートを正確に発生させる基準クロックは1.8432MHzを使うべきであるがPCの基準クロックは24MHzでありそれを13周分した1.8462MHz(1.84615...)が使われている。
(1.8432MHzを使うべき理由は、1.8432 x 10^6 [1/s] = 192 * 9600 [1/s]となるため1.8432MHzを192周分を1周期とすれば、その1周期に1bit送る事で正確に9600bpsとなるからであるが、基準クロックが24MHz/13 ≒ 1.8462Mhzだと 24M/13 [1/s] = 192*9600 + 2953.846...となるので誤差が0.16%ほどある。ただし、UARTでは1キャラクタ毎に同期を取直すのでこの程度の誤差なら問題無いみたい)

初期化 (com1を想定)

・ディバイザラッチの初期化
I/O 0x3f8と0x3f9を使うが、DLABというビットが立っている必要がある。
このDLABビットは0x3fB(LCR)のビット7にある
ディバイザラッチの値は正確には
設定値=24M / 13 / 16 / 転送レートとなっているので9600bpsの場合は誤差を切り捨てした12(0x0C)を設定する。0x3f8には下位8bit、0x3f9には上位8bitを設定する事になているのでこの場合は0x3f8に0x0Cを、0x3f9には0x00を設定する。

・LCRの初期化 (Line Control Register)
ビット7: DLAB(ディバイザラッチ)ビット切り替え用
ビット6: ブレーク信号の設定 0
ビット5〜3: パリティビット等の設定 使わないので0
ビット2: ストップ・ビット??
RS-232Cとは? | 福福電子工房Webサイトここの説明が分かり易かった
転送速度は遅くなるけど2bit取っておいた方が良さそう。
ビット1〜0: ワード長 (1文字のbit長)8bitなので11

・IERの初期化 (Interrupt Enable Register)
割り込み要因の設定で送信時と受信時の割り込み可否を設定する。
またエラー等でも割り込みが起こせるのでその設定もする。
ビット7〜4: 未使用 0
ビット3: モデムステータス割り込み制御(エラー発生時)とりあず0
ビット2: レシーバラインステータス割り込み制御(エラー発生時)とりあえず0
ビット1: 送信割り込み 1
ビット0: 受信割り込み 1