Blame view

Documentation/serial/specialix.txt 14.7 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
  
        specialix.txt  -- specialix IO8+ multiport serial driver readme.
  
  
  
        Copyright (C) 1997  Roger Wolff (R.E.Wolff@BitWizard.nl)
  
        Specialix pays for the development and support of this driver.
        Please DO contact io8-linux@specialix.co.uk if you require
        support.
  
        This driver was developed in the BitWizard linux device
        driver service. If you require a linux device driver for your
        product, please contact devices@BitWizard.nl for a quote.
  
        This code is firmly based on the riscom/8 serial driver,
        written by Dmitry Gorodchanin. The specialix IO8+ card
        programming information was obtained from the CL-CD1865 Data
        Book, and Specialix document number 6200059: IO8+ Hardware
        Functional Specification, augmented by document number 6200088:
        Merak Hardware Functional Specification. (IO8+/PCI is also 
        called Merak)
  
  
        This program is free software; you can redistribute it and/or
        modify it under the terms of the GNU General Public License as
        published by the Free Software Foundation; either version 2 of
        the License, or (at your option) any later version.
  
        This program is distributed in the hope that it will be
        useful, but WITHOUT ANY WARRANTY; without even the implied
        warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
        PURPOSE.  See the GNU General Public License for more details.
  
        You should have received a copy of the GNU General Public
        License along with this program; if not, write to the Free
        Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
        USA.
  
  
  Intro
  =====
  
   
  This file contains some random information, that I like to have online
  instead of in a manual that can get lost. Ever misplace your Linux
  kernel sources?  And the manual of one of the boards in your computer?
  
  
  Addresses and interrupts
  ========================
  
  Address dip switch settings:
  The dip switch sets bits 2-9 of the IO address. 
  
         9 8 7 6 5 4 3 2 
       +-----------------+
     0 | X   X X X X X X |
       |                 |    =   IoBase = 0x100 
     1 |   X             |
       +-----------------+          ------ RS232 connectors ---->
           
           |    |    |
         edge connector
           |    |    |
           V    V    V
  
  Base address 0x100 caused a conflict in one of my computers once.  I
  haven't the foggiest why. My Specialix card is now at 0x180.  My
  other computer runs just fine with the Specialix card at 0x100....
  The card occupies 4 addresses, but actually only two are really used.
  
  The PCI version doesn't have any dip switches. The BIOS assigns
  an IO address. 
  
  The driver now still autoprobes at 0x100, 0x180, 0x250 and 0x260.  If
  that causes trouble for you, please report that. I'll remove
  autoprobing then.
  
  The driver will tell the card what IRQ to use, so you don't have to
  change any jumpers to change the IRQ. Just use a command line
  argument (irq=xx) to the insmod program to set the interrupt.
  
  The BIOS assigns the IRQ on the PCI version. You have no say in what
  IRQ to use in that case. 
  
  If your specialix cards are not at the default locations, you can use
  the kernel command line argument "specialix=io0,irq0,io1,irq1...".
  Here "io0" is the io address for the first card, and "irq0" is the
  irq line that the first card should use. And so on. 
  
  Examples. 
  
  You use the driver as a module and have three cards at 0x100, 0x250
  and 0x180. And some way or another you want them detected in that
  order. Moreover irq 12 is taken (e.g. by your PS/2 mouse).
  
    insmod specialix.o iobase=0x100,0x250,0x180 irq=9,11,15
  
  The same three cards, but now in the kernel would require you to
  add 
  
     specialix=0x100,9,0x250,11,0x180,15
  
  to the command line. This would become 
  
     append="specialix=0x100,9,0x250,11,0x180,15" 
  
  in your /etc/lilo.conf file if you use lilo. 
  
  The Specialix driver is slightly odd: It allows you to have the second
  or third card detected without having a first card. This has
  advantages and disadvantages. A slot that isn't filled by an ISA card,
  might be filled if a PCI card is detected. Thus if you have an ISA
  card at 0x250 and a PCI card, you would get:
  
  sx0: specialix IO8+ Board at 0x100 not found.
  sx1: specialix IO8+ Board at 0x180 not found.
  sx2: specialix IO8+ board detected at 0x250, IRQ 12, CD1865 Rev. B.
  sx3: specialix IO8+ Board at 0x260 not found.
  sx0: specialix IO8+ board detected at 0xd800, IRQ 9, CD1865 Rev. B.
  
  This would happen if you don't give any probe hints to the driver. 
  If you would specify:
  
     specialix=0x250,11
  
  you'd get the following messages:
  
  sx0: specialix IO8+ board detected at 0x250, IRQ 11, CD1865 Rev. B.
  sx1: specialix IO8+ board detected at 0xd800, IRQ 9, CD1865 Rev. B.
  
  ISA probing is aborted after the IO address you gave is exhausted, and
  the PCI card is now detected as the second card. The ISA card is now
  also forced to IRQ11....
  
  
  Baud rates
  ==========
  
  The rev 1.2 and below boards use a CL-CD1864. These chips can only 
  do 64kbit. The rev 1.3 and newer boards use a CL-CD1865. These chips
  are officially capable of 115k2.
  
  The Specialix card uses a 25MHz crystal (in times two mode, which in
  fact is a divided by two mode). This is not enough to reach the rated
  115k2 on all ports at the same time. With this clock rate you can only
  do 37% of this rate. This means that at 115k2 on all ports you are
  going to lose characters (The chip cannot handle that many incoming
  bits at this clock rate.) (Yes, you read that correctly: there is a
  limit to the number of -=bits=- per second that the chip can handle.)
  
  If you near the "limit" you will first start to see a graceful
  degradation in that the chip cannot keep the transmitter busy at all
  times. However with a central clock this slow, you can also get it to
  miss incoming characters. The driver will print a warning message when
  you are outside the official specs. The messages usually show up in
  the file /var/log/messages .
  
  The specialix card cannot reliably do 115k2. If you use it, you have
  to do "extensive testing" (*) to verify if it actually works.
  
  When "mgetty" communicates with my modem at 115k2 it reports:
  got: +++[0d]ATQ0V1H0[0d][0d][8a]O[cb][0d][8a]
                              ^^^^ ^^^^    ^^^^ 
  
  The three characters that have the "^^^" under them have suffered a
  bit error in the highest bit. In conclusion: I've tested it, and found
  that it simply DOESN'T work for me. I also suspect that this is also
  caused by the baud rate being just a little bit out of tune. 
  
  I upgraded the crystal to 66Mhz on one of my Specialix cards. Works
  great! Contact me for details. (Voids warranty, requires a steady hand
  and more such restrictions....)
  
  
  (*) Cirrus logic CD1864 databook, page 40.
  
  
  Cables for the Specialix IO8+
  =============================
  
  The pinout of the connectors on the IO8+ is:
  
       pin    short    direction    long name
              name
      Pin 1   DCD      input        Data Carrier Detect
      Pin 2   RXD      input        Receive
      Pin 3   DTR/RTS  output       Data Terminal Ready/Ready To Send
      Pin 4   GND      -            Ground
      Pin 5   TXD      output       Transmit
      Pin 6   CTS      input        Clear To Send
          
      
               -- 6  5  4  3  2  1 --
               |                    |
               |                    |
               |                    |
               |                    |
               +-----          -----+
                    |__________|
                        clip
      
      Front view of an RJ12 connector. Cable moves "into" the paper.
      (the plug is ready to plug into your mouth this way...)
  
      
      NULL cable. I don't know who is going to use these except for
      testing purposes, but I tested the cards with this cable. (It 
      took quite a while to figure out, so I'm not going to delete
      it. So there! :-)
      
      
      This end goes               This end needs
      straight into the           some twists in
      RJ12 plug.                  the wiring.
         IO8+ RJ12                   IO8+ RJ12
          1  DCD       white          -
          -             -             1 DCD
          2  RXD       black          5 TXD
          3  DTR/RTS   red            6 CTS
          4  GND       green          4 GND
          5  TXD       yellow         2 RXD
          6  CTS       blue           3 DTR/RTS
      
  
      Same NULL cable, but now sorted on the second column.
   
          1  DCD       white          -
          -             -             1 DCD
          5  TXD       yellow         2 RXD
          6  CTS       blue           3 DTR/RTS
          4  GND       green          4 GND
          2  RXD       black          5 TXD
          3  DTR/RTS   red            6 CTS
      
      
      
      This is a modem cable usable for hardware handshaking:
          RJ12                        DB25           DB9
          1   DCD      white          8 DCD          1 DCD
          2   RXD      black          3 RXD          2 RXD
          3   DTR/RTS  red            4 RTS          7 RTS
          4   GND      green          7 GND          5 GND
          5   TXD      yellow         2 TXD          3 TXD
          6   CTS      blue           5 CTS          8 CTS
                              +----   6 DSR          6 DSR
                              +----  20 DTR          4 DTR
  
      This is a modem cable usable for software handshaking:
      It allows you to reset the modem using the DTR ioctls.
      I (REW) have never tested this, "but xxxxxxxxxxxxx
      says that it works." If you test this, please
      tell me and I'll fill in your name on the xxx's.
  
          RJ12                        DB25           DB9
          1   DCD      white          8 DCD          1 DCD
          2   RXD      black          3 RXD          2 RXD
          3   DTR/RTS  red           20 DTR          4 DTR
          4   GND      green          7 GND          5 GND
          5   TXD      yellow         2 TXD          3 TXD
          6   CTS      blue           5 CTS          8 CTS
                              +----   6 DSR          6 DSR
                              +----   4 RTS          7 RTS
  
     I bought a 6 wire flat cable. It was colored as indicated.
     Check that yours is the same before you trust me on this.
     
   
  Hardware handshaking issues.
  ============================
d2fbd0f2f   Alan Cox   specialix: Code c...
272
273
  The driver can be told to operate in two different ways. The default
  behaviour is specialix.sx_rtscts = 0 where the pin behaves as DTR when
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
274
275
276
277
278
279
280
  hardware handshaking is off. It behaves as the RTS hardware
  handshaking signal when hardware handshaking is selected.
  
  When you use this, you have to use the appropriate cable. The
  cable will either be compatible with hardware handshaking or with
  software handshaking. So switching on the fly is not really an
  option.
d2fbd0f2f   Alan Cox   specialix: Code c...
281
  I actually prefer to use the "specialix.sx_rtscts=1" option.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
  This makes the DTR/RTS pin always an RTS pin, and ioctls to
  change DTR are always ignored. I have a cable that is configured
  for this. 
  
  
  Ports and devices
  =================
  
  Port 0 is the one furthest from the card-edge connector.
  
  Devices:
  
  You should make the devices as follows:
  
  bash
  cd /dev
  for i in  0  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
  do
    echo -n "$i "
    mknod /dev/ttyW$i c 75 $i
    mknod /dev/cuw$i c 76 $i
  done
  echo ""
  
  If your system doesn't come with these devices preinstalled, bug your
  linux-vendor about this. They have had ample time to get this
  implemented by now.
  
  You cannot have more than 4 boards in one computer. The card only
  supports 4 different interrupts. If you really want this, contact me
  about this and I'll give you a few tips (requires soldering iron)....
  
  If you have enough PCI slots, you can probably use more than 4 PCI
  versions of the card though.... 
  
  The PCI version of the card cannot adhere to the mechanical part of
  the PCI spec because the 8 serial connectors are simply too large. If
  it doesn't fit in your computer, bring back the card.
  
  
  ------------------------------------------------------------------------
  
  
    Fixed bugs and restrictions:
         - During initialization, interrupts are blindly turned on.
              Having a shadow variable would cause an extra memory
              access on every IO instruction. 
         - The interrupt (on the card) should be disabled when we
           don't allocate the Linux end of the interrupt. This allows 
           a different driver/card to use it while all ports are not in
           use..... (a la standard serial port)
         == An extra _off variant of the sx_in and sx_out macros are
            now available. They don't set the interrupt enable bit.
            These are used during initialization. Normal operation uses
            the old variant which enables the interrupt line.
         - RTS/DTR issue needs to be implemented according to 
           specialix' spec.
              I kind of like the "determinism" of the current 
              implementation. Compile time flag?
         == Ok. Compile time flag! Default is how Specialix likes it.
         == Now a config time flag! Gets saved in your config file. Neat!
         - Can you set the IO address from the lilo command line?
              If you need this, bug me about it, I'll make it. 
         == Hah! No bugging needed. Fixed! :-)
         - Cirrus logic hasn't gotten back to me yet why the CD1865 can
              and the CD1864 can't do 115k2. I suspect that this is
              because the CD1864 is not rated for 33MHz operation.
              Therefore the CD1864 versions of the card can't do 115k2 on 
              all ports just like the CD1865 versions. The driver does
              not block 115k2 on CD1864 cards. 
          == I called the Cirrus Logic representative here in Holland.
             The CD1864 databook is identical to the CD1865 databook, 
             except for an extra warning at the end. Similar Bit errors
             have been observed in testing at 115k2 on both an 1865 and
             a 1864 chip. I see no reason why I would prohibit 115k2 on
             1864 chips and not do it on 1865 chips. Actually there is
             reason to prohibit it on BOTH chips. I print a warning.
             If you use 115k2, you're on your own. 
         - A spiky CD may send spurious HUPs. Also in CLOCAL???
           -- A fix for this turned out to be counter productive. 
              Different fix? Current behaviour is acceptable?
           -- Maybe the current implementation is correct. If anybody
              gets bitten by this, please report, and it will get fixed.
  
           -- Testing revealed that when in CLOCAL, the problem doesn't
              occur. As warned for in the CD1865 manual, the chip may
              send modem intr's on a spike. We could filter those out,
              but that would be a cludge anyway (You'd still risk getting
              a spurious HUP when two spikes occur.).....
   
  
  
    Bugs & restrictions:
         - This is a difficult card to autoprobe.
              You have to WRITE to the address register to even 
              read-probe a CD186x register. Disable autodetection?
           -- Specialix: any suggestions?
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
380