|
|
1.1 root 1: /*
2: * /usr/include/sys/xlfd.h
3: *
4: * FDC support for Archive floppy tape.
5: * This header should disappear soon!
6: *
7: * Revised: Fri May 21 13:32:25 1993 CDT
8: */
9: #ifndef __SYS_XLFD_H__
10: #define __SYS_XLFD_H__
11:
12: #define FD0 0 /* major device number for floppy disk */
13:
14: /*
15: * the floppy disk minor device number is interpreted as follows:
16: * bits:
17: * 7 4 3 21 0
18: * +----+-+--+-+
19: * |fmt |s|pt|u|
20: * +----+-+--+-+
21: * codes:
22: * u - unit no. (0 or 1)
23: * pt - partition no. (0 - 3)
24: * s - single/double sided (1 = single)
25: * fmt - format code, no. of bytes per sector/ no. of sectors per trk.
26: */
27:
28: #define PARTITION(x) ((getminor(x) & 0x06) >> 1)
29: #define UNIT(x) (getminor(x) & 0x01)
30: #define FRMT(x) ((getminor(x) & 0xf0) >> 4)
31: #define SIDES(x) ((getminor(x) & 0x08) ? 1 : 2)
32:
33: /*
34: * Defines for controller access.
35: */
36: #define FDSTAT 0x3f4 /* I/O port addr of floppy controller status port */
37: #define FDDATA 0x3f5 /* I/O port addr of floppy controller data port */
38:
39: #define FCBUSY 0x10 /* controller busy bit */
40: #define IODIR 0x40 /* data reg I/O direction, 1 = read, 0 = write */
41: #define IORDY 0x80 /* data register ready to xfer bit */
42:
43: #define FCRETRY 4000 /* this many ten microseconds equals 40ms. */
44:
45: #define CTIMOUT 0x02 /* Timed out waiting for IORDY in fdcmd */
46: #define RTIMOUT 0x03 /* Timed out waiting for IORDY in fdresult*/
47: #define NECERR 0x04 /* Controller wont go idle error flag */
48:
49: #define ONESIDE 0x08 /* indicates in minor dev that we want single sided */
50:
51: #define NUMDRV 2 /* maximum number of drives supported */
52: #define NHDS 2 /* default number of heads */
53: #define NSECS 9 /* default number of sectors per track */
54: #define NCYLS 40 /* default number of cylinders */
55: #define SECSIZE 512 /* default sector size */
56: #define SECSHFT 9
57: #define SECMASK (SECSIZE-1)
58:
59: #define FD ('R'<<8)
60: #define FDSPARAM (FD | 00) /* set the drive paramaters */
61: #define FDGPARAM (FD | 01) /* get the drive paramaters */
62: #define FDFMTTRK (FD | 02) /* format a single track */
63:
64: #define OPEN_EMAX 1 /* max number of retries during open processing */
65: #define FORM_EMAX 3 /* max number of retries during format */
66: #define TRYRESET 5 /* try a reset after this many errrors */
67: #define NORM_EMAX 10 /* normal max number of retries */
68:
69: #define RUNTIM 3
70: #define WAITTIM 4
71: #define LOADTIM 10
72: #define MTIME 100 /* no. of clock ticks in one second */
73: #define ETIMOUT 50 /* no. of clock ticks in 1/2 second */
74: #define T25MS 3 /* no. of clock ticks in 25 milliseconds */
75: #define T500MS 50 /* no. of clock ticks in 500 milliseconds */
76: #define T50MS 5 /* no. of clock ticks in 50 milliseconds */
77: #define T750MS 75 /* no. of clock ticks in 750 milliseconds */
78:
79: #define OPENED 0x01
80: #define OPENING 0x02
81: #define RECAL 0x04
82: #define CLOSING 0x08
83: #define EXCLUSV 0x10
84: #define RSTDOPN 0x20
85:
86: #define WINTR 0x01
87: #define WRESET 0x02
88:
89: #define D_NTRK 40 /* 40 tracks - double density */
90: #define Q_NTRK 80 /* 80 tracks - quad density */
91:
92:
93: #define FDCSR1 0x03F7
94: #define DOOROPEN 0x80
95: #define FDCTRL 0x03F2
96: #define NORESET 0x04
97: #define ENABINT 0x08
98: #define ENABMOTOR 0x10
99:
100: #define FD0BSY 0x01 /* drive is seeking */
101: #define FD1BSY 0x02
102: #define FD2BSY 0x04
103: #define FD3BSY 0x08
104: #define FCBSY 0x10 /* controller is busy */
105: #define NODMA 0x20 /* controller in non-DMA mode */
106:
107: /*
108: * Floppy controller commands
109: */
110: #define RDCMD 0x26
111: #define SEEK 0x0F
112: #define FORMAT 0x0D
113: #define READID 0x0A
114: #define SENSE_INT 0x08
115: #define REZERO 0x07
116: #define WRCMD 0x05
117: #define SENSE_DRV 0x04 /* read status register 3 */
118: #define SPECIFY 0x03
119:
120: #define READDEL 0x0C
121: #define WRITEDEL 0x09
122: #define READTRACK 0x02
123: #define RAWCMD 0x7F /* command is thru raw I/O ioctl */
124:
125: #define INVALID 0x80 /* status register 0 */
126: #define ABNRMTERM 0x40
127: #define SEEKEND 0x20
128: #define EQCHK 0x10
129: #define NOTRDY 0x08
130:
131: #define EOCYL 0x80 /* status register 1 */
132: #define CRCERR 0x20
133: #define OVRRUN 0x10
134: #define NODATA 0x04
135: #define MADR 0x01
136:
137: #define FAULT 0x80 /* status register 3 */
138: #define WPROT 0x40
139: #define RDY 0x20
140: #define TWOSIDE 0x08
141:
142: /* NEW_HARDWARE CMOS drive descriptions */
143: #define DRV_NONE 0x00
144: #define DRV_DBL 0x01
145: #define DRV_QUAD 0x02
146:
147: /* encodings for the 'fdf_den' field in structure 'fdparam' */
148: #define DEN_MFM 0x40 /* double density disks */
149: #define DEN_FM 0x00 /* single density disks */
150:
151: /* encodings for the 'fdf_bps' field in structure 'fdparam' */
152: #define BPS128 0 /* 128 bytes per sector */
153: #define BPS256 1 /* 256 bytes per sector */
154: #define BPS512 2 /* 512 bytes per sector */
155: #define BPS1024 3 /* 1024 bytes per sector */
156: #define MAXBPS 3 /* maximum value of the 'fdf_bps' field */
157:
158: #define FDNPART 3 /* number of partitions supported */
159: #define FDMEMSIZE (36*512)
160: /*
161: * partition table for floppy disks
162: * we support, 3 different partitions:
163: * 0 - the whole disk;
164: * 1 - the first cylinder on the disk
165: * 2 - the whole disk minus the first cylinder
166: */
167: struct fdpartab {
168: int startcyl; /* cylinder no. where partition starts */
169: int numcyls; /* number of cylinders in partition */
170: };
171:
172: #define FDNSECT 8 /* no. of sector size/count types supported */
173: /*
174: * sector table for floppy disks,
175: * specifies number of bytes per sector and
176: * number of sectors per track.
177: */
178: struct fdsectab {
179: unsigned short fd_ssize; /* number of bytes in a sector */
180: unsigned short fd_sshift; /* shift to convert bytes to sectors */
181: unsigned char fd_nsect; /* number of sectors per track */
182: unsigned char fd_drvs; /* bitmask of drive types supporting */
183: unsigned char fd_gpln; /* normal gap length */
184: unsigned char fd_gplf; /* format gap length */
185: };
186:
187: struct fdstate {
188: char fd_status;
189: char fd_maxerr;
190: unsigned char fd_drvtype;
191: unsigned char fd_trnsfr;
192: unsigned char fd_hst;
193: unsigned char fd_mst;
194: unsigned char fd_dstep;
195: unsigned short fd_cylskp;
196: unsigned short fd_ncyls;
197: unsigned short fd_secsiz;
198: unsigned short fd_secmsk;
199: unsigned char fd_secsft;
200: unsigned char fd_nsides;
201: unsigned char fd_nsects;
202: unsigned char fd_cylsiz;
203: unsigned char fd_curcyl;
204: unsigned char fd_lsterr;
205: unsigned short fd_n512b;
206: dev_t fd_device;
207: struct proc *fd_proc;
208: unsigned char fd_fmt; /* auto format detection */
209: unsigned char fd_dskchg; /* if == 0, format is up to date */
210: };
211:
212: struct fdparam { /* used by FDSPARAM and FDGPARAM commands */
213: char fdf_bps; /* number of bytes per sector - encoded */
214: char fdf_spt; /* number of sectors per track */
215: char fdf_gpln; /* gap length for normal R/W operations */
216: char fdf_gplf; /* gap length for format operations */
217: char fdf_dtl; /* length of sector if 'fdf_bps' = 0 */
218: char fdf_fil; /* fill byte to use while formatting */
219: char fdf_den; /* FM or MFM encoding */
220: char fdf_nhd; /* number of heads */
221: short fdf_ncyl; /* number of cylinders */
222: };
223:
224: struct fdformid { /* used by FDFMTTRK command */
225: char fdf_track;
226: char fdf_head;
227: char fdf_sec;
228: char fdf_secsiz;
229: };
230:
231: #define FIOC ('F'<<8)
232: #define F_DTYP (FIOC|60) /* returns fd_drvtype */
233: #define F_FCR (FIOC|61) /* output to Floppy Control Register */
234: #define F_DOR (FIOC|62) /* output to Digital Output Register */
235: #define F_RAW (FIOC|63) /* general raw controller interface */
236:
237: struct fdraw { /* used by F_RAW command */
238: char fr_cmd[10]; /* user-supplied command bytes */
239: short fr_cnum; /* number of command bytes */
240: char fr_result[10]; /* controller-supplied result bytes */
241: short fr_nbytes; /* number to transfer if read/write command */
242: char *fr_addr; /* where to transfer if read/write command */
243: };
244:
245: struct fdbufstruct {
246: int fbs_flags;
247: caddr_t fbs_addr;
248: unsigned int fbs_size;
249: };
250:
251: #endif /* __SYS_XLFD_H__ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.