SCC.C - 基于 Z8530 的 HDLC 卡的 Linux 驱动程序,用于 AX.25¶
这是文档的子集。 要使用此驱动程序,您必须拥有来自以下的完整软件包
互联网
请注意,本文档中的信息可能已过时。 新版本的文档以及其他重要的 Linux 内核 AX.25 文档和程序的链接可在 http://yaina.de/jreuter 上找到
版权所有 © 1993,2000 Joerg Reuter DL1BKE <jreuter@yaina.de>
部分版权所有 © 1993 Guido ten Dolle PE1NNZ
有关完整的版权声明,请参见 >> Copying.Z8530DRV <<
1. 驱动程序的初始化¶
要使用该驱动程序,必须执行 3 个步骤
如果编译为模块:加载模块
使用 sccinit 设置硬件、调制解调器和 KISS 参数
使用“ifconfig”将每个通道连接到 Linux 内核 AX.25
与低于 2.4 的版本不同,此驱动程序是一个真正的网络设备驱动程序。 如果您想运行 xNOS 而不是我们精良的内核 AX.25,请使用 2.x 版本(可从上述站点获得)或阅读 AX.25-HOWTO 了解如何在网络设备驱动程序上模拟 KISS TNC。
1.1 加载模块¶
- (如果您要将驱动程序编译为内核映像的一部分,
跳过本章并继续 1.2)
在使用模块之前,您必须使用以下命令加载它
insmod scc.o
请阅读 module-init-tools 附带的“man insmod”。
您应该将 insmod 包含在 /etc/rc.d/rc.* 文件之一中,并且不要忘记在此之后插入对 sccinit 的调用。 它将读取您的 /etc/z8530drv.conf。
1.2. /etc/z8530drv.conf¶
要设置所有参数,您必须从您的 rc.* 文件之一运行 /sbin/sccinit。 这必须在您可以“ifconfig”接口之前完成。 Sccinit 读取文件 /etc/z8530drv.conf 并设置硬件、调制解调器和 KISS 参数。 此软件包随附一个示例文件。 将其更改为您的需要。
该文件本身由两个主要部分组成。
1.2.1 硬件参数配置¶
硬件设置部分为每个 Z8530 定义以下参数
chip 1
data_a 0x300 # data port A
ctrl_a 0x304 # control port A
data_b 0x301 # data port B
ctrl_b 0x305 # control port B
irq 5 # IRQ No. 5
pclock 4915200 # clock
board BAYCOM # hardware type
escc no # enhanced SCC chip? (8580/85180/85280)
vector 0 # latch for interrupt vector
special no # address of special function register
option 0 # option to set via sfr
- 芯片
这只是一个分隔符,使 sccinit 的编程更简单一些。 参数不起作用。
- data_a
此 Z8530 的数据端口 A 的地址(必需)
- ctrl_a
控制端口 A 的地址(必需)
- data_b
数据端口 B 的地址(必需)
- ctrl_b
控制端口 B 的地址(必需)
- irq
此芯片使用的 IRQ。 不同的芯片可以使用不同的 IRQ 或相同的 IRQ。 如果它们共享一个中断,则需要在芯片定义中指定。
- pclock - Z8530 的 PCLK 引脚上的时钟(选项,4915200 是
默认值),以赫兹为单位测量
- 板
板的“类型”
SCC 类型
值
PA0HZP SCC 卡
PA0HZP
EAGLE 卡
EAGLE
PC100 卡
PC100
PRIMUS-PC (DG9BL) 卡
PRIMUS
BayCom (U)SCC 卡
BAYCOM
- escc
如果您想要支持 ESCC 芯片(8580、85180、85280),请将其设置为“yes”(选项,默认为“no”)
- 向量
PA0HZP 卡的向量锁存器(又名“intack 端口”)的地址。 所有芯片只能有一个向量锁存器!(选项,默认为 0)
- 特殊
多个卡上的特殊功能寄存器的地址。(选项,默认为 0)
选项 - 您写入该寄存器的值(选项,默认为 0)
您最多可以指定四个芯片(8 个通道)。 如果这还不够,只需更改
#define MAXSCC 4
为更高的值。
BAYCOM USCC 的示例:¶
chip 1
data_a 0x300 # data port A
ctrl_a 0x304 # control port A
data_b 0x301 # data port B
ctrl_b 0x305 # control port B
irq 5 # IRQ No. 5 (#)
board BAYCOM # hardware type (*)
#
# SCC chip 2
#
chip 2
data_a 0x302
ctrl_a 0x306
data_b 0x303
ctrl_b 0x307
board BAYCOM
PA0HZP 卡的示例:¶
chip 1
data_a 0x153
data_b 0x151
ctrl_a 0x152
ctrl_b 0x150
irq 9
pclock 4915200
board PA0HZP
vector 0x168
escc no
#
#
#
chip 2
data_a 0x157
data_b 0x155
ctrl_a 0x156
ctrl_b 0x154
irq 9
pclock 4915200
board PA0HZP
vector 0x168
escc no
DRSI 应该可以使用它:¶
(实际上:两张 DRSI 卡...)
chip 1
data_a 0x303
data_b 0x301
ctrl_a 0x302
ctrl_b 0x300
irq 7
pclock 4915200
board DRSI
escc no
#
#
#
chip 2
data_a 0x313
data_b 0x311
ctrl_a 0x312
ctrl_b 0x310
irq 7
pclock 4915200
board DRSI
escc no
请注意,您不能使用 DRSI 卡的板载波特率发生器。 使用“mode dpll”作为时钟源(请参见下文)。
这是基于 Mike Bilow 提供的信息(并由 Paul Helay 验证)
实用程序“gencfg”¶
如果您只知道 DOS 的 PE1CHL 驱动程序的参数,请运行 gencfg。 它将生成正确的端口地址(我希望)。 它的参数与您在 net 中使用“attach scc”命令的参数完全相同,只是字符串“init”不能出现。 例子
gencfg 2 0x150 4 2 0 1 0x168 9 4915200
将为 OptoSCC 打印一个骨架 z8530drv.conf 到 stdout。
gencfg 2 0x300 2 4 5 -4 0 7 4915200 0x10
对 BAYCOM USCC 卡执行相同的操作。 我认为编辑 scc_config.h 要容易得多...
1.2.2 通道配置¶
通道定义分为每个通道的三个子部分
scc0 的示例
# DEVICE
device scc0 # the device for the following params
# MODEM / BUFFERS
speed 1200 # the default baudrate
clock dpll # clock source:
# dpll = normal half duplex operation
# external = MODEM provides own Rx/Tx clock
# divider = use full duplex divider if
# installed (1)
mode nrzi # HDLC encoding mode
# nrzi = 1k2 MODEM, G3RUH 9k6 MODEM
# nrz = DF9IC 9k6 MODEM
#
bufsize 384 # size of buffers. Note that this must include
# the AX.25 header, not only the data field!
# (optional, defaults to 384)
# KISS (Layer 1)
txdelay 36 # (see chapter 1.4)
persist 64
slot 8
tail 8
fulldup 0
wait 12
min 3
maxkey 7
idle 3
maxdef 120
group 0
txoff off
softdcd on
slip off
这些部分内部的顺序并不重要。 这些部分的顺序很重要。 MODEM 参数是在第一个识别的 KISS 参数中设置的...
请注意,您只能在启动(或 insmod)后初始化一次主板。 您可以使用 Sccparam 程序或通过 KISS 更改所有参数,但“mode”和“clock”。 只是为了避免安全漏洞...
此分频器通常安装在 SCC-PBC (PA0HZP) 上,或者根本不存在(BayCom)。 它将 DPLL(数字锁相环)的输出反馈为传输时钟。 在没有安装分频器的情况下使用此模式通常会导致收发器保持按键状态,直到 maxkey 过期 --- 当然没有发送任何内容(有用)。
2. 您的 AX.25 软件连接通道¶
2.1 内核 AX.25¶
要设置 AX.25 设备,您只需键入
ifconfig scc0 44.128.1.1 hw ax25 dl0tha-7
这将创建一个 IP 号码为 44.128.20.107 和呼号“dl0tha”的网络接口。 如果您(尚未)没有任何 IP 号码,则可以使用任何 44.128.0.0 网络。 请注意,您不需要 axattach。 axattach(如 slattach)的目的是创建连接到 TTY 的 KISS 网络设备。 请阅读 ax25-utils 和 AX.25-HOWTO 的文档,以了解如何设置内核 AX.25 的参数。
2.2 NOS、NET 和 TFKISS¶
由于 TTY 驱动程序(又名 KISS TNC 仿真)已消失,您需要模拟旧行为。 使用这些程序的代价是您可能需要编译内核 AX.25,无论您是否实际使用它。 首先设置您的 /etc/ax25/axports,例如
9k6 dl0tha-9 9600 255 4 9600 baud port (scc3)
axlink dl0tha-15 38400 255 4 Link to NOS
现在“ifconfig”scc 设备
ifconfig scc3 44.128.1.1 hw ax25 dl0tha-9
您现在可以 axattach 一个伪 TTY
axattach /dev/ptys0 axlink
并在那里启动您的 NOS 并附加 /dev/ptys0。 问题是 NOS 只能通过内核 AX.25 进行中继(在 DAMA 控制的通道上是灾难性的)才能访问。 要解决此问题,请配置“rxecho”以将传入帧从“9k6”回显到“axlink”,并将传出帧从“axlink”回显到“9k6”并启动
rxecho
或只需使用 z8530drv-utils 附带的“kissbridge”
ifconfig scc3 hw ax25 dl0tha-9
kissbridge scc3 /dev/ptys0
3. 参数的调整和显示¶
3.1 显示 SCC 参数:¶
连接 SCC 通道后,可以使用 param 程序显示参数设置和一些统计信息
dl1bke-u:~$ sccstat scc0
Parameters:
speed : 1200 baud
txdelay : 36
persist : 255
slottime : 0
txtail : 8
fulldup : 1
waittime : 12
mintime : 3 sec
maxkeyup : 7 sec
idletime : 3 sec
maxdefer : 120 sec
group : 0x00
txoff : off
softdcd : on
SLIP : off
Status:
HDLC Z8530 Interrupts Buffers
-----------------------------------------------------------------------
Sent : 273 RxOver : 0 RxInts : 125074 Size : 384
Received : 1095 TxUnder: 0 TxInts : 4684 NoSpace : 0
RxErrors : 1591 ExInts : 11776
TxErrors : 0 SpInts : 1503
Tx State : idle
显示的状态信息是
已发送 |
传输的帧数 |
已收到 |
收到的帧数 |
RxErrors |
接收错误数(CRC、ABORT) |
TxErrors |
丢弃的 Tx 帧数(由于各种原因) |
Tx 状态 |
Tx 中断处理程序的状态:空闲/繁忙/活动/尾部 (2) |
RxOver |
接收器溢出的次数 |
TxUnder |
发射器欠载的次数 |
RxInts |
接收器中断的次数 |
TxInts |
发射器中断的次数 |
EpInts |
接收器特殊条件中断的次数 |
SpInts |
外部/状态中断的次数 |
大小 |
AX.25 帧的最大大小(带 AX.25 标头!) |
NoSpace |
无法分配缓冲区的次数 |
溢出是不正常的。 如果发生大量溢出,则波特率与接口数的乘积对于计算机的处理能力来说太高。 NoSpace 错误不太可能是由驱动程序或内核 AX.25 引起的。
3.2 设置参数¶
模拟的 KISS TNC 的参数设置以相同的方式在 SCC 驱动程序中完成。 您可以使用 ax25-utils 软件包中的 kissparms 程序更改参数,也可以使用程序“sccparam”
sccparam <device> <paramname> <decimal-|hexadecimal value>
您可以更改以下参数
参数 |
值 |
---|---|
速度 |
1200 |
txdelay |
36 |
persist |
255 |
slottime |
0 |
txtail |
8 |
fulldup |
1 |
waittime |
12 |
mintime |
3 |
maxkeyup |
7 |
idletime |
3 |
maxdefer |
120 |
group |
0x00 |
txoff |
off |
softdcd |
on |
SLIP |
off |
参数具有以下含义
- 速度
此通道上的波特率(比特/秒)
示例:sccparam /dev/scc3 速度 9600
- txdelay
在传输器按键后直到发送第一个字节的延迟(以 10 毫秒为单位)。 这通常在 TNC 中称为“TXDELAY”。 当指定 0 时,驱动程序将仅等待 CTS 信号被断言。 这假设调制解调器和/或发射器中存在一个计时器或其他电路,当发射器准备好数据时,该计时器断言 CTS。 此参数的正常值为 30-36。
示例:sccparam /dev/scc0 txd 20
- persist
这是当发现通道空闲时发射器将被按键的概率。 它是 0 到 255 之间的值,概率为 (value+1)/256。 该值应在 50-60 附近,并且当通道使用更频繁时应降低。
示例:sccparam /dev/scc2 persist 20
- slottime
这是通道采样之间的时间。 它以 10 毫秒为单位表示。 大约 200-300 毫秒(值 20-30)似乎是一个不错的选择。
示例:sccparam /dev/scc0 slot 20
- tail
在最后一个字节的数据包传输到 SCC 后,发射器将保持按键状态的时间。 这是必要的,因为 CRC 和标志仍然必须在发射器断键之前离开 SCC。 该值取决于选择的波特率。 几个字符时间应该足够了,例如 1200 波特时为 40 毫秒。(值 4)此参数的值以 10 毫秒为单位。
示例:sccparam /dev/scc2 4
- full
全双工模式开关。 这可以是以下值之一
- 0:接口将在 CSMA 模式下运行(正常
半双工数据包无线电操作)
- 1:全双工模式,即发射器将在
任何时候按键,无需检查接收到的载波。 当没有要发送的数据包时,它将被释放按键。
- 2:与 1 类似,但发射器将保持按键状态,也
当没有要发送的数据包时。 在这种情况下将发送标志,直到超时(参数 10)发生。
示例:sccparam /dev/scc0 fulldup off
- wait
帧被排队以进行传输后,任何传输尝试之前的初始等待时间。 这是 CSMA 模式中第一个插槽的长度。 在全双工模式下,它设置为 0 以获得最大性能。 此参数的值以 10 毫秒为单位。
示例:sccparam /dev/scc1 wait 4
- maxkey
发射器将被按键以发送数据包的最长时间,以秒为单位。 这在繁忙的 CSMA 通道上可能很有用,以避免在生成大量流量时“获得不良声誉”。 在指定的时间过去后,将不会启动新的帧。 相反,发射器将关闭指定的时间(参数 min),然后将再次启动所选的按键算法。 值 0 以及“off”将禁用此功能,并允许无限的传输时间。
示例:sccparam /dev/scc0 maxk 20
- min
这是当超过最大传输时间时发射器将关闭的时间。
示例:sccparam /dev/scc3 min 10
- idle
此参数指定全双工 2 模式下的最大空闲时间,以秒为单位。 如果在此时间内没有发送任何帧,则发射器将被释放按键。 值 0 与全双工模式 1 的结果相同。可以禁用此参数。
示例:sccparam /dev/scc2 idle off # 永远传输
- maxdefer
这是等待空闲通道发送的最长时间(以秒为单位)。 当此计时器过期时,发射器将立即按键。 如果您喜欢与其他用户发生问题,则应将其设置为一个非常低的值 ;-)
示例:sccparam /dev/scc0 maxdefer 240 # 2 分钟
- txoff
当此参数的值为 0 时,数据包的传输被启用。 否则将被禁用。
示例:sccparam /dev/scc2 txoff on
- group
可以构建特殊的无线电设备以在同一频段上使用多个频率,例如使用多个接收器,并且只有一个可以在频率之间切换的发射器。 此外,您可以连接多个在同一频段上处于活动状态的无线电。 在这些情况下,在多个频率上进行传输是不可能的,或者不是一个好主意。 SCC 驱动程序提供了一种锁定不同接口上的发射器的方法,使用“param <interface> group <x>”命令。 这仅在您使用 CSMA 模式(参数 full = 0)时才有效。
如果您不想要组限制,则数字 <x> 必须为 0,并且可以通过以下方式计算以创建受限组:<x> 是某些八进制数的总和
200
只有当组中的所有其他发射器都关闭时,此发射器才会被按键。
100
只有当组中所有其他接口的载波检测都关闭时,此发射器才会被按键。
0xx
一个字节,可用于定义不同的组。 当它们的 xx 值之间的逻辑 AND 非零时,接口位于同一组中。
示例
当 2 个接口使用组 201 时,它们的发射器永远不会同时按键。
当 2 个接口使用组 101 时,发射器仅在两个通道同时清除时才会按键。 当组 301 时,发射器不会同时按键。
在设置参数之前,不要忘记将八进制数转换为十进制数。
示例:(待写)
- softdcd
使用软件 dcd 而不是真正的 dcd... 对于非常慢的静噪很有用。
示例:sccparam /dev/scc0 soft on
4. 问题¶
如果您使用 BayCom USCC 卡遇到 tx 问题,请检查 8530 的制造商。 SGS 芯片的时序略有不同。 尝试 Zilog... 解决方案是写入寄存器 8 而不是数据端口,但这不适用于 ESCC 芯片。 叹息!
一个非常常见的问题是 PTT 会锁定,直到 maxkeyup 计时器过期,尽管中断和时钟源是正确的。 在大多数情况下,使用 CONFIG_SCC_DELAY(使用 make config 设置)编译驱动程序可以解决问题。 有关更多提示,请阅读(伪)FAQ 和 z8530drv-utils 附带的文档。
我收到报告称该驱动程序在一些基于 386 的系统上存在问题。(即 Amstrad)这些系统具有伪造的 AT 总线时序,这会导致中断的延迟响应。 您可以通过查看 Sccstat 对于可疑端口的输出来识别这些问题。 如果它显示欠载和溢出,则您拥有这样的系统。
延迟处理接收到的数据:这取决于
内核版本
内核配置文件是否已编译
高中断负载
机器的高负载 --- 在编译内核时运行 X、Xmorph、XV 和 Povray... 嗯... 即使使用 32 MB RAM... ;-) 或者在 8 MB 机器上为整个 .ampr.org 域运行 named...
使用来自 rxecho 或 kissbridge 的信息。
内核崩溃:请阅读 /linux/README 并确定它是否确实发生在 scc 驱动程序中。
如果您无法解决问题,请发送给我
问题的描述,
有关您的硬件(计算机系统、scc 板、调制解调器)的信息
您的内核版本
cat /proc/net/z8530 的输出
4. Thor RLC100¶
奇怪的是,此板似乎无法与驱动程序一起使用。 有人启动并运行它了吗?
非常感谢 Linus Torvalds 和 Alan Cox 将驱动程序包含在 Linux 标准发行版中并提供支持。
Joerg Reuter ampr-net: dl1bke@db0pra.ampr.org
AX-25 : DL1BKE @ DB0ABH.#BAY.DEU.EU
Internet: jreuter@yaina.de
WWW : http://yaina.de/jreuter