Other Parts Discussed in Thread: SYSCONFIG
Tool/software: TI-RTOS
I have a problem when trying to use external PCIE clock on the AM5728. I started with the example
code from the AM5728 EVM GP. I am running under SYS/BIOS on the DSP core. Using the sample code
as shown below PCIE comes up and works ok (at Gen1, Gen2 is not as reliable).
/*OCP2SCP_SYSCONFIG[1] Soft Reset*/
regVal = HW_RD_REG32(SOC_OCP2SCP3_BASE + 0x10U) & 0xFFFFFFFDU;
regVal |= 0x02U;
HW_WR_REG32(SOC_OCP2SCP3_BASE + 0x10U, regVal);
/*OCP2SCP_SYSSTATUS[0] Reset Done*/
while ((HW_RD_REG32(SOC_OCP2SCP3_BASE + 0x14U) & 0x01U) != 0x01U);
/*OCP2SCP_TIMING[9:7] Division Ratio = 1*/
regVal = HW_RD_REG32(SOC_OCP2SCP3_BASE + 0x18U) & 0xFFFFFC7FU;
regVal |= (uint32_t) 0x8U << 4U;
HW_WR_REG32(SOC_OCP2SCP3_BASE + 0x18U, regVal);
/*OCP2SCP_TIMING[3:0] (SYNC2) = 0xF*/
regVal = HW_RD_REG32(SOC_OCP2SCP3_BASE + 0x18U) & 0xFFFFFFF0U;
regVal |= 0xFU;
HW_WR_REG32(SOC_OCP2SCP3_BASE + 0x18U, regVal);
/*PCIe DPLL - M&N programming; CLKSEL*/
regVal = HW_RD_REG32(SOC_CKGEN_CM_CORE_BASE + CM_CLKSEL_DPLL_PCIE_REF);
HW_SET_FIELD(regVal, CM_CLKSEL_DPLL_PCIE_REF_DPLL_DIV, 0x09U);
HW_SET_FIELD(regVal, CM_CLKSEL_DPLL_PCIE_REF_DPLL_MULT, 0x2EEU);
HW_WR_REG32(SOC_CKGEN_CM_CORE_BASE + CM_CLKSEL_DPLL_PCIE_REF, regVal);
/*SigmaDelta SD DIV programming */
HW_WR_FIELD32(SOC_CKGEN_CM_CORE_BASE + CM_CLKSEL_DPLL_PCIE_REF,
CM_CLKSEL_DPLL_PCIE_REF_DPLL_SD_DIV, 0x06U);
/*PCIe DPLL - M2 programming*/
HW_WR_FIELD32(SOC_CKGEN_CM_CORE_BASE + CM_DIV_M2_DPLL_PCIE_REF,
CM_DIV_M2_DPLL_PCIE_REF_DIVHS, 0x0FU);
/*DPLL Enable*/
HW_WR_FIELD32(SOC_CKGEN_CM_CORE_BASE + CM_CLKMODE_DPLL_PCIE_REF,
CM_CLKMODE_DPLL_PCIE_REF_DPLL_EN,
CM_CLKMODE_DPLL_PCIE_REF_DPLL_EN_DPLL_LOCK_MODE);
/* Check for DPLL lock status */
while (((HW_RD_REG32(SOC_CKGEN_CM_CORE_BASE + CM_IDLEST_DPLL_PCIE_REF) &
CM_IDLEST_DPLL_PCIE_REF_ST_DPLL_CLK_MASK) <<
CM_IDLEST_DPLL_PCIE_REF_ST_DPLL_CLK_SHIFT) !=
CM_IDLEST_DPLL_PCIE_REF_ST_DPLL_CLK_DPLL_LOCKED);
/*PCIe Tx and Rx Control of ACSPCIe*/
HW_WR_FIELD32(SOC_SEC_EFUSE_REGISTERS_BASE + CSL_CONTROL_CORE_SEC_SMA_SW_6,
CSL_CONTROL_CORE_SEC_SMA_SW_6_PCIE_TX_RX_CONTROL, 0x02U);
/*Locking APLL to 2.5GHz with 100MHz input*/
regVal = HW_RD_REG32(SOC_CKGEN_CM_CORE_BASE + CM_CLKMODE_APLL_PCIE);
HW_SET_FIELD(regVal, CM_CLKMODE_APLL_PCIE_CLKDIV_BYPASS,
CM_CLKMODE_APLL_PCIE_CLKDIV_BYPASS_PCIEDIVBY2_BYPASS_1);
HW_SET_FIELD(regVal, CM_CLKMODE_APLL_PCIE_REFSEL,
CM_CLKMODE_APLL_PCIE_REFSEL_CLKREF_ADPLL);
HW_WR_REG32(SOC_CKGEN_CM_CORE_BASE + CM_CLKMODE_APLL_PCIE, regVal);
HW_WR_FIELD32(SOC_CKGEN_CM_CORE_BASE + CM_CLKMODE_APLL_PCIE,
CM_CLKMODE_APLL_PCIE_MODE_SELECT,
CM_CLKMODE_APLL_PCIE_MODE_SELECT_APLL_FORCE_LOCK_MODE);
/*Wait for APLL lock*/
while (((HW_RD_REG32(SOC_CKGEN_CM_CORE_BASE + CM_IDLEST_APLL_PCIE) &
CM_IDLEST_APLL_PCIE_ST_APLL_CLK_MASK) <<
CM_IDLEST_APLL_PCIE_ST_APLL_CLK_SHIFT) !=
CM_IDLEST_APLL_PCIE_ST_APLL_CLK_APLL_LOCKED);
Since the code above configures the DPLL and sets CM_CLKMODE_APLL_PCIE_REFSEL to
CM_CLKMODE_APLL_PCIE_REFSEL_CLKREF_ADPLL, this code is using the internal clock not
an external clock.
Since SMA_SW_6_PCIE_TX_RX_CONTROL is already set to 2, the ACSPCIE is already setup
as a receiver, so if I change CM_CLKMODE_APLL_PCIE_REFSEL to
CM_CLKMODE_APLL_PCIE_REFSEL_CLKREF_ACSPCIE, it should work with an external clock and
my testing shows it does.
However, I then assumed I could remove the DPLL setup and
use the code as shown below.
/*OCP2SCP_SYSCONFIG[1] Soft Reset*/
regVal = HW_RD_REG32(SOC_OCP2SCP3_BASE + 0x10U) & 0xFFFFFFFDU;
regVal |= 0x02U;
HW_WR_REG32(SOC_OCP2SCP3_BASE + 0x10U, regVal);
/*OCP2SCP_SYSSTATUS[0] Reset Done*/
while ((HW_RD_REG32(SOC_OCP2SCP3_BASE + 0x14U) & 0x01U) != 0x01U);
/*OCP2SCP_TIMING[9:7] Division Ratio = 1*/
regVal = HW_RD_REG32(SOC_OCP2SCP3_BASE + 0x18U) & 0xFFFFFC7FU;
regVal |= (uint32_t) 0x8U << 4U;
HW_WR_REG32(SOC_OCP2SCP3_BASE + 0x18U, regVal);
/*OCP2SCP_TIMING[3:0] (SYNC2) = 0xF*/
regVal = HW_RD_REG32(SOC_OCP2SCP3_BASE + 0x18U) & 0xFFFFFFF0U;
regVal |= 0xFU;
HW_WR_REG32(SOC_OCP2SCP3_BASE + 0x18U, regVal);
/* Removed DPLL setup here */
/*PCIe Tx and Rx Control of ACSPCIe*/
HW_WR_FIELD32(SOC_SEC_EFUSE_REGISTERS_BASE + CSL_CONTROL_CORE_SEC_SMA_SW_6,
CSL_CONTROL_CORE_SEC_SMA_SW_6_PCIE_TX_RX_CONTROL, 0x02U);
/*Locking APLL to 2.5GHz with 100MHz input*/
regVal = HW_RD_REG32(SOC_CKGEN_CM_CORE_BASE + CM_CLKMODE_APLL_PCIE);
HW_SET_FIELD(regVal, CM_CLKMODE_APLL_PCIE_CLKDIV_BYPASS,
CM_CLKMODE_APLL_PCIE_CLKDIV_BYPASS_PCIEDIVBY2_BYPASS_1);
HW_SET_FIELD(regVal, CM_CLKMODE_APLL_PCIE_REFSEL,
CM_CLKMODE_APLL_PCIE_REFSEL_CLKREF_ACSPCIE); /* Use external clock */
HW_WR_REG32(SOC_CKGEN_CM_CORE_BASE + CM_CLKMODE_APLL_PCIE, regVal);
HW_WR_FIELD32(SOC_CKGEN_CM_CORE_BASE + CM_CLKMODE_APLL_PCIE,
CM_CLKMODE_APLL_PCIE_MODE_SELECT,
CM_CLKMODE_APLL_PCIE_MODE_SELECT_APLL_FORCE_LOCK_MODE);
/*Wait for APLL lock*/
while (((HW_RD_REG32(SOC_CKGEN_CM_CORE_BASE + CM_IDLEST_APLL_PCIE) &
CM_IDLEST_APLL_PCIE_ST_APLL_CLK_MASK) <<
CM_IDLEST_APLL_PCIE_ST_APLL_CLK_SHIFT) !=
CM_IDLEST_APLL_PCIE_ST_APLL_CLK_APLL_LOCKED);
However, when I use this the APLL does not lock. I do not understand why it seems to work
when I change CM_CLKMODE_APLL_PCIE_REFSEL to CM_CLKMODE_APLL_PCIE_REFSEL_CLKREF_ACSPCIE but
not when I do not program the DPLL.
I had actually hoped to power off the DPLL completely.
Any ideas on what is going wrong here?
Thanks,
Chris