INS8250 -> INS8250B \ \ \-> INS8250A -> INS82C50A \ \ \-> NS16450 -> NS16C450 \ \ \-> NS16550 -> NS16550A -> PC16550D
串口和 UART 教程
商标
FreeBSD 是 FreeBSD 基金会的注册商标。
Microsoft、IntelliMouse、MS-DOS、Outlook、Windows、Windows Media 和 Windows NT 都是 Microsoft Corporation 在美国和/或其他国家/地区的注册商标或商标。
制造商和销售商用来区分其产品的许多名称都被声明为商标。在本文档中出现这些名称的地方,如果 FreeBSD 项目知道商标声明,则这些名称后面会加上“™”或“®”符号。
目录
摘要
本文讨论了在 FreeBSD 中使用串行硬件。
1. UART:它是啥以及如何工作
版权所有 ® 1996 Frank Durda IV <uhclem@FreeBSD.org>
,保留所有权利。1996 年 1 月 13 日。
通用异步收发器 (UART) 控制器是计算机串行通信子系统的关键组件。UART 将数据字节以顺序方式传输各个位。在目的地,第二个 UART 将这些位重新组装成完整的字节。
串行传输通常用于调制解调器以及计算机、终端和其他设备之间的非网络通信。
串行传输主要有两种形式:同步和异步。根据硬件支持的模式,通信子系统的名称通常会在支持异步通信时包含一个A
,在支持同步通信时包含一个S
。下面将描述这两种形式。
一些常见的缩写词是
UART 通用异步收发器
USART 通用同步异步收发器
1.1. 同步串行传输
同步串行传输要求发送方和接收方共享一个时钟,或者发送方提供一个脉冲或其他定时信号,以便接收方知道何时“读取”数据的下一个位。在大多数形式的串行同步通信中,如果在给定时刻没有可用的数据要传输,则必须发送填充字符,以便始终传输数据。同步通信通常效率更高,因为只有数据位在发送方和接收方之间传输,并且如果需要额外的布线和电路来在发送方和接收方之间共享时钟信号,则同步通信的成本可能会更高。
打印机和固定磁盘设备使用同步传输的一种形式,即数据通过一组线发送,而时钟或脉冲通过另一条线发送。打印机和固定磁盘设备通常不是串行设备,因为大多数固定磁盘接口标准通过为每个字的每个位使用单独的线,为每个时钟或脉冲信号发送一个完整的单词数据。在 PC 行业中,这些被称为并行设备。
PC 中的标准串行通信硬件不支持同步操作。此处描述此模式仅用于比较目的。
1.2. 异步串行传输
异步传输允许数据在发送方无需向接收方发送时钟信号的情况下进行传输。相反,发送方和接收方必须预先就定时参数达成一致,并且每个字中都会添加特殊的位,这些位用于同步发送和接收单元。
当一个字被赋予 UART 用于异步传输时,一个称为“起始位”的位将被添加到要传输的每个字的开头。“起始位”用于提醒接收方一个数据字即将发送,并迫使接收方的时钟与发送方的时钟同步。这两个时钟必须足够精确,在传输字中剩余的位期间,频率漂移不超过 10%。(此要求是在机械电传打字机时代设置的,现代电子设备很容易满足。)
在起始位之后,数据字的各个位被发送,最低有效位 (LSB) 首先发送。传输中的每个位都与所有其他位传输相同的时间,接收方在分配给每个位的周期的大约中间“查看”线路以确定该位是1
还是0
。例如,如果发送每个位需要两秒钟,则接收方将在经过一秒钟后检查信号以确定它是否为1
或0
,然后它将等待两秒钟,然后检查下一个位的数值,依此类推。
发送方不知道接收方何时“查看”了位的数值。发送方只知道时钟何时开始传输字的下一位。
当整个数据字发送完毕后,发送方可能会添加一个发送方生成的奇偶校验位。接收方可以使用奇偶校验位执行简单的错误检查。然后,发送方发送至少一个停止位。
当接收方接收到数据字中的所有位后,它可能会检查奇偶校验位(发送方和接收方必须就是否使用奇偶校验位达成一致),然后接收方查找停止位。如果停止位没有在预期的时间出现,则 UART 会认为整个字已损坏,并在读取数据字时向主机处理器报告帧错误。帧错误的常见原因是发送方和接收方时钟未以相同的速度运行,或信号被中断。
无论数据是否正确接收,UART 都会自动丢弃起始位、奇偶校验位和停止位。如果发送方和接收方配置相同,则这些位不会传递给主机。
如果另一个字已准备好传输,则新字的起始位可以在前一个字的停止位发送后立即发送。
由于异步数据是“自同步”的,因此如果没有数据要传输,则传输线路可以处于空闲状态。
1.3. 其他 UART 功能
除了将数据从并行转换为串行以进行传输以及在接收时从串行转换为并行的基本工作之外,UART 通常还会提供用于信号的额外电路,这些信号可用于指示传输介质的状态,并在远程设备未准备好接受更多数据的情况下调节数据流。例如,当连接到 UART 的设备是调制解调器时,调制解调器可能会报告电话线上是否存在载波,而计算机则可以通过升高或降低这些额外信号中的一个或多个来指示调制解调器重置自身或不接听电话。每个这些额外信号的功能在 EIA RS232-C 标准中定义。
1.4. RS232-C 和 V.24 标准
在大多数计算机系统中,UART 连接到生成符合 EIA RS232-C 规范的信号的电路。还有一个名为 V.24 的 CCITT 标准,它反映了 RS232-C 中包含的规范。
1.4.1. RS232-C 位分配(标记和空格)
在 RS232-C 中,值1
称为标记
,值0
称为空格
。当通信线路空闲时,线路被称为“标记”,或传输连续的1
值。
起始位的值始终为0
(空格)。停止位的值始终为1
(标记)。这意味着在每个字的开头,线路将始终存在标记 (1) 到空格 (0) 的转换,即使多个字背靠背传输也是如此。这保证了发送方和接收方可以重新同步其时钟,而不管正在传输的数据位的內容。
停止位和起始位之间的空闲时间不必是通信链路比特率的精确倍数(包括零),但大多数 UART 为了简单起见而设计成这样。
在 RS232-C 中,“标记”信号 (1
) 由 -2 VDC 到 -12 VDC 之间的电压表示,而“空格”信号 (0
) 由 0 到 +12 VDC 之间的电压表示。发送器应该发送 +12 VDC 或 -12 VDC,接收器应该允许长电缆中存在一些电压损耗。低功耗设备(如便携式计算机)中的一些发送器有时仅使用 +5 VDC 和 -5 VDC,但只要电缆长度较短,这些值对于 RS232-C 接收器来说仍然可以接受。
1.4.2. RS232-C 断路信号
RS232-C 还指定了一个称为断路
的信号,该信号是由发送连续空格值(无起始位或停止位)引起的。当数据电路没有电流时,线路被认为正在发送断路
。
断路
信号的持续时间必须长于发送一个完整字节加上起始位、停止位和奇偶校验位所需的时间。大多数 UART 可以区分帧错误和断路,但如果 UART 无法做到这一点,则可以使用帧错误检测来识别断路。
在电传打字机时代,当全国各地的许多打印机串联连接(例如新闻服务)时,任何一个单元都可以通过暂时断开整个电路(使电流无法通过)来发送一个Break
信号。这被用来允许一个有紧急新闻的地点中断另一个正在发送信息的站点。
在现代系统中,有两种类型的Break信号。如果Break信号持续时间超过1.6秒,则被视为“Modem Break”,一些调制解调器可以被编程为在检测到此信号时终止会话并挂断电话或进入调制解调器的命令模式。如果Break信号持续时间小于1.6秒,则表示数据中断(Data Break),远程计算机需要对其做出响应。有时,这种形式的Break信号用作Attention或Interrupt信号,有时则被接受为ASCII CONTROL-C字符的替代。
Marks和Spaces也分别等同于纸带系统中的“孔”和“无孔”。
Break信号无法从纸带或任何其他字节值生成,因为字节总是带有起始位和停止位。UART通常能够响应来自主机处理器的特殊命令生成连续的空格信号。 |
1.4.3. RS232-C DTE和DCE设备
RS232-C规范定义了两种类型的设备:数据终端设备(DTE)和数据通信设备(DCE)。通常,DTE设备是终端(或计算机),而DCE设备是调制解调器。在电话线的另一端,接收调制解调器也是一个DCE设备,连接到该调制解调器的计算机是一个DTE设备。DCE设备接收DTE设备发送的信号上的引脚,反之亦然。
当两个都是DTE或都是DCE的设备必须在它们之间没有调制解调器或类似的介质转换器的情况下连接在一起时,必须使用空模(NULL modem)。空模在电气上重新排列布线,以便发射器输出连接到另一设备的接收器输入,反之亦然。所有控制信号都执行类似的转换,以便每个设备都能看到它认为来自另一设备的DCE(或DTE)信号。
DTE和DCE设备产生的信号数量并不对称。DTE设备为DCE设备生成的信号少于DTE设备从DCE设备接收的信号。
1.4.4. RS232-C引脚分配
EIA RS232-C规范(以及ITU等效规范V.24)要求使用25针连接器(通常是DB25),并定义了该连接器中大多数引脚的用途。
在IBM个人计算机和类似的系统中,通过9针连接器(DB9)提供RS232-C信号的子集。PC连接器上未包含的信号主要涉及同步操作,而这种传输模式不受IBM选择用于IBM PC的UART支持。
根据计算机制造商的不同,DB25、DB9或两种类型的连接器都可用于RS232-C通信。(IBM PC还使用DB25连接器用于并行打印机接口,这会导致一些混淆。)
以下是DB25和DB9连接器中RS232-C信号分配的表格。
DB25 RS232-C 引脚 | DB9 IBM PC 引脚 | EIA 电路符号 | CCITT 电路符号 | 常用名称 | 信号源 | 描述 |
---|---|---|---|---|---|---|
1 | - | AA | 101 | PG/FG | - | 机架/保护地 |
2 | 3 | BA | 103 | TD | DTE | 发送数据 |
3 | 2 | BB | 104 | RD | DCE | 接收数据 |
4 | 7 | CA | 105 | RTS | DTE | 请求发送 |
5 | 8 | CB | 106 | CTS | DCE | 清除发送 |
6 | 6 | CC | 107 | DSR | DCE | 数据设备就绪 |
7 | 5 | AV | 102 | SG/GND | - | 信号地 |
8 | 1 | CF | 109 | DCD/CD | DCE | 载波检测 |
9 | - | - | - | - | - | 保留用于测试 |
10 | - | - | - | - | - | 保留用于测试 |
11 | - | - | - | - | - | 保留用于测试 |
12 | - | CI | 122 | SRLSD | DCE | 辅助接收线路信号检测 |
13 | - | SCB | 121 | SCTS | DCE | 辅助清除发送 |
14 | - | SBA | 118 | STD | DTE | 辅助发送数据 |
15 | - | DB | 114 | TSET | DCE | 发送信号元素定时 |
16 | - | SBB | 119 | SRD | DCE | 辅助接收数据 |
17 | - | DD | 115 | RSET | DCE | 接收信号元素定时 |
18 | - | - | 141 | LOOP | DTE | 本地回环 |
19 | - | SCA | 120 | SRS | DTE | 辅助请求发送 |
20 | 4 | CD | 108.2 | DTR | DTE | 数据终端就绪 |
21 | - | - | - | RDL | DTE | 远程数字回环 |
22 | 9 | CE | 125 | RI | DCE | 振铃指示 |
23 | - | CH | 111 | DSRS | DTE | 数据信号速率选择 |
24 | - | DA | 113 | TSET | DTE | 发送信号元素定时 |
25 | - | - | 142 | - | DCE | 测试模式 |
1.5. 比特、波特率和符号
波特率是异步通信中传输速度的度量。由于调制解调器通信技术的进步,在描述较新设备的数据速率时,这个术语经常被误用。
传统上,波特率表示实际通过介质发送的比特数,而不是实际从一个DTE设备移动到另一个DTE设备的数据量。波特率包括发送UART生成的和接收UART删除的开销比特(起始位、停止位和奇偶校验位)。这意味着七位数据字实际上需要10位才能完全传输。因此,如果使用奇偶校验并且存在一个起始位和停止位,则能够以每秒300比特的速度从一个地方移动到另一个地方的调制解调器通常只能移动30个7位字。
如果使用8位数据字和奇偶校验位,则数据速率下降到每秒27.27个字,因为现在需要11位来发送8位字,并且调制解调器仍然只发送每秒300比特。
将字节/秒转换为波特率或反之亦然的公式在纠错调制解调器出现之前很简单。这些调制解调器接收来自主机计算机中UART的串行比特流(即使使用内部调制解调器,数据也经常被串行化),并将比特转换回字节。然后,将这些字节组合成数据包,并使用同步传输方法通过电话线发送。这意味着发送调制解调器在传输之前删除了DTE(计算机)中的UART添加的停止位、起始位和奇偶校验位。当远程调制解调器接收到这些字节时,远程调制解调器会向这些字添加起始位、停止位和奇偶校验位,将其转换为串行格式,然后将其发送到远程计算机中的接收UART,然后接收UART会剥离起始位、停止位和奇偶校验位。
进行所有这些额外的转换的原因是为了使两个调制解调器能够执行纠错,这意味着接收调制解调器能够要求发送调制解调器重新发送未以正确的校验和接收的数据块。此检查由调制解调器处理,DTE设备通常不知道此过程正在发生。
通过剥离起始位、停止位和奇偶校验位,两个调制解调器之间必须共享以执行纠错的额外数据位大部分隐藏在发送和接收DTE设备看到的有效传输速率之外。例如,如果调制解调器将十个7位字发送到另一个调制解调器而不包含起始位、停止位和奇偶校验位,则发送调制解调器将能够添加30位自己的信息,接收调制解调器可以使用这些信息进行纠错,而不会影响真实数据的传输速度。
执行压缩的调制解调器使波特率术语的使用更加混乱。通过电话线传递的单个8位字可能表示发送到发送调制解调器的十几个字。接收调制解调器会将数据扩展回其原始内容,并将该数据传递给接收DTE。
现代调制解调器还包括缓冲区,允许比特跨电话线(DCE到DCE)移动的速率与比特在对话两端DTE和DCE之间移动的速率不同。通常,由于调制解调器使用压缩,因此DTE和DCE之间的速度高于DCE到DCE的速度。
由于描述字节所需的比特数在两台机器之间传输过程中有所不同,再加上DTE-DCE和DCE-DCE链路上使用的比特/秒速度不同,因此使用波特率来描述整体通信速度会导致问题,并可能错误地表示真实的传输速度。因此,比特/秒(bps)是用于描述DCE到DCE接口处看到的传输速率的正确术语,而波特率或比特/秒是在两个系统之间使用有线连接建立连接时或使用未执行纠错或压缩的调制解调器时可以接受的术语。
现代高速调制解调器(2400、9600、14,400和19,200bps)实际上仍然以2400波特或更准确地说,每秒2400个符号的速度运行。高速调制解调器能够使用称为星座填充的技术将更多的数据比特编码到每个符号中,这就是调制解调器的有效比特/秒速率更高的原因,但调制解调器继续在电话系统提供的有限音频带宽内运行。以28,800及更高速度运行的调制解调器具有可变的符号速率,但技术相同。
1.6. IBM个人计算机UART
从最初的IBM个人计算机开始,IBM选择National Semiconductor INS8250 UART用于IBM PC并行/串行适配器。IBM和其他供应商生产的后续几代兼容计算机继续使用INS8250或National Semiconductor UART系列的改进版本。
1.6.1. National Semiconductor UART系列族谱
INS8250 UART已经过几个版本和后续几代的发展。下面将描述每个主要版本。
- INS8250
此部件用于最初的IBM PC和IBM PC/XT。此部件的最初名称是INS8250 ACE(异步通信元素),它采用NMOS技术制造。
8250使用八个I/O端口,并具有一个字节发送缓冲区和一个字节接收缓冲区。这个最初的UART有几个竞争条件和其他缺陷。最初的IBM BIOS包含用于解决这些缺陷的代码,但这使得BIOS依赖于这些缺陷的存在,因此后续部件(如8250A、16450或16550)无法在最初的IBM PC或IBM PC/XT中使用。
- INS8250-B
这是采用NMOS技术制造的INS8250的较低速度版本。它包含与最初的INS8250相同的问题。
- INS8250A
使用XMOS技术的INS8250的改进版本,已更正各种功能缺陷。INS8250A最初由使用“干净”BIOS设计的供应商用于PC克隆计算机。由于芯片中的更正,此部件无法与与INS8250或INS8250B兼容的BIOS一起使用。
- INS82C50A
这是INS8250A的CMOS版本(低功耗),具有类似的功能特性。
- NS16450
与NS8250A相同,但进行了改进,因此可以与更快的CPU总线设计一起使用。IBM在IBM AT中使用了此部件,并更新了IBM BIOS,不再依赖于INS8250中的错误。
- NS16C450
这是NS16450的CMOS版本(低功耗)。
- NS16550
与NS16450相同,但具有16字节发送和接收缓冲区,但缓冲区设计存在缺陷,无法可靠地使用。
- NS16550A
与 NS16550 相同,但修正了缓冲区缺陷。16550A 及其后续版本已成为 PC 行业中最流行的 UART 设计,这主要归因于其能够在中断响应时间缓慢的操作系统上可靠地处理更高的数据速率。
- NS16C552
该组件包含两个封装在一个封装中的 NS16C550A CMOS UART。
- PC16550D
与 NS16550A 相同,但修正了一些细微的缺陷。这是 16550 系列的 D 版,也是国家半导体提供的最新设计。
1.6.2. NS16550AF 和 PC16550D 是同一个芯片
几年前,国家半导体对其零件编号系统进行了重新整理,NS16550AFN 这个名称已不再使用。(如果您有 NS16550AFN,请查看零件上的日期代码,这是一个通常以 9 开头的四位数字。数字的前两位是年份,后两位是该年零件封装的星期数。如果您有 NS16550AFN,它可能已经使用了数年。)
新的编号类似于 PC16550DV,后缀字母略有不同,具体取决于封装材料及其形状。(下面提供了编号系统的说明。)
需要了解的是,在某些商店中,您可能需要支付 15 美元(美国)购买 1990 年生产的 NS16550AFN,而在下一个货架上,则是带有国家半导体自 AFN 零件投入生产以来进行的一些小修正的新 PC16550DN 零件,PC16550DN 可能是在过去六个月内生产的,其价格仅为 NS16550AFN 的一半(批量价格低至 5 美元(美国)),因为它们很容易获得。
随着 NS16550AFN 芯片供应的持续减少,其价格可能会持续上涨,直到更多人发现并接受 PC16550DN 确实具有与旧零件号相同的功能。
1.7. 其他供应商和类似的 UART
多年来,8250、8250A、16450 和 16550 已被其他芯片供应商获得许可或复制。对于 8250、8250A 和 16450,精确电路(“巨型单元”)已授权给许多供应商,包括西部数据和英特尔。其他供应商对零件进行了反向工程或生产了具有类似行为的仿真。
在内部调制解调器中,调制解调器设计人员经常使用调制解调器微处理器模拟 8250A/16450,并且模拟的 UART 通常具有一个包含数百字节的隐藏缓冲区。由于缓冲区的大小,这些仿真在处理高速数据方面的可靠性可以与 16550A 相媲美。但是,大多数操作系统仍然会报告 UART 只是一个 8250A 或 16450,并且可能无法有效利用模拟 UART 中存在的额外缓冲功能,除非使用特殊的驱动程序。
一些调制解调器制造商受市场力量驱使,放弃了具有数百字节缓冲区的方案,转而使用 16550A UART,以便产品在市场比较中更具优势,即使此举可能会降低有效性能。
一个常见的误解是,所有标有“16550A”的零件在性能上都是相同的。它们之间存在差异,在某些情况下,大多数这些 16550A 克隆都存在明显的缺陷。
在开发 NS16550 时,国家半导体获得了该设计的几项专利,并且还限制了许可,使得其他供应商难以提供具有类似功能的芯片。由于这些专利的存在,反向工程设计和仿真必须避免侵犯专利中涵盖的权利要求。随后,这些复制品几乎从未与 NS16550A 或 PC16550D 完全相同,而后两者是大多数计算机和调制解调器制造商想要购买的零件,但有时他们不愿意支付购买正版零件所需的价钱。
克隆 16550A 零件的一些差异并不重要,而另一些差异则可能导致设备无法与给定的操作系统或驱动程序一起使用。这些差异可能会在使用其他驱动程序时出现,或者在发生特定事件组合时出现,而这些事件在 Windows® 驱动程序中没有经过充分测试或考虑。这是因为大多数调制解调器供应商和 16550 克隆制造商使用 Windows® for Workgroups 3.11 中的 Microsoft 驱动程序和 Microsoft® MS-DOS® 实用程序作为与 NS16550A 兼容性的主要测试。这种过于简单的标准意味着,如果使用不同的操作系统,则由于克隆和正版组件之间的细微差异,可能会出现问题。
国家半导体提供了一个名为 COMTEST 的程序,该程序执行独立于任何操作系统驱动程序的兼容性测试。应该记住,此类程序的目的是证明竞争对手产品的缺陷,因此该程序将报告正在测试的零件在行为上的重大差异以及极其细微的差异。
在本文档作者于 1994 年进行的一系列测试中,使用 COMTEST 测试了国家半导体、TI、StarTech 和 CMD 生产的组件,以及嵌入在内部调制解调器中的巨型单元和仿真。下面列出了一些组件的差异计数。由于这些测试是在 1994 年进行的,因此它们可能无法反映供应商提供的给定产品的当前性能。
需要注意的是,当检测到过多的或某些类型的错误时,COMTEST 通常会中止。作为此测试的一部分,COMTEST 进行了修改,使其无论遇到多少差异都不会中止。
供应商 | 零件号 | 错误(也称为“报告的差异”) |
---|---|---|
国家半导体 | (PC16550DV) | 0 |
国家半导体 | (NS16550AFN) | 0 |
国家半导体 | (NS16C552V) | 0 |
TI | (TL16550AFN) | 3 |
CMD | (16C550PE) | 19 |
StarTech | (ST16C550J) | 23 |
Rockwell | 具有内部 16550 或仿真的参考调制解调器(RC144DPi/C3000-25) | 117 |
Sierra | 具有内部 16550 的调制解调器(SC11951/SC11351) | 91 |
迄今为止,本文档作者尚未发现任何非国家半导体零件在使用 COMTEST 程序时报告零差异。还应注意,国家半导体多年来已经发布了五个版本的 16550,最新的零件的行为与被视为功能基准的经典 NS16550AFN 略有不同。COMTEST 似乎对国家半导体产品线内的差异视而不见,并且在国家半导体零件上没有报告任何错误(原始 16550 除外),即使存在正式的勘误表描述了零件的 A、B 和 C 修订版中的错误,因此必须考虑 COMTEST 中的这种偏差。 |
需要了解的是,简单地对 COMTEST 的差异进行计数并不能揭示哪些差异重要,哪些差异不重要。例如,上面列出的两个具有内部 UART 的调制解调器中报告的大约一半差异是由于克隆 UART 不支持五位和六位字符模式造成的。真正的 16550、16450 和 8250 UART 都支持这些模式,并且 COMTEST 检查这些模式的功能,因此报告了 50 多个差异。但是,几乎没有现代调制解调器支持五位或六位字符,特别是那些具有纠错和压缩功能的调制解调器。这意味着可以忽略与五位和六位字符模式相关的差异。
COMTEST 报告的许多差异都与时序有关。在许多克隆设计中,当主机从一个端口读取数据时,某些其他端口中的状态位可能不会在与真正的 NS16550AFN 相同的时间内更新(有些更快,有些更慢),而 COMTEST 会查找这些差异。这意味着差异的数量可能会产生误导,一个设备可能只有一个或两个差异,但它们非常严重,而另一个设备更新状态寄存器的速度比参考零件快或慢(这可能永远不会影响正确编写的驱动程序的操作)则可能会报告数十个差异。
COMTEST 可以用作筛选工具,提醒管理员可能存在可能导致问题或必须作为特殊情况处理的不兼容组件。
如果您在调制解调器中的 16550 上运行 COMTEST,或者调制解调器连接到串行端口,则需要首先向调制解调器发出 ATE0&W 命令,以便调制解调器不会回显任何测试字符。如果您忘记执行此操作,COMTEST 将至少报告此差异。
Error (6)...Timeout interrupt failed: IIR = c1 LSR = 61
1.8. 8250/16450/16550 寄存器
8250/16450/16550 UART 占用八个连续的 I/O 端口地址。在 IBM PC 中,为这八个端口定义了两个位置,它们统称为 COM1 和 COM2。PC 克隆和附加卡的制造商创建了另外两个区域,称为 COM3 和 COM4,但这些额外的 COM 端口在某些系统上与其他硬件发生冲突。最常见的冲突是与提供 IBM 8514 模拟的视频适配器。
COM1 位于 0x3f8 到 0x3ff 之间,通常使用 IRQ 4。COM2 位于 0x2f8 到 0x2ff 之间,通常使用 IRQ 3。COM3 位于 0x3e8 到 0x3ef 之间,没有标准化的 IRQ。COM4 位于 0x2e8 到 0x2ef 之间,没有标准化的 IRQ。
下面提供了 8250/16450/16550 UART 的 I/O 端口说明。
I/O 端口 | 允许访问 | 描述 |
---|---|---|
+0x00 | 写入(DLAB==0) | 发送保持寄存器 (THR)。 写入此端口的信息被视为数据字,并将由 UART 发送。 |
+0x00 | 读取(DLAB==0) | 接收缓冲区寄存器 (RBR)。 UART 从串行链路接收到的任何数据字都可以通过读取此端口由主机访问。 |
+0x00 | 写入/读取(DLAB==1) | 除数锁存器 LSB (DLL) 此值将作为除数,用于分频主输入时钟(在 IBM PC 中,主时钟为 1.8432MHz),得到的时钟将决定 UART 的波特率。该寄存器保存除数的第 0 到第 7 位。 |
+0x01 | 写入/读取(DLAB==1) | 除数锁存器高位字节 (DLH) 此值将作为除数,用于分频主输入时钟(在 IBM PC 中,主时钟为 1.8432MHz),得到的时钟将决定 UART 的波特率。该寄存器保存除数的第 8 到第 15 位。 |
+0x01 | 写/读 (DLAB==0) | 中断使能寄存器 (IER) 8250/16450/16550 UART 将事件分为四类。每类都可以配置为在任何事件发生时生成中断。8250/16450/16550 UART 生成一个单独的外部中断信号,无论已启用类别中发生了多少事件。主机处理器负责响应中断,然后轮询已启用的中断类别(通常所有类别都启用了中断),以确定中断的真正原因。 |
+0x02 | 写 | FIFO 控制寄存器 (FCR)(此端口在 8250 和 16450 UART 上不存在。) 这两个位控制在 FIFO 处于活动状态时接收器何时生成中断。 |
+0x02 | 读 | 中断识别寄存器 |
+0x03 | 写/读 | 线路控制寄存器 (LCR) |
+0x04 | 写/读 | 调制解调器控制寄存器 (MCR) |
+0x05 | 写/读 | 线路状态寄存器 (LSR) |
+0x06 | 写/读 | 调制解调器状态寄存器 (MSR) |
+0x07 | 写/读 | 暂存器 (SCR)。此寄存器在 UART 中不执行任何功能。主机可以将任何值写入此位置,稍后由主机读取。 |
1.9. 超越 16550A UART
尽管 National Semiconductor 没有提供任何与 16550 兼容并提供其他功能的组件,但各种其他供应商提供了。下面描述了其中一些组件。应该理解,为了有效地利用这些改进,可能需要由芯片供应商提供驱动程序,因为大多数流行的操作系统都不支持超出 16550 提供的功能的功能。
- ST16650
默认情况下,此部件类似于 NS16550A,但可以可选地启用扩展的 32 字节发送和接收缓冲区。由 StarTech 制造。
- TIL16660
默认情况下,此部件的行为类似于 NS16550A,但可以可选地启用扩展的 64 字节发送和接收缓冲区。由 Texas Instruments 制造。
- Hayes ESP
此专有插卡包含一个2048字节的发送和接收缓冲区,并支持高达230.4Kbit/sec的数据速率。由Hayes制造。
除了这些“哑”UART之外,许多供应商还生产智能串行通信板。这种类型的设计通常提供一个与多个UART接口的微处理器,处理和缓冲数据,然后在必要时提醒主PC处理器。由于在这种类型的通信系统中,UART不是由PC处理器直接访问的,因此供应商无需使用与8250、16450或16550 UART兼容的UART。这使得设计人员可以自由选择可能具有更好性能特征的组件。
2. 配置sio驱动程序
sio驱动程序提供对基于NS8250、NS16450、NS16550和NS16550A的EIA RS-232C(CCITT V.24)通信接口的支持。还支持多个多端口卡。有关详细的技术文档,请参阅sio(4)手册页。
2.1. Digi International (DigiBoard) PC/8
由Andrew Webster <awebster@pubnix.net>
贡献。1995年8月26日。
这是一个来自装有Digi International PC/8(带有16550)的机器的配置片段。它有8个调制解调器连接到这8条线路,并且运行良好。不要忘记添加options COM_MULTIPORT
,否则它将无法正常工作!
device sio4 at isa? port 0x100 flags 0xb05 device sio5 at isa? port 0x108 flags 0xb05 device sio6 at isa? port 0x110 flags 0xb05 device sio7 at isa? port 0x118 flags 0xb05 device sio8 at isa? port 0x120 flags 0xb05 device sio9 at isa? port 0x128 flags 0xb05 device sio10 at isa? port 0x130 flags 0xb05 device sio11 at isa? port 0x138 flags 0xb05 irq 9
设置此配置的技巧是,标志的MSB表示最后一个SIO端口,在本例中为11,因此标志为0xb05。
2.2. Boca 16
由Don Whiteside <whiteside@acm.org>
贡献。1995年8月26日。
在FreeBSD上使Boca 16端口板工作所需的步骤非常简单,但是您需要一些东西才能使其工作。
您需要安装内核源代码以便重新编译必要的选项,或者您需要其他人为您编译它。2.0.5默认内核不启用多端口支持,并且无论如何您都需要为每个端口添加一个设备条目。
其次,您需要知道Boca板的中断和IO设置,以便您可以在内核中正确设置这些选项。
一个重要的说明 - Boca 16的实际UART芯片位于连接器盒中,而不是在内部板上本身。因此,如果您将其拔掉,则对这些端口的探测将失败。我从未测试过在拔掉盒子并重新插入的情况下启动,我建议您也不要这样做。
如果您还没有设置自定义内核配置文件,请参阅FreeBSD手册的内核配置章节以了解常规步骤。以下是Boca 16板的具体信息,并假设您使用内核名称MYKERNEL并使用vi进行编辑。
在配置文件中添加以下行:
options COM_MULTIPORT
到配置文件中。
在当前的
device sion
行中,您需要添加16个设备。以下示例适用于中断为3且基本IO地址为100h的Boca板。每个端口的IO地址比前一个端口高8个十六进制,因此地址为100h、108h、110h…。device sio1 at isa? port 0x100 flags 0x1005 device sio2 at isa? port 0x108 flags 0x1005 device sio3 at isa? port 0x110 flags 0x1005 device sio4 at isa? port 0x118 flags 0x1005 ... device sio15 at isa? port 0x170 flags 0x1005 device sio16 at isa? port 0x178 flags 0x1005 irq 3
除非您使用完全相同的sio分配,否则必须更改flags条目。标志根据0x
MYY
设置,其中M表示主端口(Boca 16上的最后一个端口)的次编号,YY表示FIFO是否启用(启用)、是否使用IRQ共享(是)以及是否存在AST/4兼容的IRQ控制寄存器(否)。在本例中,flags 0x1005
表示主端口为sio16。如果我添加另一个板并将sio17到sio28分配给它,则该板上的所有16个端口的标志将为0x1C05,其中1C表示主端口的次编号。不要更改05设置。
保存并完成内核配置,重新编译、安装并重新启动。假设您已成功安装重新编译的内核并将其设置为正确的地址和IRQ,则您的引导消息应指示Boca端口的探测成功,如下所示:(显然sio编号、IO和IRQ可能不同)
sio1 at 0x100-0x107 flags 0x1005 on isa sio1: type 16550A (multiport) sio2 at 0x108-0x10f flags 0x1005 on isa sio2: type 16550A (multiport) sio3 at 0x110-0x117 flags 0x1005 on isa sio3: type 16550A (multiport) sio4 at 0x118-0x11f flags 0x1005 on isa sio4: type 16550A (multiport) sio5 at 0x120-0x127 flags 0x1005 on isa sio5: type 16550A (multiport) sio6 at 0x128-0x12f flags 0x1005 on isa sio6: type 16550A (multiport) sio7 at 0x130-0x137 flags 0x1005 on isa sio7: type 16550A (multiport) sio8 at 0x138-0x13f flags 0x1005 on isa sio8: type 16550A (multiport) sio9 at 0x140-0x147 flags 0x1005 on isa sio9: type 16550A (multiport) sio10 at 0x148-0x14f flags 0x1005 on isa sio10: type 16550A (multiport) sio11 at 0x150-0x157 flags 0x1005 on isa sio11: type 16550A (multiport) sio12 at 0x158-0x15f flags 0x1005 on isa sio12: type 16550A (multiport) sio13 at 0x160-0x167 flags 0x1005 on isa sio13: type 16550A (multiport) sio14 at 0x168-0x16f flags 0x1005 on isa sio14: type 16550A (multiport) sio15 at 0x170-0x177 flags 0x1005 on isa sio15: type 16550A (multiport) sio16 at 0x178-0x17f irq 3 flags 0x1005 on isa sio16: type 16550A (multiport master)
如果消息速度太快而无法查看,
# dmesg | more
将显示引导消息。
接下来,必须使用/dev/MAKEDEV脚本在/dev中创建设备的相应条目。如果您在FreeBSD 5.X上运行具有编译了devfs(5)支持的内核,则可以省略此步骤。
如果您确实需要创建/dev条目,请以
root
身份运行以下命令:# cd /dev # ./MAKEDEV tty1 # ./MAKEDEV cua1 (everything in between) # ./MAKEDEV ttyg # ./MAKEDEV cuag
如果您由于某种原因不希望或不需要呼叫输出设备,则可以放弃创建cua*设备。
如果您想快速而粗略地确保设备正常工作,您可以简单地将调制解调器插入每个端口,然后(以root身份)
# echo at > ttyd*
对于您创建的每个设备。您应该看到每个工作端口的RX指示灯闪烁。
2.3. 对廉价多UART卡的支持
由Helge Oldach贡献 hmo@sep.hamburg.com,1999年9月
是否曾经想过FreeBSD对您带有两个(或更多)COM端口共享IRQ的20美元多I/O卡的支持?以下是方法
通常,支持此类板卡的唯一选项是为每个端口使用不同的IRQ。例如,如果您的CPU板有一个板载COM1端口(即sio0-IO地址0x3F8和IRQ 4),并且您有一个带有两个UART的扩展板,您通常需要将其配置为COM2(即sio1-IO地址0x2F8和IRQ 3),以及第三个端口(即sio2)为IO 0x3E8和IRQ 5。显然,这浪费了IRQ资源,因为原则上应该可以使用前面部分中描述的COM_MULTIPORT
配置使用单个IRQ运行两个扩展板端口。
这种廉价的I/O板通常具有一个用于COM端口的4x3跳线矩阵,类似于以下内容
o o o * Port A | o * o * Port B | o * o o IRQ 2 3 4 5
此处显示的是端口A接线到IRQ 5,端口B接线到IRQ 3。您特定板卡上的IRQ列可能有所不同 - 其他板卡可能提供IRQ 3、4、5和7的跳线。
人们可能会得出结论,使用手工制作的线制跳线覆盖IRQ 3列中的所有三个连接点,将两个端口都接线到IRQ 3可以解决问题,但事实并非如此。您无法复制IRQ 3,因为每个UART的输出驱动器以“图腾柱”方式连接,因此,如果其中一个UART驱动IRQ 3,则输出信号将不是您期望的信号。根据扩展板或主板的实现,IRQ 3线将持续保持高电平或始终保持低电平。
您需要解耦两个UART的IRQ驱动器,以便板卡的IRQ线仅在(且仅在)其中一个UART发出IRQ时才变高,否则保持低电平。Joerg Wunsch j@ida.interface-business.de提出了解决方案:焊接一个由两个二极管(强烈建议使用锗或肖特基型)和一个1 kOhm电阻组成的“或门”。以下是原理图,从上面的4x3跳线场开始
Diode +---------->|-------+ / | o * o o | 1 kOhm Port A +----|######|-------+ o * o o | | Port B `-------------------+ ==+== o * o o | Ground \ | +--------->|-------+ IRQ 2 3 4 5 Diode
二极管的阴极连接到一个公共点,并与一个1 kOhm下拉电阻一起连接。将电阻连接到地线以避免总线上的IRQ线浮动至关重要。
现在我们准备配置内核。继续使用此示例,我们将配置
# standard on-board COM1 port device sio0 at isa? port "IO_COM1" flags 0x10 # patched-up multi-I/O extension board options COM_MULTIPORT device sio1 at isa? port "IO_COM2" flags 0x205 device sio2 at isa? port "IO_COM3" flags 0x205 irq 3
请注意,sio1和sio2的flags
设置确实至关重要;有关详细信息,请参阅sio(4)。(通常,“flags”属性中的2
指的是sio2
,它保存IRQ,并且您肯定希望得到一个5
低字节。)如果启用了内核详细模式,则这应该会产生类似于以下内容的结果
sio0: irq maps: 0x1 0x11 0x1 0x1
sio0 at 0x3f8-0x3ff irq 4 flags 0x10 on isa
sio0: type 16550A
sio1: irq maps: 0x1 0x9 0x1 0x1
sio1 at 0x2f8-0x2ff flags 0x205 on isa
sio1: type 16550A (multiport)
sio2: irq maps: 0x1 0x9 0x1 0x1
sio2 at 0x3e8-0x3ef irq 3 flags 0x205 on isa
sio2: type 16550A (multiport master)
尽管/sys/i386/isa/sio.c在使用上述“irq maps”数组时有些隐晦,但基本思想是您观察到第一个、第三个和第四个位置的0x1
。这意味着相应的IRQ已在输出时设置并在之后清除,这正是我们所期望的。如果您的内核没有显示此行为,则很可能是您的接线存在问题。
3. 配置cy驱动程序
由Alex Nash贡献。1996年6月6日。
Cyclades多端口卡基于cy驱动程序,而不是其他多端口卡使用的常用sio驱动程序。配置非常简单,只需
将cy设备添加到您的内核配置中(请注意,您的irq和iomem设置可能不同)。
device cy0 at isa? irq 10 iomem 0xd4000 iosiz 0x2000
重新构建并安装新的内核。
通过键入以下命令创建设备节点(以下示例假设一个8端口板)
# cd /dev # for i in 0 1 2 3 4 5 6 7;do ./MAKEDEV cuac$i ttyc$i;done
如果适用,请通过复制串行设备(
ttyd
)条目并在ttyd
处使用ttyc
来向/etc/ttys添加拨号条目。例如ttyc0 "/usr/libexec/getty std.38400" unknown on insecure ttyc1 "/usr/libexec/getty std.38400" unknown on insecure ttyc2 "/usr/libexec/getty std.38400" unknown on insecure ... ttyc7 "/usr/libexec/getty std.38400" unknown on insecure
使用新内核重新启动。
4. 配置si驱动程序
由Nick Sayer <nsayer@FreeBSD.org>
贡献。1998年3月25日。
Specialix SI/XIO和SX多端口卡使用si驱动程序。一台机器最多可以有4张主机卡。支持以下主机卡
ISA SI/XIO主机卡(2个版本)
EISA SI/XIO主机卡
PCI SI/XIO主机卡
ISA SX主机卡
PCI SX主机卡
尽管SX和SI/XIO主机卡看起来截然不同,但它们的功能基本相同。主机卡不使用I/O位置,而是需要32K内存块。ISA卡的出厂配置将其放置在0xd0000-0xd7fff
处。它们还需要一个IRQ。PCI卡当然会自动配置自身。
您可以将最多4个外部模块连接到每个主机卡。外部模块包含4个或8个串行端口。它们有以下几种类型
SI 4或8端口模块。每个端口支持高达57600 bps。
XIO 8端口模块。每个端口支持高达115200 bps。有一种类型的XIO模块具有7个串行端口和1个并行端口。
SXDC 8端口模块。每个端口支持高达921600 bps。与XIO一样,也有一个模块也带有一个并行端口。
要配置ISA主机卡,请将以下行添加到内核配置文件中,并根据需要更改数字
device si0 at isa? iomem 0xd0000 irq 11
对于SX ISA主机卡,有效的IRQ编号为9、10、11、12和15;对于SI/XIO ISA主机卡,有效的IRQ编号为11、12和15。
要配置EISA或PCI主机卡,请使用以下行
device si0
添加配置条目后,重新构建并安装新的内核。
如果您在FreeBSD 5.X中使用devfs(5),则以下步骤不是必需的。 |
使用新内核重新启动后,您需要在/dev中创建设备节点。MAKEDEV脚本将为您处理此操作。计算您拥有的总端口数,然后键入
# cd /dev
# ./MAKEDEV ttyAnn cuaAnn
(其中nn是端口数)
如果您希望在这些端口上显示登录提示,则需要在/etc/ttys中添加如下所示的行
ttyA01 "/usr/libexec/getty std.9600" vt100 on insecure
根据需要更改终端类型。对于调制解调器,dialup
或unknown
都可以。
上次修改时间:2021年11月3日,作者Sergio Carlavilla Delgado