ハードドライブへの単純な PIO アクセスをセットアップしようとしていますが、目標に向けた最初のステップで壁にぶつかりました。
ATA デバイスを操作するための最初のステップは、ステート レジスタを読み取り、BSY (7 番目) ビットが Low になるまで待機することです。プログラムでそれを行っていますが、何らかの理由で状態レジスタを読み取ると、代わりに常に 0xFF が返されます。C++ で記述されたプログラム サンプルを次に示します。
#include <stdio.h>
#include <stdlib.h>
#include <sys/io.h>
#define DRDY_OFFSET 6
#define BSY_OFFSET 7
const int STATE[2] = { 0x1F7, 0x177 };
bool requestPrivilege() {
if (iopl(3) == -1) {
printf("Unable to request privilege level III. Exiting.\n");
exit(1);
}
}
bool wait(auto lambda) {
int maxAttempts = 30 * 1000;
while((maxAttempts--)) {
if (lambda()) return true;
}
return false;
}
bool waitIdle(int channel) {
auto lambda = [=]() -> bool {
printf("%x\n", inb_p(STATE[channel]));
return !(inb_p(STATE[channel]) & (1 << BSY_OFFSET));
};
return wait(lambda);
}
bool waitReady(int channel) {
auto lambda = [=]() -> bool {
return inb_p(STATE[channel]) & (1 << DRDY_OFFSET);
};
return wait(lambda);
}
int main() {
requestPrivilege();
if (!waitIdle(0)) {
printf("BSY waiting timeout.\n");
exit(1);
};
if (!waitReady(0)) {
printf("DRDY waiting timeout.\n");
exit(1);
};
// //
// DO SOMETHING WITH READY DEVICE HERE //
// //
return 0;
}
スニペットを見て、何が問題なのか教えてください。