> For the complete documentation index, see [llms.txt](https://man.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://man.bsdcn.org/man4/lp.4.md).

# lp(4)

`lp` — 打印机端口 Internet 协议驱动

## 名称

`lp`

## 概要

`ifconfig plip0 myaddress hisaddress [-link0]`

`device ppbus device plip device ppc`

## 描述

`ifconfig` 驱动允许将 PC 并行打印机端口用作两台类似配置系统之间的点对点网络接口。数据每次传输 4 位，使用打印机状态线作为输入：因此不需要特殊的双向硬件，任何具有可工作中断的标准 AT 兼容打印机端口均可使用。

在引导过程中，对于每个被探测到且分配了中断的 `plip` 设备，都会创建一个对应的 `network` 设备。

使用 [ifconfig(8)](/man8/ifconfig.8.md) 配置 `network` 设备会使相应的 `parallel` 端口被保留给 PLIP 使用，直到网络接口被配置为“down”。

通信协议通过 `link0` 标志选择：

**`-link0`**（默认）使用 FreeBSD 模式（LPIP）。这是两种模式中较简单的一种，因此效率略高。

**`link0`** 使用 Crynwr/Linux 兼容模式（CLPIP）。此模式具有模拟的以太网数据包头，更容易与其他类型的设备对接。

接口 MTU 默认为 1500，但可设为任何值。链路两端必须配置相同的 MTU。

### 线缆连接

连接两个并行端口的线缆应按如下方式接线：

```sh
	针脚	针脚	描述
	2	15	Data0 -> ERROR*
	3	13	Data1 -> SLCT
	4	12	Data2 -> PE
	5	10	Data3 -> ACK*
	6	11	Data4 -> BUSY
	15	2	ERROR* -> Data0
	13	3	SLCT   -> Data1
	12	4	PE     -> Data2
	10	5	ACK*   -> Data3
	11	6	BUSY   -> Data4
	18-25	18-25	地线
```

按此接线方式的线缆作为“Laplink”线缆广泛销售，通常为黄色。

连接是对称的，每个方向提供 5 条线（4 条数据线加 1 条握手线）。两种模式使用相同的接线，但对用作握手线的线的选择不同。

### FreeBSD LPIP 模式

信号线的使用如下：

***Data0**（针脚 2）* 数据输出，位 0。

***Data1**（针脚 3）* 数据输出，位 1。

***Data2**（针脚 4）* 数据输出，位 2。

***Data3**（针脚 5）* 握手输出。

***Data4**（针脚 6）* 数据输出，位 3。

***ERROR***（针脚 15）\* 数据输入，位 0。

***SLCT**（针脚 13）* 数据输入，位 1。

***PE**（针脚 12）* 数据输入，位 2。

***BUSY**（针脚 11）* 数据输入，位 3。

***ACK***（针脚 10）\* 握手输入。

空闲时，所有数据线均为零。每个字节分四步发送：发送方写入 4 个最高有效位并拉高握手线；接收方读取这 4 位并拉高其握手线以确认；发送方将 4 个最低有效位放到数据线上并拉低握手线；接收方读取数据并拉低其握手线。

数据包格式有一个两字节的包头，包含固定值 0x08、0x00，紧接着是 IP 头和数据。

数据包的起始通过简单地发送头部的第一个字节来指示。数据包的结束通过反转数据线（即写入待传输前一个半字节的反码）来指示，而不改变握手状态。

注意，数据包结束标记假设握手信号和数据输出位可在单条指令中写入——否则数据包数据中的某些字节值会被错误地解释为数据包结束。这对 PC 打印机端口不成问题，但在其他设备上实现此协议时需要小心。

### Crynwr/Linux CLPIP 模式

信号线的使用如下：

***Data0**（针脚 2）* 数据输出，位 0。

***Data1**（针脚 3）* 数据输出，位 1。

***Data2**（针脚 4）* 数据输出，位 2。

***Data3**（针脚 5）* 数据输出，位 3。

***Data4**（针脚 6）* 握手输出。

***ERROR***（针脚 15）\* 数据输入，位 0。

***SLCT**（针脚 13）* 数据输入，位 1。

***PE**（针脚 12）* 数据输入，位 2。

***ACK***（针脚 10）\* 数据输入，位 3。

***BUSY**（针脚 11）* 握手输入。

空闲时，所有数据线均为零。每个字节分四步发送：发送方写入 4 个最低有效位并拉高握手线；接收方读取这 4 位并拉高其握手线以确认；发送方将 4 个最高有效位放到数据线上并拉低握手线；接收方读取数据并拉低其握手线。\[注意，这与 LPIP 模式的半字节顺序相反]。

数据包格式如下：

```sh
长度（最低有效字节）
长度（最高有效字节）
12 字节的假设 MAC 地址（FreeBSD 会忽略）
固定字节 0x08
固定字节 0x00
<IP 数据报>
校验和字节。
```

长度包含 14 字节的头部，但不包括长度字节本身和校验和字节。

校验和是所有字节的简单算术和（同样包括头部，但不包括校验和和长度字节）。FreeBSD 会计算发送的校验和，但不验证接收的校验和。

由于选择用于握手输入的线路无法产生中断，必须特别发送数据包起始信号。发送方将值 0x08 写入数据线，并等待接收方将 0x01 写入其数据线作为响应。然后发送方开始发送数据包的第一个字节（长度字节）。

数据包结束从数据包长度推断得出，不特别发送信号（尽管数据线会恢复为零的空闲状态，以避免错误地指示下一个数据包的开始）。

## 参见

[ppbus(4)](/man4/ppbus.4.md), [ppc(4)](/man4/ppc.4.md), [ifconfig(8)](/man8/ifconfig.8.md)

## 缺陷

在字节握手时使用忙等待循环（等待接收系统响应数据包开始的中断时更糟）。因此，快速系统与慢速系统通信会消耗大量 CPU。由于握手线的选择，在 CLPIP 模式下这是不可避免的；在 LPIP 模式下理论上可以改进。

轮询超时通过计数循环迭代而非定时器来控制，因此取决于 CPU 速度。通过需要执行（慢速）ISA 总线周期来实际读取端口，这在一定程度上得到了稳定。
