Go to the documentation of this file.
39 #define REG_SRA(base) (base)
40 #define SRA(reg) ((SRA_t*)(ret))
47 unsigned long b_idx:1;
48 unsigned long hdsel:1;
49 unsigned long b_trk0:1;
51 unsigned long b_drv2:1;
52 unsigned long interrupted:1;
53 #define SRA_RESET_DONE(reg) (!SRA(reg)->interrupted && !SRA(reg)->step && !SRA(reg)->hdsel && !SRA(reg)->dir)
54 #define SRA_INTERRUPTED(reg) (SRA(reg)->interrupted)
56 #elif defined(MODE_MODEL30)
57 unsigned long b_dir:1;
59 unsigned long index:1;
60 unsigned long b_hdsel:1;
62 unsigned long step_ff:1;
64 unsigned long interrupted:1;
66 #define SRA_RESET_DONE(reg) (!SRA(reg)->step_ff)
67 #define SRA_INTERRUPTED(reg) (((SRA_t*)(reg))->interrupted)
69 #elif defined(MODE_PCAT)
71 #define SRA_RESET_DONE(reg) 1
72 #define SRA_INTERRUPTED(reg) 0
77 #define REG_SRB(base) ((base) + 0x01)
78 #define SRB(reg) ((SRB_t*)(reg))
82 unsigned long motor:2;
84 unsigned long rddata_toggle:1;
85 unsigned long wrdata_toggle:1;
86 unsigned long drive_sel0:1;
87 unsigned long reserved:2;
88 #define SRB_RESET_DONE(reg) (!SRB(reg)->rddata_toggle && !SRB(reg)->wrdata_toggle)
89 #elif defined(MODE_MODEL30)
90 unsigned long b_ds_high:2;
91 unsigned long we_ff:1;
92 unsigned long rddata_ff:1;
93 unsigned long wrdata_ff:1;
94 unsigned long b_ds_low:2;
95 unsigned long b_drv2:1;
96 #define SRB_RESET_DONE(reg) (!SRB(reg)->we_ff && !SRB(reg)->rddata_ff && !SRB(reg)->wrdata_ff)
97 #elif defined(MODE_PCAT)
99 #define SRB_RESET_DONE(reg) 1
104 #define REG_DOR(base) ((base) + 0x02)
125 #define DOR_RESET(single) \
128 DOR_t *dor = (DOR_t*)® \
131 dor->b_dma_gate = 0; \
133 outb(REG_DOR(fdc_single_ctrl(single)), reg); \
136 #define DOR_ENABLE(single, drv, dma) \
139 DOR_t *dor = (DOR_t*)® \
141 dor->drive = (drv); \
142 dor->b_dma_gate = (dma); \
143 dor->motor = 0x01 << (drv); \
144 outb(REG_DOR(fdc_single_ctrl(single)), reg); \
148 #define REG_TDR(base) ((base) + 0x03)
156 #define REG_DSR(base) ((base) + 0x04)
184 #define SELECT_DRATE(reg, rate) \
186 DSR_t *dsr = (DSR_t*)(reg); \
187 dsr->dratesel = rate; \
188 switch (dsr->dratesel) { \
190 dsr->precomp = DELAY_41_67ns; \
192 case DRATE_500Kbps: \
193 dsr->precomp = DELAY_125ns; \
195 case DRATE_300Kbps: \
196 dsr->precomp = DELAY_125ns; \
198 case DRATE_250Kbps: \
199 dsr->precomp = DELAY_125ns; \
207 #define DSR_RESET(reg) \
209 DSR_t *dsr = (DSR_t*)(reg); \
211 dsr->power_down = 1; \
215 #define REG_MSR(base) ((base) + 0x04)
240 #define MSR(reg) ((MSR_t*)(reg))
241 #define DIR_OF_DATA(reg) (MSR(reg)->RQM ? (MSR(reg)->DIO ? READ_REQUIRED : WRITE_REQUIRED) : UNDEFINED)
242 #define IN_RESULT_PHASE(reg) (MSR(reg)->cmd_busy)
243 #define IN_SEEK_PORTION(reg) (MSR(reg)->drive_busy)
245 #define REG_FIFO(base) ((base) + 0x05)
252 #define REG_DIR(base) ((base) + 0x07)
255 #if defined(MODE_PCAT)
256 unsigned long none:7;
257 unsigned long disk_change:1;
258 #define DISK_CHANGED(reg) (((DIR_t*)(reg))->disk_change)
259 #elif defined(MODE_PS2)
260 unsigned long b_high_dens:1;
261 unsigned long drate_sel:2;
262 unsigned long reserved:4;
263 unsigned long disk_change:1;
264 #define DISK_CHANGED(reg) (((DIR_t*)(reg))->disk_change)
265 #elif defined(MODE_MODEL30)
266 unsigned long drate_sel:2;
267 unsigned long no_prec:1;
268 unsigned long b_dma_gate:1;
269 unsigned long reserved:3;
270 unsigned long b_disk_change:1;
271 #define DISK_CHANGED(reg) (!((DIR_t*)(reg))->disk_change)
278 #define REG_CCR(base) ((base) + 0x07)
281 #if defined(MODE_PCAT) || defined(MODE_PS2)
282 unsigned long drate_sel:2;
283 unsigned long none:6;
284 #elif defined(MODE_MODEL30)
285 unsigned long drate_sel:2;
286 unsigned long no_prec:1;
287 unsigned long none:5;
291 #define SET_DRATE(reg, drate) (((CCR_t*)(reg))->drate_sel = (drate))
343 #define LBA_TO_CHS(lba, h, t, s) \
345 (h) = ((lba) % (FD_SECTOR_PER_TRACK * FD_HEAD)) / FD_SECTOR_PER_TRACK; \
346 (t) = (lba) / (FD_SECTOR_PER_TRACK * FD_HEAD); \
347 (s) = ((lba) % FD_SECTOR_PER_TRACK) + 1; \
350 #define VALIDATE_RESULT(ctx) do { \
352 unsigned char byte; \
353 ret = read_byte(ctx, &byte); \
354 if (ret < 0 || byte == 0x80) { \
355 printf("Failed to read\n"); \