如何用Linux上的C控制硬盘电机的速度?

时间:2014-02-20 15:13:07

标签: linux linux-kernel driver hard-drive scsi

我有一台旧的硬盘驱动器,我打算用它来摆弄一下。我要做的第一件事就是以不同的速度旋转电机。

问题是:

  1. 是否有一般方法可以做到这一点,还是取决于硬盘型号?
  2. 我在哪里可以找到命令列表,我可以将其发送到HDD控制器以控制电机的速度?
  3. 我实际上发现了一个功能,显然是旋转电机,这是:

    /* spin-down a disk */
    static void spindown_disk(const char *name)
    {
      struct sg_io_hdr io_hdr;
      unsigned char sense_buf[255];
      char dev_name[100];
      int fd;
    
      dprintf("spindown: %s\n", name);
    
      /* fabricate SCSI IO request */
      memset(&io_hdr, 0x00, sizeof(io_hdr));
      io_hdr.interface_id = 'S';
      io_hdr.dxfer_direction = SG_DXFER_NONE;
    
      /* SCSI stop unit command */
      io_hdr.cmdp = (unsigned char *) "\x1b\x00\x00\x00\x00\x00";
    
      io_hdr.cmd_len = 6;
      io_hdr.sbp = sense_buf;
      io_hdr.mx_sb_len = (unsigned char) sizeof(sense_buf);
    
      /* open disk device (kernel 2.4 will probably need "sg" names here) */
      snprintf(dev_name, sizeof(dev_name), "/dev/%s", name);
      if ((fd = open(dev_name, O_RDONLY)) < 0) {
        perror(dev_name);
        return;
      }
    
      /* execute SCSI request */
      if (ioctl(fd, SG_IO, &io_hdr) < 0) {
        char buf[100];
        snprintf(buf, sizeof(buf), "ioctl on %s:", name);
        perror(buf);
    
      } else if (io_hdr.masked_status != 0) {
        fprintf(stderr, "error: SCSI command failed with status 0x%02x\n",
                io_hdr.masked_status);
        if (io_hdr.masked_status == CHECK_CONDITION) {
          phex(sense_buf, io_hdr.sb_len_wr, "sense buffer:\n");
        }
      }
    
      close(fd);
    }
    

    虽然我不太明白实际命令发送到控制器的位置,也不知道如何控制速度,但我没有看到任何转速规格。

1 个答案:

答案 0 :(得分:4)

你无法控制硬盘的转速,这是一件好事。如果可以,你将不可避免地破坏数据。

头部漂浮在通常所说的“空气轴承”中。 换句话说,就是磁盘的旋转在磁盘的运行速度下处于平衡状态时,弹簧机构将磁头压在磁盘表面上,并具有明确的力和来自气流的空气。当磁盘关闭时,另一个弹簧机构会迅速将磁头拉出一个“停放位置”。

如果你可以以任意速度运行驱动器,那么磁头会刮伤表面。不好!<​​/ p>

关于在上面的代码段中发送实际命令的位置,ioctl之后的行中是/* execute SCSI request */来电。 如果您有兴趣使用旧的硬盘(请注意,您很可能会破坏它!),请查看hdparm工具及其源代码。 hdparm可让您调整许多参数,例如省电模式,缓存或声音管理......几乎所有磁盘驱动器都支持这些参数。
在该工具的源代码中,您还可以找到完整的设备命令列表。