Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * SWIM access through the IOP | |
3 | * Written by Joshua M. Thompson | |
4 | */ | |
5 | ||
6 | /* IOP number and channel number for the SWIM */ | |
7 | ||
8 | #define SWIM_IOP IOP_NUM_ISM | |
9 | #define SWIM_CHAN 1 | |
10 | ||
11 | /* Command code: */ | |
12 | ||
13 | #define CMD_INIT 0x01 /* Initialize */ | |
14 | #define CMD_SHUTDOWN 0x02 /* Shutdown */ | |
15 | #define CMD_START_POLL 0x03 /* Start insert/eject polling */ | |
16 | #define CMD_STOP_POLL 0x04 /* Stop insert/eject polling */ | |
17 | #define CMD_SETHFSTAG 0x05 /* Set HFS tag buffer address */ | |
18 | #define CMD_STATUS 0x06 /* Status */ | |
19 | #define CMD_EJECT 0x07 /* Eject */ | |
20 | #define CMD_FORMAT 0x08 /* Format */ | |
21 | #define CMD_FORMAT_VERIFY 0x09 /* Format and Verify */ | |
22 | #define CMD_WRITE 0x0A /* Write */ | |
23 | #define CMD_READ 0x0B /* Read */ | |
24 | #define CMD_READ_VERIFY 0x0C /* Read and Verify */ | |
25 | #define CMD_CACHE_CTRL 0x0D /* Cache control */ | |
26 | #define CMD_TAGBUFF_CTRL 0x0E /* Tag buffer control */ | |
27 | #define CMD_GET_ICON 0x0F /* Get Icon */ | |
28 | ||
29 | /* Drive types: */ | |
30 | ||
31 | /* note: apple sez DRV_FDHD is 4, but I get back a type */ | |
32 | /* of 5 when I do a drive status check on my FDHD */ | |
33 | ||
34 | #define DRV_NONE 0 /* No drive */ | |
35 | #define DRV_UNKNOWN 1 /* Unspecified drive */ | |
36 | #define DRV_400K 2 /* 400K */ | |
37 | #define DRV_800K 3 /* 400K/800K */ | |
38 | #define DRV_FDHD 5 /* 400K/800K/720K/1440K */ | |
39 | #define DRV_HD20 7 /* Apple HD20 */ | |
40 | ||
41 | /* Format types: */ | |
42 | ||
43 | #define FMT_HD20 0x0001 /* Apple HD20 */ | |
44 | #define FMT_400K 0x0002 /* 400K (GCR) */ | |
45 | #define FMT_800K 0x0004 /* 800K (GCR) */ | |
46 | #define FMT_720K 0x0008 /* 720K (MFM) */ | |
47 | #define FMT_1440K 0x0010 /* 1.44M (MFM) */ | |
48 | ||
49 | #define FMD_KIND_400K 1 | |
50 | #define FMD_KIND_800K 2 | |
51 | #define FMD_KIND_720K 3 | |
52 | #define FMD_KIND_1440K 1 | |
53 | ||
54 | /* Icon Flags: */ | |
55 | ||
56 | #define ICON_MEDIA 0x01 /* Have IOP supply media icon */ | |
57 | #define ICON_DRIVE 0x01 /* Have IOP supply drive icon */ | |
58 | ||
59 | /* Error codes: */ | |
60 | ||
61 | #define gcrOnMFMErr -400 /* GCR (400/800K) on HD media */ | |
62 | #define verErr -84 /* verify failed */ | |
63 | #define fmt2Err -83 /* can't get enough sync during format */ | |
64 | #define fmt1Err -82 /* can't find sector 0 after track format */ | |
65 | #define sectNFErr -81 /* can't find sector */ | |
66 | #define seekErr -80 /* drive error during seek */ | |
67 | #define spdAdjErr -79 /* can't set drive speed */ | |
68 | #define twoSideErr -78 /* drive is single-sided */ | |
69 | #define initIWMErr -77 /* error during initialization */ | |
70 | #define tk0badErr -76 /* track zero is bad */ | |
71 | #define cantStepErr -75 /* drive error during step */ | |
72 | #define wrUnderrun -74 /* write underrun occurred */ | |
73 | #define badDBtSlp -73 /* bad data bitslip marks */ | |
74 | #define badDCksum -72 /* bad data checksum */ | |
75 | #define noDtaMkErr -71 /* can't find data mark */ | |
76 | #define badBtSlpErr -70 /* bad address bitslip marks */ | |
77 | #define badCksmErr -69 /* bad address-mark checksum */ | |
78 | #define dataVerErr -68 /* read-verify failed */ | |
79 | #define noAdrMkErr -67 /* can't find an address mark */ | |
80 | #define noNybErr -66 /* no nybbles? disk is probably degaussed */ | |
81 | #define offLinErr -65 /* no disk in drive */ | |
82 | #define noDriveErr -64 /* drive isn't connected */ | |
83 | #define nsDrvErr -56 /* no such drive */ | |
84 | #define paramErr -50 /* bad positioning information */ | |
85 | #define wPrErr -44 /* write protected */ | |
86 | #define openErr -23 /* already initialized */ | |
87 | ||
88 | #ifndef __ASSEMBLY__ | |
89 | ||
90 | struct swim_drvstatus { | |
91 | __u16 curr_track; /* Current track number */ | |
92 | __u8 write_prot; /* 0x80 if disk is write protected */ | |
93 | __u8 disk_in_drive; /* 0x01 or 0x02 if a disk is in the drive */ | |
94 | __u8 installed; /* 0x01 if drive installed, 0xFF if not */ | |
95 | __u8 num_sides; /* 0x80 if two-sided format supported */ | |
96 | __u8 two_sided; /* 0xff if two-sided format diskette */ | |
97 | __u8 new_interface; /* 0x00 if old 400K drive, 0xFF if newer */ | |
98 | __u16 errors; /* Disk error count */ | |
99 | struct { /* 32 bits */ | |
100 | __u16 reserved; | |
101 | __u16 :4; | |
102 | __u16 external:1; /* Drive is external */ | |
103 | __u16 scsi:1; /* Drive is a SCSI drive */ | |
104 | __u16 fixed:1; /* Drive has fixed media */ | |
105 | __u16 secondary:1; /* Drive is secondary drive */ | |
106 | __u8 type; /* Drive type */ | |
107 | } info; | |
108 | __u8 mfm_drive; /* 0xFF if this is an FDHD drive */ | |
109 | __u8 mfm_disk; /* 0xFF if 720K/1440K (MFM) disk */ | |
110 | __u8 mfm_format; /* 0x00 if 720K, 0xFF if 1440K */ | |
111 | __u8 ctlr_type; /* 0x00 if IWM, 0xFF if SWIM */ | |
112 | __u16 curr_format; /* Current format type */ | |
113 | __u16 allowed_fmt; /* Allowed format types */ | |
114 | __u32 num_blocks; /* Number of blocks on disk */ | |
115 | __u8 icon_flags; /* Icon flags */ | |
116 | __u8 unusued; | |
117 | }; | |
118 | ||
119 | /* Commands issued from the host to the IOP: */ | |
120 | ||
121 | struct swimcmd_init { | |
122 | __u8 code; /* CMD_INIT */ | |
123 | __u8 unusued; | |
124 | __u16 error; | |
125 | __u8 drives[28]; /* drive type list */ | |
126 | }; | |
127 | ||
128 | struct swimcmd_startpoll { | |
129 | __u8 code; /* CMD_START_POLL */ | |
130 | __u8 unusued; | |
131 | __u16 error; | |
132 | }; | |
133 | ||
134 | struct swimcmd_sethfstag { | |
135 | __u8 code; /* CMD_SETHFSTAG */ | |
136 | __u8 unusued; | |
137 | __u16 error; | |
138 | caddr_t tagbuf; /* HFS tag buffer address */ | |
139 | }; | |
140 | ||
141 | struct swimcmd_status { | |
142 | __u8 code; /* CMD_STATUS */ | |
143 | __u8 drive_num; | |
144 | __u16 error; | |
145 | struct swim_drvstatus status; | |
146 | }; | |
147 | ||
148 | struct swimcmd_eject { | |
149 | __u8 code; /* CMD_EJECT */ | |
150 | __u8 drive_num; | |
151 | __u16 error; | |
152 | struct swim_drvstatus status; | |
153 | }; | |
154 | ||
155 | struct swimcmd_format { | |
156 | __u8 code; /* CMD_FORMAT */ | |
157 | __u8 drive_num; | |
158 | __u16 error; | |
159 | union { | |
160 | struct { | |
161 | __u16 fmt; /* format kind */ | |
162 | __u8 hdrbyte; /* fmt byte for hdr (0=default) */ | |
163 | __u8 interleave; /* interleave (0 = default) */ | |
164 | caddr_t databuf; /* sector data buff (0=default */ | |
165 | caddr_t tagbuf; /* tag data buffer (0=default) */ | |
166 | } f; | |
167 | struct swim_drvstatus status; | |
168 | } p; | |
169 | }; | |
170 | ||
171 | struct swimcmd_fmtverify { | |
172 | __u8 code; /* CMD_FORMAT_VERIFY */ | |
173 | __u8 drive_num; | |
174 | __u16 error; | |
175 | }; | |
176 | ||
177 | struct swimcmd_rw { | |
178 | __u8 code; /* CMD_READ, CMD_WRITE or CMD_READ_VERIFY */ | |
179 | __u8 drive_num; | |
180 | __u16 error; | |
181 | caddr_t buffer; /* R/W buffer address */ | |
182 | __u32 first_block; /* Starting block */ | |
183 | __u32 num_blocks; /* Number of blocks */ | |
184 | __u8 tag[12]; /* tag data */ | |
185 | }; | |
186 | ||
187 | struct swimcmd_cachectl { | |
188 | __u8 code; /* CMD_CACHE_CTRL */ | |
189 | __u8 unused; | |
190 | __u16 error; | |
191 | __u8 enable; /* Nonzero to enable cache */ | |
192 | __u8 install; /* +1 = install, -1 = remove, 0 = neither */ | |
193 | }; | |
194 | ||
195 | struct swimcmd_tagbufctl { | |
196 | __u8 code; /* CMD_TAGBUFF_CTRL */ | |
197 | __u8 unused; | |
198 | __u16 error; | |
199 | caddr_t buf; /* buffer address or 0 to disable */ | |
200 | }; | |
201 | ||
202 | struct swimcmd_geticon { | |
203 | __u8 code; /* CMD_GET_ICON */ | |
204 | __u8 drive_num; | |
205 | __u16 error; | |
206 | caddr_t buffer; /* Nuffer address */ | |
207 | __u16 kind; /* 0 = media icon, 1 = drive icon */ | |
208 | __u16 unused; | |
209 | __u16 max_bytes; /* maximum byte count */ | |
210 | }; | |
211 | ||
212 | /* Messages from the SWIM IOP to the host CPU: */ | |
213 | ||
214 | struct swimmsg_status { | |
215 | __u8 code; /* 1 = insert, 2 = eject, 3 = status changed */ | |
216 | __u8 drive_num; | |
217 | __u16 error; | |
218 | struct swim_drvstatus status; | |
219 | }; | |
220 | ||
221 | #endif /* __ASSEMBLY__ */ |