> For the complete documentation index, see [llms.txt](https://book.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://book.bsdcn.org/man/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)](/man/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)](/man/man4/ppbus.4.md), [ppc(4)](/man/man4/ppc.4.md), [ifconfig(8)](/man/man8/ifconfig.8.md)

## 缺陷

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

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


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://book.bsdcn.org/man/man4/lp.4.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
