您好、TI 专家、
我们目前正在努力让 DP83826I PHY 与 Sitara AM243x 一起运行。
为了分步分析问题、我们尝试从在我们自己的硬件目标上运行的 AM243x SDK (V08.03.00.18)获取"enet_layer2_icssg"示例、我们在其中使用 DP83826I PHY。
我们修改了 example.syscfg 以匹配我们的硬件设计:
/**
* These arguments were used when this file was generated. They will be automatically applied on subsequent loads
* via the GUI or CLI. Run CLI with '--help' for additional information on how to override these arguments.
* @cliArgs --device "AM243x_ALV_beta" --package "ALV" --part "ALV" --context "r5fss0-0" --product "MCU_PLUS_SDK_AM243x@08.03.00"
* @versions {"tool":"1.12.1+2446"}
*/
/**
* Import the modules used in this configuration.
*/
const gpio = scripting.addModule("/drivers/gpio/gpio", {}, false);
const gpio1 = gpio.addInstance();
const gpio2 = gpio.addInstance();
const i2c = scripting.addModule("/drivers/i2c/i2c", {}, false);
const i2c1 = i2c.addInstance();
const i2c2 = i2c.addInstance();
const pruicss = scripting.addModule("/drivers/pruicss/pruicss", {}, false);
const pruicss1 = pruicss.addInstance();
const pruicss2 = pruicss.addInstance();
const udma = scripting.addModule("/drivers/udma/udma", {}, false);
const udma1 = udma.addInstance();
const debug_log = scripting.addModule("/kernel/dpl/debug_log");
const mpu_armv7 = scripting.addModule("/kernel/dpl/mpu_armv7", {}, false);
const mpu_armv71 = mpu_armv7.addInstance();
const mpu_armv72 = mpu_armv7.addInstance();
const mpu_armv73 = mpu_armv7.addInstance();
const mpu_armv74 = mpu_armv7.addInstance();
const mpu_armv75 = mpu_armv7.addInstance();
const mpu_armv76 = mpu_armv7.addInstance();
const mpu_armv77 = mpu_armv7.addInstance();
const enet_icss = scripting.addModule("/networking/enet_icss/enet_icss", {}, false);
const enet_icss1 = enet_icss.addInstance();
/**
* Write custom configuration values to the imported modules.
*/
gpio1.$name = "CONFIG_GPIO_RESET1";
gpio1.pinDir = "OUTPUT";
gpio1.GPIO.gpioPin.$assign = "ball.U13";
gpio2.$name = "CONFIG_GPIO_RESET2";
gpio2.pinDir = "OUTPUT";
gpio2.GPIO.gpioPin.$assign = "ball.V7";
i2c1.$name = "CONFIG_I2C0";
i2c1.I2C.$assign = "I2C0";
i2c1.I2C.SCL.$assign = "ball.A18";
i2c1.I2C.SDA.$assign = "ball.B18";
i2c2.$name = "CONFIG_I2C1";
i2c2.I2C.$assign = "I2C1";
i2c2.I2C.SCL.$assign = "ball.C18";
i2c2.I2C.SDA.$assign = "ball.B19";
pruicss2.$name = "CONFIG_PRU_ICSS0";
pruicss2.coreClk = 333333333;
pruicss2.iepClk = 500000000;
udma1.$name = "CONFIG_UDMA_PKTDMA_0";
udma1.instance = "PKTDMA_0";
debug_log.enableUartLog = true;
debug_log.enableCssLog = false;
debug_log.uartLog.$name = "CONFIG_UART0";
mpu_armv71.$name = "CONFIG_MPU_REGION0";
mpu_armv71.size = 31;
mpu_armv71.attributes = "Device";
mpu_armv71.accessPermissions = "Supervisor RD+WR, User RD";
mpu_armv71.allowExecute = false;
mpu_armv72.$name = "CONFIG_MPU_REGION1";
mpu_armv72.size = 15;
mpu_armv72.accessPermissions = "Supervisor RD+WR, User RD";
mpu_armv73.$name = "CONFIG_MPU_REGION2";
mpu_armv73.baseAddr = 0x41010000;
mpu_armv73.size = 15;
mpu_armv73.accessPermissions = "Supervisor RD+WR, User RD";
mpu_armv74.$name = "CONFIG_MPU_REGION3";
mpu_armv74.accessPermissions = "Supervisor RD+WR, User RD";
mpu_armv74.baseAddr = 0x70000000;
mpu_armv74.size = 23;
mpu_armv75.$name = "CONFIG_MPU_REGION4";
mpu_armv75.accessPermissions = "Supervisor RD+WR, User RD";
mpu_armv75.baseAddr = 0x80000000;
mpu_armv75.size = 31;
mpu_armv76.$name = "CONFIG_MPU_REGION5";
mpu_armv76.accessPermissions = "Supervisor RD+WR, User RD";
mpu_armv76.baseAddr = 0xA5000000;
mpu_armv76.size = 23;
mpu_armv76.attributes = "NonCached";
mpu_armv77.$name = "CONFIG_MPU_REGION6";
mpu_armv77.size = 27;
mpu_armv77.baseAddr = 0x60000000;
enet_icss1.$name = "CONFIG_ENET_ICSS0";
enet_icss1.GigabitSupportEnable = false;
enet_icss1.phyAddr2 = 7;
enet_icss1.phyAddr1 = 3;
enet_icss1.icss = pruicss1;
pruicss1.$name = "CONFIG_PRU_ICSS1";
pruicss1.intcMapping.create(1);
pruicss1.intcMapping[0].$name = "CONFIG_ICSS1_INTC_MAPPING0";
pruicss1.intcMapping[0].event = "41";
pruicss1.intcMapping[0].channel = "7";
pruicss1.intcMapping[0].host = "8";
/**
* Pinmux solution for unlocked pins/peripherals. This ensures that minor changes to the automatic solver in a future
* version of the tool will not impact the pinmux you originally saw. These lines can be completely deleted in order to
* re-solve from scratch.
*/
gpio1.GPIO.$suggestSolution = "GPIO0";
gpio2.GPIO.$suggestSolution = "GPIO0";
debug_log.uartLog.UART.$suggestSolution = "USART0";
debug_log.uartLog.UART.RXD.$suggestSolution = "ball.D15";
debug_log.uartLog.UART.TXD.$suggestSolution = "ball.C16";
enet_icss1.PRU_ICSSG1_MDIO.$suggestSolution = "PRU_ICSSG1_MDIO0";
enet_icss1.PRU_ICSSG1_MDIO.MDC.$suggestSolution = "ball.Y6";
enet_icss1.PRU_ICSSG1_MDIO.MDIO.$suggestSolution = "ball.AA6";
enet_icss1.PRU_ICSSG1_IEP.$suggestSolution = "PRU_ICSSG1_IEP1";
enet_icss1.PRU_ICSSG1_IEP.EDC_LATCH_IN0.$suggestSolution = "ball.Y13";
enet_icss1.PRU_ICSSG1_IEP.EDC_SYNC_OUT0.$suggestSolution = "ball.V12";
enet_icss1.PRU_ICSSG1_MII_G_RT.$suggestSolution = "PRU_ICSSG1_MII_G_RT";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII0_COL.$suggestSolution = "ball.U15";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII0_CRS.$suggestSolution = "ball.U14";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII0_RXD0.$suggestSolution = "ball.Y7";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII0_RXD1.$suggestSolution = "ball.U8";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII0_RXD2.$suggestSolution = "ball.W8";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII0_RXD3.$suggestSolution = "ball.V8";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII0_RXDV.$suggestSolution = "ball.Y8";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII0_RXER.$suggestSolution = "ball.V13";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII0_RXLINK.$suggestSolution = "ball.W13";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII0_TXD0.$suggestSolution = "ball.AA8";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII0_TXD1.$suggestSolution = "ball.U9";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII0_TXD2.$suggestSolution = "ball.W9";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII0_TXD3.$suggestSolution = "ball.AA9";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII0_TXEN.$suggestSolution = "ball.Y9";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII1_COL.$suggestSolution = "ball.V14";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII1_CRS.$suggestSolution = "ball.W14";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII1_RXD0.$suggestSolution = "ball.W11";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII1_RXD1.$suggestSolution = "ball.V11";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII1_RXD2.$suggestSolution = "ball.AA12";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII1_RXD3.$suggestSolution = "ball.Y12";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII1_RXDV.$suggestSolution = "ball.W12";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII1_RXER.$suggestSolution = "ball.AA13";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII1_RXLINK.$suggestSolution = "ball.U12";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII1_TXD0.$suggestSolution = "ball.AA10";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII1_TXD1.$suggestSolution = "ball.V10";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII1_TXD2.$suggestSolution = "ball.U10";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII1_TXD3.$suggestSolution = "ball.AA11";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII1_TXEN.$suggestSolution = "ball.Y11";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII_MR0_CLK.$suggestSolution = "ball.AA7";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII_MR1_CLK.$suggestSolution = "ball.U11";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII_MT0_CLK.$suggestSolution = "ball.V9";
enet_icss1.PRU_ICSSG1_MII_G_RT.MII_MT1_CLK.$suggestSolution = "ball.Y10";
接下来、我们在硬件目标上运行示例、应用程序中的日志看起来不错、但我们无法通过 PHY 看到任何通信:
==========================
MULTIPORT TEST
==========================
Init all peripheral clocks
----------------------------------------------
Enabling clocks!
Open all peripherals
----------------------------------------------
Init configs EnetType:2, InstId :1
----------------------------------------------
icssg1: Open port 1
EnetPhy_bindDriver:1718
icssg1: Open port 2
EnetPhy_bindDriver:1718
PHY 3 is alive
PHY 7 is alive
icssg1: Register async IOCTL callback
icssg1: Register TX timestamp callback
Attach core id 1 on all peripherals
----------------------------------------------
icssg1: Attach core
Create RX tasks
----------------------------------------------
icssg1: Create RX task
icssg1: Waiting for link up...
Enet Multiport Menu:
'T' - Enable timestamp prints
't' - Disable timestamp prints
's' - Print statistics
'r' - Reset statistics
'm' - Show allocated MAC addresses
'd' - Enable dscp based priority mapping
'x' - Stop the test
Icssg_handleLinkUp:3060
icssg1: Port 1 link is up
icssg1: Set port state to 'Forward'
icssg1: Async IOCTL completed
icssg1: Async IOCTL completed
Icssg_handleLinkUp:3060
icssg1: Port 2 link is up
icssg1: Set port state to 'Forward'
icssg1: Async IOCTL completed
icssg1: Async IOCTL completed
icssg1: Open DMA
initQs() txFreePktInfoQ initialized with 8 pkts
icssg1: Set MAC addr: 70:ff:76:1d:92:c1
icssg1: MAC port addr: 70:ff:76:1d:92:c1
我们看不到来自目标的任何通信(它应该回送所有接收到的帧)、但链路检测等似乎起作用。 我们在示例中稍微深入地看了一下,我们在 EnetUdma_rxCqIsr()函数中设置了一个断点,但从未调用过该断点。
我们在启动后立即进行了正确的 PHY 配置检查、以实现 PHY 寄存器转储:
PHY 3 Register Dump Register 0000 is: 2100 Register 0001 is: 7849 Register 0002 is: 2000 Register 0003 is: A131 Register 0004 is: 0181 Register 0005 is: 0000 Register 0006 is: 0004 Register 0007 is: 2001 Register 0008 is: 0000 Register 0009 is: 0020 Register 000A is: 0100 Register 000B is: 040B Register 000C is: 0000 Register 000D is: 0000 Register 000E is: 0000 Register 000F is: 0000 Register 0010 is: 0004 Register 0011 is: 0108 Register 0012 is: 0000 Register 0013 is: 0000 Register 0014 is: 0000 Register 0015 is: 0000 Register 0016 is: 0100 Register 0017 is: 0041 Register 0018 is: 0400 Register 0019 is: C003 Register 001A is: 0000 Register 001B is: 007D Register 001C is: 05EE Register 001D is: 0000 Register 001E is: 0102 Register 0467 is: 00CF Register 0468 is: 2586 PHY 7 Register Dump Register 0000 is: 2100 Register 0001 is: 7849 Register 0002 is: 2000 Register 0003 is: A131 Register 0004 is: 0181 Register 0005 is: 0000 Register 0006 is: 0004 Register 0007 is: 2001 Register 0008 is: 0000 Register 0009 is: 0020 Register 000A is: 0100 Register 000B is: 040B Register 000C is: 0000 Register 000D is: 0000 Register 000E is: 0000 Register 000F is: 0000 Register 0010 is: 0004 Register 0011 is: 0108 Register 0012 is: 0000 Register 0013 is: 0000 Register 0014 is: 0000 Register 0015 is: 0000 Register 0016 is: 0100 Register 0017 is: 0041 Register 0018 is: 0400 Register 0019 is: C007 Register 001A is: 0000 Register 001B is: 007D Register 001C is: 05EE Register 001D is: 0000 Register 001E is: 0102 Register 0467 is: 00DF Register 0468 is: 2186
我们感到奇怪的是、"自动协商"似乎被禁用-它应该通过自举引脚启用(请参阅寄存器0x0467中的自举锁存器)。
我们在 LinkUp 事件之后进行了额外的寄存器转储、现在他似乎正确启用了"自动协商"、但仍然无法进行通信。:
After LinkUp PHY 3 Register Dump Register 0000 is: 3100 Register 0001 is: 786D Register 0002 is: 2000 Register 0003 is: A131 Register 0004 is: 01E1 Register 0005 is: CDE1 Register 0006 is: 000F Register 0007 is: 2001 Register 0008 is: 0000 Register 0009 is: 0020 Register 000A is: 0100 Register 000B is: 040B Register 000C is: 0000 Register 000D is: 0000 Register 000E is: 0000 Register 000F is: 0000 Register 0010 is: 0015 Register 0011 is: 0108 Register 0012 is: 6400 Register 0013 is: 2800 Register 0014 is: 0000 Register 0015 is: 0000 Register 0016 is: 0100 Register 0017 is: 0041 Register 0018 is: 0400 Register 0019 is: CC03 Register 001A is: 0000 Register 001B is: 007D Register 001C is: 05EE Register 001D is: 0000 Register 001E is: 0102 Register 0467 is: 00CF Register 0468 is: 2586 PHY 7 Register Dump Register 0000 is: 3100 Register 0001 is: 786D Register 0002 is: 2000 Register 0003 is: A131 Register 0004 is: 01E1 Register 0005 is: 45E1 Register 0006 is: 0007 Register 0007 is: 2001 Register 0008 is: 0000 Register 0009 is: 0020 Register 000A is: 0100 Register 000B is: 040B Register 000C is: 0000 Register 000D is: 0000 Register 000E is: 0000 Register 000F is: 0000 Register 0010 is: 0615 Register 0011 is: 0108 Register 0012 is: 6400 Register 0013 is: 2800 Register 0014 is: 0000 Register 0015 is: 0000 Register 0016 is: 0100 Register 0017 is: 0041 Register 0018 is: 0400 Register 0019 is: CC07 Register 001A is: 0000 Register 001B is: 007D Register 001C is: 05EE Register 001D is: 0000 Register 001E is: 0102 Register 0467 is: 00DF Register 0468 is: 2186
下面是另一个使我们困惑的点:为什么在 LinkUp 之后寄存器0x19中保留的位10设置为1?
您是否有任何提示、为什么沟通无法正常进行、以及我们可以在哪里进一步调查?
此致
Alex
