ウォンツテック

そでやまのーと

FDCDriver

☆recalibrate関数

fdc_cmd関数でrecalibrateコマンド
1byte 0 0 0 0 0 1 1 1
2byte x x x x x 0 0 0 (HD=0, US1&US0=0)
を送信。
その際fdc_cmd関数内ではFDCがアイドル状態かどうかを調べる。
アイドル状態の検査はMSRレジスタ(0x03f4/0x0374)の
bit7(RQM)を調べる。これが1であればコマンド受け可能。
さらにbit6(DIO)が0であるかを調べる。DIOが0であれば
ライト方向(CPU→FDC)である。
この一連の調査関数は

int fdc_wait_msrStatus(byte mask, byte expected) {
	byte status;

	do {
		status = inportb(FDC_MSR_PRIMARY);
	} while ((status & mask) != expected);
	return TRUE; // return 1
}

となり、fdc_cmdの中で

fdc_wait_msrStatus(0x80|0x40, 0x80);

のように使う。

また、FDCの状態は3つあり
1. コマンド・フェーズ
2. エグゼキューション・フェーズ
3. リザルト・フェーズ
となっているが、recalibrateコマンドではリザルト・フェーズ
が無いため、結果を取得するために
「SENSE INTERRUPT STATUS コマンド」
1byte 0 0 0 0 1 0 0 0
を入力する必要がある。
その後in命令で結果をreadするが、DIOが1(FDC→CPU)となっており、1byteずつreadしていく。何も得るデータが無くなったらDIOが0となる。この際、全てのデータを取らないと次のコマンドが打てない。
※recalibrateの他に、seek, relative seekコマンドもリザルト・フェーズが無いため、同様にして結果を受け取る

recalibrateは使用前にmotorをONにしておく必要がある。