DS31256 非通道化T3/E3/HSSI/VDSL端口配置,适用于桥接模式应用

描述

概述

本应用笔记举例说明如何在桥接模式下配置单个T3端口,在DS31256上进行非沟道化工作。此外,此示例还介绍如何在该端口上以环回模式构造、发送、接收和检查数据包。本应用笔记作为编码示例提供,以便于适应最终用户应用。

DS31256本地总线工作在两种模式:

  1. PCI 桥接模式
  2. 配置模式

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

    输入:计数 = 等待

    的帧周期数 输出 :

非通道化配置模式编码示例

此编码示例包括以下步骤:

  1. 复位DS31256
  2. 配置 DS31256
  3. 启用 HDLC 通道
  4. 将 HDLC 通道置于环回模式
  5. 排队、发送、接收和检查数据包

以下各节通过简要说明和编码示例详细介绍了其中每个步骤。使用寄存器名称而不是地址来提高可读性。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的配置包括以下步骤:

  1. 配置 PCI 寄存器
  2. 配置第 1 层寄存器
  3. 配置 HDLC 寄存器
  4. 配置 FIFO 寄存器
  5. 配置 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中实现数据包发送和接收:

  1. 在端口 TX 和 RX 配置 RAM 中启用通道
  2. 在第 1 层启用端口数据传输
  3. 为DS31256启用TX DMA和RX DMA
  4. 启用 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);

将 HDLC 通道置于环回模式

配置并启用通道后,DS625的内部逻辑大约需要31256帧周期(<>μs)才能完成向新配置的转换。一旦此转换完成,HDLC通道就可以置于环回模式,以便在该通道上传输的所有数据也将在该通道上接收。在五帧等待期之前将 HDLC 通道置于环回模式可能会导致将垃圾数据写入通道的 RX FIFO。

缩写 偏移量/地址 寄存器名称 数据表部分
RP[n]CR 01xx 接收端口 n 控制寄存器 6.2
/* Wait for at least five frame periods for the internal DS31256 initialization to complete */
frame_wait(5);

/* Set bit 10 = 1 to enable loopback - routes transmit data back to the receive port */
read_reg(RP0CR + 4*port, data);
write_reg(RP0CR + 4*port, data | 0x0400);

排队、发送、接收和检查数据包

DS31256初始化完成后,即可发送和接收数据。由于DS31256处于环回模式,HDLC通道上传输的所有数据也将在该通道上接收。本节介绍如何在主机内存中构建数据包、发送和接收数据包以及检查结果的过程。以下各节详细介绍了此过程。

初始化 RX 空闲队列

在DS31256将接收到的数据包从内部FIFO传输到主机存储器之前,主机必须指示DS31256将数据放在哪里。这是通过 RX 空闲队列完成的。RX 空闲队列中的每个条目都包含一个指向 RX 数据缓冲区的指针和一个 RX 数据包描述符索引。此示例使用 10 个 RX 空闲队列条目。每个条目包含一个 RX 空闲队列大型缓冲区和一个 RX 数据包描述符。DS31256 RX大数据缓冲区大小设置为256字节(RLBS = 256)。此外,DS31256配置为使用4字节CRC,并将RX CRC写入RX数据缓冲器。因此,一个 RX 大数据缓冲区能够容纳多达 252 字节的数据包数据。

缩写 偏移量/地址 寄存器名称 数据表部分
询价 0710 接收空闲队列大型缓冲区主机写入指针 9.2.3
询价 0718 接收空闲队列大缓冲区 DMA 读取指针 9.2.3
/* check for space in RX large free queue */
read_reg(RFQLBWP, wr_ptr);
read_reg(RFQLBRP, rd_ptr);
if (rd_ptr > wr_ptr)
cnt = rd_ptr - wr_ptr - 1;
else
cnt = rfq_end_idx - wr_ptr + rd_ptr;

/* If room in RX free queue then put 10 entries in the queue */
/* dword 0 = RX data buffer address */
/* (use RX data buffer starting at RX buffer area base address) */
/* dword 1 = corresponding RX descriptor index (use RX descriptor table index 0) */
if (cnt > 9)
{
rx_dscr_idx = 0;
for (index=0, index < 10, index++)
{
wr_dword(rfq_base_addr + wr_ptr*8, rx_buf_base_addr+index*256);
wr_dword(rfq_base_addr + wr_ptr*8+4, index);
if (wr_ptr == rfq_end_idx)
wr_ptr = 0;
else
wr_ptr++;
}
/* Advance the RX free queue large buffer write pointer by 10 */
write_reg(RFQLBWP, wr_ptr);
}

在主机内存中构建数据包

此示例将发送 10 个 16 字节数据包的链。在发送数据包之前,必须在主机内存中构造数据包。此外,还必须在主机内存中构造相应的 TX 数据包描述符。以下代码详细介绍了其中每个任务。

/* Create a 16-byte data packet in memory in a TX buffer whose 
start address is the TX buffer area base address */
wr_dword(tx_buf_base_addr,   0x01234567);
wr_dword(tx_buf_base_addr + 4, 0x89ABCDEF);
wr_dword(tx_buf_base_addr + 8, 0x02468ACE);
wr_dword(tx_buf_base_addr + 12, 0x13579BDF);

/* Second data packet goes in second data buffer 
(16-byte packet in 256-byte buffer). */
wr_dword(tx_buf_base_addr + 256, 0x08192A3B);
wr_dword(tx_buf_base_addr + 256 + 4, 0x4D5E6F70);
wr_dword(tx_buf_base_addr + 256 + 8, 0x8192A3B4);
wr_dword(tx_buf_base_addr + 256 + 12, 0xC5D6E7F8);

/* Create 8 more packets with unique data in each. */
for (index = 2, index < 10, index++)
{
wr_dword(tx_buf_base_addr + index*256, 	    0x08192A30  + index);
wr_dword(tx_buf_base_addr + index*256 + 4,   0x4D5E6F71  + index);
wr_dword(tx_buf_base_addr + index*256 + 8,   0x8192A3B2  + index);
wr_dword(tx_buf_base_addr + index*256 + 12, 0xC5D6E7F3 + index);
}

Create 10 TX Descriptors (4 dwords each)
/* TX descriptor table index 0 */
/* dword0 = TX buffer address */
/* dword1 = EOF, CV, byte count (10h), next descriptor pointer */
/* dword2 = HDLC channel */
/* dword3 = PV, next pending descriptor pointer (set to 0) */
tx_dscr_idx = 0;
for (index = 0, index < 10, index++)
{
wr_dword(tdscr_base_addr + index*16, tx_buf_base_addr+index*256);
if (index == 9)
wr_dword(tdscr_base_addr + index*16 + 4, 0x80100000);
/* end of chain, CV set to 0 */
else
wr_dword(tdscr_base_addr + index*16 + 4, 0xC0100000 + index+1);

wr_dword(tdscr_base_addr + index*16 + 8, 0x00000000 + channel);
wr_dword(tdscr_base_addr + index*16 + 12, 0x00000000);
}
/* This creates 10 TX descriptors that are chained or linked 
together via the next descriptor pointer. */

发送和接收数据包

要传输数据包,必须将 TX 描述符放在传输挂起队列中,然后必须递增传输挂起队列写入指针 (TPQWP)。当DS31256检测到待处理队列不为空(TPQWP不等于TPQRP)时,它将开始处理队列条目并传输数据包。

缩写 偏移量/地址 寄存器名称 数据表部分
SDMA 0028 DMA 的状态寄存器 5.3.2
TPQWP 080C 传输挂起队列主机写入指针 9.3.3
TPQRP 0810 传输挂起队列 DMA 读取指针 9.3.3
/* Read SDMA register to clear any previously set status bits */
read_reg(SDMA, data);

Write the TX Pending-Queue Entry
/* check free space in TX pending queue */
read_reg(TPQWP, wr_ptr);
read_reg(TPQRP, rd_ptr)
if (rd_ptr > wr_ptr)
cnt = rd_ptr - wr_ptr - 1;
else
cnt = rfq_end_idx - wr_ptr + rd_ptr;

/* If room in the TX pending queue create an entry for the packet */
if (cnt > 0)
{
/* Bits 0-15 Descriptor Pointer (0000h) */
/* Bits 16-23 HDLC channel - (channel < < 16) */
wr_dword(tpq_base_addr + wr_ptr*4, 0x0000000 + (channel < < 16));

/* Advance the TX pending-queue write pointer */
if (wr_ptr == tpq_end_idx)
wr_ptr = 0;
else
wr_ptr = wr_ptr + 1;
write_reg(TPQWP, wr_ptr);
}

检查结果

在等待足够的时间传输和接收数据包后,可以执行多项检查以确定数据包传输和接收是否成功。以下代码详细介绍了这些检查。

缩写 偏移量/地址 寄存器名称 数据表部分
SDMA 0028 DMA 的状态寄存器 5.3.2
询价 0710 接收空闲队列大型缓冲区主机写入指针 9.2.3
询价 0718 接收空闲队列大缓冲区 DMA 读取指针 9.2.3
RDQRP 073C 接收完成队列主机读取指针 9.2.4
RDQWP 0740 接收完成队列 DMA 写入指针 9.2.4
TDQRP 083C 传输完成队列主机读取指针 9.3.4
TDQWP 0840 传输完成队列 DMA 写入指针 9.3.4
/* Wait two frame periods for packet to be transmitted/received */
frame_wait(2);
/* Check SDMA register, Expected value = 0x6440; if not, it means there was error */
read_reg(SDMA, data);

/* Check to see how many entries are in the TX done queue 
(distance from TDQRP to TDQWP) */
/* Expected value is 0Ah - 10 entries in the TX done queue 
corresponding to the 10 packets that were sent */
read_reg(TDQRP, rd_ptr);
read_reg(TDQWP, wr_ptr);
if (wr_ptr >= rd_ptr)
cnt = wr_ptr - rd_ptr;
else
cnt = tdq_end_idx + 1 - rd_ptr + wr_ptr;

/* Check TX done-queue descriptor */
/* Expected value = 0x00000000 */
/* Bits 15-0 indicates the descriptor pointer */
/* Bits 23-16 indicate the channel number, it should be 0 in this example */
/* Bits 28-26 indicate the packet status, all 0 means the packet 
transmission is complete and the descriptor */
/* Pointer field corresponds to the first descriptor in the HDLC 
packet that has been transmitted */
for (index = 0; index < 10; index++)
{
rd_dword(tdq_base_addr + rd_ptr*4, tdq_entry);
/* Advance the TX done-queue read pointer */
if (rd_ptr == tdq_end_idx)
rd_ptr = 0;
else
rd_ptr = rd_ptr + 1;
write_reg(TDQRP, rd_ptr);
}

/* Check the RX large free queue to see how many RX buffers are 
in the queue (distance from RFQLBRP to RFQLBWP) */
/* Expected number is 0 since the queue had 10 buffers before the 
packet was received and packet reception required 10 buffers */
read_reg(RFQLBRP, rd_ptr);
read_reg(RFQLBWP, wr_ptr);
if (wr_ptr >= rd_ptr)
cnt = wr_ptr - rd_ptr;
else
cnt = rfq_end_idx + 1 - rd_ptr + wr_ptr;

/* Check RX done queue to see if any packets were received (distance from RDQRP to RDQWP)
Expected value is 10 - 10 entries in the RX done-queue entry corresponding to 
the 10 packets that should have been received */
read_reg(RDQRP, rd_ptr);
read_reg(RDQWP, wr_ptr);
if (wr_ptr >= rd_ptr)
cnt = wr_ptr - rd_ptr;
else
cnt = rdq_end_idx + 1 - rd_ptr + wr_ptr;

/* Check the RX done queue descriptor */
/* Expected value = 0x40000000, */
/* Bits 15-0 indicates the descriptor pointer */
/* Bits 23-16 indicate the channel number; it should be 0 in this example */
/* Bits 26-24 indicate the buffer count; all 0 means that a complete packet has been received */
/* Bit 30 EOF = 1 indicates the receiver descriptor is the last one in the chain */
for (index = 0;index < 10;index++)
/* Check all 10 entries */
{
rd_dword(rdq_base_addr + 8*rd_ptr, rdq_entry);

/* Check the corresponding RX descriptor (4 dwords) */
/* dword 0 expected value = 0x10002680 the RX buffer address */
/* dword 1 expected value = 0x80140000 */
/* Bits 15-0 is the next descriptor pointer */
/* Bits 28-16 is the number of bytes stored in the data buffer */
/* Bits 31-29 indicates buffer status */
/* dword 2 expected value = 0xxxxxxx00 */
/* Bits 7-0 indicates HDLC channel number (should match TDQ entry channel) */
/* Bits 31-8 indicates the timestamp (varies) */
rdscr_idx = rdq_entry & 0x0000FFFF;
rd_dword(rdscr_base_addr + 16*rdscr_idx, rdscr_dword0);
rd_dword(rdscr_base_addr + 16*rdscr_idx + 4, rdscr_dword1);
rd_dword(rdscr_base_addr + 16*rdscr_idx + 8, rdscr_dword2);

/* Check the data in the RX buffer */
/* 16 bytes of data + 4-byte CRC */
/* Expected values = 	0x01234567 */
/* 			0x89ABCDEF */
/* 			0x02468ACE */
/* 			0x13579BDF */
/* 			0x05127B09 (4-byte CRC) */
byte_count = (rdscr_dword1 > > 16) & 0x00001FFF;
for (addr = rdscr_dword0, addr < rdscr_dword0 + byte_count; addr = addr + 4)
rd_dword(addr, data);

/* Advance the RX done-queue read pointer */
if (rd_ptr == rdq_end_idx)
rd_ptr = 0;
else
rd_ptr = rd_ptr + 1;
write_reg(RDQRP, rd_ptr);
}

针对高速使用的其他优化

许多变量都是逐个应用程序优化的,并且可以预期一定程度的性能调整。以下选项可能会有所帮助,具体取决于手头应用程序的详细信息:

  1. 端口时钟反转

    在高端口时钟频率的应用中,端口数据变化沿和端口时钟采样边沿之间的偏斜可能成为满足DS31256数据时钟设置要求的问题。反转相应的DS31256端口时钟可以解决这种偏斜问题。通过在寄存器 TP[n]CR 中设置 TICE 位,可以逐端口反转 TX 端口时钟。通过在寄存器RP[n]CR中设置RICE位,可以反转RX端口时钟。

    /* invert the receive clock */
    for(port = 0; port < 16; port++)
    {
    	RPnVal = read_reg(RP0CR + 4*port);
    	RpnVal = RpnVal | 1;
    }
    /* Transmit clock can be inverted in the same manner using the TPnCR register */
    
  2. DS31256 TX/RX 队列缓存

    DS31256包含内部高速缓存存储器,可用于突发读/写多个DMA队列条目,从而减少DS31256用于执行这些DMA操作的PCI总线带宽量。重置后将禁用这些缓存。用于启用和配置这些内部缓存存储器的寄存器如下:

    • TDMAQ - TX DMA 队列控制
    • TDQFFT - TX DMA 完成队列 FIFO 刷新计时器
    • RDMAQ - RX DMA 队列控制
    • RDQFFT - RX DMA 完成队列 FIFO 刷新计时器

    TDMAQ寄存器用于启用和刷新DS31256 TX待处理队列缓存和TX完成队列缓存。RDMAQ 寄存器用于启用和刷新 RX 空闲队列缓存和 RX 完成队列缓存。寄存器 TDQFFT 和 RDQFFT 用于控制 TX 完成队列缓存和 RX 完成队列缓存中的条目刷新到主机内存中各自缓存的频率。

    TX/RX 完成队列 FIFO 刷新计时器控制 TX/RX 完成队列条目在写出到主机内存中的相应队列之前在缓存中等待的最长时间。为了最大限度地提高从内部缓存到主机内存的突发完成队列条目的效率,应将刷新计时器值设置为足够大的值,以便在正常操作下,触发缓存写入主机内存的将是缓存高水位线,而不是刷新计时器超时。在数据包速率较低的应用程序中,太大的刷新计时器值可能会导致将完成队列条目放入缓存与将其写出到主机内存中的队列之间的延迟增加。因此,必须根据应用要求选择先进先出冲洗定时器的最佳值。

    /* Slow flushes */
    write_reg(CHAT_REG_DMA_RDQFFT, 0x1000);
    write_reg(CHAT_REG_DMA_TDQFFT, 0x1000);
    

    请参考DS31256数据资料,详细了解如何配置这些寄存器。

  3. DMA 队列的中断驱动主机服务

    如果DS31256工作在桥接模式,则PCI总线在DS31256 DMA传输和DS31256内部寄存器访问之间共享。如果主机处理器使用轮询方案为DS31256的DMA队列提供服务,则轮询速率会对DS31256的最大吞吐能力产生负面影响,因为寄存器轮询占用了一定比例的PCI总线带宽。轮询还会给处理器带来不必要的负担,因为它会产生大量开销。为了尽量减少用于DS31256寄存器访问的PCI总线带宽百分比,可以实现中断驱动的DMA队列服务方案。通过在ISDMA寄存器中设置适当的位,可以使用各种DS31256 DMA队列访问事件在DS31256 LINT和PINTA引脚上产生硬件中断。请参考DS31256数据资料了解更多详情。
    进一步的优化是能够对DS31256进行编程,使其仅在发生多个TX/RX完成队列写入事件后,而不是仅在单个写入事件之后设置SDMA寄存器中的TDQW/RDQW位。此功能可用于降低 TX/RX 完成队列写入中断的频率,并增加在检测到中断时准备处理的 TX/RX 完成队列条目的数量。因此,处理 TX/RX 完成队列条目变得更加高效。在发送端,此功能由TDMAQ寄存器中的位域TDQT[2:0]控制。在接收端,此功能由位字段 RDQT[2:0] 和 RDMAQ 寄存器控制。请参考DS31256数据资料了解更多详情。

    /* Interrupt driven code is almost certainly required at high speeds. */
    /* Turn on interrupts for RLBR */
    write_reg(CHAT_REG_GEN_ISDMA, read_reg(CHAT_REG_GEN_ISDMA) |
    CHAT_BIT_GEN_SDMAISDMA_RLBR);
    
  4. TX/RX 先进先出大小和水印

    最佳 TX/RX FIFO 块分配和水印设置因应用要求而异。以下准则可用作起点:

    • 对于所有 HDLC 通道具有大致均匀吞吐量要求的应用,请在通道之间均匀分配 FIFO 模块。
    • 对于 HDLC 通道没有统一吞吐量要求的应用,请使用基于吞吐量的加权方案在通道之间划分 FIFO 块。对于具有较高吞吐量要求的通道,应分配更多相对于具有较低吞吐量要求的通道的 FIFO 块。
    • 具有大致相同吞吐量要求的所有 HDLC 通道都应将其低传输水位线设置为相同的值。同样,它们的接收高水位线应设置为相同的值。
    • 将 TX FIFO 低水位线设置为 25%。根据需要增加,直到达到可接受的 TX 下溢率。

    选择 TX FIFO 低水位线值的目的是在通道 TX FIFO 数据请求到服务延迟和高效数据传输到 TX FIFO 之间找到可接受的平衡。低水位线值可最大限度地提高数据传输效率,因为 TX FIFO 能够在提供服务时接受更多数据。TX FIFO在维修时可以接受的数据越多,DS31256就越能有效地将新数据从主机存储器DM传输到TX FIFO。相反,低水位线的高值可最大程度地减少传输下溢的可能性。TX FIFO 请求更多数据时的数据量越大,TX FIFO 在下溢之前等待服务的时间就越长。

    将 RX FIFO 高水位线设置为 75%。根据需要减少,直到达到可接受的 RX 溢出率。

    选择 RX FIFO 高水位线的目标是在 RX FIFO 数据请求到服务延迟和高效数据传输到 TX FIFO 之间找到可接受的平衡。高水位线的高值可最大限度地提高数据传输效率,因为 RX FIFO 在提供服务时将包含更多数据。RX FIFO包含的数据越多,DS31256将数据DMA输出到主机存储器的效率就越高。相反,高水位线的低值可将接收溢出的可能性降至最低。RX FIFO 请求清空时的空白空间越多,RX FIFO 在溢出之前等待维修的时间就越长。

  5. DMA 突发长度

    DS31256的默认DMA突发长度为32个双字。在支持更长突发的系统中,DS31256 DMA数据传输效率可以通过将其最大DMA突发长度增加到64个dwords、128个dwords或256个dwords来提高。这是通过DS31256 MC寄存器中的DS1 TX/RX DMA节流参数、位字段TDT[0:1]和RDT[0:31256]实现的。增加DS31256的最大DMA突发长度的结果是,DS31256 DMA事务的待处理延迟以及与DS31256共享PCI总线的其他器件的待处理事务可能会增加延迟。
    DS31256另外两个可用于提高DMA突发效率的参数是PCI总线高速缓存线路大小和PCI总线延迟定时器。这些参数中的每一个都控制DS31256如何执行PCI总线事务。
    高速缓存行大小参数寄存器 PLTH0[7:0] 应设置为与系统内存控制器的高速缓存行大小匹配。当DS31256尝试执行超过高速缓存行大小的突发读取时,它将发出存储器读取多个命令而不是存储器读取命令,以通知存储器系统正在启动多高速缓存行读取。如果内存系统能够提前读取一个或多个附加高速缓存行,则当读取的数据总量超过单个高速缓存行时,这可能会导致更高效的数据传输。
    延迟定时器参数寄存器PLTH0[15:8]控制DS31256在PCI总线仲裁器解除DS31256的PGNT输入信号后放弃对总线的控制之前的最短时间长度。延迟定时器值越大,潜在的PCI事务突发长度越长,从而可以提高DS31256数据传输的效率。然而,由于DS31256放弃PCI总线的速度较慢,PCI总线上其他器件的潜在授权延迟会增加。请参考DS31256数据资料,了解这些特性的更多详细信息。

  6. TX/RX FIFO HDLC 信道仲裁

    重置后,TX/RX FIFO HDLC 通道仲裁方案设置为轮循机制。对于低通道数应用程序,可以通过使用基于优先级的仲裁方案而不是轮循机制方案来减少通道服务延迟。TX/RX FIFO HDLC 信道仲裁方案通过 MC 寄存器中的 TFPC[1:0] 和 RFPC[1:0] 位字段进行选择。请参考DS31256数据资料了解更多详情。

  7. 杂项提示

    为了帮助早期代码开发,请编写一个函数来回收数据包,然后使用它设置一个长测试循环。这将测试所有循环队列,因为它们围绕着一个共同的困难源,并确保代码中没有内存泄漏。

结论

本应用笔记介绍了如何在桥接模式下为DS3配置单个T31256端口的非沟道工作。编码示例描述了如何对DS31256进行编程(配置)并详细(逐步)发送/接收数据包。本应用笔记列出了DS31256高速使用的一些有用优化。

审核编辑:郭婷

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分