概述
本應(yīng)用筆記舉例說明如何在橋接模式下配置單個(gè)T3端口,在DS31256上進(jìn)行非溝道化工作。此外,此示例還介紹如何在該端口上以環(huán)回模式構(gòu)造、發(fā)送、接收和檢查數(shù)據(jù)包。本應(yīng)用筆記作為編碼示例提供,以便于適應(yīng)最終用戶應(yīng)用。
DS31256本地總線工作在兩種模式:
- PCI 橋接模式
- 配置模式
PCI 橋接模式允許 PCI 總線上的主機(jī)訪問本地總線。PCI總線用于控制和監(jiān)視DS31256,并在此應(yīng)用中傳輸數(shù)據(jù)包數(shù)據(jù)。DS31256還配置為將數(shù)據(jù)從PCI總線映射到本地總線,用于控制和監(jiān)視xDSL調(diào)制解調(diào)器或T3/E3接口等外圍元件。
此示例具有以下配置:
- DS1的端口31256作為非通道端口工作。也就是說,端口獲得接收/發(fā)送時(shí)鐘,但沒有同步脈沖。不使用所有其他端口。
- HDLC通道0分配給DS1的端口31256。它還分配了 256 個(gè) RX FIFO 塊、256 個(gè) TX FIFO 塊、179 個(gè) RX FIFO 高水位線(70 的 256%)和 77 個(gè) TX 低水位線(30 的 256%)。
- 使用 16 個(gè) TX 緩沖區(qū)、10 個(gè) TX 描述符和一個(gè) TX 掛起隊(duì)列條目在主機(jī)內(nèi)存中構(gòu)造 10 個(gè) 10 字節(jié)數(shù)據(jù)包。TX 掛起隊(duì)列條目指向一個(gè)描述符,該描述符通過下一個(gè)描述符指針字段以及正在設(shè)置的 EOF 和 CV 鏈接到 <> 個(gè)描述符。
- 由于DS31256處于環(huán)回模式,數(shù)據(jù)包在發(fā)送時(shí)也會(huì)被DS31256接收。接收到的數(shù)據(jù)包使用 10 個(gè) RX 緩沖區(qū)、10 個(gè) RX 描述符和 10 個(gè) RX 完成隊(duì)列條目寫入主機(jī)內(nèi)存。
- 主機(jī)內(nèi)存配置如下:
- 接收端
- RX 空閑隊(duì)列基址 (RFQBA1/0) = 0x10000000
- RX 完成隊(duì)列基址 (RDQBA1/0) = 0x10000B00
- RX 描述符基址 (RDBA1/0) = 0x10001080
- RX 緩沖區(qū)基址 = 0x10002680
- 傳輸側(cè)
- TX 掛起隊(duì)列基址 (TPQBA1/0) = 0x10059084
- TX 完成隊(duì)列基址 (TDQBA1/0) = 0x10059604
- TX 描述符基址 (TDBA1/0) = 0x10059B84
- TX 緩沖區(qū)基址 = 0x1005B184
- 接收端
編碼示例函數(shù)調(diào)用的定義
為了提高可讀性,此示例中的代碼使用了多個(gè)函數(shù)調(diào)用。這些函數(shù)的定義如下:
-
write_reg(地址、數(shù)據(jù))
將指定數(shù)據(jù)寫入指定的DS31256寄存器地址
輸入:地址=
要寫入
數(shù)據(jù)的寄存器地址 數(shù)據(jù)=要寫入指定寄存器
的數(shù)據(jù) 輸出:無
-
read_reg(地址、數(shù)據(jù))
在指定地址
讀取DS31256寄存器的內(nèi)容 輸入:
地址 = 要讀取
的寄存器地址 輸出:
數(shù)據(jù) = 從寄存器讀取的值
-
write_reg_IS(地址、數(shù)據(jù))
將指定數(shù)據(jù)寫入指定的DS31256間接選擇寄存器,然后等待該寄存器的繁忙位清除后返回
輸入: 地址 = 要寫入數(shù)據(jù)的間接選擇寄存器 數(shù)據(jù) = 要寫入
指定寄存器
的數(shù)據(jù) 輸出 : 無
功能代碼 :
write_reg(地址, 數(shù)據(jù));
bit_check = 0x8000;
而(bit_check&0x8000)
read_reg(地址,bit_check);
-
wr_dword(地址、數(shù)據(jù))
將指定的 32 位數(shù)據(jù)值寫入指定的 32 位主機(jī)內(nèi)存地址
輸入:
地址 = 要寫入數(shù)據(jù)的主機(jī)內(nèi)存地址 數(shù)據(jù) = 要寫入
指定內(nèi)存地址
的數(shù)據(jù) 輸出 : 無
-
rd_dword(地址、數(shù)據(jù))
從指定的 32 位主機(jī)內(nèi)存地址
讀取 32 位數(shù)據(jù)值 輸入:
地址 = 要讀取
的主機(jī)內(nèi)存地址 輸出:
數(shù)據(jù) = 從主機(jī)內(nèi)存讀取的 32 位數(shù)據(jù)值
-
frame_wait(計(jì)數(shù))
提供等于幀周期數(shù)的延遲,其中幀周期為 125μs
輸入:計(jì)數(shù) = 等待
的幀周期數(shù) 輸出 :
無
非通道化配置模式編碼示例
此編碼示例包括以下步驟:
- 復(fù)位DS31256
- 配置 DS31256
- 啟用 HDLC 通道
- 將 HDLC 通道置于環(huán)回模式
- 排隊(duì)、發(fā)送、接收和檢查數(shù)據(jù)包
以下各節(jié)通過簡要說明和編碼示例詳細(xì)介紹了其中每個(gè)步驟。使用寄存器名稱而不是地址來提高可讀性。DS31256內(nèi)部器件配置寄存器的相應(yīng)地址/失調(diào)列于附表中。此外,縮寫 TX 和 RX 分別用于表示發(fā)射端和接收端。請參考DS31256數(shù)據(jù)資料了解更多詳情。
復(fù)位DS31256
復(fù)位DS31256包括兩個(gè)步驟。首先,DS31256的內(nèi)部RAM必須歸零,然后復(fù)位DS31256內(nèi)部寄存器。
將DS31256內(nèi)部RAM歸零
DS31256內(nèi)部配置RAM不能通過復(fù)位芯片清除,因此必須手動(dòng)歸零。該任務(wù)通過使用DS31256的適當(dāng)數(shù)據(jù)和間接選擇寄存器對DS31256中的每個(gè)內(nèi)部RAM進(jìn)行一系列寫入來完成。本節(jié)詳細(xì)介紹了完成此任務(wù)的過程。
縮寫 | 偏移量/地址 | 寄存器名稱 | 數(shù)據(jù)表部分 |
---|---|---|---|
CP[n]RDIS | 03xx | 通道化端口 n 寄存器數(shù)據(jù)間接選擇 | 6.3 |
CP[n]RD | 03xx | 信道化端口 n 寄存器數(shù)據(jù) | 6.3 |
/* Zero RX configuration and TX configuration RAMs for all ports */
for(port = 0; port < 16; port = port + 1)
{
write_reg(CP0RD + 8*port, 0x0000);
for(ds0 = 0; ds0 < 128; ds0 = ds0 + 1)
{
/* Set bits 9-8 = 01 to select RX Configuration RAM */
/* Set bits 9-8 = 10 to select TX Configuration RAM */
write_reg_IS(CP0RDIS + 8*port, (0x0100 + ds0));
write_reg_IS(CP0RDIS + 8*port, (0x0200 + ds0));
}
}
縮寫 | 偏移量/地址 | 寄存器名稱 | 數(shù)據(jù)表部分 |
---|---|---|---|
蕓香芷 | 0400 | 接收 HDLC 通道定義間接選擇 | 7.2 |
生殖健康發(fā)展 | 0404 | 接收 HDLC 通道定義 | 7.2 |
/* Zero the RX HDLC Channel Definition RAM */
write_reg(RHCD, 0x0000);
for(channel = 0; channel < 256; channel = channel + 1)
write_reg_IS(RHCDIS, channel);
縮寫 | 偏移量/地址 | 寄存器名稱 | 數(shù)據(jù)表部分 |
---|---|---|---|
西迪斯 | 0480 | 傳輸 HDLC 通道定義間接選擇 | 7.2 |
四氫大麻酚 | 0484 | 傳輸 HDLC 通道定義 | 7.2 |
/* Zero the TX HDLC Channel Definition RAM */
write_reg(THCD, 0x0000);
for(channel = 0; channel < 256; channel = channel + 1)
write_reg_IS(THCDIS, channel);
縮寫 | 偏移量/地址 | 寄存器名稱 | 數(shù)據(jù)表部分 |
---|---|---|---|
RFSBPIS | 0900 | 接收 FIFO 凝視塊指針間接選擇 | 8.2 |
RFSBP | 0904 | 接收先進(jìn)先出起始?jí)K指針 | 8.2 |
/* Zero the RX FIFO Starting Block Pointer RAM */
write_reg(RFSBP, 0x0000);
for(channel = 0; channel < 256; channel = channel + 1)
write_reg_IS(RFSBPIS, channel);
縮寫 | 偏移量/地址 | 寄存器名稱 | 數(shù)據(jù)表部分 |
---|---|---|---|
征求意見稿 | 0910 | 接收 FIFO 塊指針間接選擇 | 8.2 |
RFBP | 0914 | 接收先進(jìn)先出塊指針 | 8.2 |
/* Zero the RX FIFO Block Pointer RAM */
write_reg(RFBP, 0x0000);
for(channel = 0; channel < 256; channel = channel + 1)
write_reg_IS(RFBPIS, channel);
縮寫 | 偏移量/地址 | 寄存器名稱 | 數(shù)據(jù)表部分 |
---|---|---|---|
RFHWMIS | 0920 | 接收先進(jìn)先出高水位線間接選擇 | 8.2 |
RFHWM | 0924 | 接收先進(jìn)先出高水位線 | 8.2 |
/* Zero the RX FIFO High Watermark RAM */
write_reg(RFHWM, 0x0000);
for(channel = 0; channel < 256; channel = channel + 1)
write_reg_IS(RFHWMIS, channel);
縮寫 | 偏移量/地址 | 寄存器名稱 | 數(shù)據(jù)表部分 |
---|---|---|---|
TFSBPIS | 0980 | 傳輸FIFO起始?jí)K指針間接選擇 | 8.2 |
TFSBP | 0984 | 傳輸先進(jìn)先出起始?jí)K指針 | 8.2 |
/* Zero the TX FIFO Starting Block Pointer Registers */
write_reg(TFSBP, 0x0000);
for(channel = 0; channel < 256; channel = channel + 1)
write_reg_IS(TFSBPIS, channel);
縮寫 | 偏移量/地址 | 寄存器名稱 | 數(shù)據(jù)表部分 |
---|---|---|---|
全要素計(jì)數(shù) | 0990 | 傳輸 FIFO 塊指針間接選擇 | 8.2 |
全要素密度計(jì) | 0994 | 傳輸先進(jìn)先出塊指針 | 8.2 |
/* Zero the TX FIFO Block Pointer RAM */
write_reg(TFBP, 0x0000);
for(channel = 0; channel < 256; channel = channel + 1)
write_reg_IS(TFBPIS, channel);
縮寫 | 偏移量/地址 | 寄存器名稱 | 數(shù)據(jù)表部分 |
---|---|---|---|
TFLWMIS | 09A0 | 傳輸 FIFO 塊指針間接選擇 | 8.2 |
TFLWM | 09A4 | 傳輸先進(jìn)先出低水位線 | 8.2 |
/* Zero the TX FIFO Low Watermark RAM */
write_reg(TFLWM, 0x0000);
for(channel = 0; channel < 256; channel = channel + 1)
write_reg_IS(TFLWMIS, channel);
縮寫 | 偏移量/地址 | 寄存器名稱 | 數(shù)據(jù)表部分 |
---|---|---|---|
RDMACIS | 0770 | 接收 DMA 配置間接選擇 | 9.3.5 |
RDMAC | 0774 | 接收 DMA 配置 | 9.3.5 |
/* Zero the RX DMA Configuration RAM */
write_reg(RDMAC, 0x0000);
for(channel = 0; channel < 256; channel = channel + 1)
write_reg_IS(RDMACIS, 0x0400 + channel);
縮寫 | 偏移量/地址 | 寄存器名稱 | 數(shù)據(jù)表部分 |
---|---|---|---|
道明西斯 | 0870 | 傳輸 DMA 配置間接選擇 | 8.2.5 |
道明 | 0874 | 傳輸 DMA 配置 | 8.2.5 |
/* Zero the TX DMA Configuration RAM */
write_reg(TDMAC, 0x0000);
for(channel = 0; channel < 256; channel = channel + 1)
write_reg_IS(TDMACIS, 0x0400 + channel);
復(fù)位DS31256內(nèi)部寄存器
使用主復(fù)位寄存器(MRID)可以對DS31256中的所有寄存器執(zhí)行軟件復(fù)位。主機(jī)必須將此位設(shè)置回 0,然后才能對設(shè)備進(jìn)行編程以使其正常運(yùn)行。
縮寫 | 偏移量/地址 | 寄存器名稱 | 數(shù)據(jù)表部分 |
---|---|---|---|
核磁共振成像 | 0000 | 主復(fù)位和ID寄存器 | 5.1 |
/* Reset DS31256 using MRID registers master reset bit. */
write_reg(MRID, 0x0001);
write_reg(MRID, 0x0000);
配置 DS31256
DS31256的配置包括以下步驟:
- 配置 PCI 寄存器
- 配置第 1 層寄存器
- 配置 HDLC 寄存器
- 配置 FIFO 寄存器
- 配置 DMA 寄存器
以下各節(jié)詳細(xì)介紹了每個(gè)寄存器集的配置。
/* This example uses port 1 channel 0 */
port = 1;
channel = 0;
/* RX free queue base address */
rfq_base_addr = 0x10000000;
/* RX free queue end address */
/* RX free queue size = 16 */
rfq_end_idx = 0x000F;
/* RX done queue base address */
rdq_base_addr = 0x10000B00;
/* RX done queue end address */
/* RX done queue size = 16 */
rdq_end_idx = 0x000F;
/* RX descriptor base address */
/* RX descriptor table size = 256 */
rdscr_base_addr = 0x10001080;
/* RX data buffer base address */
rx_buf_base_addr = 0x10002680;
/* TX pending queue base address */
tpq_base_addr = 0x10059084;
/* TX pending queue end address */
/* TX pending queue size = 16 */
tpq_end_idx = 0x000F;
/* TX done queue base address */
tdq_base_addr = 0x10059604;
/* TX done queue end address */
/* TX done queue size = 16 */
tdq_end_idx = 0x000F;
/* TX descriptor base address */
/* TX descriptor table size = 256 */
tdscr_base_addr = 0x10059B84;
/* TX data buffer base address */
tx_buf_base_addr = 0x1005B184;
配置 PCI 寄存器
PCI 橋接模式允許 PCI 總線上的主機(jī)訪問本地總線。PCI總線用于控制和監(jiān)視DS31256并傳輸數(shù)據(jù)包數(shù)據(jù)。DS31256將數(shù)據(jù)從PCI總線映射到本地總線。 (請參考DS10數(shù)據(jù)資料第31256節(jié))
縮寫 | 偏移量/地址 | 寄存器名稱 | 數(shù)據(jù)表部分 |
---|---|---|---|
PCMD0 | 0x004/0A04 | PCI 命令狀態(tài) 0 | 10.2 |
/* Map DS31256 configuration registers to a PCI Bus Base Address */
write_reg(PDCM, 0x80000000);
/* PCI command/status register 0 - controls DS31256 DMA functionality */
/* Set bit 1 = 1 to enable accesses to internal device configuration
registers through PCI bus (required for bridge mode) */
/* Set bit 2 = 1 to allow the device operation as bus master on
PCI bus (required for DMA) */
/* Set bit 6 = 1 to act on parity errors */
/* Set bit 8 = 1 to enable the PSERR pin */
write_reg(PCMD0, 0x00000146);
配置第 1 層寄存器
DS31256的每個(gè)端口包含一個(gè)第1層控制器,執(zhí)行多種功能,包括:
- 將 HDLC 通道號(hào)分配給傳入和傳出數(shù)據(jù)
- 通道化本地和網(wǎng)絡(luò)環(huán)回
- 通道化選擇 64kbps、56kbps 或無數(shù)據(jù)
- 信道化發(fā)射DS0信道全部填充
- 將數(shù)據(jù)路由到 BERT 函數(shù)和從 BERT 函數(shù)路由數(shù)據(jù)
- 將數(shù)據(jù)路由到 V.54 環(huán)路模式檢測器
第 1 層配置通過 RP[n]CR、TP[n]CR、CP[n]RD 和 CP[n]RDIS 寄存器在端口基礎(chǔ)上執(zhí)行,其中 n 是要配置的端口。
縮寫 | 偏移量/地址 | 寄存器名稱 | 數(shù)據(jù)表部分 |
---|---|---|---|
RP[n]CR | 01xx | 接收端口 n 控制寄存器 | 6.2 |
TP[n]CR | 02xx | 傳輸端口 n 控制寄存器 | 6.2 |
CP[n]RDIS | 03xx | 通道化端口 n 寄存器數(shù)據(jù)間接選擇 | 6.3 |
CP[n]RD | 03xx | 信道化端口 n 寄存器數(shù)據(jù) | 6.3 |
/* Set RX Port Control Register */
/* Set bits 2-0 = 000 for clock, data and sync are not inverted */
/* Set bits 5-4 = 00 for sync pulse 0 clocks early */
/* Bits 7-6 are ignored; the high-speed mode is enabled */
/* Set bit 8 = 1 to enable high-speed mode */
/* Set bit 9 = 1 to enable unchannelized mode */
/* Set bit 10 = 0 to disable local loopback */
/* Bit 11 is not assigned */
/* Bits 12-13 are read only */
/* Set bit 14 = 0 to enable unchannelized mode */
/* Bit 15 is read only */
write_reg(RP0CR + 4*port, 0x0300);
/* Set TX Port Control Register */
/* Set bit 2-0 = 000 for clock, data and sync are not inverted */
/* Set bit 3 = 0 to force all data at TD to be 1 */
/* Set bits 5-4 = 00 for sync pulse 0 clocks early */
/* Bits 7-6 are ignored when the high-speed mode is enabled (TUEN=1) */
/* Set bit 8 = 1 to enable high-speed mode */
/* Set bit 9 = 1 to enable unchannelized mode */
/* Set bit 10 = 0 to disable network loopback */
/* Set bit 11 = 0 to select source transmit data from the HDLC controller */
/* Bits 12-13 is not assigned */
/* Set bit 14 = 0 to mask interrupt */
/* Bit 15 is read only */
write_reg(TP0CR + 4*port, 0x0300);
配置 HDLC 寄存器
DS31256包含一個(gè)256通道HDLC控制器,執(zhí)行第2層功能,包括:
- 零填料和去填料
- 標(biāo)志檢測和字節(jié)對齊
- CRC 生成和檢查
- 數(shù)據(jù)反轉(zhuǎn)和位翻轉(zhuǎn)
HDLC控制器通過RHCD,RHCDIS,THCD和THCDIS寄存器基于通道進(jìn)行配置。
縮寫 | 偏移量/地址 | 寄存器名稱 | 數(shù)據(jù)表部分 |
---|---|---|---|
蕓香芷 | 0400 | 接收 HDLC 通道定義間接選擇 | 7.2 |
生殖健康發(fā)展 | 0404 | 接收 HDLC 通道定義 | 7.2 |
西迪斯 | 0480 | 傳輸 HDLC 通道定義間接選擇 | 7.2 |
四氫大麻酚 | 0484 | 傳輸 HDLC 通道定義 | 7.2 |
/* RX HDLC configuration */
/* Set bits 3-2 = 10 for 32-bit CRC */
write_reg(RHCD, 0x0008);
write_reg_IS(RHCDIS, channel);
/* TX HDLC Configuration */
/* Set bit 1= 0 to select an interfill byte of 7E */
/* Set bits 3-2 = 10 for 32-bit CRC */
/* Set bits 11-8 = 0000 share closing and opening flag */
write_reg(THCD, 0x0008);
write_reg_IS(THCDIS, channel);
配置 FIFO 寄存器
DS31256包含一個(gè)16k字節(jié)的發(fā)送FIFO和一個(gè)16kby的接收FIFO。每個(gè)FIFO分為1024個(gè)塊,每個(gè)塊四個(gè)雙字(dwords)或16個(gè)字節(jié)。FIFO 內(nèi)存基于HDLC通道進(jìn)行分配。分配給每個(gè) HDLC 通道的 FIFO 內(nèi)存量是可編程的,最小可以是四個(gè)塊,最多可以是 1024 個(gè)塊。FIFO內(nèi)存通過從一組塊中創(chuàng)建循環(huán)鏈接列表來分配給HDLC通道,其中每個(gè)塊指向鏈中的下一個(gè)塊,最后一個(gè)塊指向第一個(gè)塊。FIFO 塊鏈表通過分配鏈表中的一個(gè)塊作為該通道的 FIFO 起始?jí)K指針來分配給特定的 HDLC 通道。
在此示例中,將 256 個(gè) TX FIFO 塊和 256 個(gè) RX FIFO 塊分配給 HDLC 通道。此示例還使用 RX FIFO 高水位線 179 和 TX FIFO 低水位線 77。RX FIFO 高水位線指示在 DMA 開始將數(shù)據(jù)發(fā)送到 PCI 總線之前,HDLC 引擎應(yīng)將多少塊寫入 RX FIFO。高水位線設(shè)置必須在一個(gè)塊之間,并且小于所涉及的特定通道的鏈接列表鏈中的塊數(shù)。TX FIFO 低水位線指示在 DMA 開始從 PCI 總線獲取更多數(shù)據(jù)之前,TX FIFO 中應(yīng)保留多少塊。HDLC 通道為防止發(fā)生傳輸下溢和接收溢出而需要的 FIFO 內(nèi)存量、RX FIFO 高水位線和 TX FIFO 低水位線量取決于應(yīng)用。請注意,水印選擇通常需要優(yōu)化,并且非常依賴于應(yīng)用程序。通常,將高水位線和低水位線都設(shè)置為 50% 是一個(gè)很好的起點(diǎn)。最后,DS31256的TX FIFO和RX FIFO通過下表中列出的寄存器在HDLC通道的基礎(chǔ)上獨(dú)立配置。
縮寫 | 偏移量/地址 | 寄存器名稱 | 數(shù)據(jù)表部分 |
---|---|---|---|
蕓香芷 | 0910 | RFBPIS 接收 FIFO 塊指針間接選擇 | 7.2 |
生殖健康發(fā)展 | 0914 | RFBP 接收 FIFO 塊指針 | 7.2 |
/* Build the RX FIFO block linked list 0- >1- >2- >3- >4 ... 255 - > 0 */
for (block = 0; block < 255; block = block + 1)
{
/* Bits 9-0 in RFBP register indicate which block is next in the linked list */
write_reg(RFBP, block + 1);
write_reg_IS(RFBPIS, block);
}
/* The last block points to the first block to create a circular linked list */
write_reg(RFBP, 0x0000);
write_reg_IS(RFBPIS, 0x00FF);
/* Assign the circular linked list to a specific channel */
write_reg(RFSBP, 0x0000);
write_reg_IS(RFSBPIS, channel);
縮寫 | 偏移量/地址 | 寄存器名稱 | 數(shù)據(jù)表部分 |
---|---|---|---|
RFHWMIS | 0920 | 接收先進(jìn)先出高水位線間接選擇 | 8.2 |
RFHWM | 0924 | 接收先進(jìn)先出高水位線 | 8.2 |
/* Set RX FIFO high watermark for channel to 179 */
write_reg(RFHWM, 0x00B3);
write_reg_IS(RFHWMIS, channel);
縮寫 | 偏移量/地址 | 寄存器名稱 | 數(shù)據(jù)表部分 |
---|---|---|---|
全要素計(jì)數(shù) | 0990 | 傳輸 FIFO 塊指針間接選擇 | 8.2 |
全要素密度計(jì) | 0994 | 傳輸先進(jìn)先出塊指針 | 8.2 |
/* TX FIFO block linked list 0- >1- >2- >3- >4 ... 255- >0 */
for(block = 0; block < 255; block = block + 1)
{
/* Bits 9-0 in RFBP register indicate which block is next in the linked list */
write_reg(TFBP, block + 1);
write_reg_IS(TFBPIS, block);
}
/* The last block points to the first block to create a circular linked list */
write_reg(TFBP, 0x0000);
write_reg_IS(TFBPIS, 0x00FF);
縮寫 | 偏移量/地址 | 寄存器名稱 | 數(shù)據(jù)表部分 |
---|---|---|---|
TFSBPIS | 0980 | 傳輸FIFO起始?jí)K指針間接選擇 | 8.2 |
TFSBP | 0984 | 傳輸先進(jìn)先出起始?jí)K指針 | 8.2 |
/* Assign the circular linked list to a specific channel */
write_reg(TFSBP, 0x0000);
write_reg_IS(TFSBPIS, channel);
/* Set TX FIFO low watermark for channel to 77 */
write_reg(TFLWM, 0x004D);
write_reg_IS(TFLWMIS, channel);
配置 DMA 寄存器
DMA 塊處理數(shù)據(jù)包數(shù)據(jù)從 FIFO 塊到 PCI 塊的傳輸,反之亦然。PCI模塊控制DS31256和外部PCI總線之間的數(shù)據(jù)傳輸。主機(jī)定義為位于PCI總線上的CPU或智能控制器,指示DS31256如何處理傳入和傳出數(shù)據(jù)。
這是使用描述符完成的,這些描述符定義為從主機(jī)傳遞到 DMA 塊的預(yù)格式化消息,反之亦然。通過這些描述符,主機(jī)通知 DMA 要傳輸?shù)臄?shù)據(jù)包數(shù)據(jù)的位置和狀態(tài),以及接收的數(shù)據(jù)包數(shù)據(jù)的放置位置。DMA 使用這些描述符告訴主機(jī)已傳輸?shù)臄?shù)據(jù)包數(shù)據(jù)的狀態(tài)以及已接收的數(shù)據(jù)包數(shù)據(jù)的狀態(tài)和位置。
在接收端,主機(jī)將寫入空閑隊(duì)列描述符,通知 DMA 它可以將傳入數(shù)據(jù)包數(shù)據(jù)放置在何處。與每個(gè)空閑隊(duì)列條目相關(guān)聯(lián)的是接收數(shù)據(jù)緩沖區(qū)位置和數(shù)據(jù)包描述符。由于DS31256使用免接收隊(duì)列條目將接收到的數(shù)據(jù)包數(shù)據(jù)寫入主機(jī)存儲(chǔ)器,因此它會(huì)在RX done隊(duì)列中創(chuàng)建條目。這些 RX 完成隊(duì)列條目通知主機(jī)接收數(shù)據(jù)的位置和狀態(tài)。請參考DS31256數(shù)據(jù)資料了解更多詳情。主機(jī)必須通過寫入下表中的所有寄存器來配置 RX DMA:
縮寫 | 偏移量/地址 | 寄存器名稱 | 數(shù)據(jù)表部分 |
---|---|---|---|
詢價(jià)單0 | 0700 | 接收免費(fèi)隊(duì)列基址 0(小字) | 9.2.3 |
詢價(jià)單1 | 0704 | 接收空閑隊(duì)列基址 1(大字) | 9.2.3 |
詢價(jià) | 0708 | 接收免費(fèi)隊(duì)列結(jié)束地址 | 9.2.3 |
詢價(jià)單 | 070C | 接收免費(fèi)的小緩沖區(qū)起始地址 | 9.2.3 |
詢價(jià) | 0710 | 接收空閑隊(duì)列大型緩沖區(qū)主機(jī)寫入指針 | 9.2.3 |
FQSBWP | 0714 | 接收空閑隊(duì)列小型緩沖區(qū)主機(jī)寫入指針 | 9.2.3 |
詢價(jià) | 0718 | 接收空閑隊(duì)列大緩沖區(qū) DMA 讀取指針 | 9.2.3 |
詢價(jià) | 071C | 接收空閑隊(duì)列小緩沖區(qū) DMA 讀取指針 | 9.2.3 |
RDQBA0 | 0730 | 接收完成隊(duì)列基址 0(小字) | 9.2.4 |
RDQBA1 | 0734 | 接收完成隊(duì)列基址 1(大字) | 9.2.4 |
德庫亞 | 0738 | 接收完成隊(duì)列結(jié)束地址 | 9.2.4 |
RDQRP | 073C | 接收完成隊(duì)列主機(jī)讀取指針 | 9.2.4 |
RDQWP | 0740 | 接收完成隊(duì)列 DMA 寫入指針 | 9.2.4 |
RDBA0 | 0750 | 接收描述符基址 0(小字) | 9.2.2 |
RDBA1 | 0754 | 接收描述符基址 1(大字) | 9.2.2 |
RDMACIS | 0770 | 接收 DMA 配置間接選擇 | 9.3.5 |
RDMAC | 0774 | 接收 DMA 配置 | 9.3.5 |
利比斯 | 0790 | 接收較大的緩沖區(qū)大小 | 9.2.1 |
/* RX large buffer size = 256 bytes */
write_reg(RLBS, 0x0100);
/* RX free queue base address */
write_reg(RFQBA0, rfq_base_addr & 0x0000FFFF);
write_reg(RFQBA1, (rfq_base_addr > > 16) & 0x0000FFFF);
/* RX free queue large buffer read and write pointers = 0 */
write_reg(RFQLBRP, 0x0000);
write_reg(RFQLBWP, 0x0000);
/* RX free queue small buffer start address = 16 */
write_reg(RFQSBSA, rfq_end_idx);
/* RX free queue small buffer read and write pointers = 0 */
write_reg(RFQSBRP, 0x0000);
write_reg(RFQSBWP, 0x0000);
/* RX free queue end address */
write_reg(RFQEA, rfq_end_idx);
/* RX done queue base address */
write_reg(RDQBA0, rdq_base_addr & 0x0000FFFF);
write_reg(RDQBA1, (rdq_base_addr > > 16) & 0x0000FFFF);
/* RX done queue read and write pointers = 0 */
write_reg(RDQRP, 0x0000);
write_reg(RDQWP, 0x0000);
/* RX done queue end address */
write_reg(RDQEA, rdq_end_idx);
/* RX descriptor base address */
write_reg(RDBA0, rdscr_base_addr & 0x0000FFFF);
write_reg(RDBA1, (rdscr_base_addr > > 16) & 0x0000FFFF);
/* RX DMA Channel Configuration */
/* The data in RDMAC register is written to or read from the Receive Configuration RAM */
/* Set bit 0 = 0 to disable the HDLC Channel */
/* Set bit 2-1 = 00 for large buffers only */
/* Set bit 6-3 = 0000 for 0 byte offset from the data buffer address of the first data buffer */
/* Set bit 9-7 = 000 for DMA write to the done queue only after packet reception is complete */
/* Set the HDLC channel number by RDMACIS register */
write_reg(RDMAC, 0x0000);
write_reg_IS(RDMACIS, 0x0400 + channel);
在傳輸端,主機(jī)將寫入掛起的隊(duì)列,通知 DMA 哪些通道具有準(zhǔn)備傳輸?shù)臄?shù)據(jù)包數(shù)據(jù)。與每個(gè)掛起隊(duì)列描述符關(guān)聯(lián)的是描述數(shù)據(jù)包數(shù)據(jù)的一個(gè)或多個(gè)傳輸數(shù)據(jù)包描述符的鏈接列表。這些傳輸數(shù)據(jù)包描述符中的每一個(gè)還具有指向傳輸數(shù)據(jù)緩沖區(qū)的指針,該緩沖區(qū)包含 HDLC 數(shù)據(jù)包的實(shí)際數(shù)據(jù)有效負(fù)載。
當(dāng)DS31256處理傳輸暫掛隊(duì)列描述符條目時(shí),它會(huì)創(chuàng)建傳輸完成的隊(duì)列描述符隊(duì)列條目。DMA在完成傳輸完整數(shù)據(jù)包或數(shù)據(jù)緩沖區(qū)后將寫入完成隊(duì)列,具體取決于DS31256的配置方式。通過這些完成隊(duì)列描述符,DMA 通知主機(jī)傳出數(shù)據(jù)包數(shù)據(jù)的狀態(tài)。請參考DS31256數(shù)據(jù)資料了解更多詳情。主機(jī)必須通過寫入下表中的所有寄存器來配置 TX DMA:
縮寫 | 偏移量/地址 | 寄存器名稱 | 數(shù)據(jù)表部分 |
---|---|---|---|
TPQBA0 | 0800 | 傳輸掛起隊(duì)列基址 0(小字) | 9.3.3 |
TPQBA1 | 0804 | 傳輸掛起隊(duì)列基址 1(大字) | 9.3.3 |
TPQEA | 0808 | 傳輸掛起隊(duì)列結(jié)束地址 | 9.3.3 |
TPQWP | 080C | 傳輸掛起隊(duì)列主機(jī)寫入指針 | 9.3.3 |
TPQRP | 0810 | 傳輸掛起隊(duì)列 DMA 讀取指針 | 9.3.3 |
TDQBA0 | 0830 | 傳輸完成隊(duì)列基址 0(小字) | 9.3.4 |
TDQBA1 | 0834 | 傳輸完成隊(duì)列基址 1(大字) | 9.3.4 |
TDQEA | 0838 | 傳輸完成隊(duì)列結(jié)束地址 | 9.3.4 |
TDQRP | 083C | 傳輸完成隊(duì)列主機(jī)讀取指針 | 9.3.4 |
TDQWP | 0840 | 傳輸完成隊(duì)列 DMA 寫入指針 | 9.3.4 |
TDBA0 | 0850 | 傳輸描述符基址 0(小字) | 9.3.2 |
TDBA1 | 0854 | 傳輸描述符基址 1(大字) | 9.3.2 |
道明西斯 | 0870 | 傳輸 DMA 配置間接選擇 | 9.3.5 |
道明 | 0874 | 傳輸 DMA 配置 | 9.3.5 |
/* TX pending queue base address */
write_reg(TPQBA0, tpq_base_addr & 0x0000FFFF);
write_reg(TPQBA1, (tpq_base_addr > > 16) & 0x0000FFFF);
/* TX pending queue read and write pointers = 0 */
write_reg(TPQRP, 0x0000);
write_reg(TPQWP, 0x0000);
/* TX pending queue end address */
write_reg(TPQEA, tpq_end_idx);
/* TX done queue base address */
write_reg(TDQBA0, tdq_base_addr & 0x0000FFFF);
write_reg(TDQBA1, (tdq_base_addr > > 16) & 0x0000FFFF);
/* TX done-queue read and write pointers = 0 */
write_reg(TDQRP, 0x0000);
write_reg(TDQWP, 0x0000);
/* TX done-queue end address */
write_reg(TDQEA, tdq_end_idx);
/* TX descriptor base address */
write_reg(TDBA0, tdscr_base_addr & 0x0000FFFF);
write_reg(TDBA1, (tdscr_base_addr > > 16) & 0x0000FFFF);
/* TX DMA Channel Configuration */
/* The data in TDMAC register is written to or read from the Receive Configuration RAM */
/* Set bit 0 = 0 to disable HDLC Channel */
/* Set bit 1 = 0 for write done queue after packet transmitted */
/* Set the HDLC Channel Number by TDMACIS register */
write_reg(TDMAC, 0x0000);
write_reg_IS(TDMACIS, 0x0200 + channel);
啟用 HDLC 通道
DS31256初始化后的下一步是使能HDLC通道。除了上述配置步驟外,還必須執(zhí)行以下步驟才能在DS31256中實(shí)現(xiàn)數(shù)據(jù)包發(fā)送和接收:
- 在端口 TX 和 RX 配置 RAM 中啟用通道
- 在第 1 層啟用端口數(shù)據(jù)傳輸
- 為DS31256啟用TX DMA和RX DMA
- 啟用 HDLC 通道 TX DMA 和 RX DMA
縮寫 | 偏移量/地址 | 寄存器名稱 | 數(shù)據(jù)表部分 |
---|---|---|---|
司儀 | 0010 | 主配置寄存器 | 5.2 |
TP[n]CR | 02xx | 傳輸端口 n 控制寄存器 | 6.2 |
RDMACIS | 0770 | 接收 DMA 配置間接選擇寄存器 | 9.3.5 |
RDMAC | 0774 | 接收 DMA 配置寄存器 | 9.3.5 |
道明西斯 | 0870 | 傳輸 DMA 配置間接選擇寄存器 | 9.3.5 |
道明 | 0874 | 傳輸 DMA 配置間接選擇寄存器 | 9.3.5 |
/* TX port control register */
/* Set bit 3 = 1 to allow data to be transmitted normally */
read_reg(TP0CR + 4*port, data);
write_reg(TP0CR + 4*port, data | 0x0008);
/* Enable TX and RX DMA in the DS31256 master configuration register */
/* Set bit 0 = 1 to enable Receive DMA */
/* Set bits 2-1 = 00 to burst length maximum is 32 dwords. The optimum length */
/* is application-dependent. */
/* Set bit 3 = 1 to enable Transmit DMA */
/* Set bit 6 = 1 for HDLC packet data on PCI bus is big endian */
/* Set bits 11-7 = 00000 to give Port 0 the dedicated resources of the BERT */
write_reg(MC, 0x0049);
/* Read the current channel value from the RX DMA Configuration RAM */
/* Set RDMACIS bits 7-0 = channel */
/* Set RDMACIS bits 10-8 = 100 to read lower word of dword 2 */
/* Set RDMACIS bit 14 = 1 to read from RAM */
write_reg_IS(RDMACIS, 0x4400 + channel);
read_reg(RDMAC, data);
/* Enable channel RX DMA */
/* Update RAM with new value */
/* Set RDMAC bit 0 = 1 to enable the HDLC channel */
/* Set RDMACIS bits 7-0 = channel */
/* Set RDMACIS bits 10-8 = 100 to write lower word of dword 2 */
/* Set RDMACIS bit 14 = 0 to write to RAM */
write_reg(RDMAC, data | 0x0001);
write_reg_IS(RDMACIS, 0x0400 + channel);
/* Read the current channel value from the TX DMA Configuration RAM */
/* Set TDMACIS bits 7-0 = channel */
/* Set TDMACIS bits 11-8 = 0010 to read lower word of dword 1 */
/* Set TDMACIS bit 14 = 1 to read from RAM */
write_reg_IS(TDMACIS, 0x4200 + channel);
read_reg(TDMAC, data);
/* Enable channel TX DMA */
/* Update RAM with new value */
/* Set TDMAC bit 0 = 1 to enable the HDLC channel */
/* Set TDMACIS bits 7-0 = channel */
/* Set TDMACIS bits 11-8 = 0010 to write lower word of dword 1 */
/* Set TDMACIS bit 14 = 0 to write to RAM */
write_reg((TDMAC, data | 0x0001);
write_reg_IS(TDMACIS, 0x0200 + channel);