216 lines
		
	
	
	
		
			8 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			216 lines
		
	
	
	
		
			8 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
| 
								 | 
							
								PLIP: The Parallel Line Internet Protocol Device
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Donald Becker (becker@super.org)
							 | 
						||
| 
								 | 
							
								I.D.A. Supercomputing Research Center, Bowie MD 20715
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								At some point T. Thorn will probably contribute text,
							 | 
						||
| 
								 | 
							
								Tommy Thorn (tthorn@daimi.aau.dk)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								PLIP Introduction
							 | 
						||
| 
								 | 
							
								-----------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This document describes the parallel port packet pusher for Net/LGX.
							 | 
						||
| 
								 | 
							
								This device interface allows a point-to-point connection between two
							 | 
						||
| 
								 | 
							
								parallel ports to appear as a IP network interface.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								What is PLIP?
							 | 
						||
| 
								 | 
							
								=============
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								PLIP is Parallel Line IP, that is, the transportation of IP packages
							 | 
						||
| 
								 | 
							
								over a parallel port. In the case of a PC, the obvious choice is the
							 | 
						||
| 
								 | 
							
								printer port.  PLIP is a non-standard, but [can use] uses the standard
							 | 
						||
| 
								 | 
							
								LapLink null-printer cable [can also work in turbo mode, with a PLIP
							 | 
						||
| 
								 | 
							
								cable]. [The protocol used to pack IP packages, is a simple one
							 | 
						||
| 
								 | 
							
								initiated by Crynwr.]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Advantages of PLIP
							 | 
						||
| 
								 | 
							
								==================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								It's cheap, it's available everywhere, and it's easy.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The PLIP cable is all that's needed to connect two Linux boxes, and it
							 | 
						||
| 
								 | 
							
								can be built for very few bucks.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Connecting two Linux boxes takes only a second's decision and a few
							 | 
						||
| 
								 | 
							
								minutes' work, no need to search for a [supported] netcard. This might
							 | 
						||
| 
								 | 
							
								even be especially important in the case of notebooks, where netcards
							 | 
						||
| 
								 | 
							
								are not easily available.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Not requiring a netcard also means that apart from connecting the
							 | 
						||
| 
								 | 
							
								cables, everything else is software configuration [which in principle
							 | 
						||
| 
								 | 
							
								could be made very easy.]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Disadvantages of PLIP
							 | 
						||
| 
								 | 
							
								=====================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Doesn't work over a modem, like SLIP and PPP. Limited range, 15 m.
							 | 
						||
| 
								 | 
							
								Can only be used to connect three (?) Linux boxes. Doesn't connect to
							 | 
						||
| 
								 | 
							
								an existing Ethernet. Isn't standard (not even de facto standard, like
							 | 
						||
| 
								 | 
							
								SLIP).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Performance
							 | 
						||
| 
								 | 
							
								===========
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								PLIP easily outperforms Ethernet cards....(ups, I was dreaming, but
							 | 
						||
| 
								 | 
							
								it *is* getting late. EOB)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								PLIP driver details
							 | 
						||
| 
								 | 
							
								-------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The Linux PLIP driver is an implementation of the original Crynwr protocol,
							 | 
						||
| 
								 | 
							
								that uses the parallel port subsystem of the kernel in order to properly
							 | 
						||
| 
								 | 
							
								share parallel ports between PLIP and other services.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								IRQs and trigger timeouts
							 | 
						||
| 
								 | 
							
								=========================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								When a parallel port used for a PLIP driver has an IRQ configured to it, the
							 | 
						||
| 
								 | 
							
								PLIP driver is signaled whenever data is sent to it via the cable, such that
							 | 
						||
| 
								 | 
							
								when no data is available, the driver isn't being used.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								However, on some machines it is hard, if not impossible, to configure an IRQ
							 | 
						||
| 
								 | 
							
								to a certain parallel port, mainly because it is used by some other device.
							 | 
						||
| 
								 | 
							
								On these machines, the PLIP driver can be used in IRQ-less mode, where
							 | 
						||
| 
								 | 
							
								the PLIP driver would constantly poll the parallel port for data waiting,
							 | 
						||
| 
								 | 
							
								and if such data is available, process it. This mode is less efficient than
							 | 
						||
| 
								 | 
							
								the IRQ mode, because the driver has to check the parallel port many times
							 | 
						||
| 
								 | 
							
								per second, even when no data at all is sent. Some rough measurements
							 | 
						||
| 
								 | 
							
								indicate that there isn't a noticeable performance drop when using IRQ-less
							 | 
						||
| 
								 | 
							
								mode as compared to IRQ mode as far as the data transfer speed is involved.
							 | 
						||
| 
								 | 
							
								There is a performance drop on the machine hosting the driver.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								When the PLIP driver is used in IRQ mode, the timeout used for triggering a
							 | 
						||
| 
								 | 
							
								data transfer (the maximal time the PLIP driver would allow the other side
							 | 
						||
| 
								 | 
							
								before announcing a timeout, when trying to handshake a transfer of some
							 | 
						||
| 
								 | 
							
								data) is, by default, 500usec. As IRQ delivery is more or less immediate,
							 | 
						||
| 
								 | 
							
								this timeout is quite sufficient. 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								When in IRQ-less mode, the PLIP driver polls the parallel port HZ times
							 | 
						||
| 
								 | 
							
								per second (where HZ is typically 100 on most platforms, and 1024 on an
							 | 
						||
| 
								 | 
							
								Alpha, as of this writing). Between two such polls, there are 10^6/HZ usecs.
							 | 
						||
| 
								 | 
							
								On an i386, for example, 10^6/100 = 10000usec. It is easy to see that it is
							 | 
						||
| 
								 | 
							
								quite possible for the trigger timeout to expire between two such polls, as
							 | 
						||
| 
								 | 
							
								the timeout is only 500usec long. As a result, it is required to change the
							 | 
						||
| 
								 | 
							
								trigger timeout on the *other* side of a PLIP connection, to about
							 | 
						||
| 
								 | 
							
								10^6/HZ usecs. If both sides of a PLIP connection are used in IRQ-less mode,
							 | 
						||
| 
								 | 
							
								this timeout is required on both sides.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								It appears that in practice, the trigger timeout can be shorter than in the
							 | 
						||
| 
								 | 
							
								above calculation. It isn't an important issue, unless the wire is faulty,
							 | 
						||
| 
								 | 
							
								in which case a long timeout would stall the machine when, for whatever
							 | 
						||
| 
								 | 
							
								reason, bits are dropped.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								A utility that can perform this change in Linux is plipconfig, which is part
							 | 
						||
| 
								 | 
							
								of the net-tools package (its location can be found in the
							 | 
						||
| 
								 | 
							
								Documentation/Changes file). An example command would be
							 | 
						||
| 
								 | 
							
								'plipconfig plipX trigger 10000', where plipX is the appropriate
							 | 
						||
| 
								 | 
							
								PLIP device.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								PLIP hardware interconnection
							 | 
						||
| 
								 | 
							
								-----------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								PLIP uses several different data transfer methods.  The first (and the
							 | 
						||
| 
								 | 
							
								only one implemented in the early version of the code) uses a standard
							 | 
						||
| 
								 | 
							
								printer "null" cable to transfer data four bits at a time using
							 | 
						||
| 
								 | 
							
								data bit outputs connected to status bit inputs.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The second data transfer method relies on both machines having
							 | 
						||
| 
								 | 
							
								bi-directional parallel ports, rather than output-only ``printer''
							 | 
						||
| 
								 | 
							
								ports.  This allows byte-wide transfers and avoids reconstructing
							 | 
						||
| 
								 | 
							
								nibbles into bytes, leading to much faster transfers.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Parallel Transfer Mode 0 Cable
							 | 
						||
| 
								 | 
							
								==============================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The cable for the first transfer mode is a standard
							 | 
						||
| 
								 | 
							
								printer "null" cable which transfers data four bits at a time using
							 | 
						||
| 
								 | 
							
								data bit outputs of the first port (machine T) connected to the
							 | 
						||
| 
								 | 
							
								status bit inputs of the second port (machine R).  There are five
							 | 
						||
| 
								 | 
							
								status inputs, and they are used as four data inputs and a clock (data
							 | 
						||
| 
								 | 
							
								strobe) input, arranged so that the data input bits appear as contiguous
							 | 
						||
| 
								 | 
							
								bits with standard status register implementation.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								A cable that implements this protocol is available commercially as a
							 | 
						||
| 
								 | 
							
								"Null Printer" or "Turbo Laplink" cable.  It can be constructed with
							 | 
						||
| 
								 | 
							
								two DB-25 male connectors symmetrically connected as follows:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    STROBE output	1*
							 | 
						||
| 
								 | 
							
								    D0->ERROR	2 - 15		15 - 2
							 | 
						||
| 
								 | 
							
								    D1->SLCT	3 - 13		13 - 3
							 | 
						||
| 
								 | 
							
								    D2->PAPOUT	4 - 12		12 - 4
							 | 
						||
| 
								 | 
							
								    D3->ACK	5 - 10		10 - 5
							 | 
						||
| 
								 | 
							
								    D4->BUSY	6 - 11		11 - 6
							 | 
						||
| 
								 | 
							
								    D5,D6,D7 are   7*, 8*, 9*
							 | 
						||
| 
								 | 
							
								    AUTOFD output 14*
							 | 
						||
| 
								 | 
							
								    INIT   output 16*
							 | 
						||
| 
								 | 
							
								    SLCTIN	17 - 17
							 | 
						||
| 
								 | 
							
								    extra grounds are 18*,19*,20*,21*,22*,23*,24*
							 | 
						||
| 
								 | 
							
								    GROUND	25 - 25
							 | 
						||
| 
								 | 
							
								* Do not connect these pins on either end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								If the cable you are using has a metallic shield it should be
							 | 
						||
| 
								 | 
							
								connected to the metallic DB-25 shell at one end only.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Parallel Transfer Mode 1
							 | 
						||
| 
								 | 
							
								========================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The second data transfer method relies on both machines having
							 | 
						||
| 
								 | 
							
								bi-directional parallel ports, rather than output-only ``printer''
							 | 
						||
| 
								 | 
							
								ports.  This allows byte-wide transfers, and avoids reconstructing
							 | 
						||
| 
								 | 
							
								nibbles into bytes.  This cable should not be used on unidirectional
							 | 
						||
| 
								 | 
							
								``printer'' (as opposed to ``parallel'') ports or when the machine
							 | 
						||
| 
								 | 
							
								isn't configured for PLIP, as it will result in output driver
							 | 
						||
| 
								 | 
							
								conflicts and the (unlikely) possibility of damage.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The cable for this transfer mode should be constructed as follows:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    STROBE->BUSY 1 - 11
							 | 
						||
| 
								 | 
							
								    D0->D0	2 - 2
							 | 
						||
| 
								 | 
							
								    D1->D1	3 - 3
							 | 
						||
| 
								 | 
							
								    D2->D2	4 - 4
							 | 
						||
| 
								 | 
							
								    D3->D3	5 - 5
							 | 
						||
| 
								 | 
							
								    D4->D4	6 - 6
							 | 
						||
| 
								 | 
							
								    D5->D5	7 - 7
							 | 
						||
| 
								 | 
							
								    D6->D6	8 - 8
							 | 
						||
| 
								 | 
							
								    D7->D7	9 - 9
							 | 
						||
| 
								 | 
							
								    INIT -> ACK  16 - 10
							 | 
						||
| 
								 | 
							
								    AUTOFD->PAPOUT 14 - 12
							 | 
						||
| 
								 | 
							
								    SLCT->SLCTIN 13 - 17
							 | 
						||
| 
								 | 
							
								    GND->ERROR	18 - 15
							 | 
						||
| 
								 | 
							
								    extra grounds are 19*,20*,21*,22*,23*,24*
							 | 
						||
| 
								 | 
							
								    GROUND	25 - 25
							 | 
						||
| 
								 | 
							
								* Do not connect these pins on either end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Once again, if the cable you are using has a metallic shield it should
							 | 
						||
| 
								 | 
							
								be connected to the metallic DB-25 shell at one end only.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								PLIP Mode 0 transfer protocol
							 | 
						||
| 
								 | 
							
								=============================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The PLIP driver is compatible with the "Crynwr" parallel port transfer
							 | 
						||
| 
								 | 
							
								standard in Mode 0.  That standard specifies the following protocol:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   send header nibble '0x8'
							 | 
						||
| 
								 | 
							
								   count-low octet
							 | 
						||
| 
								 | 
							
								   count-high octet
							 | 
						||
| 
								 | 
							
								   ... data octets
							 | 
						||
| 
								 | 
							
								   checksum octet
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Each octet is sent as
							 | 
						||
| 
								 | 
							
									<wait for rx. '0x1?'>	<send 0x10+(octet&0x0F)>
							 | 
						||
| 
								 | 
							
									<wait for rx. '0x0?'>	<send 0x00+((octet>>4)&0x0F)>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								To start a transfer the transmitting machine outputs a nibble 0x08.
							 | 
						||
| 
								 | 
							
								That raises the ACK line, triggering an interrupt in the receiving
							 | 
						||
| 
								 | 
							
								machine.  The receiving machine disables interrupts and raises its own ACK
							 | 
						||
| 
								 | 
							
								line. 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Restated:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(OUT is bit 0-4, OUT.j is bit j from OUT. IN likewise)
							 | 
						||
| 
								 | 
							
								Send_Byte:
							 | 
						||
| 
								 | 
							
								   OUT := low nibble, OUT.4 := 1
							 | 
						||
| 
								 | 
							
								   WAIT FOR IN.4 = 1
							 | 
						||
| 
								 | 
							
								   OUT := high nibble, OUT.4 := 0
							 | 
						||
| 
								 | 
							
								   WAIT FOR IN.4 = 0
							 |