|  |  | 
|  | 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. | 
|  | ============================ | 
|  |  | 
|  | 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 | 
|  | 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. | 
|  |  | 
|  | I actually prefer to use the "specialix.sx_rtscts=1" option. | 
|  | 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? | 
|  |  | 
|  |  |