|
|
1.1 ! root 1: /* ! 2: * Mach Operating System ! 3: * Copyright (c) 1992 Carnegie Mellon University ! 4: * All Rights Reserved. ! 5: * ! 6: * Permission to use, copy, modify and distribute this software and its ! 7: * documentation is hereby granted, provided that both the copyright ! 8: * notice and this permission notice appear in all copies of the ! 9: * software, derivative works or modified versions, and any portions ! 10: * thereof, and that both notices appear in supporting documentation. ! 11: * ! 12: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" ! 13: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR ! 14: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. ! 15: * ! 16: * Carnegie Mellon requests users of this software to return to ! 17: * ! 18: * Software Distribution Coordinator or [email protected] ! 19: * School of Computer Science ! 20: * Carnegie Mellon University ! 21: * Pittsburgh PA 15213-3890 ! 22: * ! 23: * any improvements or extensions that they make and grant Carnegie Mellon ! 24: * the rights to redistribute these changes. ! 25: */ ! 26: /* ! 27: * File: fdi_82077_hdw.h ! 28: * Author: Alessandro Forin, Carnegie Mellon University ! 29: * Date: 1/92 ! 30: * ! 31: * Defines for the Intel 82077 Floppy Disk Controller chip. ! 32: * Includes defines for 8272A and 82072. ! 33: */ ! 34: ! 35: #ifndef _FDC_82077_H_ ! 36: #define _FDC_82077_H_ ! 37: ! 38: /* ! 39: * Chips we claim to understand, and their modes ! 40: */ ! 41: #define fdc_8272a 0 ! 42: #define fdc_82072 1 ! 43: #define fdc_82077aa 2 ! 44: ! 45: #define at_mode 0 ! 46: #define ps2_mode 1 ! 47: #define mod30_mode 2 ! 48: ! 49: #define DRIVES_PER_FDC 4 ! 50: ! 51: /* ! 52: * Register maps ! 53: */ ! 54: typedef struct { ! 55: volatile unsigned char fd_sra; /* r: status register A */ ! 56: volatile unsigned char fd_srb; /* r: status register B */ ! 57: volatile unsigned char fd_dor; /* rw: digital output reg */ ! 58: volatile unsigned char fd_tdr; /* rw: tape drive register */ ! 59: volatile unsigned char fd_msr; /* r: main status register */ ! 60: #define fd_dsr fd_msr /* w: data rate select reg */ ! 61: volatile unsigned char fd_data; /* rw: fifo */ ! 62: volatile unsigned char fd_xxx; /* --reserved-- */ ! 63: volatile unsigned char fd_dir; /* r: digital input reg */ ! 64: #define fd_ccr fd_dir /* w: config control reg */ ! 65: } fd_regmap_t; ! 66: ! 67: typedef struct { ! 68: volatile unsigned char fd_msr; /* r: main status register */ ! 69: volatile unsigned char fd_data; /* rw: data register */ ! 70: } fd_8272a_regmap_t; ! 71: ! 72: typedef fd_8272a_regmap_t fd_82072_regmap_t; ! 73: /*#define fd_dsr fd_msr /* w: data rate select reg */ ! 74: ! 75: /* ! 76: * Status register A (82077AA only) ! 77: * ! 78: * Only available in PS/2 (ps2) and Model 30 (m30) modes, ! 79: * not available in PC/AT (at) mode. ! 80: * Some signals have inverted polarity (~) on mod30 ! 81: */ ! 82: ! 83: #define FD_SRA_INT 0x80 /* interrupt */ ! 84: #define FD_SRA_DRV2 0x40 /* 2nd drive installed (ps2) */ ! 85: #define FD_SRA_DRQ 0x40 /* dma request (mod30) */ ! 86: #define FD_SRA_STEP 0x20 /* step pulse (~mod30) */ ! 87: #define FD_SRA_TRK0 0x10 /* Track 0 (~mod30) */ ! 88: #define FD_SRA_HDSEL 0x08 /* select head 1 (~mod30) */ ! 89: #define FD_SRA_INDX 0x04 /* Index hole (~mod30) */ ! 90: #define FD_SRA_WP 0x02 /* write protect (~mod30) */ ! 91: #define FD_SRA_DIR 0x01 /* step dir, 1->center (~mod30) */ ! 92: ! 93: /* ! 94: * Status register B (82077AA only) ! 95: * Not available in at mode. ! 96: */ ! 97: ! 98: #define FD_SRB_DRV2 0x80 /* 2nd drive installed (mod30) */ ! 99: /* wired 1 on ps2 */ ! 100: ! 101: #define FD_SRB_DS1 0x40 /* drive select 1 (mod30) */ ! 102: /* wired 1 on ps2 */ ! 103: ! 104: #define FD_SRB_DS0 0x20 /* drive select 0 */ ! 105: #define FD_SRB_WRDATA 0x10 /* out data (toggle or ~trigger) */ ! 106: #define FD_SRB_RDDATA 0x08 /* in data (toggle or ~trigger) */ ! 107: #define FD_SRB_WE 0x04 /* write enable (~mod30) */ ! 108: #define FD_SRB_MOT_1 0x02 /* motor enable drive 1 (ps2) */ ! 109: #define FD_SRB_DS3 0x02 /* drive select 3 (mod30) */ ! 110: #define FD_SRB_MOT_0 0x01 /* motor enable drive 0 (ps2) */ ! 111: #define FD_SRB_DS2 0x01 /* drive select 2 (mod30) */ ! 112: ! 113: /* ! 114: * Digital output register (82077AA only) ! 115: */ ! 116: ! 117: #define FD_DOR_MOT_3 0x80 /* motor enable drive 3 */ ! 118: #define FD_DOR_MOT_2 0x40 ! 119: #define FD_DOR_MOT_1 0x20 ! 120: #define FD_DOR_MOT_0 0x10 ! 121: #define FD_DOR_DMA_GATE 0x08 /* enable dma (mod30,at) */ ! 122: #define FD_DOR_ENABLE 0x04 /* chip reset (inverted) */ ! 123: #define FD_DOR_DRIVE_0 0x00 /* select drive no 0 */ ! 124: #define FD_DOR_DRIVE_1 0x01 ! 125: #define FD_DOR_DRIVE_2 0x02 ! 126: #define FD_DOR_DRIVE_3 0x03 ! 127: ! 128: /* ! 129: * Tape drive register (82077AA only) ! 130: */ ! 131: ! 132: #define FD_TDR_TAPE_1 0x01 /* unit 1 is a tape */ ! 133: #define FD_TDR_TAPE_2 0x02 ! 134: #define FD_TDR_TAPE_3 0x03 ! 135: #define FD_TDR_xxx 0xfc ! 136: ! 137: /* ! 138: * Data-rate select register (82077AA and 82072) ! 139: */ ! 140: ! 141: #define FD_DSR_RESET 0x80 /* self-clearing reset */ ! 142: #define FD_DSR_POWER_DOWN 0x40 /* stop clocks and oscill */ ! 143: #define FD_DSR_zero 0x20 /* wired zero on 82077AA */ ! 144: #define FD_DSR_EPLL 0x20 /* enable PLL on 82072 */ ! 145: ! 146: #define FD_DSR_PRECOMP_MASK 0x1c /* precompensation value */ ! 147: # define FD_DSR_PRECOMP_SHIFT 2 ! 148: ! 149: # define FD_DSR_PRECOMP_DEFAULT 0 /* 41.67@1Mbps else 125ns */ ! 150: # define FD_DSR_PRECOMP_41_67 1 ! 151: # define FD_DSR_PRECOMP_83_34 2 ! 152: # define FD_DSR_PRECOMP_125_00 3 ! 153: # define FD_DSR_PRECOMP_166_67 4 ! 154: # define FD_DSR_PRECOMP_208_33 5 ! 155: # define FD_DSR_PRECOMP_250_00 6 ! 156: # define FD_DSR_PRECOMP_DISABLE 7 /* 0.00ns */ ! 157: ! 158: #define FD_DSR_DATA_RATE_MASK 0x03 ! 159: #define FD_DSR_SD_250 0x00 /* fm modulation, 250Kbps bit clock */ ! 160: #define FD_DSR_SD_150 0x01 ! 161: #define FD_DSR_SD_125 0x02 ! 162: ! 163: #define FD_DSR_DD_500 0x00 /* mfm modulation, 500Kbps */ ! 164: #define FD_DSR_DD_300 0x01 ! 165: #define FD_DSR_DD_250 0x02 ! 166: #define FD_DSR_DD_1000 0x03 /* illegal for 82077 */ ! 167: ! 168: /* ! 169: * Main status register (all chips) ! 170: */ ! 171: ! 172: #define FD_MSR_RQM 0x80 /* request from master (allowed) */ ! 173: #define FD_MSR_DIO 0x40 /* data in/out, 1->master read */ ! 174: #define FD_MSR_NON_DMA 0x20 /* dma disabled */ ! 175: #define FD_MSR_CMD_BSY 0x10 /* command in progress */ ! 176: #define FD_MSR_DRV_3_BSY 0x08 /* drive busy seeking */ ! 177: #define FD_MSR_DRV_2_BSY 0x04 ! 178: #define FD_MSR_DRV_1_BSY 0x02 ! 179: #define FD_MSR_DRV_0_BSY 0x01 ! 180: ! 181: /* ! 182: * FIFO (82077AA and 82072) ! 183: * ! 184: * Service delay is ! 185: * Threshold * 8 ! 186: * delay = ------------- - 1.5 usecs ! 187: * Data-rate ! 188: */ ! 189: ! 190: #define FD_FIFO_DEEP 16 ! 191: ! 192: /* ! 193: * Digital input register (82077AA only) ! 194: */ ! 195: ! 196: #define FD_DIR_DSK_CHG 0x80 /* disk was changed (~mod30) */ ! 197: ! 198: #define FD_DIR_ones 0x78 /* wired ones for ps2 */ ! 199: #define FD_DIR_zeroes 0x70 /* wired zeroes for mod30 */ ! 200: #define FD_DIR_undef 0x7f /* undefined for at */ ! 201: ! 202: #define FD_DIR_DR_MASK_PS2 0x06 /* current data rate (ps2) */ ! 203: # define FD_DIR_DR_SHIFT_PS2 1 ! 204: #define FD_DIR_LOW_DENS 0x01 /* zero for 500/1M dr (ps2) */ ! 205: ! 206: #define FD_DIR_DMA_GATE 0x08 /* same as DOR (mod30) */ ! 207: #define FD_DIR_NOPREC 0x04 /* same as CCR (mod30) */ ! 208: #define FD_DIR_DR_MASK_M30 0x03 /* current data rate (mod30) */ ! 209: # define FD_DIR_DR_SHIFT_M30 0 ! 210: ! 211: /* ! 212: * Configuration control register (82077AA only) ! 213: */ ! 214: ! 215: #define FD_CCR_DATA_RATE_MASK 0x03 /* see DSR for values */ ! 216: #define FD_CCR_NOPREC 0x04 /* "has no function" (mod30) */ ! 217: ! 218: ! 219: /* ! 220: * Programming ! 221: * ! 222: * Legend for command bytes, when applicable ! 223: * ! 224: * hds bit 2 of byte 1, head select (1 -> head 1) ! 225: * ds bits 0-1 of byte 1, drive select ! 226: * c cylinder number (max 76 for 8272A, else 255) ! 227: * h head number ! 228: * r sector number ! 229: * n number of bytes in sector ! 230: * eot end-of-track, e.g. final sector number ! 231: * gpl gap length ! 232: * dtl data length (for partial sectors) ! 233: * st0-3 status byte ! 234: * srt step rate time ! 235: * hut head unload time ! 236: * hlt head load time ! 237: * nd disable DMA ! 238: * mot do not turn motor on before checking drive status ! 239: * pcn present cylinder number ! 240: * ncn new cylinder number ! 241: * rcn relative cylinder number (new=present+rcn) ! 242: * sc sectors/cylinder ! 243: * d filler byte ! 244: * ? undefined ! 245: * hsda high-speed disk adjust (doubles motor on/off delays) ! 246: * moff motor off timer, one disk revolution increments ! 247: * mon motor on timer, ditto ! 248: * eis enable implied seeks ! 249: * dfifo disable fifo ! 250: * poll disable poll ! 251: * fifthr fifo threshold (1 to 16 bytes) ! 252: * pretrk precomp starts on this trackno (0-255) ! 253: * wgate change timings of WE signal, in perpendicular mode ! 254: * gap change gap2 length, in perpendicular mode ! 255: * ec in verify, qualify terminating conditions (sc viz eot) ! 256: */ ! 257: ! 258: /* First byte of command, qualifiers */ ! 259: #define FD_CMD_MT 0x80 /* Multi-track */ ! 260: #define FD_CMD_MFM 0x40 /* Double density */ ! 261: #define FD_CMD_SK 0x20 /* skip deleted data address mark */ ! 262: #define FD_CMD_DIR 0x40 /* relative seek direction (up) */ ! 263: ! 264: /* command codes and description */ ! 265: ! 266: /* ! 267: * Read an entire track. ! 268: * Qualifiers: MFM, SK (8272A only) ! 269: * Bytes total: 9 code,hds+ds,c,h,r,n,eot,gpl,dtl ! 270: * Result total: 7 st0,st1,st2,c,h,r,n ! 271: */ ! 272: #define FD_CMD_READ_TRACK 0x02 ! 273: ! 274: /* ! 275: * Specify timers ! 276: * Qualifiers: ! 277: * Bytes total: 3 code,srt+hut,hlt+nd ! 278: * Result total: ! 279: */ ! 280: #define FD_CMD_SPECIFY 0x03 ! 281: ! 282: /* ! 283: * Sense status of drive ! 284: * Qualifiers: ! 285: * Bytes total: 2 code,hds+ds +mot(82072 only) ! 286: * Result total: 1 st3 ! 287: */ ! 288: #define FD_CMD_SENSE_DRIVE_STATUS 0x04 ! 289: # define FD_CMD_SDS_NO_MOT 0x80 ! 290: ! 291: /* ! 292: * Write ! 293: * Qualifiers: MT, MFM ! 294: * Bytes total: 9 code,hds+ds,c,h,r,n,eot,gpl,dtl ! 295: * Result total: 7 st0,st1,st2,c,h,r,n ! 296: */ ! 297: #define FD_CMD_WRITE_DATA 0x05 ! 298: ! 299: /* ! 300: * Read ! 301: * Qualifiers: MT, MFM, SK ! 302: * Bytes total: 9 code,hds+ds,c,h,r,n,eot,gpl,dtl ! 303: * Result total: 7 st0,st1,st2,c,h,r,n ! 304: */ ! 305: #define FD_CMD_READ_DATA 0x06 ! 306: ! 307: /* ! 308: * Seek to track 0 ! 309: * Qualifiers: ! 310: * Bytes total: 2 code,ds ! 311: * Result total: ! 312: */ ! 313: #define FD_CMD_RECALIBRATE 0x07 ! 314: ! 315: /* ! 316: * Sense interrupt status ! 317: * Qualifiers: ! 318: * Bytes total: 1 code ! 319: * Result total: 2 st0,pcn ! 320: */ ! 321: #define FD_CMD_SENSE_INT_STATUS 0x08 ! 322: ! 323: /* ! 324: * Write data and mark deleted ! 325: * Qualifiers: MT, MFM ! 326: * Bytes total: 9 code,hds+ds,c,h,r,n,eot,gpl,dtl ! 327: * Result total: 7 st0,st1,st2,c,h,r,n ! 328: */ ! 329: #define FD_CMD_WRITE_DELETED_DATA 0x09 ! 330: ! 331: /* ! 332: * Read current head position ! 333: * Qualifiers: MFM ! 334: * Bytes total: 2 code,hds+ds ! 335: * Result total: 7 st0,st1,st2,c,h,r,n ! 336: */ ! 337: #define FD_CMD_READ_ID 0x0a ! 338: ! 339: /* ! 340: * Set value of MOT pin, unconditionally ! 341: * Qualifiers: see ! 342: * Bytes total: 1 code+.. ! 343: * Result total: none returns to command phase ! 344: */ ! 345: #define FD_CMD_MOTOR_ON_OFF 0x0b /* 82072 only */ ! 346: ! 347: # define FD_CMD_MOT_ON 0x80 ! 348: # define FD_CMD_MOT_DS 0x60 ! 349: # define FD_CMD_MOT_DS_SHIFT 5 ! 350: ! 351: /* ! 352: * Read data despite deleted address mark ! 353: * Qualifiers: MT, MFM, SK ! 354: * Bytes total: 9 code,hds+ds,c,h,r,n,eot,gpl,dtl ! 355: * Result total: 7 st0,st1,st2,c,h,r,n ! 356: */ ! 357: #define FD_CMD_READ_DELETED_DATA 0x0c ! 358: ! 359: /* ! 360: * Media initialization ! 361: * Qualifiers: MFM ! 362: * Bytes total: 6 code,hds+ds,n,sc,gpl,d ! 363: * Data: 4*sc/2 c,h,r,n ! 364: * Result total: 7 st0,st1,st2,?,?,?,? ! 365: */ ! 366: #define FD_CMD_FORMAT_TRACK 0x0d ! 367: ! 368: /* ! 369: * Dump internal register status ! 370: * Qualifiers: ! 371: * Bytes total: 1 code ! 372: * Result total: 10 pcn0,pcn1,pcn2,pcn3,srt+hut,hlt+nd, ! 373: * sc/eot,hsda+moff+mon, ! 374: * eis+dfifo+poll+fifothr, pretrk ! 375: * Notes: 82077AA does not provide for hsda+moff+mon ! 376: */ ! 377: #define FD_CMD_DUMPREG 0x0e /* not 8272a */ ! 378: ! 379: /* ! 380: * Move head ! 381: * Qualifiers: ! 382: * Bytes total: 3 code,hds+ds,ncn ! 383: * Result total: ! 384: */ ! 385: #define FD_CMD_SEEK 0x0f ! 386: ! 387: /* ! 388: * ! 389: * Qualifiers: ! 390: * Bytes total: 1 code ! 391: * Result total: 1 version ! 392: */ ! 393: #define FD_CMD_VERSION 0x10 /* 82077AA only */ ! 394: # define FD_VERSION_82077AA 0x90 ! 395: ! 396: /* ! 397: * Scan disk data ! 398: * Qualifiers: MT, MFM, SK ! 399: * Bytes total: 9 code,hds+ds,c,h,r,n,eot,gpl,dtl ! 400: * Result total: 7 st0,st1,st2,c,h,r,n ! 401: */ ! 402: #define FD_CMD_SCAN_EQUAL 0x11 /* 8272A only */ ! 403: ! 404: /* ! 405: * Specify timers ! 406: * Qualifiers: ! 407: * Bytes total: 2 code,wgate+gap ! 408: * Result total: ! 409: */ ! 410: #define FD_CMD_PERPENDICULAR_MODE 0x12 /* 82077AA only */ ! 411: ! 412: /* ! 413: * Set configuration parameters ! 414: * Qualifiers: ! 415: * Bytes total: 4 code,hsda+moff+mon,eis+dfifo+poll+fifothr, ! 416: * pretrk ! 417: * Result total: ! 418: * Notes: 82077AA does not provide for hsda+moff+mon ! 419: */ ! 420: #define FD_CMD_CONFIGURE 0x13 /* not 8272a */ ! 421: ! 422: /* ! 423: * Verify CRC of disk data ! 424: * Qualifiers: MT, MFM, SK ! 425: * Bytes total: 9 code,ec+hds+ds,c,h,r,n,eot,gpl,dtl/sc ! 426: * Result total: 7 st0,st1,st2,c,h,r,n ! 427: */ ! 428: #define FD_CMD_VERIFY 0x16 /* 82077AA only */ ! 429: ! 430: /* ! 431: * Scan disk data (disk less-or-equal memory) ! 432: * Qualifiers: MT, MFM, SK ! 433: * Bytes total: 9 code,hds+ds,c,h,r,n,eot,gpl,dtl ! 434: * Result total: 7 st0,st1,st2,c,h,r,n ! 435: */ ! 436: #define FD_CMD_SCAN_LOW_OR_EQUAL 0x19 /* 8272A only */ ! 437: ! 438: /* ! 439: * Scan disk data (disk greater-or-equal memory) ! 440: * Qualifiers: MT, MFM, SK ! 441: * Bytes total: 9 code,hds+ds,c,h,r,n,eot,gpl,dtl ! 442: * Result total: 7 st0,st1,st2,c,h,r,n ! 443: */ ! 444: #define FD_CMD_SCAN_HIGH_OR_EQUAL 0x1d /* 8272A only */ ! 445: ! 446: /* ! 447: * Specify timers ! 448: * Qualifiers: DIR ! 449: * Bytes total: 3 code,hds+ds,rcn ! 450: * Result total: ! 451: */ ! 452: #define FD_CMD_RELATIVE_SEEK 0x8f /* not 8272a */ ! 453: ! 454: /* ! 455: * Any invalid command code ! 456: * Qualifiers: ! 457: * Bytes total: 1 code ! 458: * Result total: 1 st0 (st0 == 0x80) ! 459: */ ! 460: #define FD_CMD_INVALID 0xff ! 461: ! 462: ! 463: /* ! 464: * Results and statii ! 465: * ! 466: * The typical command returns three status bytes, ! 467: * followed by four drive status bytes. ! 468: */ ! 469: ! 470: /* ! 471: * Status register 0 ! 472: */ ! 473: #define FD_ST0_IC_MASK 0xc0 /* interrupt completion code */ ! 474: ! 475: # define FD_ST0_IC_OK 0x00 /* terminated ok */ ! 476: # define FD_ST0_IC_AT 0x40 /* exec phase ended sour */ ! 477: # define FD_ST0_IC_BAD_CMD 0x80 /* didnt grok */ ! 478: # define FD_ST0_IC_AT_POLL 0xc0 /* polling got in the way */ ! 479: ! 480: #define FD_ST0_SE 0x20 /* (implied) seek ended */ ! 481: #define FD_ST0_EC 0x10 /* equipment check */ ! 482: #define FD_ST0_NR 0x08 /* not ready (raz for 82077aa) */ ! 483: #define FD_ST0_H 0x04 /* currently selected head */ ! 484: #define FD_ST0_DS 0x03 /* currently selected drive */ ! 485: ! 486: /* ! 487: * Status register 1 ! 488: */ ! 489: ! 490: #define FD_ST1_EN 0x80 /* end of cylinder (TC not set?) */ ! 491: #define FD_ST1_zero 0x48 ! 492: #define FD_ST1_DE 0x20 /* data error, bad CRC */ ! 493: #define FD_ST1_OR 0x10 /* overrun/underrun ! 494: #define FD_ST1_ND 0x04 /* no data, sector not found */ ! 495: #define FD_ST1_NW 0x02 /* write protect signal */ ! 496: #define FD_ST1_MA 0x01 /* missing address mark */ ! 497: ! 498: /* ! 499: * Status register 2 ! 500: */ ! 501: ! 502: #define FD_ST2_zero 0x80 ! 503: #define FD_ST2_CM 0x40 /* control mark, improper read */ ! 504: #define FD_ST2_DD 0x20 /* the CRC error was for data */ ! 505: #define FD_ST2_WC 0x10 /* wrong cylinder */ ! 506: #define FD_ST2_SH 0x08 /* scan hit (8272a only) */ ! 507: #define FD_ST2_SN 0x04 /* scan not met (8272a only) */ ! 508: #define FD_ST2_BC 0x02 /* bad cylinder, has 0xff mark */ ! 509: #define FD_ST2_MD 0x01 /* missing data mark */ ! 510: ! 511: /* ! 512: * Status register 3 ! 513: * (sense drive status) ! 514: */ ! 515: ! 516: #define FD_ST3_FT 0x80 /* fault pin (0 if not 8272a) */ ! 517: #define FD_ST3_WP 0x40 /* write protect pin */ ! 518: #define FD_ST3_RDY 0x20 /* ready pin (1 on 82077aa) */ ! 519: #define FD_ST3_T0 0x10 /* track0 pin */ ! 520: #define FD_ST3_TS 0x08 /* two-sided pin (1 if not 8272a) */ ! 521: #define FD_ST3_HD 0x04 /* hdsel pin */ ! 522: #define FD_ST3_DS 0x03 /* drive select pins (1&0) */ ! 523: ! 524: ! 525: #endif /* _FDC_82077_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.