#ifndef __ATA_H #define __ATA_H #ifdef __cplusplus extern "C" { #endif #include <kernel/driver.h> /*! * \ingroup drivers * \defgroup ata ATA/ATAPI * @{ */ /* ATA register file (offsets from 0x1F0 or 0x170) */ #define ATA_REG_DATA 0 /* data (16-bit) */ #define ATA_REG_FEAT 1 /* write: feature reg */ #define ATA_REG_ERROR ATA_REG_FEAT /* read: error */ #define ATA_REG_COUNT 2 /* sector count */ #define ATA_REG_SECTOR 3 /* sector */ #define ATA_REG_LOCYL 4 /* LSB of cylinder */ #define ATA_REG_HICYL 5 /* MSB of cylinder */ #define ATA_REG_DRVHD 6 /* drive select; head */ #define ATA_REG_CMD 7 /* write: drive command */ #define ATA_REG_STATUS 7 /* read: status and error flags */ #define ATA_REG_DEVCTRL 0x206 /* write: device control */ //efine ATA_REG_ALTSTAT 0x206 /* read: alternate status/error */ /* a few of the ATA registers are used differently by ATAPI... */ #define ATAPI_REG_REASON 2 /* interrupt reason */ #define ATAPI_REG_LOCNT 4 /* LSB of transfer count */ #define ATAPI_REG_HICNT 5 /* MSB of transfer count */ /* ATA command bytes */ #define ATA_CMD_READ 0x20 /* read sectors */ #define ATA_CMD_PKT 0xA0 /* signals ATAPI packet command */ #define ATA_CMD_PID 0xA1 /* identify ATAPI device */ #define ATA_CMD_READMULT 0xC4 /* read sectors, one interrupt */ #define ATA_CMD_MULTMODE 0xC6 #define ATA_CMD_ID 0xEC /* identify ATA device */ #define ATA_ERR 0x01 #define ATA_IDX 0x02 #define ATA_CORR 0x04 #define ATA_DRQ 0x08 #define ATA_DSC 0x10 #define ATA_DF 0x20 #define ATA_READY 0x40 #define ATA_BUSY 0x80 //!@} #ifdef __cplusplus } #endif #endif