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 #ifndef FDC1_H
00032 #define FDC1_H
00033
00034 #define FDC_DMA_EANBLE 1
00035 #define FDC_DMA_CHANNEL 2
00036 #define FDC_IRQ 6
00037
00038 #define FDC_NO_ERROR 0
00039 #define FDC_ERROR 1
00040 #define FDC_NODISK 2
00041 #define FDC_TIMEROUT 3
00042
00043 #define FDC_WRITE 0 //same to DMA_READ
00044 #define FDC_READ 1 //same to DMA_WRITE
00045
00046
00047 #define FDC1_BASE 0x3f0
00048 #define FDC1_STATUS_A 0x3f0 //status register a,ps/2
00049 #define FDC1_STATUS_B 0x3f1 //status register b,ps/2
00050 #define FDC1_DOR_REG 0x3f2 //w,digital output register
00051 #define FDC1_MSR_REG 0x3f4 //r,main status register...xt,at
00052 #define FDC1_DSR_REG 0x3f4 //datarate select reigster
00053 #define FDC1_FIFO_REG 0x3f5 //r,w,data port...xt,at
00054 #define FDC1_DIR_REG 0x3f7 //r,digital input register...at
00055 #define FDC1_CCR_REG 0x3f7 //w,configuration control register...at pc
00056
00057 #define FDC_MSR_FDD0_BUSY 0x01 //fdd 0:busy in seek mode
00058 #define FDC_MSR_FDD1_BUSY 0x02 //fdd 1:busy in seek mode
00059 #define FDC_MSR_FDD2_BUSY 0x04 //fdd 2:busy in seek mode
00060 #define FDC_MSR_FDD3_BUSY 0x08 //fdd 3:busy in seek mode
00061 #define FDC_MSR_FDC_BUSY 0x10 //1:busy,0:not busy
00062 #define FDC_MSR_NON_DMA 0x20 //1:fdc not in dma mode,0:fdc in dma mode
00063 #define FDC_MSR_DIO 0x40 //1:fdc has data for cpu,0:fdc expecting data from cpu
00064 #define FDC_MSR_RQM 0x80 //memory request...1:data register is ready,0:data register is not ready
00065
00066 #define FDC_DOR_DEVICENUM0 0x00 //device number 0
00067 #define FDC_DOR_DEVICENUM1 0x01 //device number 1
00068 #define FDC_DOR_DEVICENUM2 0x10 //device number 2
00069 #define FDC_DOR_DEVICENUM3 0x11 //device number 3
00070 #define FDC_DOR_RESETB 0x04
00071 #define FDC_DOR_DMAGATE 0x08 //enable fdc interrupt and drq
00072 #define FDC_DOR_MOTORON_FDD0 0x10 //fdd 0 motor
00073 #define FDC_DOR_MOTORON_FDD1 0x20 //fdd 1 motor
00074 #define FDC_DOR_MOTORON_FDD2 0x40 //fdd 2 motor
00075 #define FDC_DOR_MOTORON_FDD3 0x80 //fdd 3 motor
00076
00077
00078 #define FDC_DIR_DISKCHANGE 0x80
00079
00080 #define CCR_DTR_MASK 0x03 //DTR: data transfer rate
00081 #define CCR_DTR_500K 0x00 //DTR=500kbits/sec
00082 #define CCR_DTR_300K 0x01 //DTR=300kbits/sec
00083 #define CCR_DTR_250K 0x10 //DTR=250kbits/sec
00084 #define CCR_DTR_1M 0x11 //DTR=1mbits/sec
00085
00086
00087
00088 #define FDC_CMD_READDATA 0x06 //bit765=MT.MFM.SK
00089 #define FDC_CMD_READDELETEDATA 0x0c //bit765=MT.MFM.SK
00090 #define FDC_CMD_READTRACK 0x02 //bit6=MFM
00091 #define FDC_CMD_WRITEDATA 0x05 //bit76=MT.MFM
00092 #define FDC_CMD_WRITEDELETEDATA 0x09 //bit76=MT.MFM
00093 #define FDC_CMD_VERIFY 0x16 //bit765=MT.MFM.SK
00094 #define FDC_CMD_FORMATTRACK 0x0d //bit6=MFM
00095
00096 #define FDC_CMD_SCANEQUAL 0x11 //bit765=MT.MFM.SK
00097 #define FDC_CMD_SCANLOWEQUAL 0x19 //bit765=MT.MFM.SK
00098 #define FDC_CMD_SCANHIGHEQUAL 0x1d //bit765=MT.MFM.SK
00099
00100 #define FDC_CMD_READID 0x0a //bit6=MFM
00101 #define FDC_CMD_RECALIBRATE 0x07
00102 #define FDC_CMD_SEEK 0x0f
00103 #define FDC_CMD_SENSEINTERRUPTSTATUS 0x08
00104 #define FDC_CMD_SENSEDRIVESTATUS 0x04
00105 #define FDC_CMD_SPECIFY 0x03
00106 #define FDC_CMD_CONFIGURE 0x13
00107 #define FDC_CMD_VERSION 0x10
00108 #define FDC_CMD_RELATIVESEEK 0x8f //bit6=DIR
00109 #define FDC_CMD_DUMPREG 0x0e
00110
00111 #define FDC_CMD_PERPENDICULARMODE 0x12
00112 #define FDC_CMD_LOCK 0x14 //bit7=LOCK
00113
00114 #define FDC_MT 0x80 //multi track...treat track0 at head 0 track0 at head as a track
00115 #define FDC_MFM 0x40 //modified fm...set 1 if floppy is double density
00116 #define FDC_SK 0x20 //skip delete...set 1 it will skip sector that is marked as delete
00117 #define FDC_COMMAND_ATTRIBUTE (FDC_MT|FDC_MFM|FDC_SK)
00118
00119 #define FDC_HEAD_PER_DISK 2
00120 #define FDC_TRACK_PER_HEAD 80
00121 #define FDC_SECTOR_PER_TRACK 18
00122 #define FDC_TOTAL_SECTOR (FDC_HEAD_PER_DISK*FDC_TRACK_PER_HEAD*FDC_SECTOR_PER_TRACK) //2880
00123 #define FDC_GAP3 0x1b
00124 #define FDC_RATE CCR_DTR_500K //500 kbits/sec
00125 #define FDC_HEAD_UNLOAD_TIME 0xcf
00126 #define FDC_GAP3_FORMATING 0x6c
00127
00128 #define FDC_DMA_READ 0x44
00129 #define FDC_DMA_WRITE 0x48
00130
00131 #define FDC_DEVICE_NONE 0
00132 #define FDC_DEVICE_NEC765 1
00133 #define FDC_DEVICE_ENHENCED 2
00134
00135 #define FDC_DISK_CHANGE 0x01
00136 #define FDC_SPIN_UP 0x02
00137 #define FDC_SPIN_DOWN 0x04
00138
00139 #define FDC_HLT 0x08 //head load time
00140 #define FDC_HUT 0x0f //head unload time
00141 #define FDC_SRT 0x0c //step rate time
00142 #if(FDC_DMA_EANBLE==0)
00143 #define FDC_ND 1 //non-dma=1...no use dma
00144 #else
00145 #define FDC_ND 0 //non-dma=0...use dma
00146 #endif
00147
00148 #define FDC_GAP3 0x1B
00149
00150
00151
00152 #define FDC_IC_NORMAL 0x00
00153 #define FDC_IC_ABNORMAL 0x40
00154 #define FDC_IC_INVALID 0x80
00155 #define FDC_IC_ABNORMAL_POLLING 0xc0
00156
00157 #define FDC_SECTORSIZE_128 0x00
00158 #define FDC_SECTORSIZE_256 0x01
00159 #define FDC_SECTORSIZE_512 0x02
00160 #define FDC_SECTORSIZE_1k 0x03
00161 #define FDC_SECTORSIZE_2k 0x04
00162 #define FDC_SECTORSIZE_4k 0x05
00163 #define FDC_SECTORSIZE_8k 0x06
00164 #define FDC_SECTORSIZE_16k 0x07
00165
00166 #define FDC_DRIVE0 0x00
00167 #define FDC_DRIVE1 0x01
00168 #define FDC_DRIVE2 0x02
00169 #define FDC_DRIVE3 0x03
00170
00171 #define FDC_IN_NONDATA 0
00172 #define FDC_IN_READ 1
00173 #define FDC_IN_WRITE 2
00174
00175
00176 typedef struct{
00177 U32 cmos_type;
00178 U32 HeadLoadTime;
00179 U32 spin_up;
00180 U32 spin_down;
00181 U32 sel_delay;
00182 U32 int_tmout;
00183 U32 detect[8];
00184 U32 native_fmt;
00185 const char *name;
00186 }FDC_RECORD;
00187
00188 typedef struct{
00189 U32 strech;
00190 U8 gap3;
00191 U8 rate;
00192 U8 gap3fmt;
00193 const char *name;
00194 }FLOPPY_FORMAT;
00195
00196 typedef struct{
00197 U8 State;
00198 U8 DorReg;
00199 U8 MsrReg;
00200 U8 HasInterrupt;
00201 U8 ControllerType;
00202 U8 Device0Type;
00203 U8 Device1Type;
00204 U8 HasPrimaryFdc;
00205 U8 HasSecondaryFdc;
00206 U8 RwFlag;
00207 U8 Flags;
00208 U8 Track;
00209 U8 Head;
00210 U8 Sector;
00211 U8 SectorSize;
00212 U16 Timer;
00213 U16 ReTries;
00214 }FDC_CONTROL;
00215
00216 extern FDC_CONTROL Fdc1Ctrl;
00217
00218 void Fdc1Init(void);
00219 void Fdc1Handler(void);
00220 bool Fdc1Test(void);
00221 void Fdc1Initialization(void);
00222 bool Fdc1Recalibrate(void);
00223 bool Fdc1SenseInterruptStatus(void);
00224 void Fdc1Version(void);
00225 bool Fdc1Specify(void);
00226 void Fdc1ReadId(void);
00227 bool Fdc1Seek(U8 TrackNumber);
00228 void Fdc1Delay(U16 Time);
00229 bool Fdc1RecalibrateProcedure(void);
00230 bool Fdc1SeekProcedure(U8);
00231 void Fdc1ReadTest(void);
00232 U8 Fdc1ReadMsr(void);
00233
00234 #endif