diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /drivers/char/ip2/i2hw.h |
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'drivers/char/ip2/i2hw.h')
-rw-r--r-- | drivers/char/ip2/i2hw.h | 648 |
1 files changed, 648 insertions, 0 deletions
diff --git a/drivers/char/ip2/i2hw.h b/drivers/char/ip2/i2hw.h new file mode 100644 index 000000000000..15fe04e748f4 --- /dev/null +++ b/drivers/char/ip2/i2hw.h | |||
@@ -0,0 +1,648 @@ | |||
1 | /******************************************************************************* | ||
2 | * | ||
3 | * (c) 1999 by Computone Corporation | ||
4 | * | ||
5 | ******************************************************************************** | ||
6 | * | ||
7 | * | ||
8 | * PACKAGE: Linux tty Device Driver for IntelliPort II family of multiport | ||
9 | * serial I/O controllers. | ||
10 | * | ||
11 | * DESCRIPTION: Definitions limited to properties of the hardware or the | ||
12 | * bootstrap firmware. As such, they are applicable regardless of | ||
13 | * operating system or loadware (standard or diagnostic). | ||
14 | * | ||
15 | *******************************************************************************/ | ||
16 | #ifndef I2HW_H | ||
17 | #define I2HW_H 1 | ||
18 | //------------------------------------------------------------------------------ | ||
19 | // Revision History: | ||
20 | // | ||
21 | // 23 September 1991 MAG First Draft Started...through... | ||
22 | // 11 October 1991 ... Continuing development... | ||
23 | // 6 August 1993 Added support for ISA-4 (asic) which is architected | ||
24 | // as an ISA-CEX with a single 4-port box. | ||
25 | // | ||
26 | // 20 December 1996 AKM Version for Linux | ||
27 | // | ||
28 | //------------------------------------------------------------------------------ | ||
29 | /*------------------------------------------------------------------------------ | ||
30 | |||
31 | HARDWARE DESCRIPTION: | ||
32 | |||
33 | Introduction: | ||
34 | |||
35 | The IntelliPort-II and IntelliPort-IIEX products occupy a block of eight (8) | ||
36 | addresses in the host's I/O space. | ||
37 | |||
38 | Some addresses are used to transfer data to/from the board, some to transfer | ||
39 | so-called "mailbox" messages, and some to read bit-mapped status information. | ||
40 | While all the products in the line are functionally similar, some use a 16-bit | ||
41 | data path to transfer data while others use an 8-bit path. Also, the use of | ||
42 | command /status/mailbox registers differs slightly between the II and IIEX | ||
43 | branches of the family. | ||
44 | |||
45 | The host determines what type of board it is dealing with by reading a string of | ||
46 | sixteen characters from the board. These characters are always placed in the | ||
47 | fifo by the board's local processor whenever the board is reset (either from | ||
48 | power-on or under software control) and are known as the "Power-on Reset | ||
49 | Message." In order that this message can be read from either type of board, the | ||
50 | hardware registers used in reading this message are the same. Once this message | ||
51 | has been read by the host, then it has the information required to operate. | ||
52 | |||
53 | General Differences between boards: | ||
54 | |||
55 | The greatest structural difference is between the -II and -IIEX families of | ||
56 | product. The -II boards use the Am4701 dual 512x8 bidirectional fifo to support | ||
57 | the data path, mailbox registers, and status registers. This chip contains some | ||
58 | features which are not used in the IntelliPort-II products; a description of | ||
59 | these is omitted here. Because of these many features, it contains many | ||
60 | registers, too many to access directly within a small address space. They are | ||
61 | accessed by first writing a value to a "pointer" register. This value selects | ||
62 | the register to be accessed. The next read or write to that address accesses | ||
63 | the selected register rather than the pointer register. | ||
64 | |||
65 | The -IIEX boards use a proprietary design similar to the Am4701 in function. But | ||
66 | because of a simpler, more streamlined design it doesn't require so many | ||
67 | registers. This means they can be accessed directly in single operations rather | ||
68 | than through a pointer register. | ||
69 | |||
70 | Besides these differences, there are differences in whether 8-bit or 16-bit | ||
71 | transfers are used to move data to the board. | ||
72 | |||
73 | The -II boards are capable only of 8-bit data transfers, while the -IIEX boards | ||
74 | may be configured for either 8-bit or 16-bit data transfers. If the on-board DIP | ||
75 | switch #8 is ON, and the card has been installed in a 16-bit slot, 16-bit | ||
76 | transfers are supported (and will be expected by the standard loadware). The | ||
77 | on-board firmware can determine the position of the switch, and whether the | ||
78 | board is installed in a 16-bit slot; it supplies this information to the host as | ||
79 | part of the power-up reset message. | ||
80 | |||
81 | The configuration switch (#8) and slot selection do not directly configure the | ||
82 | hardware. It is up to the on-board loadware and host-based drivers to act | ||
83 | according to the selected options. That is, loadware and drivers could be | ||
84 | written to perform 8-bit transfers regardless of the state of the DIP switch or | ||
85 | slot (and in a diagnostic environment might well do so). Likewise, 16-bit | ||
86 | transfers could be performed as long as the card is in a 16-bit slot. | ||
87 | |||
88 | Note the slot selection and DIP switch selection are provided separately: a | ||
89 | board running in 8-bit mode in a 16-bit slot has a greater range of possible | ||
90 | interrupts to choose from; information of potential use to the host. | ||
91 | |||
92 | All 8-bit data transfers are done in the same way, regardless of whether on a | ||
93 | -II board or a -IIEX board. | ||
94 | |||
95 | The host must consider two things then: 1) whether a -II or -IIEX product is | ||
96 | being used, and 2) whether an 8-bit or 16-bit data path is used. | ||
97 | |||
98 | A further difference is that -II boards always have a 512-byte fifo operating in | ||
99 | each direction. -IIEX boards may use fifos of varying size; this size is | ||
100 | reported as part of the power-up message. | ||
101 | |||
102 | I/O Map Of IntelliPort-II and IntelliPort-IIEX boards: | ||
103 | (Relative to the chosen base address) | ||
104 | |||
105 | Addr R/W IntelliPort-II IntelliPort-IIEX | ||
106 | ---- --- -------------- ---------------- | ||
107 | 0 R/W Data Port (byte) Data Port (byte or word) | ||
108 | 1 R/W (Not used) (MSB of word-wide data written to Data Port) | ||
109 | 2 R Status Register Status Register | ||
110 | 2 W Pointer Register Interrupt Mask Register | ||
111 | 3 R/W (Not used) Mailbox Registers (6 bits: 11111100) | ||
112 | 4,5 -- Reserved for future products | ||
113 | 6 -- Reserved for future products | ||
114 | 7 R Guaranteed to have no effect | ||
115 | 7 W Hardware reset of board. | ||
116 | |||
117 | |||
118 | Rules: | ||
119 | All data transfers are performed using the even i/o address. If byte-wide data | ||
120 | transfers are being used, do INB/OUTB operations on the data port. If word-wide | ||
121 | transfers are used, do INW/OUTW operations. In some circumstances (such as | ||
122 | reading the power-up message) you will do INB from the data port, but in this | ||
123 | case the MSB of each word read is lost. When accessing all other unreserved | ||
124 | registers, use byte operations only. | ||
125 | ------------------------------------------------------------------------------*/ | ||
126 | |||
127 | //------------------------------------------------ | ||
128 | // Mandatory Includes: | ||
129 | //------------------------------------------------ | ||
130 | // | ||
131 | #include "ip2types.h" | ||
132 | #include "i2os.h" /* For any o.s., compiler, or host-related issues */ | ||
133 | |||
134 | //------------------------------------------------------------------------- | ||
135 | // Manifests for the I/O map: | ||
136 | //------------------------------------------------------------------------- | ||
137 | // R/W: Data port (byte) for IntelliPort-II, | ||
138 | // R/W: Data port (byte or word) for IntelliPort-IIEX | ||
139 | // Incoming or outgoing data passes through a FIFO, the status of which is | ||
140 | // available in some of the bits in FIFO_STATUS. This (bidirectional) FIFO is | ||
141 | // the primary means of transferring data, commands, flow-control, and status | ||
142 | // information between the host and board. | ||
143 | // | ||
144 | #define FIFO_DATA 0 | ||
145 | |||
146 | // Another way of passing information between the board and the host is | ||
147 | // through "mailboxes". Unlike a FIFO, a mailbox holds only a single byte of | ||
148 | // data. Writing data to the mailbox causes a status bit to be set, and | ||
149 | // potentially interrupting the intended receiver. The sender has some way to | ||
150 | // determine whether the data has been read yet; as soon as it has, it may send | ||
151 | // more. The mailboxes are handled differently on -II and -IIEX products, as | ||
152 | // suggested below. | ||
153 | //------------------------------------------------------------------------------ | ||
154 | // Read: Status Register for IntelliPort-II or -IIEX | ||
155 | // The presence of any bit set here will cause an interrupt to the host, | ||
156 | // provided the corresponding bit has been unmasked in the interrupt mask | ||
157 | // register. Furthermore, interrupts to the host are disabled globally until the | ||
158 | // loadware selects the irq line to use. With the exception of STN_MR, the bits | ||
159 | // remain set so long as the associated condition is true. | ||
160 | // | ||
161 | #define FIFO_STATUS 2 | ||
162 | |||
163 | // Bit map of status bits which are identical for -II and -IIEX | ||
164 | // | ||
165 | #define ST_OUT_FULL 0x40 // Outbound FIFO full | ||
166 | #define ST_IN_EMPTY 0x20 // Inbound FIFO empty | ||
167 | #define ST_IN_MAIL 0x04 // Inbound Mailbox full | ||
168 | |||
169 | // The following exists only on the Intelliport-IIEX, and indicates that the | ||
170 | // board has not read the last outgoing mailbox data yet. In the IntelliPort-II, | ||
171 | // the outgoing mailbox may be read back: a zero indicates the board has read | ||
172 | // the data. | ||
173 | // | ||
174 | #define STE_OUT_MAIL 0x80 // Outbound mailbox full (!) | ||
175 | |||
176 | // The following bits are defined differently for -II and -IIEX boards. Code | ||
177 | // which relies on these bits will need to be functionally different for the two | ||
178 | // types of boards and should be generally avoided because of the additional | ||
179 | // complexity this creates: | ||
180 | |||
181 | // Bit map of status bits only on -II | ||
182 | |||
183 | // Fifo has been RESET (cleared when the status register is read). Note that | ||
184 | // this condition cannot be masked and would always interrupt the host, except | ||
185 | // that the hardware reset also disables interrupts globally from the board | ||
186 | // until re-enabled by loadware. This could also arise from the | ||
187 | // Am4701-supported command to reset the chip, but this command is generally not | ||
188 | // used here. | ||
189 | // | ||
190 | #define STN_MR 0x80 | ||
191 | |||
192 | // See the AMD Am4701 data sheet for details on the following four bits. They | ||
193 | // are not presently used by Computone drivers. | ||
194 | // | ||
195 | #define STN_OUT_AF 0x10 // Outbound FIFO almost full (programmable) | ||
196 | #define STN_IN_AE 0x08 // Inbound FIFO almost empty (programmable) | ||
197 | #define STN_BD 0x02 // Inbound byte detected | ||
198 | #define STN_PE 0x01 // Parity/Framing condition detected | ||
199 | |||
200 | // Bit-map of status bits only on -IIEX | ||
201 | // | ||
202 | #define STE_OUT_HF 0x10 // Outbound FIFO half full | ||
203 | #define STE_IN_HF 0x08 // Inbound FIFO half full | ||
204 | #define STE_IN_FULL 0x02 // Inbound FIFO full | ||
205 | #define STE_OUT_MT 0x01 // Outbound FIFO empty | ||
206 | |||
207 | //------------------------------------------------------------------------------ | ||
208 | |||
209 | // Intelliport-II -- Write Only: the pointer register. | ||
210 | // Values are written to this register to select the Am4701 internal register to | ||
211 | // be accessed on the next operation. | ||
212 | // | ||
213 | #define FIFO_PTR 0x02 | ||
214 | |||
215 | // Values for the pointer register | ||
216 | // | ||
217 | #define SEL_COMMAND 0x1 // Selects the Am4701 command register | ||
218 | |||
219 | // Some possible commands: | ||
220 | // | ||
221 | #define SEL_CMD_MR 0x80 // Am4701 command to reset the chip | ||
222 | #define SEL_CMD_SH 0x40 // Am4701 command to map the "other" port into the | ||
223 | // status register. | ||
224 | #define SEL_CMD_UNSH 0 // Am4701 command to "unshift": port maps into its | ||
225 | // own status register. | ||
226 | #define SEL_MASK 0x2 // Selects the Am4701 interrupt mask register. The | ||
227 | // interrupt mask register is bit-mapped to match | ||
228 | // the status register (FIFO_STATUS) except for | ||
229 | // STN_MR. (See above.) | ||
230 | #define SEL_BYTE_DET 0x3 // Selects the Am4701 byte-detect register. (Not | ||
231 | // normally used except in diagnostics.) | ||
232 | #define SEL_OUTMAIL 0x4 // Selects the outbound mailbox (R/W). Reading back | ||
233 | // a value of zero indicates that the mailbox has | ||
234 | // been read by the board and is available for more | ||
235 | // data./ Writing to the mailbox optionally | ||
236 | // interrupts the board, depending on the loadware's | ||
237 | // setting of its interrupt mask register. | ||
238 | #define SEL_AEAF 0x5 // Selects AE/AF threshold register. | ||
239 | #define SEL_INMAIL 0x6 // Selects the inbound mailbox (Read) | ||
240 | |||
241 | //------------------------------------------------------------------------------ | ||
242 | // IntelliPort-IIEX -- Write Only: interrupt mask (and misc flags) register: | ||
243 | // Unlike IntelliPort-II, bit assignments do NOT match those of the status | ||
244 | // register. | ||
245 | // | ||
246 | #define FIFO_MASK 0x2 | ||
247 | |||
248 | // Mailbox readback select: | ||
249 | // If set, reads to FIFO_MAIL will read the OUTBOUND mailbox (host to board). If | ||
250 | // clear (default on reset) reads to FIFO_MAIL will read the INBOUND mailbox. | ||
251 | // This is the normal situation. The clearing of a mailbox is determined on | ||
252 | // -IIEX boards by waiting for the STE_OUT_MAIL bit to clear. Readback | ||
253 | // capability is provided for diagnostic purposes only. | ||
254 | // | ||
255 | #define MX_OUTMAIL_RSEL 0x80 | ||
256 | |||
257 | #define MX_IN_MAIL 0x40 // Enables interrupts when incoming mailbox goes | ||
258 | // full (ST_IN_MAIL set). | ||
259 | #define MX_IN_FULL 0x20 // Enables interrupts when incoming FIFO goes full | ||
260 | // (STE_IN_FULL). | ||
261 | #define MX_IN_MT 0x08 // Enables interrupts when incoming FIFO goes empty | ||
262 | // (ST_IN_MT). | ||
263 | #define MX_OUT_FULL 0x04 // Enables interrupts when outgoing FIFO goes full | ||
264 | // (ST_OUT_FULL). | ||
265 | #define MX_OUT_MT 0x01 // Enables interrupts when outgoing FIFO goes empty | ||
266 | // (STE_OUT_MT). | ||
267 | |||
268 | // Any remaining bits are reserved, and should be written to ZERO for | ||
269 | // compatibility with future Computone products. | ||
270 | |||
271 | //------------------------------------------------------------------------------ | ||
272 | // IntelliPort-IIEX: -- These are only 6-bit mailboxes !!! -- 11111100 (low two | ||
273 | // bits always read back 0). | ||
274 | // Read: One of the mailboxes, usually Inbound. | ||
275 | // Inbound Mailbox (MX_OUTMAIL_RSEL = 0) | ||
276 | // Outbound Mailbox (MX_OUTMAIL_RSEL = 1) | ||
277 | // Write: Outbound Mailbox | ||
278 | // For the IntelliPort-II boards, the outbound mailbox is read back to determine | ||
279 | // whether the board has read the data (0 --> data has been read). For the | ||
280 | // IntelliPort-IIEX, this is done by reading a status register. To determine | ||
281 | // whether mailbox is available for more outbound data, use the STE_OUT_MAIL bit | ||
282 | // in FIFO_STATUS. Moreover, although the Outbound Mailbox can be read back by | ||
283 | // setting MX_OUTMAIL_RSEL, it is NOT cleared when the board reads it, as is the | ||
284 | // case with the -II boards. For this reason, FIFO_MAIL is normally used to read | ||
285 | // the inbound FIFO, and MX_OUTMAIL_RSEL kept clear. (See above for | ||
286 | // MX_OUTMAIL_RSEL description.) | ||
287 | // | ||
288 | #define FIFO_MAIL 0x3 | ||
289 | |||
290 | //------------------------------------------------------------------------------ | ||
291 | // WRITE ONLY: Resets the board. (Data doesn't matter). | ||
292 | // | ||
293 | #define FIFO_RESET 0x7 | ||
294 | |||
295 | //------------------------------------------------------------------------------ | ||
296 | // READ ONLY: Will have no effect. (Data is undefined.) | ||
297 | // Actually, there will be an effect, in that the operation is sure to generate | ||
298 | // a bus cycle: viz., an I/O byte Read. This fact can be used to enforce short | ||
299 | // delays when no comparable time constant is available. | ||
300 | // | ||
301 | #define FIFO_NOP 0x7 | ||
302 | |||
303 | //------------------------------------------------------------------------------ | ||
304 | // RESET & POWER-ON RESET MESSAGE | ||
305 | /*------------------------------------------------------------------------------ | ||
306 | RESET: | ||
307 | |||
308 | The IntelliPort-II and -IIEX boards are reset in three ways: Power-up, channel | ||
309 | reset, and via a write to the reset register described above. For products using | ||
310 | the ISA bus, these three sources of reset are equvalent. For MCA and EISA buses, | ||
311 | the Power-up and channel reset sources cause additional hardware initialization | ||
312 | which should only occur at system startup time. | ||
313 | |||
314 | The third type of reset, called a "command reset", is done by writing any data | ||
315 | to the FIFO_RESET address described above. This resets the on-board processor, | ||
316 | FIFO, UARTS, and associated hardware. | ||
317 | |||
318 | This passes control of the board to the bootstrap firmware, which performs a | ||
319 | Power-On Self Test and which detects its current configuration. For example, | ||
320 | -IIEX products determine the size of FIFO which has been installed, and the | ||
321 | number and type of expansion boxes attached. | ||
322 | |||
323 | This and other information is then written to the FIFO in a 16-byte data block | ||
324 | to be read by the host. This block is guaranteed to be present within two (2) | ||
325 | seconds of having received the command reset. The firmware is now ready to | ||
326 | receive loadware from the host. | ||
327 | |||
328 | It is good practice to perform a command reset to the board explicitly as part | ||
329 | of your software initialization. This allows your code to properly restart from | ||
330 | a soft boot. (Many systems do not issue channel reset on soft boot). | ||
331 | |||
332 | Because of a hardware reset problem on some of the Cirrus Logic 1400's which are | ||
333 | used on the product, it is recommended that you reset the board twice, separated | ||
334 | by an approximately 50 milliseconds delay. (VERY approximately: probably ok to | ||
335 | be off by a factor of five. The important point is that the first command reset | ||
336 | in fact generates a reset pulse on the board. This pulse is guaranteed to last | ||
337 | less than 10 milliseconds. The additional delay ensures the 1400 has had the | ||
338 | chance to respond sufficiently to the first reset. Why not a longer delay? Much | ||
339 | more than 50 milliseconds gets to be noticable, but the board would still work. | ||
340 | |||
341 | Once all 16 bytes of the Power-on Reset Message have been read, the bootstrap | ||
342 | firmware is ready to receive loadware. | ||
343 | |||
344 | Note on Power-on Reset Message format: | ||
345 | The various fields have been designed with future expansion in view. | ||
346 | Combinations of bitfields and values have been defined which define products | ||
347 | which may not currently exist. This has been done to allow drivers to anticipate | ||
348 | the possible introduction of products in a systematic fashion. This is not | ||
349 | intended to suggest that each potential product is actually under consideration. | ||
350 | ------------------------------------------------------------------------------*/ | ||
351 | |||
352 | //---------------------------------------- | ||
353 | // Format of Power-on Reset Message | ||
354 | //---------------------------------------- | ||
355 | |||
356 | typedef union _porStr // "por" stands for Power On Reset | ||
357 | { | ||
358 | unsigned char c[16]; // array used when considering the message as a | ||
359 | // string of undifferentiated characters | ||
360 | |||
361 | struct // Elements used when considering values | ||
362 | { | ||
363 | // The first two bytes out of the FIFO are two magic numbers. These are | ||
364 | // intended to establish that there is indeed a member of the | ||
365 | // IntelliPort-II(EX) family present. The remaining bytes may be | ||
366 | // expected // to be valid. When reading the Power-on Reset message, | ||
367 | // if the magic numbers do not match it is probably best to stop | ||
368 | // reading immediately. You are certainly not reading our board (unless | ||
369 | // hardware is faulty), and may in fact be reading some other piece of | ||
370 | // hardware. | ||
371 | |||
372 | unsigned char porMagic1; // magic number: first byte == POR_MAGIC_1 | ||
373 | unsigned char porMagic2; // magic number: second byte == POR_MAGIC_2 | ||
374 | |||
375 | // The Version, Revision, and Subrevision are stored as absolute numbers | ||
376 | // and would normally be displayed in the format V.R.S (e.g. 1.0.2) | ||
377 | |||
378 | unsigned char porVersion; // Bootstrap firmware version number | ||
379 | unsigned char porRevision; // Bootstrap firmware revision number | ||
380 | unsigned char porSubRev; // Bootstrap firmware sub-revision number | ||
381 | |||
382 | unsigned char porID; // Product ID: Bit-mapped according to | ||
383 | // conventions described below. Among other | ||
384 | // things, this allows us to distinguish | ||
385 | // IntelliPort-II boards from IntelliPort-IIEX | ||
386 | // boards. | ||
387 | |||
388 | unsigned char porBus; // IntelliPort-II: Unused | ||
389 | // IntelliPort-IIEX: Bus Information: | ||
390 | // Bit-mapped below | ||
391 | |||
392 | unsigned char porMemory; // On-board DRAM size: in 32k blocks | ||
393 | |||
394 | // porPorts1 (and porPorts2) are used to determine the ports which are | ||
395 | // available to the board. For non-expandable product, a single number | ||
396 | // is sufficient. For expandable product, the board may be connected | ||
397 | // to as many as four boxes. Each box may be (so far) either a 16-port | ||
398 | // or an 8-port size. Whenever an 8-port box is used, the remaining 8 | ||
399 | // ports leave gaps between existing channels. For that reason, | ||
400 | // expandable products must report a MAP of available channels. Since | ||
401 | // each UART supports four ports, we represent each UART found by a | ||
402 | // single bit. Using two bytes to supply the mapping information we | ||
403 | // report the presense or absense of up to 16 UARTS, or 64 ports in | ||
404 | // steps of 4 ports. For -IIEX products, the ports are numbered | ||
405 | // starting at the box closest to the controller in the "chain". | ||
406 | |||
407 | // Interpreted Differently for IntelliPort-II and -IIEX. | ||
408 | // -II: Number of ports (Derived actually from product ID). See | ||
409 | // Diag1&2 to indicate if uart was actually detected. | ||
410 | // -IIEX: Bit-map of UARTS found, LSB (see below for MSB of this). This | ||
411 | // bitmap is based on detecting the uarts themselves; | ||
412 | // see porFlags for information from the box i.d's. | ||
413 | unsigned char porPorts1; | ||
414 | |||
415 | unsigned char porDiag1; // Results of on-board P.O.S.T, 1st byte | ||
416 | unsigned char porDiag2; // Results of on-board P.O.S.T, 2nd byte | ||
417 | unsigned char porSpeed; // Speed of local CPU: given as MHz x10 | ||
418 | // e.g., 16.0 MHz CPU is reported as 160 | ||
419 | unsigned char porFlags; // Misc information (see manifests below) | ||
420 | // Bit-mapped: CPU type, UART's present | ||
421 | |||
422 | unsigned char porPorts2; // -II: Undefined | ||
423 | // -IIEX: Bit-map of UARTS found, MSB (see | ||
424 | // above for LSB) | ||
425 | |||
426 | // IntelliPort-II: undefined | ||
427 | // IntelliPort-IIEX: 1 << porFifoSize gives the size, in bytes, of the | ||
428 | // host interface FIFO, in each direction. When running the -IIEX in | ||
429 | // 8-bit mode, fifo capacity is halved. The bootstrap firmware will | ||
430 | // have already accounted for this fact in generating this number. | ||
431 | unsigned char porFifoSize; | ||
432 | |||
433 | // IntelliPort-II: undefined | ||
434 | // IntelliPort-IIEX: The number of boxes connected. (Presently 1-4) | ||
435 | unsigned char porNumBoxes; | ||
436 | } e; | ||
437 | } porStr, *porStrPtr; | ||
438 | |||
439 | //-------------------------- | ||
440 | // Values for porStr fields | ||
441 | //-------------------------- | ||
442 | |||
443 | //--------------------- | ||
444 | // porMagic1, porMagic2 | ||
445 | //---------------------- | ||
446 | // | ||
447 | #define POR_MAGIC_1 0x96 // The only valid value for porMagic1 | ||
448 | #define POR_MAGIC_2 0x35 // The only valid value for porMagic2 | ||
449 | #define POR_1_INDEX 0 // Byte position of POR_MAGIC_1 | ||
450 | #define POR_2_INDEX 1 // Ditto for POR_MAGIC_2 | ||
451 | |||
452 | //---------------------- | ||
453 | // porID | ||
454 | //---------------------- | ||
455 | // | ||
456 | #define POR_ID_FAMILY 0xc0 // These bits indicate the general family of | ||
457 | // product. | ||
458 | #define POR_ID_FII 0x00 // Family is "IntelliPort-II" | ||
459 | #define POR_ID_FIIEX 0x40 // Family is "IntelliPort-IIEX" | ||
460 | |||
461 | // These bits are reserved, presently zero. May be used at a later date to | ||
462 | // convey other product information. | ||
463 | // | ||
464 | #define POR_ID_RESERVED 0x3c | ||
465 | |||
466 | #define POR_ID_SIZE 0x03 // Remaining bits indicate number of ports & | ||
467 | // Connector information. | ||
468 | #define POR_ID_II_8 0x00 // For IntelliPort-II, indicates 8-port using | ||
469 | // standard brick. | ||
470 | #define POR_ID_II_8R 0x01 // For IntelliPort-II, indicates 8-port using | ||
471 | // RJ11's (no CTS) | ||
472 | #define POR_ID_II_6 0x02 // For IntelliPort-II, indicates 6-port using | ||
473 | // RJ45's | ||
474 | #define POR_ID_II_4 0x03 // For IntelliPort-II, indicates 4-port using | ||
475 | // 4xRJ45 connectors | ||
476 | #define POR_ID_EX 0x00 // For IntelliPort-IIEX, indicates standard | ||
477 | // expandable controller (other values reserved) | ||
478 | |||
479 | //---------------------- | ||
480 | // porBus | ||
481 | //---------------------- | ||
482 | |||
483 | // IntelliPort-IIEX only: Board is installed in a 16-bit slot | ||
484 | // | ||
485 | #define POR_BUS_SLOT16 0x20 | ||
486 | |||
487 | // IntelliPort-IIEX only: DIP switch #8 is on, selecting 16-bit host interface | ||
488 | // operation. | ||
489 | // | ||
490 | #define POR_BUS_DIP16 0x10 | ||
491 | |||
492 | // Bits 0-2 indicate type of bus: This information is stored in the bootstrap | ||
493 | // loadware, different loadware being used on different products for different | ||
494 | // buses. For most situations, the drivers do not need this information; but it | ||
495 | // is handy in a diagnostic environment. For example, on microchannel boards, | ||
496 | // you would not want to try to test several interrupts, only the one for which | ||
497 | // you were configured. | ||
498 | // | ||
499 | #define POR_BUS_TYPE 0x07 | ||
500 | |||
501 | // Unknown: this product doesn't know what bus it is running in. (e.g. if same | ||
502 | // bootstrap firmware were wanted for two different buses.) | ||
503 | // | ||
504 | #define POR_BUS_T_UNK 0 | ||
505 | |||
506 | // Note: existing firmware for ISA-8 and MC-8 currently report the POR_BUS_T_UNK | ||
507 | // state, since the same bootstrap firmware is used for each. | ||
508 | |||
509 | #define POR_BUS_T_MCA 1 // MCA BUS */ | ||
510 | #define POR_BUS_T_EISA 2 // EISA BUS */ | ||
511 | #define POR_BUS_T_ISA 3 // ISA BUS */ | ||
512 | |||
513 | // Values 4-7 Reserved | ||
514 | |||
515 | // Remaining bits are reserved | ||
516 | |||
517 | //---------------------- | ||
518 | // porDiag1 | ||
519 | //---------------------- | ||
520 | |||
521 | #define POR_BAD_MAPPER 0x80 // HW failure on P.O.S.T: Chip mapper failed | ||
522 | |||
523 | // These two bits valid only for the IntelliPort-II | ||
524 | // | ||
525 | #define POR_BAD_UART1 0x01 // First 1400 bad | ||
526 | #define POR_BAD_UART2 0x02 // Second 1400 bad | ||
527 | |||
528 | //---------------------- | ||
529 | // porDiag2 | ||
530 | //---------------------- | ||
531 | |||
532 | #define POR_DEBUG_PORT 0x80 // debug port was detected by the P.O.S.T | ||
533 | #define POR_DIAG_OK 0x00 // Indicates passage: Failure codes not yet | ||
534 | // available. | ||
535 | // Other bits undefined. | ||
536 | //---------------------- | ||
537 | // porFlags | ||
538 | //---------------------- | ||
539 | |||
540 | #define POR_CPU 0x03 // These bits indicate supposed CPU type | ||
541 | #define POR_CPU_8 0x01 // Board uses an 80188 (no such thing yet) | ||
542 | #define POR_CPU_6 0x02 // Board uses an 80186 (all existing products) | ||
543 | #define POR_CEX4 0x04 // If set, this is an ISA-CEX/4: An ISA-4 (asic) | ||
544 | // which is architected like an ISA-CEX connected | ||
545 | // to a (hitherto impossible) 4-port box. | ||
546 | #define POR_BOXES 0xf0 // Valid for IntelliPort-IIEX only: Map of Box | ||
547 | // sizes based on box I.D. | ||
548 | #define POR_BOX_16 0x10 // Set indicates 16-port, clear 8-port | ||
549 | |||
550 | //------------------------------------- | ||
551 | // LOADWARE and DOWNLOADING CODE | ||
552 | //------------------------------------- | ||
553 | |||
554 | /* | ||
555 | Loadware may be sent to the board in two ways: | ||
556 | 1) It may be read from a (binary image) data file block by block as each block | ||
557 | is sent to the board. This is only possible when the initialization is | ||
558 | performed by code which can access your file system. This is most suitable | ||
559 | for diagnostics and appications which use the interface library directly. | ||
560 | |||
561 | 2) It may be hard-coded into your source by including a .h file (typically | ||
562 | supplied by Computone), which declares a data array and initializes every | ||
563 | element. This acheives the same result as if an entire loadware file had | ||
564 | been read into the array. | ||
565 | |||
566 | This requires more data space in your program, but access to the file system | ||
567 | is not required. This method is more suited to driver code, which typically | ||
568 | is running at a level too low to access the file system directly. | ||
569 | |||
570 | At present, loadware can only be generated at Computone. | ||
571 | |||
572 | All Loadware begins with a header area which has a particular format. This | ||
573 | includes a magic number which identifies the file as being (purportedly) | ||
574 | loadware, CRC (for the loader), and version information. | ||
575 | */ | ||
576 | |||
577 | |||
578 | //----------------------------------------------------------------------------- | ||
579 | // Format of loadware block | ||
580 | // | ||
581 | // This is defined as a union so we can pass a pointer to one of these items | ||
582 | // and (if it is the first block) pick out the version information, etc. | ||
583 | // | ||
584 | // Otherwise, to deal with this as a simple character array | ||
585 | //------------------------------------------------------------------------------ | ||
586 | |||
587 | #define LOADWARE_BLOCK_SIZE 512 // Number of bytes in each block of loadware | ||
588 | |||
589 | typedef union _loadHdrStr | ||
590 | { | ||
591 | unsigned char c[LOADWARE_BLOCK_SIZE]; // Valid for every block | ||
592 | |||
593 | struct // These fields are valid for only the first block of loadware. | ||
594 | { | ||
595 | unsigned char loadMagic; // Magic number: see below | ||
596 | unsigned char loadBlocksMore; // How many more blocks? | ||
597 | unsigned char loadCRC[2]; // Two CRC bytes: used by loader | ||
598 | unsigned char loadVersion; // Version number | ||
599 | unsigned char loadRevision; // Revision number | ||
600 | unsigned char loadSubRevision; // Sub-revision number | ||
601 | unsigned char loadSpares[9]; // Presently unused | ||
602 | unsigned char loadDates[32]; // Null-terminated string which can give | ||
603 | // date and time of compilation | ||
604 | } e; | ||
605 | } loadHdrStr, *loadHdrStrPtr; | ||
606 | |||
607 | //------------------------------------ | ||
608 | // Defines for downloading code: | ||
609 | //------------------------------------ | ||
610 | |||
611 | // The loadMagic field in the first block of the loadfile must be this, else the | ||
612 | // file is not valid. | ||
613 | // | ||
614 | #define MAGIC_LOADFILE 0x3c | ||
615 | |||
616 | // How do we know the load was successful? On completion of the load, the | ||
617 | // bootstrap firmware returns a code to indicate whether it thought the download | ||
618 | // was valid and intends to execute it. These are the only possible valid codes: | ||
619 | // | ||
620 | #define LOADWARE_OK 0xc3 // Download was ok | ||
621 | #define LOADWARE_BAD 0x5a // Download was bad (CRC error) | ||
622 | |||
623 | // Constants applicable to writing blocks of loadware: | ||
624 | // The first block of loadware might take 600 mS to load, in extreme cases. | ||
625 | // (Expandable board: worst case for sending startup messages to the LCD's). | ||
626 | // The 600mS figure is not really a calculation, but a conservative | ||
627 | // guess/guarantee. Usually this will be within 100 mS, like subsequent blocks. | ||
628 | // | ||
629 | #define MAX_DLOAD_START_TIME 1000 // 1000 mS | ||
630 | #define MAX_DLOAD_READ_TIME 100 // 100 mS | ||
631 | |||
632 | // Firmware should respond with status (see above) within this long of host | ||
633 | // having sent the final block. | ||
634 | // | ||
635 | #define MAX_DLOAD_ACK_TIME 100 // 100 mS, again! | ||
636 | |||
637 | //------------------------------------------------------ | ||
638 | // MAXIMUM NUMBER OF PORTS PER BOARD: | ||
639 | // This is fixed for now (with the expandable), but may | ||
640 | // be expanding according to even newer products. | ||
641 | //------------------------------------------------------ | ||
642 | // | ||
643 | #define ABS_MAX_BOXES 4 // Absolute most boxes per board | ||
644 | #define ABS_BIGGEST_BOX 16 // Absolute the most ports per box | ||
645 | #define ABS_MOST_PORTS (ABS_MAX_BOXES * ABS_BIGGEST_BOX) | ||
646 | |||
647 | #endif // I2HW_H | ||
648 | |||