工具/软件:
您好:
我正在根据 enet-layer2-icssg 示例 在 AM243x EVM (MCU+ SDK) 上对定制工程运行测试。
设置:
-
对于测试 2、将端口设置为阻塞或测试 1、一个阻止另一个转发
-
两个 ICSSG 端口都连接到同一个外部交换机(网络环路场景)。
测试 1–两个端口均被阻止:
我将两个端口都设置为ICSSG_PORT_STATE_BLOCKING。
正如预期的那样、未观察到网络环路。
测试 2–一个端口转发、一个端口阻塞:
然后将两个端口中的一个更改为ICSSG_PORT_STATE_FORWARD。
此时、我得到了一个网络环路。
这不是预期行为、因为只有一个端口应转发流量、而另一个端口应保持阻塞。
分析:
我比较了在 Linux 下发送到 PRU 的 R30 消息与 MCU+ SDK:
Linux(内核驱动程序):
static const struct icssg_r30_cmd emac_r32_bitmask[] = {
{{0xffff0004, 0xffff0100, 0xffff0004, EMAC_NONE}}, /* EMAC_PORT_DISABLE */
{{0xfffb0040, 0xfeff0200, 0xfeff0200, EMAC_NONE}}, /* EMAC_PORT_BLOCK */
{{0xffbb0000, 0xfcff0000, 0xdcfb0000, EMAC_NONE}}, /* EMAC_PORT_FORWARD */
};
MCU + SDK:
[ICSSG_UTILS_R30_CMD_DISABLE] = {
{ 0xffff0004, 0xffff0100, 0xffff0104, ICSSG_UTILS_CMD_NONE }
},
[ICSSG_UTILS_R30_CMD_BLOCK] = {
{ 0xfffb0040, 0xfeff0200, 0xfffb0008, 0xffff0200 }
},
[ICSSG_UTILS_R30_CMD_FORWARD] = {
{ 0xffbb0000, 0xfcff0000, 0xdcf30000, ICSSG_UTILS_CMD_NONE }
},
我注意到 Linux 和 MCU+ SDK 的位掩码不同。 如果我将位掩码从 Linux 应用于 MCU SDK、则结果不会更好
然后、我尝试 手动调整 MCU+ SDK 值、得到以下值的理想结果:
[ICSSG_UTILS_R30_CMD_BLOCK] = {
{ 0xfffb0040, 0xfeff0200, 0xfffb0008, 0xfeff0200 }
},
[ICSSG_UTILS_R30_CMD_FORWARD] = {
{ 0xffbb0000, 0xfcff0000, 0xdff30000, 0xFCFF0000 }
},
这改善了情况,但结果仍然不完全正确:有时,如果我将两个端口都设置为转发,则数据包不会正确转发。
问题:
-
是 RXPRU/TXPRU/RTU 固件 Linux 和 MCU+ SDK 之间也是如此?
-
我的测试对测试阻塞和转发数据包是否有意义? 注意:我可以在阻塞模式下发送特殊数据包!
-
R30 位掩码是否正确?
提前感谢您的帮助!