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.

AM2634: ENET CPSW supports 1G speed

Part Number: AM2634

Tool/software:

Hi Team

I have a query regarding the CPSW Ethernet configuration. I have set up the CPSW interface in RGMII mode and configured it for 1Gbps operation. However, I am unable to achieve communication at this speed — specifically, I am not able to ping the device when 1Gbps is configured.

On the other hand, when I set the PHY speed to Auto, 10Mbps, or 100Mbps, the ping works successfully and I am able to communicate over the network at the corresponding speed.

Given this behavior, I would like to understand the following:

  • Is there any specific configuration or hardware setting required to enable and successfully operate at 1Gbps using RGMII with CPSW?

  • Does the AM263x CPSW interface fully support 1Gbps operation in RGMII mode, or is it limited to 10/100Mbps?

  • Are there any timing adjustments (e.g., RGMII TX/RX delay, internal/external delay) or board-level constraints I should verify?

I would appreciate any guidance or documentation references that could help me ensure correct 1Gbps operation.

  • Hi Anjana,

    CPSW does indeed support RGMII and 1Gbps speed. Do you mind sharing the below details:
    1. MCU_PLUS_SDK version

    2. Link partner details (make sure the link partner connected to am263x is also 1Gbps and RGMII capable)

    3. MCU_PLUS_SDK application you are testing for 1Gbps

    4. Can you share your example.syscfg file here?

    Regards,
    Shaunak

  • Hi Shaunak,

    1. MCU_PLUS_SDK version - mcu_plus_sdk_am263x_10_00_00_35

    2. Link partner details (make sure the link partner connected to am263x is also 1Gbps and RGMII capable) - yes, i have cross verified that the cable supports 1G by connecting it between 2 laptops.

    3. MCU_PLUS_SDK application you are testing for 1Gbps - yes

    4. Can you share your example.syscfg file here?  I have attached the 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 "AM263x_beta" --part "AM263x" --package "ZCZ" --context "r5fss0-0" --product "MCU_PLUS_SDK_AM263x@10.00.00"
     * @v2CliArgs --device "AM2631-Q1" --package "NFBGA (ZCZ)" --context "r5fss0-0" --product "MCU_PLUS_SDK_AM263x@10.00.00"
     * @versions {"tool":"1.21.0+3721"}
     */
    
    /**
     * Import the modules used in this configuration.
     */
    const eeprom          = scripting.addModule("/board/eeprom/eeprom", {}, false);
    const eeprom1         = eeprom.addInstance();
    const gpio            = scripting.addModule("/drivers/gpio/gpio", {}, false);
    const gpio1           = gpio.addInstance();
    const i2c             = scripting.addModule("/drivers/i2c/i2c", {}, false);
    const i2c1            = i2c.addInstance();
    const i2c2            = i2c.addInstance();
    const debug_log       = scripting.addModule("/kernel/dpl/debug_log");
    const dpl_cfg         = scripting.addModule("/kernel/dpl/dpl_cfg");
    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 default_linker  = scripting.addModule("/memory_configurator/default_linker", {}, false);
    const default_linker1 = default_linker.addInstance();
    const general         = scripting.addModule("/memory_configurator/general", {}, false);
    const general1        = general.addInstance();
    const region          = scripting.addModule("/memory_configurator/region", {}, false);
    const region1         = region.addInstance();
    const section         = scripting.addModule("/memory_configurator/section", {}, false);
    const section1        = section.addInstance();
    const section2        = section.addInstance();
    const section3        = section.addInstance();
    const section4        = section.addInstance();
    const section5        = section.addInstance();
    const section6        = section.addInstance();
    const section7        = section.addInstance();
    const section8        = section.addInstance();
    const section9        = section.addInstance();
    const enet_cpsw       = scripting.addModule("/networking/enet_cpsw/enet_cpsw", {}, false);
    const enet_cpsw1      = enet_cpsw.addInstance();
    
    /**
     * Write custom configuration values to the imported modules.
     */
    eeprom1.$name = "CONFIG_EEPROM0";
    
    gpio1.$name          = "MCA_PHY1_RST";
    gpio1.pinDir         = "OUTPUT";
    gpio1.defaultValue   = "1";
    gpio1.GPIO_n.$assign = "EPWM4_A";
    
    i2c1.$name               = "CONFIG_I2C0";
    eeprom1.peripheralDriver = i2c1;
    i2c1.I2C.$assign         = "I2C0";
    i2c1.I2C.SCL.$assign     = "I2C0_SCL";
    i2c1.I2C.SDA.$assign     = "I2C0_SDA";
    i2c1.I2C_child.$name     = "drivers_i2c_v1_i2c_v1_template1";
    
    i2c2.$name           = "CONFIG_I2C1";
    i2c2.I2C.$assign     = "I2C2";
    i2c2.I2C.SCL.$assign = "UART0_RTSn";
    i2c2.I2C.SDA.$assign = "UART0_CTSn";
    i2c2.I2C_child.$name = "drivers_i2c_v1_i2c_v1_template2";
    
    debug_log.enableUartLog            = true;
    debug_log.enableCssLog             = false;
    debug_log.uartLog.$name            = "CONFIG_UART0";
    debug_log.uartLog.UART.$assign     = "UART0";
    debug_log.uartLog.UART.RXD.$assign = "UART0_RXD";
    debug_log.uartLog.UART.TXD.$assign = "UART0_TXD";
    debug_log.uartLog.child.$name      = "drivers_uart_v2_uart_v2_template0";
    
    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          = 0x80000;
    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              = 21;
    
    mpu_armv75.$name      = "CONFIG_MPU_REGION4";
    mpu_armv75.baseAddr   = 0x70080000;
    mpu_armv75.size       = 14;
    mpu_armv75.attributes = "NonCached";
    
    default_linker1.$name = "memory_configurator_default_linker0";
    
    general1.$name        = "CONFIG_GENERAL0";
    general1.stack_size   = 8192;
    general1.heap_size    = 34000;
    general1.linker.$name = "TIARMCLANG0";
    
    region1.$name                               = "MEMORY_REGION_CONFIGURATION0";
    region1.memory_region.create(7);
    region1.memory_region[0].type               = "TCMA";
    region1.memory_region[0].$name              = "R5F_VECS";
    region1.memory_region[0].size               = 0x40;
    region1.memory_region[0].auto               = false;
    region1.memory_region[1].type               = "TCMA";
    region1.memory_region[1].$name              = "R5F_TCMA";
    region1.memory_region[1].size               = 0x7FC0;
    region1.memory_region[2].type               = "TCMB";
    region1.memory_region[2].size               = 0x8000;
    region1.memory_region[2].$name              = "R5F_TCMB";
    region1.memory_region[3].$name              = "SBL";
    region1.memory_region[3].auto               = false;
    region1.memory_region[3].size               = 0x40000;
    region1.memory_region[4].$name              = "OCRAM";
    region1.memory_region[4].auto               = false;
    region1.memory_region[4].manualStartAddress = 0x70084000;
    region1.memory_region[4].size               = 0x17C000;
    region1.memory_region[5].type               = "FLASH";
    region1.memory_region[5].auto               = false;
    region1.memory_region[5].size               = 0x80000;
    region1.memory_region[5].$name              = "FLASH";
    region1.memory_region[6].$name              = "CPPI_DESC";
    region1.memory_region[6].auto               = false;
    region1.memory_region[6].manualStartAddress = 0x70080000;
    region1.memory_region[6].size               = 0x4000;
    
    section1.load_memory                  = "R5F_VECS";
    section1.group                        = false;
    section1.$name                        = "Vector Table";
    section1.output_section.create(1);
    section1.output_section[0].$name      = ".vectors";
    section1.output_section[0].palignment = true;
    
    section2.load_memory                  = "OCRAM";
    section2.$name                        = "Text Segments";
    section2.output_section.create(5);
    section2.output_section[0].$name      = ".text.hwi";
    section2.output_section[0].palignment = true;
    section2.output_section[1].$name      = ".text.cache";
    section2.output_section[1].palignment = true;
    section2.output_section[2].$name      = ".text.mpu";
    section2.output_section[2].palignment = true;
    section2.output_section[3].$name      = ".text.boot";
    section2.output_section[3].palignment = true;
    section2.output_section[4].$name      = ".text:abort";
    section2.output_section[4].palignment = true;
    
    section3.load_memory                  = "OCRAM";
    section3.$name                        = "Code and Read-Only Data";
    section3.output_section.create(2);
    section3.output_section[0].$name      = ".text";
    section3.output_section[0].palignment = true;
    section3.output_section[1].$name      = ".rodata";
    section3.output_section[1].palignment = true;
    
    section4.load_memory                  = "OCRAM";
    section4.$name                        = "Data Segment";
    section4.output_section.create(1);
    section4.output_section[0].$name      = ".data";
    section4.output_section[0].palignment = true;
    
    section5.load_memory                             = "OCRAM";
    section5.$name                                   = "Memory Segments";
    section5.output_section.create(3);
    section5.output_section[0].$name                 = ".bss";
    section5.output_section[0].output_sections_start = "__BSS_START";
    section5.output_section[0].output_sections_end   = "__BSS_END";
    section5.output_section[0].palignment            = true;
    section5.output_section[1].$name                 = ".sysmem";
    section5.output_section[1].palignment            = true;
    section5.output_section[2].$name                 = ".stack";
    section5.output_section[2].palignment            = true;
    
    section6.load_memory                              = "OCRAM";
    section6.$name                                    = "Stack Segments";
    section6.output_section.create(5);
    section6.output_section[0].$name                  = ".irqstack";
    section6.output_section[0].output_sections_start  = "__IRQ_STACK_START";
    section6.output_section[0].output_sections_end    = "__IRQ_STACK_END";
    section6.output_section[0].input_section.create(1);
    section6.output_section[0].input_section[0].$name = ". = . + __IRQ_STACK_SIZE;";
    section6.output_section[1].$name                  = ".fiqstack";
    section6.output_section[1].output_sections_start  = "__FIQ_STACK_START";
    section6.output_section[1].output_sections_end    = "__FIQ_STACK_END";
    section6.output_section[1].input_section.create(1);
    section6.output_section[1].input_section[0].$name = ". = . + __FIQ_STACK_SIZE;";
    section6.output_section[2].$name                  = ".svcstack";
    section6.output_section[2].output_sections_start  = "__SVC_STACK_START";
    section6.output_section[2].output_sections_end    = "__SVC_STACK_END";
    section6.output_section[2].input_section.create(1);
    section6.output_section[2].input_section[0].$name = ". = . + __SVC_STACK_SIZE;";
    section6.output_section[3].$name                  = ".abortstack";
    section6.output_section[3].output_sections_start  = "__ABORT_STACK_START";
    section6.output_section[3].output_sections_end    = "__ABORT_STACK_END";
    section6.output_section[3].input_section.create(1);
    section6.output_section[3].input_section[0].$name = ". = . + __ABORT_STACK_SIZE;";
    section6.output_section[4].$name                  = ".undefinedstack";
    section6.output_section[4].output_sections_start  = "__UNDEFINED_STACK_START";
    section6.output_section[4].output_sections_end    = "__UNDEFINED_STACK_END";
    section6.output_section[4].input_section.create(1);
    section6.output_section[4].input_section[0].$name = ". = . + __UNDEFINED_STACK_SIZE;";
    
    section7.load_memory                  = "OCRAM";
    section7.$name                        = "Initialization and Exception Handling";
    section7.output_section.create(3);
    section7.output_section[0].$name      = ".ARM.exidx";
    section7.output_section[0].palignment = true;
    section7.output_section[1].$name      = ".init_array";
    section7.output_section[1].palignment = true;
    section7.output_section[2].$name      = ".fini_array";
    section7.output_section[2].palignment = true;
    
    section8.$name                       = "NDK Packet Memory CPPI_DESC";
    section8.type                        = "NOLOAD";
    section8.group                       = false;
    section8.load_memory                 = "CPPI_DESC";
    section8.output_section.create(1);
    section8.output_section[0].$name     = ".bss:ENET_CPPI_DESC";
    section8.output_section[0].alignment = 128;
    
    section9.$name                       = "NDK Packet Memory DMA_PKT_MEMPOOL";
    section9.type                        = "NOLOAD";
    section9.group                       = false;
    section9.load_memory                 = "OCRAM";
    section9.output_section.create(1);
    section9.output_section[0].$name     = ".bss:ENET_DMA_PKT_MEMPOOL";
    section9.output_section[0].alignment = 128;
    
    enet_cpsw1.$name                        = "CONFIG_ENET_CPSW0";
    enet_cpsw1.PktInfoOnlyEnable            = true;
    enet_cpsw1.LargePoolPktCount            = 32;
    enet_cpsw1.macOnlyEn_hostPort           = true;
    enet_cpsw1.macOnlyEn_macPort1           = true;
    enet_cpsw1.macOnlyEn_macPort2           = true;
    enet_cpsw1.hostportRxCsumOffloadEn      = false;
    enet_cpsw1.cptsHostRxTsEn               = false;
    enet_cpsw1.macAddrConfig                = "Manual Entry";
    enet_cpsw1.DisableMacPort2              = true;
    enet_cpsw1.MDIO.$assign                 = "MDIO";
    enet_cpsw1.MDIO.MDIO_MDIO.$assign       = "MDIO_MDIO";
    enet_cpsw1.MDIO.MDIO_MDC.$assign        = "MDIO_MDC";
    enet_cpsw1.RGMII1.$assign               = "RGMII1";
    enet_cpsw1.RGMII2.$assign               = "RGMII2";
    enet_cpsw1.RGMII2.RD0.$used             = false;
    enet_cpsw1.RGMII2.RD1.$used             = false;
    enet_cpsw1.RGMII2.RD2.$used             = false;
    enet_cpsw1.RGMII2.RD3.$used             = false;
    enet_cpsw1.RGMII2.RX_CTL.$used          = false;
    enet_cpsw1.RGMII2.RXC.$used             = false;
    enet_cpsw1.RGMII2.TD0.$used             = false;
    enet_cpsw1.RGMII2.TD1.$used             = false;
    enet_cpsw1.RGMII2.TD2.$used             = false;
    enet_cpsw1.RGMII2.TD3.$used             = false;
    enet_cpsw1.RGMII2.TX_CTL.$used          = false;
    enet_cpsw1.RGMII2.TXC.$used             = false;
    enet_cpsw1.txDmaChannel[0].$name        = "ENET_DMA_TX_CH0";
    enet_cpsw1.rxDmaChannel[0].$name        = "ENET_DMA_RX_CH0";
    enet_cpsw1.rxDmaChannel[0].macAddrCount = 2;
    enet_cpsw1.netifInstance.create(1);
    enet_cpsw1.netifInstance[0].$name       = "NETIF_INST_ID0";
    
    /**
     * 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.
     */
    enet_cpsw1.RGMII1.RD0.$suggestSolution    = "RGMII1_RD0";
    enet_cpsw1.RGMII1.RD1.$suggestSolution    = "RGMII1_RD1";
    enet_cpsw1.RGMII1.RD2.$suggestSolution    = "RGMII1_RD2";
    enet_cpsw1.RGMII1.RD3.$suggestSolution    = "RGMII1_RD3";
    enet_cpsw1.RGMII1.RX_CTL.$suggestSolution = "RGMII1_RX_CTL";
    enet_cpsw1.RGMII1.RXC.$suggestSolution    = "RGMII1_RXC";
    enet_cpsw1.RGMII1.TD0.$suggestSolution    = "RGMII1_TD0";
    enet_cpsw1.RGMII1.TD1.$suggestSolution    = "RGMII1_TD1";
    enet_cpsw1.RGMII1.TD2.$suggestSolution    = "RGMII1_TD2";
    enet_cpsw1.RGMII1.TD3.$suggestSolution    = "RGMII1_TD3";
    enet_cpsw1.RGMII1.TX_CTL.$suggestSolution = "RGMII1_TX_CTL";
    enet_cpsw1.RGMII1.TXC.$suggestSolution    = "RGMII1_TXC";
    

  • Hi Anjana,

    Thanks for sharing the syscfg file, I do not see any issues with the syscfg.

    Q1. Can you specify which example from the SDK you are trying? Are there any modifications made to the out-of-box default application?

    Q2. Can you share the application logs that you see? I want to check if we see all the link up and handle logs correctly.

    Regards,
    Shaunak