本应用笔记举例说明如何在桥接模式下配置单个T3端口,在DS31256上进行非沟道化工作。此外,此示例还介绍如何在该端口上以环回模式构造、发送、接收和检查数据包。本应用笔记作为编码示例提供,以便于适应最终用户应用。
DS31256本地总线工作在两种模式:
PCI 桥接模式允许 PCI 总线上的主机访问本地总线。PCI总线用于控制和监视DS31256,并在此应用中传输数据包数据。DS31256还配置为将数据从PCI总线映射到本地总线,用于控制和监视xDSL调制解调器或T3/E3接口等外围元件。
此示例具有以下配置:
为了提高可读性,此示例中的代码使用了多个函数调用。这些函数的定义如下:
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内部器件配置寄存器的相应地址/失调列于附表中。此外,缩写 TX 和 RX 分别用于表示发射端和接收端。请参考DS31256数据资料了解更多详情。
复位DS31256包括两个步骤。首先,DS31256的内部RAM必须归零,然后复位DS31256内部寄存器。
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);
使用主复位寄存器(MRID)可以对DS31256中的所有寄存器执行软件复位。主机必须将此位设置回 0,然后才能对设备进行编程以使其正常运行。
缩写 | 偏移量/地址 | 寄存器名称 | 数据表部分 |
---|---|---|---|
核磁共振成像 | 0000 | 主复位和ID寄存器 | 5.1 |
/* Reset DS31256 using MRID registers master reset bit. */
write_reg(MRID, 0x0001);
write_reg(MRID, 0x0000);
DS31256的配置包括以下步骤:
以下各节详细介绍了每个寄存器集的配置。
/* 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总线用于控制和监视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);
DS31256的每个端口包含一个第1层控制器,执行多种功能,包括:
第 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);
DS31256包含一个256通道HDLC控制器,执行第2层功能,包括:
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);
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 块处理数据包数据从 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);
DS31256初始化后的下一步是使能HDLC通道。除了上述配置步骤外,还必须执行以下步骤才能在DS31256中实现数据包发送和接收:
缩写 | 偏移量/地址 | 寄存器名称 | 数据表部分 |
---|---|---|---|
司仪 | 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);