读取ATA状态寄存器时为0xFF

时间:2015-04-27 17:38:12

标签: c++ linux 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;
}

请你看一下片段并告诉我出了什么问题?

0 个答案:

没有答案