summaryrefslogtreecommitdiffstats
path: root/include/asm-m68k/swim_iop.h
blob: 12df2635f1acbbcd23457dc891332b3a1bbf95bb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
/*
 * SWIM access through the IOP
 * Written by Joshua M. Thompson
 */

/* IOP number and channel number for the SWIM */

#define SWIM_IOP	IOP_NUM_ISM
#define SWIM_CHAN	1

/* Command code: */

#define CMD_INIT		0x01	/* Initialize                  */
#define CMD_SHUTDOWN		0x02	/* Shutdown                    */
#define CMD_START_POLL		0x03	/* Start insert/eject polling  */
#define CMD_STOP_POLL		0x04	/* Stop insert/eject polling   */
#define CMD_SETHFSTAG		0x05	/* Set HFS tag buffer address  */
#define CMD_STATUS		0x06	/* Status                      */
#define CMD_EJECT		0x07	/* Eject                       */
#define CMD_FORMAT		0x08	/* Format                      */
#define CMD_FORMAT_VERIFY	0x09	/* Format and Verify           */
#define CMD_WRITE		0x0A	/* Write                       */
#define CMD_READ		0x0B	/* Read                        */
#define CMD_READ_VERIFY		0x0C	/* Read and Verify             */
#define CMD_CACHE_CTRL		0x0D	/* Cache control               */
#define CMD_TAGBUFF_CTRL	0x0E	/* Tag buffer control          */
#define CMD_GET_ICON		0x0F	/* Get Icon                    */

/* Drive types: */

/* note: apple sez DRV_FDHD is 4, but I get back a type */
/*       of 5 when I do a drive status check on my FDHD */

#define	DRV_NONE	0	/* No drive             */
#define	DRV_UNKNOWN	1	/* Unspecified drive    */
#define	DRV_400K	2	/* 400K                 */
#define	DRV_800K	3	/* 400K/800K            */
#define	DRV_FDHD	5	/* 400K/800K/720K/1440K */
#define	DRV_HD20	7	/* Apple HD20           */

/* Format types: */

#define	FMT_HD20	0x0001	/*  Apple HD20 */
#define	FMT_400K	0x0002	/*  400K (GCR) */
#define	FMT_800K	0x0004	/*  800K (GCR) */
#define	FMT_720K	0x0008	/*  720K (MFM) */
#define	FMT_1440K	0x0010	/* 1.44M (MFM) */

#define	FMD_KIND_400K	1
#define	FMD_KIND_800K	2
#define	FMD_KIND_720K	3
#define	FMD_KIND_1440K	1

/* Icon Flags: */

#define	ICON_MEDIA	0x01	/* Have IOP supply media icon */
#define	ICON_DRIVE	0x01	/* Have IOP supply drive icon */

/* Error codes: */

#define	gcrOnMFMErr	-400	/* GCR (400/800K) on HD media */
#define	verErr		-84	/* verify failed */
#define	fmt2Err		-83	/* cant get enough sync during format */
#define	fmt1Err		-82	/* can't find sector 0 after track format */
#define	sectNFErr	-81	/* can't find sector */
#define	seekErr		-80	/* drive error during seek */
#define	spdAdjErr	-79	/* can't set drive speed */
#define	twoSideErr	-78	/* drive is single-sided */
#define	initIWMErr	-77	/* error during initialization */
#define	tk0badErr	-76	/* track zero is bad */
#define	cantStepErr	-75	/* drive error during step */
#define	wrUnderrun	-74	/* write underrun occurred */
#define	badDBtSlp	-73	/* bad data bitslip marks */
#define	badDCksum	-72	/* bad data checksum */
#define	noDtaMkErr	-71	/* can't find data mark */
#define	badBtSlpErr	-70	/* bad address bitslip marks */
#define	badCksmErr	-69	/* bad address-mark checksum */
#define	dataVerErr	-68	/* read-verify failed */
#define	noAdrMkErr	-67	/* can't find an address mark */
#define	noNybErr	-66	/* no nybbles? disk is probably degaussed */
#define	offLinErr	-65	/* no disk in drive */
#define	noDriveErr	-64	/* drive isn't connected */
#define	nsDrvErr	-56	/* no such drive */
#define	paramErr	-50	/* bad positioning information */
#define	wPrErr		-44	/* write protected */
#define	openErr		-23	/* already initialized */

#ifndef __ASSEMBLY__

struct swim_drvstatus {
	__u16	curr_track;	/* Current track number                   */
	__u8	write_prot;	/* 0x80 if disk is write protected        */
	__u8	disk_in_drive;	/* 0x01 or 0x02 if a disk is in the drive */
	__u8	installed;	/* 0x01 if drive installed, 0xFF if not   */
	__u8	num_sides;	/* 0x80 if two-sided format supported     */
	__u8	two_sided;	/* 0xff if two-sided format diskette      */
	__u8	new_interface;	/* 0x00 if old 400K drive, 0xFF if newer  */
	__u16	errors;		/* Disk error count                       */
	struct {		/* 32 bits */
		__u16	reserved;
		__u16	:4;
		__u16	external:1;	/* Drive is external        */
		__u16	scsi:1;		/* Drive is a SCSI drive    */
		__u16	fixed:1;	/* Drive has fixed media    */
		__u16	secondary:1;	/* Drive is secondary drive */
		__u8	type;		/* Drive type               */
	} info;
	__u8	mfm_drive;	/* 0xFF if this is an FDHD drive    */
	__u8	mfm_disk;	/* 0xFF if 720K/1440K (MFM) disk    */
	__u8	mfm_format;	/* 0x00 if 720K, 0xFF if 1440K      */
	__u8	ctlr_type;	/* 0x00 if IWM, 0xFF if SWIM        */
	__u16	curr_format;	/* Current format type              */
	__u16	allowed_fmt;	/* Allowed format types             */
	__u32	num_blocks;	/* Number of blocks on disk         */
	__u8	icon_flags;	/* Icon flags                       */
	__u8	unusued;
};

/* Commands issued from the host to the IOP: */

struct swimcmd_init {
	__u8	code;		/* CMD_INIT */
	__u8	unusued;
	__u16	error;
	__u8	drives[28];	/* drive type list */
};

struct swimcmd_startpoll {
	__u8	code;		/* CMD_START_POLL */
	__u8	unusued;
	__u16	error;
};

struct swimcmd_sethfstag {
	__u8	code;		/* CMD_SETHFSTAG */
	__u8	unusued;
	__u16	error;
	caddr_t	tagbuf;		/* HFS tag buffer address */
};

struct swimcmd_status {
	__u8	code;		/* CMD_STATUS */
	__u8	drive_num;
	__u16	error;
	struct swim_drvstatus status;
};

struct swimcmd_eject {
	__u8	code;		/* CMD_EJECT */
	__u8	drive_num;
	__u16	error;
	struct swim_drvstatus status;
};

struct swimcmd_format {
	__u8	code;		/* CMD_FORMAT */
	__u8	drive_num;
	__u16	error;
	union {
		struct {
			__u16 fmt;	   /* format kind                  */
			__u8  hdrbyte;	   /* fmt byte for hdr (0=default) */
			__u8  interleave;  /* interleave (0 = default)     */
			caddr_t	databuf;   /* sector data buff (0=default  */
			caddr_t	tagbuf;	   /* tag data buffer (0=default)  */
		} f;
		struct swim_drvstatus status;
	} p;
};

struct swimcmd_fmtverify {
	__u8	code;		/* CMD_FORMAT_VERIFY */
	__u8	drive_num;
	__u16	error;
};

struct swimcmd_rw {
	__u8	code;		/* CMD_READ, CMD_WRITE or CMD_READ_VERIFY */
	__u8	drive_num;
	__u16	error;
	caddr_t	buffer;		/* R/W buffer address */
	__u32	first_block;	/* Starting block     */
	__u32	num_blocks;	/* Number of blocks   */
	__u8	tag[12];	/* tag data           */
};

struct swimcmd_cachectl {
	__u8	code;		/* CMD_CACHE_CTRL */
	__u8	unused;
	__u16	error;
	__u8	enable;		/* Nonzero to enable cache                */
	__u8	install;	/* +1 = install, -1 = remove, 0 = neither */
};

struct swimcmd_tagbufctl {
	__u8	code;		/* CMD_TAGBUFF_CTRL */
	__u8	unused;
	__u16	error;
	caddr_t	buf;		/* buffer address or 0 to disable */
};

struct swimcmd_geticon {
	__u8	code;		/* CMD_GET_ICON */
	__u8	drive_num;
	__u16	error;
	caddr_t	buffer;		/* Nuffer address */
	__u16	kind;		/* 0 = media icon, 1 = drive icon */
	__u16	unused;
	__u16	max_bytes;	/* maximum  byte count */
};

/* Messages from the SWIM IOP to the host CPU: */

struct swimmsg_status {
	__u8	code;		/* 1 = insert, 2 = eject, 3 = status changed */
	__u8	drive_num;
	__u16	error;
	struct swim_drvstatus status;
};

#endif /* __ASSEMBLY__ */