> 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/ppbus.4.md).

# ppbus(4)

`ppbus` — 并口总线系统

## 名称

`ppbus`

## 概要

`device ppbus`

`device lpt device plip device ppi device pps device lpbb`

## 描述

*ppbus* 系统提供了一个统一、模块化且与体系结构无关的系统，用于实现控制各种并行设备的驱动程序，并利用不同的并口芯片组。

## 设备驱动

为了编写新驱动或移植现有驱动，ppbus 系统提供以下功能：

* 用于访问并口的体系结构无关宏或函数
* 允许各种设备共享同一并口的机制
* 一个名为 [ppi(4)](/man4/ppi.4.md) 的用户接口，允许从内核外部访问并口而不会与内核内驱动冲突。

### 开发新驱动

ppbus 系统旨在支持标准和非标准软件的开发：

| *驱动*     | *描述*                   |
| -------- | ---------------------- |
| **ppi**  | 用于通用 I/O 的并口接口         |
| **pps**  | 每秒脉冲定时接口               |
| **lpbb** | Philips 官方并口 I2C 位操作接口 |

### 移植现有驱动

ppbus 系统的另一种方法是移植现有驱动。已移植了各种驱动：

| *驱动*     | *描述*        |
| -------- | ----------- |
| **lpt**  | lpt 打印机驱动   |
| **plip** | lp 并行网络接口驱动 |

ppbus 应允许你移植任何其他软件，甚至是来自提供类似服务的其他操作系统的软件。

## 并口芯片组

并口芯片组支持由 [ppc(4)](/man4/ppc.4.md) 提供。

ppbus 系统提供用于分配新并口总线的函数和宏，然后初始化它和上层外设驱动。

ppc 进行芯片组检测和初始化，然后调用 ppbus 附加函数以初始化 ppbus 系统。

## 并口模型

为 ppbus 系统选择的逻辑并口模型是 PC 的并口模型。因此，对于 ppbus 的 i386 实现，ppc 提供的大多数服务都是 inb() 和 outb() 调用的宏。但对于另一种体系结构，访问我们的一个逻辑寄存器（数据、状态、控制等）可能需要多次 I/O 访问。

### 描述

并口可在以下模式下操作：

* 兼容模式，也称为 Centronics 模式
* 双向 8/4 位模式，也称为 NIBBLE 模式
* 字节模式，也称为 PS/2 模式
* 扩展功能端口模式，ECP
* 增强型并口模式，EPP
* 混合 ECP+EPP 或 ECP+PS/2 模式

### 兼容模式

此模式定义了大多数 PC 用于向打印机传输数据的协议。在此模式下，数据被放置在端口的数据线上，检查打印机状态以确认无错误且不忙，然后由软件生成数据选通以将数据时钟传输到打印机。

许多 I/O 控制器实现了一种使用 FIFO 缓冲区以兼容模式协议传输数据的模式。此模式被称为“Fast Centronics”或“Parallel Port FIFO mode”。

### 双向模式

NIBBLE 模式是从打印机或外设获取反向通道数据的最常见方法。与标准的 host-to-printer 模式结合，它提供了一个完整的双向通道。

在此模式下，输出为 8 位长。输入通过读取状态寄存器 8 位中的 4 位来完成。

### 字节模式

在此模式下，数据寄存器用于输出和输入。然后，任何传输都是 8 位长。

### 扩展功能端口模式

ECP 协议被提议作为与打印机和扫描仪类外设通信的高级模式。与 EPP 协议一样，ECP 模式在主机适配器和外设之间提供高性能的双向通信路径。

ECP 协议特性包括：

* 用于主机适配器的游程编码（RLE）数据压缩
* 正向和反向通道的 FIFO
* 用于主机寄存器接口的 DMA 和编程 I/O

### 增强型并口模式

EPP 协议最初作为一种手段开发，用于提供高性能的并口链路，同时仍与标准并口兼容。

EPP 模式有两种类型的周期：地址和数据。在硬件层面上，区别在于放置在数据线上的字节选通。数据用 nAutofeed 选通，地址用 nSelectin 信号选通。

EPP 协议的 ISA 实现的一个特点是 EPP 周期适合 ISA 周期。以这种方式，并口外设可以以接近等效 ISA 插卡的性能水平操作。

在软件层面上，你可以实现你希望的协议，根据需要使用数据和地址周期。这是用于 IEEE1284 兼容部分。然后，外设供应商可以使用以下状态线实现协议握手：PError、nFault 和 Select。尝试了解这些线如何随你的外设切换，允许外设请求更多数据、停止传输等。

外设可随时使用 nAck 信号中断主机，而不会干扰当前传输。

### 混合模式

一些制造商（如 SMC）已实现支持混合模式的芯片组。使用此类芯片组，可随时通过访问扩展控制寄存器进行模式切换。

## IEEE1284-1994 标准

### 背景

此标准也称为“IEEE Standard Signaling Method for a Bidirectional Parallel Peripheral Interface for Personal Computers”。它定义了主机与打印机或其他外设之间异步、完全互锁的双向并行通信的信号方法。它还规定了外设标识字符串的格式以及在双向数据流之外向主机返回此字符串的方法。

此标准与体系结构无关，仅在信号级别上指定对话握手。应参考特定于体系结构的文档，以操作依赖于机器的寄存器、映射内存或其他控制这些信号的方法。

IEEE1284 协议完全面向所有支持的并口模式。计算机充当主机，外设充当从机。

任何传输都定义为有限状态自动机。它允许软件正确管理信号方法的完全互锁方案。兼容模式“按原样”支持，无需任何协商，因为它兼容。任何其他模式必须首先由主机协商以检查外设是否支持，然后进入一种前向空闲状态。

从机可随时希望向主机发送数据。这只能从前向空闲状态（nibble、byte、ecp 等）进行。因此，主机必须先前已协商允许外设请求传输。中断线可专用于请求信号，以防止耗时的轮询方法。

但外设请求仅是对主机的一个提示。如果主机接受传输，它必须首先协商反向模式，然后开始传输。在反向传输期间，主机可随时终止传输，或从机可驱动线路以表示没有更多数据可用。

### 实现

IEEE1284 标准支持已在 ppbus 系统的顶层实现，作为一组执行高级功能（如协商、终止、以任何模式传输）的过程，无需关心标准的低级特性。

IEEE1284 与 ppbus 系统的交互尽可能少。这意味着当你想访问 ppbus 时仍需请求它，negotiate 函数不会替你做。当然，之后要释放它。

## 体系结构

### adapter、ppbus 和 device 层

首先是 *adapter* 层，ppbus 系统的最低层。它通过一组将逻辑模型映射到底层硬件的低级函数提供芯片组抽象。

其次是 *ppbus* 层，提供以下功能：

* 在类似菊花链连接的设备之间共享并口总线
* 管理链接到 ppbus 的设备
* 提供与体系结构无关的接口以访问硬件层。

最后，*device* 层汇集并口外设驱动程序。

### 并行模式管理

我们必须区分 ppbus 系统各层的操作模式。实际上，ppbus 和 adapter 的操作模式一方面分开，另一方面对每种模式分别有当前和可用模式。

通过这种抽象级别，特定芯片组可从任何原生模式切换到任何使用扩展模式仿真的其他模式，而不会干扰上层。例如，大多数芯片组原生支持 NIBBLE 模式，并使用 ECP 和/或 EPP 进行仿真。

此体系结构应支持 IEEE1284-1994 模式。

## 特性

### 引导过程

引导过程从 ISA 总线（PC 体系结构）初始化期间 [ppc(4)](/man4/ppc.4.md) 驱动的探测阶段开始。在 ppc 驱动附加期间，分配新的 ppbus 结构，然后调用此新总线节点的探测和附加。

ppbus 附加尝试检测任何 PnP 并行外设（根据 (c)1993-4 Microsoft Corporation 的 Plug and Play Parallel Port Devices 草案），然后探测并附加已知设备驱动。

在探测期间，预期设备驱动会请求 ppbus 并尝试设置其操作模式。此模式将保存在上下文结构中，并在驱动每次请求 ppbus 时返回。

### 总线分配和中断

ppbus 分配是强制性的，以免损坏其他设备的 I/O。ppbus 分配的另一种用途是保留端口并接收传入中断。

借助 newbus Fn BUS\_SETUP\_INTR 和 Fn BUS\_TEARDOWN\_INTR 函数，高级中断处理程序连接到 ppbus 系统。但是，要附加处理程序，驱动必须拥有总线。因此，调用上述函数必须请求 ppbus（更多信息请参见现有驱动）。请注意，释放 ppbus 时会自动释放中断处理程序。

### 微序列

*微序列* 是一种通用机制，允许快速低级操作并口。微序列可用于执行标准（IEEE1284 模式）或非标准传输。微序列的理念是避免 ppbus 层的开销，并在适配器级别完成大部分工作。

微序列是操作码和参数的数组。每个操作码编码一个操作（操作码在 [microseq(9)](/man9/microseq.9.md) 中描述）。标准 I/O 操作在 ppbus 级别实现，而基本 I/O 操作和微序列语言在适配器级别编码以提高效率。

## 参见

[lpt(4)](/man4/lpt.4.md), plip(4), [ppc(4)](/man4/ppc.4.md), [ppi(4)](/man4/ppi.4.md)

## 历史

`ppbus` 手册页首次出现于 FreeBSD 3.0。

## 作者

本手册页由 Nicolas Souchu 编写。
