summaryrefslogtreecommitdiff
path: root/sys/dev/ic/ns8477reg.h
blob: a6f8977b268b2fb745c83d653d6dc24e314ea388 (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
/*	$NetBSD: ns8477reg.h,v 1.3 2008/04/28 20:23:50 martin Exp $	 */

/*-
 * Copyright (c) 1998 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by Christos Zoulas.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

/*
 * Register descriptions of the National Semiconductor PC8477B
 * floppy controller
 */

#define	FDC_SRA	0	/* (R)   Status Register A		*/

#define FDC_SRB	1	/* (R)   Status Register B		*/

#define FDC_DOR	2	/* (R/W) Digital Output Register	*/

# define FDC_DOR_SEL0	0x01	/* Drive Select 0	*/
# define FDC_DOR_SEL1	0x02	/* Drive Select 1	*/
# define FDC_DOR_RESET	0x04	/* Reset Controller	*/
# define FDC_DOR_DMAEN	0x08	/* Dma Enable		*/
# define FDC_DOR_MTR0	0x10	/* Motor Enable 0	*/
# define FDC_DOR_MTR1	0x20	/* Motor Enable 1	*/
# define FDC_DOR_MTR2	0x40	/* Motor Enable 2	*/
# define FDC_DOR_MTR3	0x80	/* Motor Enable 3	*/
# define FDC_DOR_MTR(a)  (1 << (n + 4))

#define FDC_TDR	3	/* (R/W) Tape Drive Register		*/
# define FDC_TDR_SEL0	0x01	/* Tape Select 0	*/
# define FDC_TDR_SEL1	0x02	/* Tape Select 1	*/

#define FDC_MSR	4	/* (R)   Main Status Register		*/
# define FDC_MSR_BUSY0	0x01	/* Drive 0 Busy		*/
# define FDC_MSR_BUSY1	0x02	/* Drive 1 Busy		*/
# define FDC_MSR_BUSY2	0x04	/* Drive 2 Busy		*/
# define FDC_MSR_BUSY3	0x08	/* Drive 3 Busy		*/
# define FDC_MSR_CMDPRG	0x10	/* Command In Progress	*/
# define FDC_MSR_NONDMA	0x20	/* Non DMA Execution	*/
# define FDC_MSR_DIO	0x40	/* Data I/O Direction	*/
# define FDC_MSR_RQM	0x80	/* Reguest for Master	*/

#define FDC_DSR	4	/* (W)   Data Rate Select Register	*/
# define FDC_DSR_DRATE0	0x01	/* Data Rate Select 0	*/
# define FDC_DSR_DRATE1	0x02	/* Data Rate Select 0	*/
/*
 * bit	MFM	FM
 *  00  500Kb/s	250Kb/s
 *  01  300Kb/s	150Kb/s
 *  10  250Kb/s	125Kb/s
 *  11	1Mb/s	illegal
 */
# define FDC_DSR_500KBPS	0x00	/* 500KBPS MFM drive transfer rate */
# define FDC_DSR_300KBPS	0x01	/* 300KBPS MFM drive transfer rate */
# define FDC_DSR_250KBPS	0x02	/* 250KBPS MFM drive transfer rate */
# define FDC_DSR_1MBPS		0x03	/* 1MBPS MFM drive transfer rate */

# define FDC_DSR_PREC0	0x04	/* Precompensation bit 0*/
# define FDC_DSR_PREC1	0x08	/* Precompensation bit 1*/
# define FDC_DSR_PREC2	0x10	/* Precompensation bit 2*/
/*
 * bit	Precomp Data Rate
 * 000	default
 * 001   41.7ns	1Mb/s
 * 010	 83.3ns
 * 011	125.0ns 500Kb/s, 300Kb/s, 250Kb/s
 * 100	168.7ns
 * 101	208.3ns
 * 110	208.3ns
 * 111	  0.0ns
 */
# define FDC_DSR_ZERO	0x20	/* Undef; should be 0	*/
# define FDC_DSR_LOWPWR	0x40	/* Low Power Mode	*/
# define FDC_DSR_SWRST	0x80	/* Software Reset	*/

#define FDC_FIFO	5	/* (R/W) Data Register (FIFO)		*/

/*
 * Commands
 */
#define FDC_CMD_MODE				(0x01)
#define	FDC_CMD_READ_TRACK(mfm)			(0x02|mfm)
#define	FDC_CMD_SPECIFY				(0x03)
#define	FDC_CMD_SENSE_DRIVE_STATUS		(0x04)
#define FDC_CMD_WRITE_DATA(mt,mfm)		(0x05|mt|mfm)
#define FDC_CMD_READ_DATA(mt,mfm,sk)		(0x06|mt|mfm|sk)
#define	FDC_CMD_RECALIBRATE			(0x07)
#define	FDC_CMD_SENSE_INTERRUPT			(0x08)
#define FDC_CMD_WRITE_DEL_DATA(mt,mfm)		(0x09|mt|mfm)
#define	FDC_CMD_READ_ID(mfm)			(0x0a|mfm)
#define FDC_CMD_READ_DEL_DATA(mt,mfm,sk)	(0x0c|mt|mfm|sk)
#define	FDC_CMD_FORMAT_TRACK(mfm)		(0x0d|mfm)
#define FDC_CMD_DUMPREG				(0x0e)
#define FDC_CMD_SEEK				(0x0f)
#define FDC_CMD_VERSION				(0x10)
#define FDC_CMD_SCAN_EQUAL(mt,mfm,sk)		(0x11|mt|mfm|sk)
#define FDC_CMD_PERPENDICULAR			(0x12)
#define FDC_CMD_CONFIGURE			(0x13)
#define FDC_CMD_LOCK(lock)			(0x14|lock)
#define FDC_CMD_VERIFY(mt,mfm,sk)		(0x16|mt|mfm|sk)
#define FDC_CMD_NSC				(0x18)
#define FDC_CMD_SCAN_LO_EQUAL(mt,mfm,sk)	(0x19|mt|mfm|sk)
#define FDC_CMD_SCAN_HI_EQUAL(mt,mfm,sk)	(0x1d|mt|mfm|sk)
#define FDC_CMD_SET_TRACK(wnr)			(0x21|wnr)
#define	FDC_CMD_REL_SEEK(dir)			(0x8f|dir)

#define  FDC_CMD_CONFIGURE_FLAGS_POLL	0x10
#define  FDC_CMD_CONFIGURE_FLAGS_FIFO	0x20
#define  FDC_CMD_CONFIGURE_FLAGS_EIS	0x40
#define  FDC_CMD_FLAGS_LOCK		0x80
#define  FDC_CMD_FLAGS_MT		0x80
#define  FDC_CMD_FLAGS_MFM		0x40
#define  FDC_CMD_FLAGS_SK		0x20
#define  FDC_CMD_FLAGS_DIR		0x40
#define  FDC_CMD_FLAGS_WNR		0x40
/*
 * Command Status
 */
/* Status register ST0 */
#define FDC_ST0BITS	"\020\010invld\007abnrml\006seek_cmplt\005drv_chck\004drive_rdy\003top_head\002ds1\001ds0"
# define FDC_ST0_DS0	0x01	/* Drive Select 0	*/
# define FDC_ST0_DS1	0x02	/* Drive Select 1	*/
# define FDC_ST0_HDS	0x04	/* Head select		*/
# define FDC_ST0_ZERO	0x08	/* Undef; should be 0	*/
# define FDC_ST0_EC	0x10	/* Equipment check	*/
# define FDC_ST0_SE	0x20	/* Seek completed	*/
# define FDC_ST0_IC0	0x40	/* Interrupt code 0	*/
# define FDC_ST0_IC1	0x80	/* Interrupt code 1	*/
# define FDC_ST0(a)	(a & ~(FDC_ST0_DS0|FDC_ST0_DS1|FDC_ST0_HDS))
#  define FDC_ST0_NRML 0x00	/* Normal Completion	*/
#  define FDC_ST0_ABNR 0x40	/* Abnormal Termination	*/
#  define FDC_ST0_INVL 0x80	/* Invalid Command	*/
#  define FDC_ST0_CHGD 0xc0	/* Drive status changed	*/

/* Status register ST1 */
#define FDC_ST1BITS	"\020\010end_of_cyl\006bad_crc\005data_overrun\003sec_not_fnd\002write_protect\001no_am"
# define FDC_ST1_MA	0x01	/* Missing address mark	*/
# define FDC_ST1_NW	0x02	/* Write Protect	*/
# define FDC_ST1_ND	0x04	/* No Data		*/
# define FDC_ST1_ZERO0	0x08	/* Undef; should be 0	*/
# define FDC_ST1_OR	0x10	/* Overrun error	*/
# define FDC_ST1_CE	0x20	/* CRC error		*/
# define FDC_ST1_ZERO1	0x40	/* Undef; should be 0	*/
# define FDC_ST1_ET	0x80	/* End of Track		*/

/* Status register ST2 */
#define FDC_ST2BITS	"\020\007ctrl_mrk\006bad_crc\005wrong_cyl\004scn_eq\003scn_not_fnd\002bad_cyl\001no_dam"
# define FDC_ST2_MD	0x01	/* Missing Address Mark */
# define FDC_ST2_BT	0x02	/* Bad Track		*/
# define FDC_ST2_SNS	0x04	/* Scan Not Satisfied	*/
# define FDC_ST2_SEH	0x08	/* Scan Equal Hit	*/
# define FDC_ST2_WT	0x10	/* Wrong Track		*/
# define FDC_ST2_CD	0x20	/* CRC Error in Data	*/
# define FDC_ST2_CM	0x40	/* Control Mark		*/
# define FDC_ST2_ZERO	0x80	/* Undef; should be 0	*/

/* Status register ST3 */
#define FDC_ST3BITS	"\020\010fault\007write_protect\006drdy\005tk0\004two_side\003side_sel\002ds1\001ds0"
# define FDC_ST3_DS0	0x01	/* Drive Select 0	*/
# define FDC_ST3_DS1	0x02	/* Drive Select 1	*/
# define FDC_ST3_HDS	0x04	/* Head Select		*/
# define FDC_ST3_ONE0	0x08	/* Undef; should be 0	*/
# define FDC_ST3_TK0	0x10	/* Track 0		*/
# define FDC_ST3_ONE1	0x20	/* Undef; should be 0	*/
# define FDC_ST3_WP	0x40	/* Write Protect	*/
# define FDC_ST3_ZERO	0x80	/* Undef; should be 0	*/

#define FDC_NONE	6	/* (X)   None (Bus TRI-STATE)	*/

#define FDC_DIR	7	/* (R)   Digital Input Register		*/
# define FDC_DIR_DSKCHG	0x80	/* Disk Changed		*/

#define FDC_CCR	7	/* (W)   Configuration Register		*/
# define FDC_CCR_DRATE0	0x01	/* Data Rate Select 0	*/
# define FDC_CCR_DRATE1	0x02	/* Data Rate Select 0	*/
# define FDC_CCR_ZERO0	0x04	/* Undef; should be 0	*/
# define FDC_CCR_ZERO1	0x08	/* Undef; should be 0	*/
# define FDC_CCR_ZERO2	0x10	/* Undef; should be 0	*/
# define FDC_CCR_ZERO3	0x20	/* Undef; should be 0	*/
# define FDC_CCR_ZERO4	0x40	/* Undef; should be 0	*/
# define FDC_CCR_ZERO5	0x80	/* Undef; should be 0	*/

#define FDC_NPORT	8