0xFF при чтении государственного регистра ATA

Я пытаюсь настроить простой доступ PIO к моему жесткому диску, но я ударил стену на самом первом шаге к цели.

Первый шаг к работе с устройством ATA — это прочитать его регистр состояния и подождать, пока его бит BSY (7-й) не станет низким. У меня есть программа, которая делает это, но по какой-то причине при чтении регистра состояния он всегда дает мне 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;
}

Не могли бы вы взглянуть на фрагмент и сказать, что не так?

3

Решение

Задача ещё не решена.

Другие решения