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