SCC.C - 基于 Z8530 的 HDLC 卡用于 AX.25 的 Linux 驱动程序¶
这只是文档的一部分。要使用此驱动程序,您必须从以下位置获取完整软件包
互联网
请注意,本文档中的信息可能已过时。有关文档的新版本,以及指向其他重要的 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 设置硬件、MODEM 和 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’。
你应该在 /etc/rc.d/rc.* 文件之一中包含 insmod,并且不要忘记在此之后插入对 sccinit 的调用。 它会读取你的 /etc/z8530drv.conf。
1.2. /etc/z8530drv.conf¶
要设置所有参数,你必须从你的 rc.* 文件之一运行 /sbin/sccinit。 这必须在你可以 “ifconfig” 一个接口之前完成。 Sccinit 读取文件 /etc/z8530drv.conf 并设置硬件、MODEM 和 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 是
默认值),以赫兹为单位测量
- board
板的 “类型”
SCC 类型
值
PA0HZP SCC 卡
PA0HZP
EAGLE 卡
EAGLE
PC100 卡
PC100
PRIMUS-PC (DG9BL) 卡
PRIMUS
BayCom (U)SCC 卡
BAYCOM
- escc
如果你想支持 ESCC 芯片(8580、85180、85280),请将其设置为 “yes”(可选,默认为 “no”)
- vector
PA0HZP 卡的矢量锁存器(也称为 “intack 端口”)的地址。 所有芯片只能有一个矢量锁存器!(可选,默认为 0)
- special
多个卡上的特殊功能寄存器的地址。(可选,默认为 0)
option - 你写入该寄存器的值(可选,默认值为 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
显示的 status 信息是
已发送 |
已传输的帧数 |
已接收 |
已接收的帧数 |
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 |
全双工 |
1 |
等待时间 |
12 |
最小时间 |
3 |
最大键控时间 |
7 |
空闲时间 |
3 |
最大延迟 |
120 |
组 |
0x00 |
发射关闭 |
关 |
软件DCD |
开 |
SLIP |
关 |
参数含义如下
- 速度
此通道上的波特率,单位为比特/秒
示例:sccparam /dev/scc3 speed 9600
- txdelay
发射器键控后,到发送第一个字节之间的延迟(以10毫秒为单位)。这通常在TNC中称为“TXDELAY”。当指定为0时,驱动程序将仅等待CTS信号被置位。这假设MODEM和/或发射器中存在定时器或其他电路,当发射器准备好数据时,该定时器会置位CTS。此参数的正常值为30-36。
示例:sccparam /dev/scc0 txd 20
- persist
这是当发现通道空闲时,发射器将被键控的概率。它是一个从0到255的值,概率为(值+1)/256。该值应在50-60附近,并且当通道使用更频繁时应降低。
示例:sccparam /dev/scc2 persist 20
- slottime
这是通道采样的间隔时间。以10毫秒为单位表示。大约200-300毫秒(值20-30)似乎是一个好值。
示例:sccparam /dev/scc0 slot 20
- 尾部
在数据包的最后一个字节传输到SCC后,发射器将保持键控的时间。这是必要的,因为CRC和标志仍然必须在发射器被取消键控之前离开SCC。该值取决于所选的波特率。几个字符时间应该足够了,例如,在1200波特时为40毫秒。(值4)此参数的值以10毫秒为单位。
示例:sccparam /dev/scc2 4
- 全
全双工模式开关。它可以是以下值之一
- 0:接口将在CSMA模式下运行(正常
半双工分组无线电操作)
- 1:全双工模式,即发射器将在
任何时候被键控,而无需检查接收到的载波。当没有数据包要发送时,它将被取消键控。
- 2:类似于1,但是发射器也将保持键控,
即使没有数据包要发送。在这种情况下,将发送标志,直到超时(参数10)发生。
示例:sccparam /dev/scc0 fulldup off
- 等待
在帧被排队等待传输之后,任何传输尝试之前的初始等待时间。这是CSMA模式下第一个时隙的长度。在全双工模式下,它被设置为0以获得最大性能。此参数的值以10毫秒为单位。
示例:sccparam /dev/scc1 wait 4
- 最大键控
发射器将被键控以发送数据包的最大时间(以秒为单位)。这在繁忙的CSMA通道上很有用,可以避免在产生大量流量时“获得不良声誉”。指定的时间过后,不会启动新帧。相反,发射器将关闭指定的时间(参数min),然后将再次启动所选的键控算法。值0以及“off”将禁用此功能,并允许无限传输时间。
示例:sccparam /dev/scc0 maxk 20
- 最小
当超过最大传输时间时,发射器将关闭的时间。
示例:sccparam /dev/scc3 min 10
- 空闲
此参数指定全双工2模式下的最大空闲时间(以秒为单位)。如果在此时间内未发送任何帧,则发射器将关闭。值0与全双工模式1具有相同的结果。此参数可以禁用。
示例:sccparam /dev/scc2 idle off # 永远传输
- 最大延迟
这是等待空闲通道发送的最大时间(以秒为单位)。当此计时器到期时,发射器将立即被键控。如果您喜欢与其他用户发生冲突,则应将其设置为非常低的值;-)
示例:sccparam /dev/scc0 maxdefer 240 # 2分钟
- 发射关闭
当此参数的值为0时,启用数据包的传输。否则,禁用它。
示例:sccparam /dev/scc2 txoff on
- 组
可以构建特殊的无线电设备,以在同一频段上使用多个频率,例如,使用多个接收器和一个可以在频率之间切换的发射器。此外,您可以连接多个在同一频段上活动的无线电。在这些情况下,在多个频率上进行传输是不可能的,或者不是一个好主意。SCC驱动程序提供了一种使用“param <接口> group <x>”命令锁定不同接口上的发射器的方法。这仅当您使用CSMA模式(参数full = 0)时才有效。
如果不想进行任何组限制,则数字<x>必须为0,并且可以按以下方式计算以创建受限组: <x>是一些八进制数字的和
200
仅当组中的所有其他发射器都关闭时,此发射器才会被键控。
100
仅当组中所有其他接口的载波检测关闭时,此发射器才会被键控。
0xx
可用于定义不同组的字节。当它们的xx值之间的逻辑与运算不为零时,接口在同一组中。
示例
当2个接口使用组201时,它们的发射器永远不会同时被键控。
当2个接口使用组101时,只有当两个通道同时清除时,发射器才会键控。当组301时,发射器不会同时被键控。
不要忘记在设置参数之前将八进制数转换为十进制。
示例:(待编写)
- 软件DCD
使用软件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: [email protected]
AX-25 : DL1BKE @ DB0ABH.#BAY.DEU.EU
Internet: [email protected]
WWW : http://yaina.de/jreuter