概述
本應用筆記舉例說明如何在橋接模式下配置單個T3端口,在DS31256上進行非溝道化工作。此外,此示例還介紹如何在該端口上以環回模式構造、發送、接收和檢查數據包。本應用筆記作為編碼示例提供,以便于適應最終用戶應用。
DS31256本地總線工作在兩種模式:
- PCI 橋接模式
- 配置模式
PCI 橋接模式允許 PCI 總線上的主機訪問本地總線。PCI總線用于控制和監視DS31256,并在此應用中傳輸數據包數據。DS31256還配置為將數據從PCI總線映射到本地總線,用于控制和監視xDSL調制解調器或T3/E3接口等外圍元件。
此示例具有以下配置:
- DS1的端口31256作為非通道端口工作。也就是說,端口獲得接收/發送時鐘,但沒有同步脈沖。不使用所有其他端口。
- HDLC通道0分配給DS1的端口31256。它還分配了 256 個 RX FIFO 塊、256 個 TX FIFO 塊、179 個 RX FIFO 高水位線(70 的 256%)和 77 個 TX 低水位線(30 的 256%)。
- 使用 16 個 TX 緩沖區、10 個 TX 描述符和一個 TX 掛起隊列條目在主機內存中構造 10 個 10 字節數據包。TX 掛起隊列條目指向一個描述符,該描述符通過下一個描述符指針字段以及正在設置的 EOF 和 CV 鏈接到 <> 個描述符。
- 由于DS31256處于環回模式,數據包在發送時也會被DS31256接收。接收到的數據包使用 10 個 RX 緩沖區、10 個 RX 描述符和 10 個 RX 完成隊列條目寫入主機內存。
- 主機內存配置如下:
- 接收端
- RX 空閑隊列基址 (RFQBA1/0) = 0x10000000
- RX 完成隊列基址 (RDQBA1/0) = 0x10000B00
- RX 描述符基址 (RDBA1/0) = 0x10001080
- RX 緩沖區基址 = 0x10002680
- 傳輸側
- TX 掛起隊列基址 (TPQBA1/0) = 0x10059084
- TX 完成隊列基址 (TDQBA1/0) = 0x10059604
- TX 描述符基址 (TDBA1/0) = 0x10059B84
- TX 緩沖區基址 = 0x1005B184
- 接收端
編碼示例函數調用的定義
為了提高可讀性,此示例中的代碼使用了多個函數調用。這些函數的定義如下:
-
write_reg(地址、數據)
將指定數據寫入指定的DS31256寄存器地址
輸入:地址=
要寫入
數據的寄存器地址 數據=要寫入指定寄存器
的數據 輸出:無
-
read_reg(地址、數據)
在指定地址
讀取DS31256寄存器的內容 輸入:
地址 = 要讀取
的寄存器地址 輸出:
數據 = 從寄存器讀取的值
-
write_reg_IS(地址、數據)
將指定數據寫入指定的DS31256間接選擇寄存器,然后等待該寄存器的繁忙位清除后返回
輸入: 地址 = 要寫入數據的間接選擇寄存器 數據 = 要寫入
指定寄存器
的數據 輸出 : 無
功能代碼 :
write_reg(地址, 數據);
bit_check = 0x8000;
而(bit_check&0x8000)
read_reg(地址,bit_check);
-
wr_dword(地址、數據)
將指定的 32 位數據值寫入指定的 32 位主機內存地址
輸入:
地址 = 要寫入數據的主機內存地址 數據 = 要寫入
指定內存地址
的數據 輸出 : 無
-
rd_dword(地址、數據)
從指定的 32 位主機內存地址
讀取 32 位數據值 輸入:
地址 = 要讀取
的主機內存地址 輸出:
數據 = 從主機內存讀取的 32 位數據值
-
frame_wait(計數)
提供等于幀周期數的延遲,其中幀周期為 125μs
輸入:計數 = 等待
的幀周期數 輸出 :
無
非通道化配置模式編碼示例
此編碼示例包括以下步驟:
- 復位DS31256
- 配置 DS31256
- 啟用 HDLC 通道
- 將 HDLC 通道置于環回模式
- 排隊、發送、接收和檢查數據包
以下各節通過簡要說明和編碼示例詳細介紹了其中每個步驟。使用寄存器名稱而不是地址來提高可讀性。DS31256內部器件配置寄存器的相應地址/失調列于附表中。此外,縮寫 TX 和 RX 分別用于表示發射端和接收端。請參考DS31256數據資料了解更多詳情。
復位DS31256
復位DS31256包括兩個步驟。首先,DS31256的內部RAM必須歸零,然后復位DS31256內部寄存器。
將DS31256內部RAM歸零
DS31256內部配置RAM不能通過復位芯片清除,因此必須手動歸零。該任務通過使用DS31256的適當數據和間接選擇寄存器對DS31256中的每個內部RAM進行一系列寫入來完成。本節詳細介紹了完成此任務的過程。
縮寫 | 偏移量/地址 | 寄存器名稱 | 數據表部分 |
---|---|---|---|
CP[n]RDIS | 03xx | 通道化端口 n 寄存器數據間接選擇 | 6.3 |
CP[n]RD | 03xx | 信道化端口 n 寄存器數據 | 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));
}
}
縮寫 | 偏移量/地址 | 寄存器名稱 | 數據表部分 |
---|---|---|---|
蕓香芷 | 0400 | 接收 HDLC 通道定義間接選擇 | 7.2 |
生殖健康發展 | 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);
縮寫 | 偏移量/地址 | 寄存器名稱 | 數據表部分 |
---|---|---|---|
西迪斯 | 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);
縮寫 | 偏移量/地址 | 寄存器名稱 | 數據表部分 |
---|---|---|---|
RFSBPIS | 0900 | 接收 FIFO 凝視塊指針間接選擇 | 8.2 |
RFSBP | 0904 | 接收先進先出起始塊指針 | 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);
縮寫 | 偏移量/地址 | 寄存器名稱 | 數據表部分 |
---|---|---|---|
征求意見稿 | 0910 | 接收 FIFO 塊指針間接選擇 | 8.2 |
RFBP | 0914 | 接收先進先出塊指針 | 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);
縮寫 | 偏移量/地址 | 寄存器名稱 | 數據表部分 |
---|---|---|---|
RFHWMIS | 0920 | 接收先進先出高水位線間接選擇 | 8.2 |
RFHWM | 0924 | 接收先進先出高水位線 | 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);
縮寫 | 偏移量/地址 | 寄存器名稱 | 數據表部分 |
---|---|---|---|
TFSBPIS | 0980 | 傳輸FIFO起始塊指針間接選擇 | 8.2 |
TFSBP | 0984 | 傳輸先進先出起始塊指針 | 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);
縮寫 | 偏移量/地址 | 寄存器名稱 | 數據表部分 |
---|---|---|---|
全要素計數 | 0990 | 傳輸 FIFO 塊指針間接選擇 | 8.2 |
全要素密度計 | 0994 | 傳輸先進先出塊指針 | 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);
縮寫 | 偏移量/地址 | 寄存器名稱 | 數據表部分 |
---|---|---|---|
TFLWMIS | 09A0 | 傳輸 FIFO 塊指針間接選擇 | 8.2 |
TFLWM | 09A4 | 傳輸先進先出低水位線 | 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);
縮寫 | 偏移量/地址 | 寄存器名稱 | 數據表部分 |
---|---|---|---|
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);
縮寫 | 偏移量/地址 | 寄存器名稱 | 數據表部分 |
---|---|---|---|
道明西斯 | 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);
復位DS31256內部寄存器
使用主復位寄存器(MRID)可以對DS31256中的所有寄存器執行軟件復位。主機必須將此位設置回 0,然后才能對設備進行編程以使其正常運行。
縮寫 | 偏移量/地址 | 寄存器名稱 | 數據表部分 |
---|---|---|---|
核磁共振成像 | 0000 | 主復位和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 寄存器
以下各節詳細介紹了每個寄存器集的配置。
/* 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 總線上的主機訪問本地總線。PCI總線用于控制和監視DS31256并傳輸數據包數據。DS31256將數據從PCI總線映射到本地總線。 (請參考DS10數據資料第31256節)
縮寫 | 偏移量/地址 | 寄存器名稱 | 數據表部分 |
---|---|---|---|
PCMD0 | 0x004/0A04 | PCI 命令狀態 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的每個端口包含一個第1層控制器,執行多種功能,包括:
- 將 HDLC 通道號分配給傳入和傳出數據
- 通道化本地和網絡環回
- 通道化選擇 64kbps、56kbps 或無數據
- 信道化發射DS0信道全部填充
- 將數據路由到 BERT 函數和從 BERT 函數路由數據
- 將數據路由到 V.54 環路模式檢測器
第 1 層配置通過 RP[n]CR、TP[n]CR、CP[n]RD 和 CP[n]RDIS 寄存器在端口基礎上執行,其中 n 是要配置的端口。
縮寫 | 偏移量/地址 | 寄存器名稱 | 數據表部分 |
---|---|---|---|
RP[n]CR | 01xx | 接收端口 n 控制寄存器 | 6.2 |
TP[n]CR | 02xx | 傳輸端口 n 控制寄存器 | 6.2 |
CP[n]RDIS | 03xx | 通道化端口 n 寄存器數據間接選擇 | 6.3 |
CP[n]RD | 03xx | 信道化端口 n 寄存器數據 | 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包含一個256通道HDLC控制器,執行第2層功能,包括:
- 零填料和去填料
- 標志檢測和字節對齊
- CRC 生成和檢查
- 數據反轉和位翻轉
HDLC控制器通過RHCD,RHCDIS,THCD和THCDIS寄存器基于通道進行配置。
縮寫 | 偏移量/地址 | 寄存器名稱 | 數據表部分 |
---|---|---|---|
蕓香芷 | 0400 | 接收 HDLC 通道定義間接選擇 | 7.2 |
生殖健康發展 | 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包含一個16k字節的發送FIFO和一個16kby的接收FIFO。每個FIFO分為1024個塊,每個塊四個雙字(dwords)或16個字節。FIFO 內存基于HDLC通道進行分配。分配給每個 HDLC 通道的 FIFO 內存量是可編程的,最小可以是四個塊,最多可以是 1024 個塊。FIFO內存通過從一組塊中創建循環鏈接列表來分配給HDLC通道,其中每個塊指向鏈中的下一個塊,最后一個塊指向第一個塊。FIFO 塊鏈表通過分配鏈表中的一個塊作為該通道的 FIFO 起始塊指針來分配給特定的 HDLC 通道。
在此示例中,將 256 個 TX FIFO 塊和 256 個 RX FIFO 塊分配給 HDLC 通道。此示例還使用 RX FIFO 高水位線 179 和 TX FIFO 低水位線 77。RX FIFO 高水位線指示在 DMA 開始將數據發送到 PCI 總線之前,HDLC 引擎應將多少塊寫入 RX FIFO。高水位線設置必須在一個塊之間,并且小于所涉及的特定通道的鏈接列表鏈中的塊數。TX FIFO 低水位線指示在 DMA 開始從 PCI 總線獲取更多數據之前,TX FIFO 中應保留多少塊。HDLC 通道為防止發生傳輸下溢和接收溢出而需要的 FIFO 內存量、RX FIFO 高水位線和 TX FIFO 低水位線量取決于應用。請注意,水印選擇通常需要優化,并且非常依賴于應用程序。通常,將高水位線和低水位線都設置為 50% 是一個很好的起點。最后,DS31256的TX FIFO和RX FIFO通過下表中列出的寄存器在HDLC通道的基礎上獨立配置。
縮寫 | 偏移量/地址 | 寄存器名稱 | 數據表部分 |
---|---|---|---|
蕓香芷 | 0910 | RFBPIS 接收 FIFO 塊指針間接選擇 | 7.2 |
生殖健康發展 | 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);
縮寫 | 偏移量/地址 | 寄存器名稱 | 數據表部分 |
---|---|---|---|
RFHWMIS | 0920 | 接收先進先出高水位線間接選擇 | 8.2 |
RFHWM | 0924 | 接收先進先出高水位線 | 8.2 |
/* Set RX FIFO high watermark for channel to 179 */
write_reg(RFHWM, 0x00B3);
write_reg_IS(RFHWMIS, channel);
縮寫 | 偏移量/地址 | 寄存器名稱 | 數據表部分 |
---|---|---|---|
全要素計數 | 0990 | 傳輸 FIFO 塊指針間接選擇 | 8.2 |
全要素密度計 | 0994 | 傳輸先進先出塊指針 | 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);
縮寫 | 偏移量/地址 | 寄存器名稱 | 數據表部分 |
---|---|---|---|
TFSBPIS | 0980 | 傳輸FIFO起始塊指針間接選擇 | 8.2 |
TFSBP | 0984 | 傳輸先進先出起始塊指針 | 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 塊處理數據包數據從 FIFO 塊到 PCI 塊的傳輸,反之亦然。PCI模塊控制DS31256和外部PCI總線之間的數據傳輸。主機定義為位于PCI總線上的CPU或智能控制器,指示DS31256如何處理傳入和傳出數據。
這是使用描述符完成的,這些描述符定義為從主機傳遞到 DMA 塊的預格式化消息,反之亦然。通過這些描述符,主機通知 DMA 要傳輸的數據包數據的位置和狀態,以及接收的數據包數據的放置位置。DMA 使用這些描述符告訴主機已傳輸的數據包數據的狀態以及已接收的數據包數據的狀態和位置。
在接收端,主機將寫入空閑隊列描述符,通知 DMA 它可以將傳入數據包數據放置在何處。與每個空閑隊列條目相關聯的是接收數據緩沖區位置和數據包描述符。由于DS31256使用免接收隊列條目將接收到的數據包數據寫入主機存儲器,因此它會在RX done隊列中創建條目。這些 RX 完成隊列條目通知主機接收數據的位置和狀態。請參考DS31256數據資料了解更多詳情。主機必須通過寫入下表中的所有寄存器來配置 RX DMA:
縮寫 | 偏移量/地址 | 寄存器名稱 | 數據表部分 |
---|---|---|---|
詢價單0 | 0700 | 接收免費隊列基址 0(小字) | 9.2.3 |
詢價單1 | 0704 | 接收空閑隊列基址 1(大字) | 9.2.3 |
詢價 | 0708 | 接收免費隊列結束地址 | 9.2.3 |
詢價單 | 070C | 接收免費的小緩沖區起始地址 | 9.2.3 |
詢價 | 0710 | 接收空閑隊列大型緩沖區主機寫入指針 | 9.2.3 |
FQSBWP | 0714 | 接收空閑隊列小型緩沖區主機寫入指針 | 9.2.3 |
詢價 | 0718 | 接收空閑隊列大緩沖區 DMA 讀取指針 | 9.2.3 |
詢價 | 071C | 接收空閑隊列小緩沖區 DMA 讀取指針 | 9.2.3 |
RDQBA0 | 0730 | 接收完成隊列基址 0(小字) | 9.2.4 |
RDQBA1 | 0734 | 接收完成隊列基址 1(大字) | 9.2.4 |
德庫亞 | 0738 | 接收完成隊列結束地址 | 9.2.4 |
RDQRP | 073C | 接收完成隊列主機讀取指針 | 9.2.4 |
RDQWP | 0740 | 接收完成隊列 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 | 接收較大的緩沖區大小 | 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);
在傳輸端,主機將寫入掛起的隊列,通知 DMA 哪些通道具有準備傳輸的數據包數據。與每個掛起隊列描述符關聯的是描述數據包數據的一個或多個傳輸數據包描述符的鏈接列表。這些傳輸數據包描述符中的每一個還具有指向傳輸數據緩沖區的指針,該緩沖區包含 HDLC 數據包的實際數據有效負載。
當DS31256處理傳輸暫掛隊列描述符條目時,它會創建傳輸完成的隊列描述符隊列條目。DMA在完成傳輸完整數據包或數據緩沖區后將寫入完成隊列,具體取決于DS31256的配置方式。通過這些完成隊列描述符,DMA 通知主機傳出數據包數據的狀態。請參考DS31256數據資料了解更多詳情。主機必須通過寫入下表中的所有寄存器來配置 TX DMA:
縮寫 | 偏移量/地址 | 寄存器名稱 | 數據表部分 |
---|---|---|---|
TPQBA0 | 0800 | 傳輸掛起隊列基址 0(小字) | 9.3.3 |
TPQBA1 | 0804 | 傳輸掛起隊列基址 1(大字) | 9.3.3 |
TPQEA | 0808 | 傳輸掛起隊列結束地址 | 9.3.3 |
TPQWP | 080C | 傳輸掛起隊列主機寫入指針 | 9.3.3 |
TPQRP | 0810 | 傳輸掛起隊列 DMA 讀取指針 | 9.3.3 |
TDQBA0 | 0830 | 傳輸完成隊列基址 0(小字) | 9.3.4 |
TDQBA1 | 0834 | 傳輸完成隊列基址 1(大字) | 9.3.4 |
TDQEA | 0838 | 傳輸完成隊列結束地址 | 9.3.4 |
TDQRP | 083C | 傳輸完成隊列主機讀取指針 | 9.3.4 |
TDQWP | 0840 | 傳輸完成隊列 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通道。除了上述配置步驟外,還必須執行以下步驟才能在DS31256中實現數據包發送和接收:
- 在端口 TX 和 RX 配置 RAM 中啟用通道
- 在第 1 層啟用端口數據傳輸
- 為DS31256啟用TX DMA和RX DMA
- 啟用 HDLC 通道 TX DMA 和 RX DMA
縮寫 | 偏移量/地址 | 寄存器名稱 | 數據表部分 |
---|---|---|---|
司儀 | 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);