程序14-21 linux/include/linux/hdreg.h


  1 /*

  2  * This file contains some defines for the AT-hd-controller.

  3  * Various sources. Check out some definitions (see comments with

  4  * a ques).

  5  */

    /*

     * 本文件含有一些AT硬盘控制器的定义。来自各种资料。请查证某些

     * 定义(带有问号的注释)。

     */

  6 #ifndef _HDREG_H

  7 #define _HDREG_H

  8

  9 /* Hd controller regs. Ref: IBM AT Bios-listing */

    /* 硬盘控制器寄存器端口。参见:IBM AT Bios程序 */

 10 #define HD_DATA         0x1f0   /* _CTL when writing */

 11 #define HD_ERROR        0x1f1   /* see err-bits */

 12 #define HD_NSECTOR      0x1f2   /* nr of sectors to read/write */

 13 #define HD_SECTOR       0x1f3   /* starting sector */

 14 #define HD_LCYL         0x1f4   /* starting cylinder */

 15 #define HD_HCYL         0x1f5   /* high byte of starting cyl */

 16 #define HD_CURRENT      0x1f6   /* 101dhhhh , d=drive, hhhh=head */

 17 #define HD_STATUS       0x1f7   /* see status-bits */

 18 #define HD_PRECOMP HD_ERROR     /* same io address, read=error, write=precomp */

 19 #define HD_COMMAND HD_STATUS    /* same io address, read=status, write=cmd */

 20

 21 #define HD_CMD          0x3f6   // 控制寄存器端口。

 22

 23 /* Bits of HD_STATUS */

    /* 硬盘状态寄存器各位的定义(HD_STATUS) */

 24 #define ERR_STAT        0x01    // 命令执行错误。

 25 #define INDEX_STAT      0x02    // 收到索引。

 26 #define ECC_STAT        0x04    /* Corrected error */  // ECC校验错。

 27 #define DRQ_STAT        0x08    // 请求服务。

 28 #define SEEK_STAT       0x10    // 寻道结束。

 29 #define WRERR_STAT      0x20    // 驱动器故障。

 30 #define READY_STAT      0x40    // 驱动器准备好(就绪)。

 31 #define BUSY_STAT       0x80    // 控制器忙碌。

 32

 33 /* Values for HD_COMMAND */

    /* 硬盘命令值(HD_CMD */

 34 #define WIN_RESTORE             0x10   // 驱动器重新校正(驱动器复位)。

 35 #define WIN_READ                0x20   // 读扇区。

 36 #define WIN_WRITE               0x30   // 写扇区。

 37 #define WIN_VERIFY              0x40   // 扇区检验。

 38 #define WIN_FORMAT              0x50   // 格式化磁道。

 39 #define WIN_INIT                0x60   // 控制器初始化。

 40 #define WIN_SEEK                0x70   // 寻道。

 41 #define WIN_DIAGNOSE            0x90   // 控制器诊断。

 42 #define WIN_SPECIFY             0x91   // 建立驱动器参数。

 43

 44 /* Bits for HD_ERROR */

    /* 错误寄存器各比特位的含义(HD_ERROR */

    // 执行控制器诊断命令时含义与其他命令时的不同。下面分别列出:

    // ==================================================

    //           诊断命令时            其他命令时

    // --------------------------------------------------

    // 0x01      无错误               数据标志丢失

    // 0x02      控制器出错           磁道0

    // 0x03      扇区缓冲区错        

    // 0x04      ECC部件错            命令放弃

    // 0x05      控制处理器错         

    // 0x10                            ID未找到

    // 0x40                            ECC错误

    // 0x80                            坏扇区

    //---------------------------------------------------

 45 #define MARK_ERR        0x01    /* Bad address mark ? */

 46 #define TRK0_ERR        0x02    /* couldn't find track 0 */

 47 #define ABRT_ERR        0x04    /* ? */

 48 #define ID_ERR          0x10    /* ? */

 49 #define ECC_ERR         0x40    /* ? */

 50 #define BBD_ERR         0x80    /* ? */

 51

    // 硬盘分区表结构。参见下面列表后信息。

 52 struct partition {

 53         unsigned char boot_ind;         /* 0x80 - active (unused) */

 54         unsigned char head;             /* ? */

 55         unsigned char sector;           /* ? */

 56         unsigned char cyl;              /* ? */

 57         unsigned char sys_ind;          /* ? */

 58         unsigned char end_head;         /* ? */

 59         unsigned char end_sector;       /* ? */

 60         unsigned char end_cyl;          /* ? */

 61         unsigned int start_sect;        /* starting sector counting from 0 */

 62         unsigned int nr_sects;          /* nr of sectors in partition */

 63 };

 64

 65 #endif

 66