00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #ifndef ATA_H
00037 #define ATA_H
00038
00039 #include "global.h"
00040 #include "ataconf.h"
00041
00042
00043 #define DRIVE0 0
00044
00045 #define STANDBY 0
00046 #define SLEEP 1
00047 #define IDLE 2
00048
00049
00050 #define ATA_SR_BSY 0x80
00051 #define ATA_SR_DRDY 0x40
00052 #define ATA_SR_DF 0x20
00053 #define ATA_SR_DSC 0x10
00054 #define ATA_SR_DRQ 0x08
00055 #define ATA_SR_CORR 0x04
00056 #define ATA_SR_IDX 0x02
00057 #define ATA_SR_ERR 0x01
00058
00059
00060 #define ATA_ER_UNC 0x40
00061 #define ATA_ER_MC 0x20
00062 #define ATA_ER_IDNF 0x10
00063 #define ATA_ER_MCR 0x08
00064 #define ATA_ER_ABRT 0x04
00065 #define ATA_ER_TK0NF 0x02
00066 #define ATA_ER_AMNF 0x01
00067
00068
00069 #define ATA_HEAD_USE_LBA 0x40
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 #define ATA_CMD_READ 0x20
00088 #define ATA_CMD_READNR 0x21
00089 #define ATA_CMD_WRITE 0x30
00090 #define ATA_CMD_WRITENR 0x31
00091 #define ATA_CMD_IDENTIFY 0xEC
00092 #define ATA_CMD_RECALIBRATE 0x10
00093 #define ATA_CMD_SPINDOWN 0xE0 // spin down disk immediately
00094 #define ATA_CMD_SPINUP 0xE1 // spin up disk immediately
00095 #define ATA_CMD_STANDBY_5SU 0xE2 // spin down disk and set auto-power-down timer (sectorcount*5sec)
00096 #define ATA_CMD_IDLE_5SU 0xE3 // keep disk spinning and set auto-power-down timer (sectorcount*5sec)
00097 #define ATA_CMD_SLEEP 0xE6 // sleep disk (wakeup only on HW or SW reset)
00098 #define ATA_CMD_STANDBY_01SU 0xF2 // spin down disk and set auto-power-down timer (sectorcount*0.1sec)
00099 #define ATA_CMD_IDLE_01SU 0xF3 // keep disk spinning and set auto-power-down timer (sectorcount*0.1sec)
00100
00101
00102
00103 #define ATA_DISKPARM_CLYS 0x03A6 // number of cylinders per platter
00104 #define ATA_DISKPARM_HEADS 0x10 // number of heads (usable plater sides)
00105 #define ATA_DISKPARM_SECTORS 0x11 // number of sectors per head per cylinder
00106
00107
00108
00109 #define ATA_IDENT_DEVICETYPE 0 // specifies ATA/ATAPI, removable/non-removable
00110 #define ATA_IDENT_CYLINDERS 1 // number of logical cylinders
00111 #define ATA_IDENT_HEADS 3 // number of logical heads
00112 #define ATA_IDENT_SECTORS 6 // number of sectors per track
00113 #define ATA_IDENT_SERIAL 10 // drive model name (20 characters)
00114 #define ATA_IDENT_MODEL 27 // drive model name (40 characters)
00115 #define ATA_IDENT_FIELDVALID 53 // indicates field validity of higher words (bit0: words54-58, bit1: words 64-70)
00116 #define ATA_IDENT_LBASECTORS 60 // number of sectors in LBA translation mode
00117
00118
00119 #define ATA_DISKMODE_SPINDOWN 0
00120 #define ATA_DISKMODE_SPINUP 1
00121 #define ATA_DISKMODE_SETTIMEOUT 2
00122 #define ATA_DISKMODE_SLEEP 3
00123
00124
00125
00126 typedef struct
00127 {
00128 unsigned int cylinders;
00129 unsigned char heads;
00130 unsigned char sectors;
00131 unsigned long sizeinsectors;
00132 unsigned char LBAsupport;
00133 char model[41];
00134 } typeDriveInfo;
00135
00136
00137
00138 void ataInit(void);
00139 void ataDriveInit(void);
00140 void ataDriveSelect(u08 DriveNo);
00141 void ataSetDrivePowerMode(u08 DriveNo, u08 mode, u08 timeout);
00142 u08 ataReadByte(u08 reg);
00143 void ataWriteByte(u08 reg, u08 data);
00144 void ataShowRegisters(unsigned char DriveNo);
00145 u08 ataSWReset(void);
00146 void ataDiskErr(void);
00147 void ataPrintSector( u08 *Buffer);
00148 void ataReadDataBuffer(u08 *Buffer, u16 numBytes);
00149 void ataWriteDataBuffer(u08 *Buffer, u16 numBytes);
00150 u08 ataStatusWait(u08 mask, u08 waitStatus);
00151
00152
00153 unsigned char ataReadSectorsCHS( unsigned char Drive,
00154 unsigned char Head,
00155 unsigned int Track,
00156 unsigned char Sector,
00157 unsigned int numsectors,
00158 unsigned char *Buffer);
00159
00160 unsigned char ataWriteSectorsCHS( unsigned char Drive,
00161 unsigned char Head,
00162 unsigned int Track,
00163 unsigned char Sector,
00164 unsigned int numsectors,
00165 unsigned char *Buffer);
00166
00167
00168 unsigned char ataReadSectorsLBA( unsigned char Drive,
00169 unsigned long lba,
00170 unsigned int numsectors,
00171 unsigned char *Buffer);
00172
00173 unsigned char ataWriteSectorsLBA( unsigned char Drive,
00174 unsigned long lba,
00175 unsigned int numsectors,
00176 unsigned char *Buffer);
00177
00178
00179
00180
00181 unsigned char ataReadSectors( unsigned char Drive,
00182 unsigned long lba,
00183 unsigned int numsectors,
00184 unsigned char *Buffer);
00185
00186 unsigned char ataWriteSectors( unsigned char Drive,
00187 unsigned long lba,
00188 unsigned int numsectors,
00189 unsigned char *Buffer);
00190
00191
00192
00193
00194
00195 #endif
00196