| |
| 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? |
| |
| |