이 파일의 문서화 페이지로 가기
38 #define REG_SRA(base) (base)
39 #define SRA(reg) ((SRA_t*)(ret))
46 unsigned long b_idx:1;
47 unsigned long hdsel:1;
48 unsigned long b_trk0:1;
50 unsigned long b_drv2:1;
51 unsigned long interrupted:1;
52 #define SRA_RESET_DONE(reg) (!SRA(reg)->interrupted && !SRA(reg)->step && !SRA(reg)->hdsel && !SRA(reg)->dir)
53 #define SRA_INTERRUPTED(reg) (SRA(reg)->interrupted)
55 #elif defined(MODE_MODEL30)
56 unsigned long b_dir:1;
58 unsigned long index:1;
59 unsigned long b_hdsel:1;
61 unsigned long step_ff:1;
63 unsigned long interrupted:1;
65 #define SRA_RESET_DONE(reg) (!SRA(reg)->step_ff)
66 #define SRA_INTERRUPTED(reg) (((SRA_t*)(reg))->interrupted)
68 #elif defined(MODE_PCAT)
70 #define SRA_RESET_DONE(reg) 1
71 #define SRA_INTERRUPTED(reg) 0
76 #define REG_SRB(base) ((base) + 0x01)
77 #define SRB(reg) ((SRB_t*)(reg))
81 unsigned long motor:2;
83 unsigned long rddata_toggle:1;
84 unsigned long wrdata_toggle:1;
85 unsigned long drive_sel0:1;
87 #define SRB_RESET_DONE(reg) (!SRB(reg)->rddata_toggle && !SRB(reg)->wrdata_toggle)
88 #elif defined(MODE_MODEL30)
89 unsigned long b_ds_high:2;
90 unsigned long we_ff:1;
91 unsigned long rddata_ff:1;
92 unsigned long wrdata_ff:1;
93 unsigned long b_ds_low:2;
94 unsigned long b_drv2:1;
95 #define SRB_RESET_DONE(reg) (!SRB(reg)->we_ff && !SRB(reg)->rddata_ff && !SRB(reg)->wrdata_ff)
96 #elif defined(MODE_PCAT)
98 #define SRB_RESET_DONE(reg) 1
103 #define REG_DOR(base) ((base) + 0x02)
124 #define DOR_RESET(ctx) \
127 DOR_t *dor = (DOR_t*)® \
130 dor->b_dma_gate = 0; \
132 outb(REG_DOR((ctx)->ctrl), reg); \
135 #define DOR_ENABLE(ctx, drv, dma) \
138 DOR_t *dor = (DOR_t*)® \
140 dor->drive = (drv); \
141 dor->b_dma_gate = (dma); \
142 dor->motor = 0x01 << (drv); \
143 outb(REG_DOR((ctx)->ctrl), reg); \
147 #define REG_TDR(base) ((base) + 0x03)
155 #define REG_DSR(base) ((base) + 0x04)
183 #define SELECT_DRATE(reg, rate) \
185 DSR_t *dsr = (DSR_t*)(reg); \
186 dsr->dratesel = rate; \
187 switch (dsr->dratesel) { \
189 dsr->precomp = DELAY_41_67ns; \
191 case DRATE_500Kbps: \
192 dsr->precomp = DELAY_125ns; \
194 case DRATE_300Kbps: \
195 dsr->precomp = DELAY_125ns; \
197 case DRATE_250Kbps: \
198 dsr->precomp = DELAY_125ns; \
206 #define DSR_RESET(reg) \
208 DSR_t *dsr = (DSR_t*)(reg); \
210 dsr->power_down = 1; \
214 #define REG_MSR(base) ((base) + 0x04)
239 #define MSR(reg) ((MSR_t*)(reg))
240 #define DIR_OF_DATA(reg) (MSR(reg)->RQM ? (MSR(reg)->DIO ? READ_REQUIRED : WRITE_REQUIRED) : UNDEFINED)
241 #define IN_RESULT_PHASE(reg) (MSR(reg)->cmd_busy)
242 #define IN_SEEK_PORTION(reg) (MSR(reg)->drive_busy)
244 #define REG_FIFO(base) ((base) + 0x05)
251 #define REG_DIR(base) ((base) + 0x07)
254 #if defined(MODE_PCAT)
255 unsigned long none:7;
256 unsigned long disk_change:1;
257 #define DISK_CHANGED(reg) (((DIR_t*)(reg))->disk_change)
258 #elif defined(MODE_PS2)
259 unsigned long b_high_dens:1;
260 unsigned long drate_sel:2;
262 unsigned long disk_change:1;
263 #define DISK_CHANGED(reg) (((DIR_t*)(reg))->disk_change)
264 #elif defined(MODE_MODEL30)
265 unsigned long drate_sel:2;
266 unsigned long no_prec:1;
267 unsigned long b_dma_gate:1;
269 unsigned long b_disk_change:1;
270 #define DISK_CHANGED(reg) (!((DIR_t*)(reg))->disk_change)
277 #define REG_CCR(base) ((base) + 0x07)
280 #if defined(MODE_PCAT) || defined(MODE_PS2)
281 unsigned long drate_sel:2;
282 unsigned long none:6;
283 #elif defined(MODE_MODEL30)
284 unsigned long drate_sel:2;
285 unsigned long no_prec:1;
286 unsigned long none:5;
290 #define SET_DRATE(reg, drate) (((CCR_t*)(reg))->drate_sel = (drate))
342 #define LBA_TO_CHS(lba, h, t, s) \
344 (h) = ((lba) % (FD_SECTOR_PER_TRACK * FD_HEAD)) / FD_SECTOR_PER_TRACK; \
345 (t) = (lba) / (FD_SECTOR_PER_TRACK * FD_HEAD); \
346 (s) = ((lba) % FD_SECTOR_PER_TRACK) + 1; \
349 #define VALIDATE_RESULT(ctx) do { \
351 unsigned char byte; \
352 ret = read_byte(ctx, &byte); \
353 if (ret < 0 || byte == 0x80) \
354 printf("Failed to read\n"); \