Keystone I 以太网子系统调试手册
2015-05-22
摘要
KeystoneI 系列芯片 (C6670,C6671,C6672,C6674,C6678, TCI6614) 的以太网子系统可以划分为三个功能实体:内部Switch(SGMII Serdes/SGMII/EMAC/CPSW), PA(包加速器),SA(安全加速器)。 该子系统因为包含的子模块多,相对较为复杂,相关的四本用户手册内容组织并不是很容易理解,不少用户在开发过程中都遇到了一些技术难题。本手册总结实际应用中遇到的部分典型的技术问题和各种问题的调试方法,同时也提供以太网子系统的各种实用配置和建议。对于具备基本Keystone I 以太网知识的用户,本手册可以作为用户手册的有力补充。 期望读者在初步阅读user guide 和具备基本的PA LLD/SA LLD 开发经验以后再查阅本文。
1. 以太网子系统说明
在用户手册中,以太网子系统可以称为网络协处理器子系统(NETCP),其主要构成模块有:
1.以太网交换部分
主要模块有Serdes,SGMII, EMAC,三端口交换机等
2.包加速器
主要模块有6 个PDSP,3 个一级的查找表,1 个二级的查找表,对应的Packet DMA 等
3.安全加速器
主要模块有2 个PDSP,加解密和鉴权引擎等
注意:
以太网子系统的整个初始化过程,一般推荐采用从内到外的次序:
PA PAKET DMA->PA PDSP->3 port switch/CPSW->EMAC->SGMII->SGMII Serdes
2. SGMII
2.1 SGMII SerDes 配置
Serdes 的配置主要与供给的Serdes 时钟相关,下面给出一个对应不同时钟频率的配置示例:
312.5MHz-> SGMII PLL Configuration Register 0x41,
250MHz-> SGMII PLL Configuration Register 0x51,
156.25MHz-> SGMII PLL Configuration Register 0x81
配置完毕以后,请注意检查SGMII SerDes Status Register (SGMII_SERDES_STS)的最低Lock 位是否为1。
2.2 SGMII 与PHY的连接
当SGMII 与PHY 连接的时候,SGMII 一定是Slave 模式,一般情况下同时使能自协商。
2.3 SGMII 与Switch的连接
对于支持 SGMII 标准的外部 switch 与 Keystone I 芯片连接的时候,可以一端配置为master,另一端配置为slave,同时使能自协商模式。但是对于只支持1000BASE-X 的switch 与Keystone I 芯片连接的时候,应该将两端都设置为master 模式,并禁止自协商,强制为1000M 全双工。
2.4 MDIO接口与PHY的控制
通过MDIO 控制寄存器MDIO_CONTROL 可以对外接的PHY 进行控制,按照用户手册的建议配置到2.5MHz。需要注意的是:
1.MDIO 模块初始化后,应该先通过MDIO 读取PHY 的ID 寄存器,确认该连接是否正常。
2.读取MDIO 模块的PHY Alive Status Register (ALIVE)获取PHY ID (注意PHY ID 是0~31)
3.将第二步读到的PHY ID 作为PHY address 写到MDIO User Access Register 0 (USERACCESS0)或者MDIO User Access Register 1 (USERACCESS1)中访问对应的PHY 寄存器
2.5 1000M半双工的问题说明
Keystone I 不支持1000M 半双工的应用,当外接的PHY 或者是switch 支持1000M 半双工时,可能会对keystone I 的网络功能造成影响。特别是当某些PHY 在复位过程中,可能会发起1000M 半双工的请求,这种情况下,请在系统上电初始化时先通过MDIO 接口关闭PHY 的1000M 半双工协商能力。
3. EMAC
3.1 VLAN aware模式和VLAN unaware模式
1.VLAN unaware 模式下所有的包不会被改变
2.VLAN aware 模式的配置步骤:
A.配置GbE switch Control 寄存器(CPSW_CONTROL)的VLAN_AWARE 比特
B.配置ALE Control 寄存器(ALE_CONTROL)的ALE_VLAN_AWARE 比特
C.配置P0_PORT_VLAN, P1_PORT_VLAN 和P2_PORT_VLAN 寄存器
3.VLAN aware 模式对不同包的不同策略:
A.对于untagged 包,插入端口所配置的VLAN 头
B.对于priority tagged 包,根据CPSW_CONTROL 中的 P0_PASS_PRI_TAGGED/P1_PASS_PRI_TAGGED/P2_PASS_PRI_TAGGED 配置,如果该位为 0(default),则该端口上收到的priority tagged 包中的VLAN ID 会被替换为该端口配置的VLAN ID。
C.对于VLAN tagged 包,包中的VLAN 优先级会被替换为该端口配置的VLAN 优先级,VLAN ID 不变。
3.2 EMAC 的复位
EMAC 模块提供了一个软复位的寄存器,一般情况下在芯片上电复位启动后,不建议使用该寄存器对EMAC 模块做单独的复位操作,该复位操作后可能会引起以太网包收发异常,请谨慎使用。
3.3 MAC地址的说明
对于Keystone I 的芯片来说,一般可以配置3 个MAC 地址。以C6678 为例,
MACID1 (0x02620110) 和MACID2 (0x02600114)
该MAC 地址是出厂时,TI 写到芯片的Efuse 里的,类似于一个芯片ID,只读不可修改。如果芯片选择以太网boot 方式,芯片会以该地址发出bootp 的报文(Ethernet ready announcement)
MAC1_SA_LO (0x2090870)和MAC1_SA_HI (0x2090874)
MAC2_SA_LO (0x20908A0)和MAC2_SA_HI (0x20908A4)
以上两个MAC 地址是分别配置给两个EMAC 端口的,但该地址的作用仅限于使能以太网Rx 流控以后,封装发到网络上的流控帧,并不按MAC 地址过滤以太网包。
因为Keystone 芯片有包加速器(PA),MAC 地址的过滤应该由配置PA 来完成,所以可以认为Keystone I 的EMAC 模块工作在混杂模式(Promiscuous mode)。 换句话讲,所有的报文都会接收并到PA 进行过滤,从业务层面,对于一颗Keystone I 的芯片理论上最大可以配置64 个MAC 地址(LUT1-0 有64个表项)。
4. CPSW
4.1 ALE 模块的注意事项
4.1.1 MAC地址的老化问题
因为 ALE 只有 1K 个表项,且硬件没有提供内部的 timer 来自动维护一个老化周期,所以应用程序需要自己维护一个 timer。 Time 第一次超时,应用程序对ALE_CONTROL 寄存器的AGE_OUT_NOW 比特置位,会导致所有ageable 的ALE Entry 被设置为untouched; 第二次timer 超时,再次设置ALE_CONTROL 寄存器的 AGE_OUT_NOW 比特,在两次超时之间仍保持为 untouched 的表项将会被清除。如果在两次超时之间,有包交换并重新touched 的表项将会被保留。
4.1.2 ALE Bypass
设置 ALE bypass 只是表明从网络外发到芯片的包,将不会通过查找 ALE 再交换,而是无条件发送到HOST port。 而从HOST port 发送到外部的网络的包仍然要通过ALE 交换。
4.1.3 未知的单播,多播,广播包
1.在某一个端口收到的,ALE 中无法匹配的多播和广播包会被广播到另两个端口。
2.在HOST 端口收到的,ALE 中无法匹配的单播包,会被发送到两个SGMII 端口。
3.在某SGMII 端口收到的,ALE 中无法匹配的单播包,只会被发送另一个SGMII 端口。
4.2 以太网子系统环回配置及其应用
以太网子系统提供如图的SGMII Serdes 环回,SGMII digital 环回,CPSW FIFO 环回。
注意环回的方向,SerDes 环回,SGMII digital 环回和CPSW FIFO 环回都有内环的功能,也就是芯片内的CPU(包括DSP core, ARM core)向外发的包会被环回到芯片。因为发生环回的节点不一样,所以可以利用这几种环回来定位以太网配置问题。示例:
1.CPSWFIFO 环回成功,而Serdes 环回和digital 环回失败,基本可以判定EMAC/SGMII 配置有问题
2.CPSWFIFO 环回和digital 环回成功,而Serdes 环回失败,基本可以判定SGMII Serdes 配置有问题
3.CPSWFIFO 环回,digital 环回和CPSW FIFO 环回都成功,说明CPSW 以下层的配置在基本是正确的
CPSW FIFO 环回还包含了外环的功能,也就是从外部网络(PHY/Switch)进入芯片的包会被环回到外部网络,芯片内的 CPU core 将无法收到这些包。这个功能可以用以判定 PHY/switch 与keystone I 的连接配置是否正确。注意CPSW FIFO 环回只能用于debug, 使能以后不能动态的去使能,也就是说使能以后若想恢复正常状态,必须对整个SoC 下电,重新上电复位。
4.3 以太网流控
Rx 流控的意义是CPSW 检测到FIFO 超过一定的门限以后,该端口主动向网络外发出以太网流控帧。该流控帧的发送量是30pps。
Tx 流控的意义是CPSW 检测到网络对端发出的流控帧,报告给HOST(DSP/ARM),由HOST 软件来裁决减少发送的网络流量。
需要注意的是,如果Rx FIFO 的占用情况一直满足Rx 流控的检测条件,Rx flow control 帧会不断的发送到网络上,这种情况多出现在上层软件或者PA/SA 出现某种异常的场景下。
4.4 CPSW的统计寄存器
1.寄存器实际都是R/W 属性,比如当你读到一个寄存器的值为0x80,回写大于0x80 的数字,会导致该寄存器的值清0。 实际对该组寄存器的写操作是减法关系,如果该寄存器正在动态变化中,对它进行写操作并不会导致统计值的丢失。比如当你读到一个寄存器的值为0x80,回写0x80 的时刻该寄存器实际的值已经变为0x90(因为该时刻有包的收发),则此时写0x80 的结果是该寄存器的值变为0x90-0x80=0x10。
2.CPSW 的统计寄存器有两组,其中STATA 是对应于HOST port, STATB 是两个SGMII port 的和
3.对于统计寄存器中的Rx,Tx 分别都是站在CPSW 模块的角度统计的结果,换句话说,统计STATA中的Rx 表示的是HOST port 从DSP/ARM cores 收进CPSW 的包,Tx 表示的是从HOST port 发出CPSW 到DSP/ARM core 的包;而统计STATB 中的Rx 表示的是两个SGMII 端口从网络收进来的包,Tx 表示的是从两个SGMII 端口发送到外部网络的包。
简单的示例:
1)如果一个包从网络外发送到Keystone I 芯片,DSP/ARM core 没有收到
A.检查STATB 的Rx 寄存器
B.检查STATA 的TX 寄存器
2)如果一个包从DSP/ARM core 发送到网络外,网络上没有收到
A.检查STATA 的Rx 寄存器
B.检查STATB 的TX 寄存器
4.一般情况下RXSOFOVERRUNS/ RXMOFOVERRUNS/ RXDMAOVERRUNS 寄存器都为0,在某些特定条件下,如以太网子系统reset 过程中收到包,这些寄存器出现较小的值且不增加是正常的。但如果这些寄存器出现不断增加且收包流量并不大,这种情况一般说明以太网收包异常,通常异常是由于收包的软件模块异常或者PA 子系统异常造成的。
4.5 802.1P VLAN QoS 的配置
每个CPSW EMAC 端口都有收发的 FIFO,收发的总memory 数为20 个4K block。 Rx/Tx 的收发block数可以通过P1_MAX_BLKS 和P2_MAX_BLKS 寄存器配置。其中Tx FIFO 分为四个 优先级队列(priority queue),优先级0 到3,其中3 的优先级最高。配置过程为:
1.配置packet priority to header packet priority mapping register(P0_RX_PRI_MAP 和两个EMAC 的 MAC_RX_PRI_MAP),将实际的VLAN 包的8 个优先级映射到芯片内部包头的优先级
2.配置header priority to switch priority mapping register (P1_TX_PRI_MAP 和P2_TX_PRI_MAP),将内部包头的优先级映射到4 个优先级队列
注意:
a.对于untagged VLAN包,映射所要用的VLAN优先级将使用端口的VLAN优先级。在P0_PORT_VLAN, P1_PORT_VLAN和P2_PORT_VLAN寄存器中配置
b.当只使用0~3四个优先级队列中的部分时,必须从优先级最高的队列3开始分配。比如只使用两个队列,则应该用3和2。
c.端口0代表HOST port,端口0收到的包都会通过ALE交换后从两个EMAC端口发送出去,所以端口0只需要配置packet priority to header packet priority mapping register,而没有header priority to switch priority mapping register。
下面是三个VLAN映射的示例:
5. PA
5.1 PA PLL配置
根据data sheet(参考SPRS671D TMS320TCI6614 Data Manual Figure 8-25 PASS PLL Block Diagram), PA 子系统的时钟可以选择两个来源,一个是PASS PLLOUT,另一个是从SYSCLK1 固定的三分频。当芯片的主频配置为1GHz 时,如果选择SYSCLK1,则PA 子系统工作频率是333MHz,可以选择PASS PLLOUT 方式,通过PA PLL 配置子系统工作于350MHz。 但是对于主频为1.2GHz 的芯片,只能选择PASS PLLOUT 方式,通过PA PLL 配置子系统工作于350MHz,不能支持SYSCLK1 三分频到400MHz。
5.2 PA的Packet DMA模块
1.PA 的packet DMA 模块有9 个Tx 通道和24 个Rx channel,注意这些通道在硬件上都有固定的映射关系,请在使能PA 子系统的时候,使能所有的通道。
2.PA 的packet DMA 模块有32 个Rx flow。 实际应用中经常见到做法是所有用到Rx Flow/FDQ 的地方都配置同一个 Rx Flow/FDQ,这样的做法虽然最简单,但是一旦出现问题则很容易导致该 FDQ的描述符迅速耗尽,而且很难定位导致问题的点。
3.一般来说在 PA 与其他的硬件模块(特别是 SA)数据交互过程都非常的快,而 PA 将分类好的数据交给 HOST queue,因为有软件的处理所以较慢。故而推荐分开灵活配置不同的 Rx Flow(FDQ): 硬件模块交互间的 FDQ 一般包含 16 个描述符/buffer 就足够了,而最后到 HOST queue 的 Rx Flow/FDQ 可以根据实际软件的处理速度来配置更多的个描述符/buffer。
4.分开配置不同的Rx Flow/FDQ 带来的另一个好处是,配置到HOST queue 的RX flow/FDQ 里的描述符耗尽,也不会影响到硬件的处理。而且因为FDQ 根据不同的功能和包处理流程做了不同的配置,在定位某些网络处理问题的时候更加容易。比如在某一个FDQ 里的描述符用尽时,基本可以确定是该级的相关模块处理的问题,更容易缩小问题定位的范围。
下面是两个的配置实例:
IPSec ESP 隧道模式
1.当 PDSP1 根据 IPSec ESP 的 SPI 将包分类并路由到 SA 的时候,将需要一个 Rx Flow 的配置(在LUT1-1 的配置),假定配置为Rx Flow No.1 (FDQ No.1000,包含空闲描述符/buffer 16 个) 。
2.当SA 对IPSec ESP 报文解密完毕,并送到PDSP2 做内层IP 分类的时候,配置Rx Flow No.2 (FDQ No.1001,包含空闲描述符/buffer 16 个) 。
3.当PDSP3 做完L4/L5 分类以后,将包送到HOST queue 时配置Rx Flow No.3 (FDQ No.1002,包含空闲描述符/buffer 8K 个)。
IPSec AH+ESP 隧道模式
1.当 PDSP1 根据 IPSec AH 的 SPI 将包分类并路由到 SA 的时候,将需要一个 Rx Flow 的配置(在LUT1-1 的配置),假定配置为Rx Flow No.1 (FDQ No.1000,包含空闲描述符/buffer 16 个) 。
2.当SA 对IPSec AH 报文鉴权校验完毕,并送回PDSP1 做IPSec ESP SPI 分类的时候,配置Rx Flow No.4 (FDQ No.1003,包含空闲描述符/buffer 16 个)。
3.当PDSP1 根据IPSec ESP 的SPI 将包分类并路由到SA 的时候,配置Rx Flow No.1 (FDQ No.1000,包含空闲描述符/buffer 16 个) 。
4.当SA 对IPSec ESP 报文解密完毕,并送到PDSP2 做内层IP 分类的时候,配置Rx Flow No.2 (FDQ No.1001,包含空闲描述符/buffer 16 个) 。
5.当PDSP3 做完L4/L5 分类以后,将包送到HOST queue 时配置Rx Flow No.3 (FDQ No.1002,包含空闲描述符/buffer 8K 个) 。
为了更好的定位在开发过程中遇到的网络问题,比如丢包,packet DMA 队列卡死,描述符丢失等等,推荐在应用软件侧做一些描述符的辅助定位手段:
1.当描述符初始化以后,记录下所有的描述符首指针。
2.查询/扫描PA Packet DMA Tx 队列No. 640~648 中描述符个数
3.当发现队列No. 640~648 队列中有包拥塞时(正常情况下该队列中的描述符个数不会超过64 个),停止包的收发
4.将在步骤1 记录的描述符地址与FDQ 残留的和队列No. 640~648 队列中拥塞的做比较
5.发现丢失的描述符,并检查其内容,特别是检查是否有描述符的packet length 超过其链接的所有分片的buffer length 总和的情况
5.3 PA Bypass
芯片可以配置为bypass 整个PA 子系统。PA bypass 的实质是忽略所有的PA 模块(PDSP/LUT)的处理,从SGMII 端口收到的包经过内部的packet stream switch 直接通过PA PKTDMA 模块传输到HOST queue。 其配置过程为:
1.配置CPSW Configuration Register (CPSW_CFG_REG)为0x606(参考sprugz6 Network Coprocessor (NETCP) User Guide)
2.初始化并配置PA Packet DMA 模块
3.配置PA Packet DMA 的Rx flow No.22 和Rx flow No.23,其中Rx flow No.22 中的destination queue代表了从SGMII0 收到的包所要放到的目的队列,Rx flow No.23 中的destination queue 代表了从SGMII1收到的包所要放到的目的队列。
注意:PA bypass 以后,由于所有的包未经过PA 子系统的过滤直接进入到HOST 队列中,流量较大的情况下,很容易造成FDQ 的描述符耗尽。而且容易造成软件协议栈loading 过高,容易遭受网络攻击。另由于在芯片设计中,PA 可以直接与SA 进行数据传输,特别是在from network 方向上对加密的包进行解密以后在送到HOST queue,而 PA bypass 以后,对于加密包的解密处理将增加HOST 侧的CPU 负荷。
5.4 PA的固件和Low level driver
PA 的固件有三个文件,位于PDK 安装目录\pdk_C6678_x_x_x_xx\packages\ti\drv\pa\fw (x_x_x_xx 为版本号) ,PDSP0~PDSP2 共用一个文件(classify1_bin.c),PDSP3 用一个文件(classify2_bin.c),PDSP4 和PDSP5 共用一个文件(pam_bin.c)。PA 子系统运行于大端序,所以固件都是大端序。 注意固件版本和 LLD 版本一定要一致。固件的版本号可以从上述 C 文件的数组中读到,第三个 32 bit WORD 就是版本号。
如上例固件版本号为1.3.0.7
PA LLD 的版本号可以从 PA LLD 安装目录的 paver.h 中得到 (PA_LLD_VERSION_ID 和PA_LLD_VERSION_STR) 。
PA LLD 中的函数Pa_downloadImage 是下载PDSP 固件的,注意其中每个PDSP 的常量表定义pap_pdsp_const_reg_map,不同的版本这些值可能不同。对于某些有ARM core 的Keystone I 芯片,该常量表不是通过 PA LLD 函数来赋值而是Linux kernel 代码直接赋值的,所以必须跟各个版本的固件对应。如果常量表和固件,LLD 的版本不匹配,可能会有某些功能异常。
5.5 PA LUT1表项增加的策略
LUT1 是线性查找表,也就说,配置的表项从下标No. 0 一直找到No.63。 因为不同的表项内容间可能有包含关系,比如某一项A 只要求匹配目的IP 地址,另一项B 配置了同样的目的IP 地址,同时也配置了源IP 地址。这样其实是B 的条件比A 更加严格,那么严格的表项B 应该比宽松的A 下标小。比如配置A 在No.1, B 在No.0, 只有这样B 才能有被匹配的可能性。
注意:PA LLD 提供的函数如Pa_addIp,Pa_addMac 等,都提供了不指定下标的方式添加表项,函数的参数为不指定下标的时候,PA LLD 的处理为从下标较大的开始添加。例如当某个64 表项的表为空,而两次调用Pa_addIp 添加表项并不指定表项位置的时候,第一次添加的表项在No.63 的位置,第二次添加的表项在No.62 位置。
5.6 PA相关的调式
5.6.1 Device simulator 辅助调试
由于PA 子系统主要由硬件模块组成,提供的寄存器有限,对于复杂的功能来说,调试相对比较困难。但是TI 的芯片simulator 上对该子系统进行了充分的支持,在初期开发阶段,simulator上调试PA 更加方便。
下面是一个在TCI6608 的simulator 上使能PA 调试和Log 输出的例子:
1.CCS 安装路径\simulation_csp_ny\bin\configurations\tisim_tci6608_pv.cfg 如果该行被注释,请解注释 INPUT5 log_file, pass.log;
2.在软件初始化中加入下面的代码
3.上两步的初始化过程将在simulator 的安装路径(如CCS 安装路径
\simulation_csp_ny\env\ccs\drivers\pass.log)下产生名为Pass.log 的详细log 文件
该文件包含LUT 表项的添加过程,LUT 表项每一级的匹配过程等等详细的内容。
注意这个方法非常适合诊断某些包未按照预想的规则匹配/路由的情况,软件只需要将测试包发到640 队列(忽略以太网子系统其他的模块的初始化过程)就可以开始测试。但是对于发包量比较大的测试,产生的Log 文件可能过于庞大。
5.6.2 PA子系统提供的系统统计
用PA LLD 提供的Pa_requestStats 和Pa_formatStatsReply 函数可以提取PA 子系统给出的统计计数器,这些统计计数器在系统运行过程中可以诊断部分的包匹配,包错误等问题。下面是对这些计数器的详细说明。
5.6.3 辅助调试的寄存器
利用PDSP所提供的一些辅助计数器/寄存器可以更容易的在运行时定位问题。比如下面的计数器
0x2000000 + 0x10*n PDSPn 收到的包数(包括配置命令和数据包)
0x2000008 + 0x10*n PDSPn收到的配置命令数
举例说明其用法:
1.如果读到0x2000000为0xa,0x2000008为0x1,代表PDSP0收到了9个数据包和1个配置命令
2.在第一步的基础上继续读到 0x2000010为0x3,0x2000018为0x1, 代表PDSP1收到了2个数据包和1个配置命令
3.根据前两步的结果,我们可以知道,有2个数据包在PDSP0收到后继续传给了PDSP1
PDSP control register: PDSP 寄存器,控制PDSP 的运行状态。
PDSP status register: PDSP 状态寄存器,其实是PDSP 固件的PC 值,该值不恒定,如果该值一直不变化,可以确定是PDSP 固件crash。
PDSP instruction RAM: PDSP 指令空间,设置PDSP control register 为1,可以将PDSP halt,同时查看PDSP 的指令空间。在某些功能异常的时候,可以回读PDSP 指令空间,特别是固件的版本号,看看是否与期望的一致。
PDSP debug register: PDSP 的调试寄存器。
LUT table bit map: 查找表的占用状态。每个查找表的表项在占用后,PDSP 都会对该表项对应的位域置位。这个位表中保存的是PDSP/硬件所维护的查找表状态,应用软件可以将其回读来与自己所保存的比较,看看是否有不一致的情况发生。理论上软硬件应该是同步的。
LUT table route info: 根据LUT table bit map 所查找到的对应表项下标,乘以64 字节的偏移量,可以找到该表项匹配后对应的路由信息,该信息是由软件配置的。同样可以回读,看看是否与期望的一致。
5.6.4 PDSP 的单步跟踪
在某些PDSP 相关的问题定位过程中,可能需要对PDSP 做单步跟踪。该方法主要适用于在simulator 的方式下无法重现的功能问题,比如表项匹配失败失败,路由错误等等。获得的信息可以交由TI 进行分析。
调用示例:单步跟踪PDSP1,600 步
6. SA
SA 调试的过程中,请充分利用SA 提供的相关统计信息:
6.1 系统统计
注意:
描述符中提供了PS_flag 字段,可以指定该描述符所发向的目的SGMII 端口(direct packet mode),但是当该描述符要先经过SA 的时候,请清空该字段,否则SA 对该包的处理导致安全上下文的错误(errCtx)。在经过SA 处理后的包仍需要指定对应的SGMII 端口的情况,配置该包从SA输出以后的路由到645 队列/PDSP5,并用PA 的Next route 命令指定到以太网以及对应的SGMII端口号.
6.2 通道统计
注意:
取通道统计应该在调用完SA API Sa_chanReceiveData或Sa_chanSendData以后,而这两个API本身有部分加解密的初步检查作用,应用程序必须要对返回值进行判断。如果它们返回错误,则应该终止向SA发包的过程,并根据返回值来检查自身应用软件的错误。何时调用这两个API是需要注意的另一个问题,在IPsec/SRTP的场景下,TX侧代表to network方向,即加密方向,需要调用调用Sa_chanSendData;Rx侧代表from network方向,即解密方向,需要调用Sa_chanReceiveData。对于air cipher的场景, TX侧对于空中接口来说实际为from air方向, 即解密方向,需要调用调用Sa_chanReceiveData;Rx侧代表to air方向,即加密方向,需要调用Sa_chanSendData。
6.3 辅助寄存器
SA 的辅助寄存器主要用来定位SA 相关的硬件错误,当然该硬件错误可能是由软件的非法操作导致的。下面是常用的辅助寄存器列表,表中标注了正常情况下所期望的值。特别请注意CMD_STATUS 寄存器,在运行时间的SA 异常情况,常能够反映到该寄存器中。其具体的含义请参考SA 用户手册。
7. 总结
本文主要总结了目前为止中国区用户在开发Keystone I 系列芯片的时候,所遇到的以太网子系统相关的典型技术问题,以及阅读user guide 时一些较为集中的疑问。很多用户在开发过程中容易忽略的问题本文都做了强调。PA 子系统部分的调试办法基本可以覆盖开发过程中所遇到的所有问题。文档中给出的各种寄存器配置以及示例程序,都在实际开发中有使用。
参考文献
1.KeyStone Architecture Network Coprocessor (NETCP) User Guide (SPRUGZ6)
2.KeyStone Architecture Gigabit Ethernet (GbE) Switch Subsystem User Guide (SPRUGV9A)
3.KeyStone Architecture Packet Accelerator (PA) User Guide (SPRUGS4)
4.KeyStone Architecture Security Accelerator (SA) User Guide (SPRUGY6)