This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMDSEVM6670:DPS - FPGA 连接上的端口正常问题

Guru**** 2549370 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/604517/tmdsevm6670-port-ok-problem-on-dps---fpga-connection

器件型号:TMDSEVM6670

大家好、团队、

我们尝试使用 Kintex-7 FPGA 连接套件(具有 IP 内核第4代的 KC705)连接 TMDSEVM6670。

不幸的是、当程序跳转到一个循环等待适当的位值时、我们卡在端口 OK 上。

我们已成功测试的内容:
具有 ISR 的 DSP 回送 DIO 示例(此示例已根据我们的需求进行修改)
DSP - DSP 连接、DIO 数据包在两侧发送。
FPGA 回送 DIO 示例

我们的目标是使用数据速率为3.125Gbps 的单通道建立一个1x 模式连接。

Q1:我认为该套件的 REFCLK 默认为312.5MHz、但我不确定-有任何提示如何检查它?

问题2:我已经检查了 DPS 端的许多设备设置、但嗯、可能我忘记了重要的设置... 从港口 OK 的角度来看、我会感谢您提供任何提示或可能重要的信息。 有什么提示或想法?

问题3:在 sprugw1b.pdf 表3-182中、我读出:

PRESCAALAR_SRV_CLK -默认值31是针对312.5MHz 的 IP_clk 频率。
对于 IP_clk 的不同频率、请使用以下公式:
ip_clk_frequency (以 MHz 为单位)/10四舍五入为最接近的整数。

在带有 ISR 环回的 DIO 示例中、它被设置为0x21、这是十进制的33。
问题是:为什么?
我已经在 e2e 中读出它是 CPU/3、但不确定它是否为真。

Q4:此外、它是否与表3-7中使用的 REFCLK 有任何关系?

以下是我在 DSP 方面的器件设置(如果您需要更多设置或我可以提供的任何信息、请告诉我):

#ifndef __linux_user_space
void
#else
CSL_SrioHandle hSrio、
uint32_t srioSerdesVAddr
#endif
)
{
portsNum=1;
/*获取 CSL SRIO 句柄。 */
hSrio = CSL_SRIO_Open (0);

if (hSrio = NULL)
返回-1;

/*禁用 SRIO 复位隔离的代码*/
IF (CSL_PSC_isModuleResetIsolationEnabled (CSL_PSC_LPSC_SRIO))
{
CSL_PSC_disableModuleResetIsolation (CSL_PSC_LPSC_SRIO);
}

//禁用 SRIO 全局块*/
CSL_SRIO_GlobalDisable (hSrio);

//禁用每个单独的 SRIO 块。 //
for (unsigned int i = 0;i <= 9;i++)
{
CSL_SRIO_DisableBlock (hSrio、i);
}

/*将引导完成设置为0;我们没有完成初始化。 //
CSL_SRIO_SetBootComplete (hSrio、0);

/*现在也启用 SRIO 块和所有单独的块。 *
CSL_SRIO_GlobalEnable (hSrio);
for (unsigned int i = 0;i <= 9;i++)
{
CSL_SRIO_EnableBlock (hSrio、i);
}

/*将 SRIO 端口配置为在正常模式下运行。 :)*/
CSL_SRIO_SetNormalMode (hSrio、0);
//CSL_SRIO_SetNormalMode (hSrio、1);
//CSL_SRIO_SetNormalMode (hSrio、2);
//CSL_SRIO_SetNormalMode (hSrio、3);

/*启用响应数据包的自动优先级提升。 //
CSL_SRIO_EnableAutomaticPriorityPromotion (hSrio);

//将 SRIO 预分频器选择设置为在44.7到89.5范围内运行*/
CSL_SRIO_SetPrescalarSelect (hSrio、0);

#ifndef __linux_user_space
/*解锁引导配置 Kicker */
CSL_BootCfgUnlockKicker();

//假设链路速率为3125;对 PLL 进行相应的编程。 *
CSL_BootCfgSetSRIOSERDESConfigPLL (0x229);//MPY (PLL 乘法器)= 5倍

/*配置 SRIO SERDES 接收配置。 *
CSL_BootCfgSetSRIOSERDESRxConfig (0、0x00440495);//RESCALE = 0.5
//CSL_BootCfgSetSRIOSERDESRxConfig (1、0x00440495);
//CSL_BootCfgSetSRIOSERDESRxConfig (2、0x00440495);
//CSL_BootCfgSetSRIOSERDESRxConfig (3、0x00440495);

/*配置 SRIO SERDES 发送配置。 *
CSL_BootCfgSetSRIOSERDESxConfig (0、0x00180795);//RESCALE = 0.5
//CSL_BootCfgSetSRIOSERDESTxConfig (1、0x00180795);
//CSL_BootCfgSetSRIOSERDESTxConfig (2、0x00180795);
//CSL_BootCfgSetSRIOSERDESTxConfig (3、0x00180795);
#endif

/*循环、直至 SERDES PLL 未锁定。 *
while (1)
{
uint32_t status;
/*获取 SRIO SERDES 状态*/
CSL_BootCfgGetSRIOSERDESStatus (status);
IF (STATUS & 0x1)
{
中断;
}
}

/*清除 LSU 挂起中断。 //
CSL_SRIO_ClearLSUPendingInterrupt (hSrio、0xFFFFFFFF、0xFFFFFFFF);

//设置器件信息*/
CSL_SRIO_SetDeviceInfo (hSrio、device_ID1_16BIT、device_fender_ID、device_revision);

//设置汇
编信息*、device_refender_device_sub版本 信息*、cs_device_setio_revision_device_subset 信息*;

/* SRIO RL 文件缺少重新发送抑制支持(Bit6)字段定义*/
peFeatures.isBridge = 0;
peFeatures.isEndpoint = 0;
peFeatures.isProcessor = 1;
peFeatures.isSwitch = 0;
peFeatures.isMultiport = 0;
peFeatures.isFlowArbiterationSupported = 0;
peFeatures.isMulticastSupported = 0;
peFeatures.isExtendedRouteConfigSupported = 0;
peFeatures.isStandardRouteConfigSupported = 1;
peFeatures.isFlowControlSupported = 1;
peFeatures.isCRF 支持 = 0;
peFeatures.isCTLSSupported = 1;
peFeatures.isExtendedFeaturePtrValid = 1;
peFeatures.numAddressBitSupported = 1;
CSL_SRIO_SetProcessingElementFeatures (hSrio、&peFeatures);

//配置源操作 CAR */
memset (((void *)&opCar、0、sizeof (opCar));
opCar.portWriteOperationSupport = 1;
opCar.ClearicatomSupport = 1;
opCar.atomicSetSupport = 1;
opCar.atomicDecSupport = 1;
opCar.atomicIncSupport = 1;
opCar.atomicTestSwapSupport = 1;
OPCar.DoorbellSupport = 1;
opCar.dataMessageSupport = 1;
opCar.writeResponse 支持 = 1;
opCar.streamWriteSupport = 1;
opCar.writeSupport = 1;
opCar.readSupport = 1;
opCar.dataStreamingSupport = 1;
CSL_SRIO_SetSourceOperationCAR (hSrio、&opCar);

//配置目标操作 CAR */
memset (((void *)&opCar、0、sizeof (opCar));
opCar.portWriteOperationSupport = 1;
opCar.DoorbellSupport = 1;
opCar.dataMessageSupport = 1;
opCar.writeResponse 支持 = 1;
opCar.streamWriteSupport = 1;
opCar.writeSupport = 1;
opCar.readSupport = 1;
CSL_SRIO_SetDestOperationCAR (hSrio、&opCar);

/*设置 SRIO 器件的16位和8位标识符。 *
CSL_SRIO_SetDeviceIDCSR (hSrio、DEVICE_ID1_8位、DEVICE_ID1_16BIT);

/*为维护请求启用 TLM 基本路由信息并确保这样做
*所有端口都可以使用 BRR。 *
CSL_SRIO_SetLMPortBaseRoutingInfo (hSrio、0、1、1、1、1、 0);
CSL_SRIO_SetLMPortBaseRoutingInfo (hSrio、0、2、1、1、 0);
CSL_SRIO_SetLMPortBaseRoutingInfo (hSrio、0、3、1、1、 0);
//CSL_SRIO_SetLMPortBaseRoutingInfo (hSrio、1、0、1、1、1、 0);

SRIO_PLM_IMPL_CONTROL 植入控制;
CSL_SRIO_GetPortPLMIPplSpecificControl (hSrio、0、&implControl);

//####################################################
implControl.useIdle1 = 1;
CSL_SRIO_SetPLMPortImplSpecificControl (hSrio、0、&ImplControl);
//##################################################################################

/*配置基本路由寄存器以确保所有数据包与匹配
*设备标识符和辅助设备 ID 被允许。 *
CSL_SRIO_SetLMPortBaseRoutingPatternMatch (hSrio、0、1、DEVICE_ID2_16BIT、0xFFFF);
//CSL_SRIO_SetLMPortBaseRoutingPatternMatch (hSrio、0、2、DEVICE_ID3_16BIT、0xFFFF);
//CSL_SRIO_SetLMPortBaseRoutingPatternMatch (hSrio、0、3、DEVICE_ID4_16BIT、0xFFFF);
//CSL_SRIO_SetLMPortBaseRoutingPatternMatch (hSrio、1、0、DEVICE_ID2_8位、0xFF);

//我们需要在 QMSS 中打开垃圾收集队列。 这样做是为了确保这一点
*这些队列不是由另一个系统实体打开的。 *
对于(unsigned int i = 0;i < 6;i++)
{
/*打开车库队列*/
garbageQueueHnd[i]= queueHnd = Qmss_queueOpen (Qms_QueueType_General_Purpose、QMSS_Param_not _specified、isAllocated);
如果(队列 Hnd < 0)
返回-1;

/*确保队列尚未打开;我们不会让其他人共享队列
系统中的*实体。 *
如果(等距> 1)
返回-1;
}

/*设置发送垃圾收集信息。 *
CSL_SRIO_SetTxGarbageCollectionInfo (
hSrio、
Qmss_getQIDFromHandle (garbageQueueHnd[0])、
Qmss_getQIDFromHandle (garbageQueueHnd[1])、
Qmss_getQIDFromHandle (garbQueueHnd[2])、
Qmss_getQIDHandle[garbQIdHand]、Qms3[garbqQIdFromHandle)
Qmss_getQIDFromHandle (garbageQueueHnd[4])、
Qmss_getQIDFromHandle (garbageQueueHnd[5])
);

/*设置主机设备标识符。 *
CSL_SRIO_SetHostDeviceID (hSrio、DEVICE_ID1_16BIT);

/*配置组件标签 CSR */
CSL_SRIO_SetCompTagCSR (hSrio、0x00000000);

/*为所有端口配置 PLM。 对于
(unsigned int i = 0;i < portsNum;i++)
{
/*设置 PLM 端口静音计时器。 *
CSL_SRIO_SetPLMPortSilenceTimer (hSrio、I、0x2);

/* TODO:我们需要确保端口0配置为同时支持这两个端口
* 2x 和4x 模式。 端口宽度字段为只读。 那么、在这里、我们简单地说
*确保已启用输入和输出端口。 *
CSL_SRIO_EnableInputPort (hSrio、I);
CSL_SRIO_EnableOutputPort (hSrio、I);

/*设置 PLM 端口发现计时器。 *
CSL_SRIO_SetPLMPortDiscoveryTimer (hSrio、I、0x2);

/*重置端口写入接收捕获。 *
CSL_SRIO_SetPortWriteRecepionCapture (hSrio、I、0x0);
}

/*设置端口链接超时 CSR */
CSL_SRIO_SetPortLinkTimeoutCSR (hSrio、0x000FFF);

/*设置端口常规 CSR:仅作为主设备启用执行*/
CSL_SRIO_SetPortGeneralCSR (hSrio、0、1、0);

/*清除粘滞寄存器位。 *
CSL_SRIO_SetLMResetControl (hSrio、1);

对于维护端口写入操作,/*将设备 ID 设置为0
*向系统主机报告错误。 *
CSL_SRIO_SetPortWriteDeviceId (hSrio、0x0、0x0、0x0);

//设置数据流 MTU */
CSL_SRIO_SetDataStreamingMTU (hSrio、64);

/*为端口配置路径模式。 *
for (unsigned int i = 0;i < portsNum;i++)
{
CSL_SRIO_SetPLMPortPathControlMode (hSrio、i、0);
}

/*设置 LLM 端口 IP 预分频器。 *
CSL_SRIO_SetLLMPortIPPrescalar (hSrio、0x21);/0x21:333MHz -默认值:0x31、312.5MHz

/*启用外设。 *
CSL_SRIO_EnablePeripheral (hSrio);

/*配置已完成。 *
CSL_SRIO_SetBootComplete (hSrio、1);

#ifndef simpler_support
/*此代码检查端口是否正常工作。 不支持该功能
*。 //
for (unsigned int i = 0;i < portsNum;i++)
{
while (CSL_SRIO_IsPortOk (hSrio、i)!= true)
{
}

#endif

/*将所有队列0设置为以相同的优先级运行并将数据包发送到端口0 */
对于(unsigned int i = 0;i < 16;i++)
{
CSL_SRIO_SetTxQueue/分区信息(hSrio、i、0、0);
}

/*设置 Doorbell 路由以确定要使用的路由表
*此配置表示中断路由表配置为
*如下:-
*中断目标0 - INTDST 16
*中断目标1 - INTDST 17
*中断目标2 - INTDST 18
*中断目标3 - INTDST 19
*
CSL_SRIO_SetDoorbellRoute (hSrio、0);

/*路由 Doorbell 中断。
*门铃寄存器0 -所有16个门铃都路由到中断目标0。
*门铃寄存器1 -所有16个门铃都路由到中断目标1。
*门铃寄存器2 -所有16个门铃都路由到中断目标2。
*门铃寄存器3 -所有16个门铃都路由到中断目标3。 //
for (i = 0;i < 16;i++)
//{
// CSL_SRIO_RouteDoorbellInterrupts (hSrio、0、I、0);
// CSL_SRIO_RouteDoorbellInterrupts (hSrio、1、I、1);
// CSL_SRIO_RouteDoorbellInterrupts (hSrio、2、I、2);
// CSL_SRIO_RouteDoorbellInterrupts (hSrio、3、I、3);
//}

/*初始化已完成。 *
返回0; 

谢谢、

Maciej

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Maciej、

    我已通知工厂团队。 他们的反馈将在此处发布。

    此致、
    Yordan