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 /* cant 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__ */ 222