| \title{PLIP: The Parallel Line Internet Protocol Device} |
| |
| \author{ Donald Becker (becker@super.org)} |
| \affiliation{I.D.A. Supercomputing Research Center, Bowie MD 20715} |
| |
| %% At some point T. Thorn will probably contribute text, |
| %% \author{ Tommy Thorn (tthorn@daimi.aau.dk)} |
| |
| \section{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. |
| |
| \chapter{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 transfers 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. |
| |
| \section{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. |
| |
| \section{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 tranfer 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. |
| |
| \section{PLIP Mode 0 tranfer 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 '8' |
| count-low octet |
| count-high octet |
| ... data octets |
| checksum octet |
| |
| Each octet is sent as |
| <wait for rx. '1'> <send 0x10+(octet&0x0F)> |
| <wait for rx. '0'> <send 0x00+((octet>>4)&0x0F)> |
| |
| To start a transfer the transmitting machine outputs a nibble 0x08. |
| The raises the ACK line, triggering an interrupt in the receiving |
| machine. The receiving machine disables |
| |
| 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 |
| |
| |