Hi Yiping,
Thanks for your reply.
We've designed our own P1021 customized board for Industrial Automation.After few trails we've succeeded with NOR flash loading and booting through ETSEC-1 of P1021.
We are not using any OS Kind of environments here. We've written bare-board drivers. But we're getting some issues in Etsec-2,Etsec-3(serdes) init process.
Is there any difference in ETSEC-2 and ETSEC-3(SERDES mode) controllers init process when it compared to ETSEC-1(RGMII mode).
Could you please verify the below Ethernet-2,3 init process for SERDES.
instance=etsec-2,etsec-3
#define ECNTRL_FIFM 0x00008000
#define ECNTRL_CLRCNT 0x00004000
#define ECNTRL_AUTOZ 0x00002000
#define ECNTRL_STEN 0x00001000
#define ECNTRL_GMIIM 0x00000040
#define ECNTRL_TBIM 0x00000020
#define ECNTRL_RPM 0x00000010
#define ECNTRL_R100M 0x00000008
#define ECNTRL_RMM 0X00000004
#define ECNTRL_SGMIIM 0x00000002
// initialize ethernet control register
p1021EtsecMemMap[instance].ecntrl = ECNTRL_STEN | ECNTRL_CLRCNT | ECNTRL_AUTOZ | ECNTRL_RPM | ECNTRL_SGMIIM;
// initialize station address
p1021EtsecMemMap[instance].macstnaddr1 =
((DWORD)etsec->config.macAddress[ETSEC_MAC_ADDR_OCTET_6] << SHIFT_3_BYTES) |
((DWORD)etsec->config.macAddress[ETSEC_MAC_ADDR_OCTET_5] << SHIFT_2_BYTES) |
((DWORD)etsec->config.macAddress[ETSEC_MAC_ADDR_OCTET_4] << SHIFT_1_BYTES) |
(DWORD)etsec->config.macAddress[ETSEC_MAC_ADDR_OCTET_3];
p1021EtsecMemMap[instance].macstnaddr2 =
((DWORD)etsec->config.macAddress[ETSEC_MAC_ADDR_OCTET_2] << SHIFT_3_BYTES) |
((DWORD)etsec->config.macAddress[ETSEC_MAC_ADDR_OCTET_1] << SHIFT_2_BYTES);
// initialize receive control register
p1021EtsecMemMap[instance].rctrl = 0 ;
// initialize maximum receive buffer length register
p1021EtsecMemMap[instance].mrblr = ETSEC_BUFFER_LENGTH;
// initialize DMA control register
p1021EtsecMemMap[instance].dmactrl = DMACTRL_TDSEN | DMACTRL_TBDSEN;
// initialize attribute register
p1021EtsecMemMap[instance].attr = ATTR_RDSEN | ATTR_RBDSEN;
// setup RX ring BD
etsecInitRxRing( instance, etsec->config.useInterrupts);
// setup TX ring BD
etsecInitTxRing( instance, etsec->config.useInterrupts);
// clear all interrupt, transmit, and receive events
p1021EtsecMemMap[instance].ievent = IEVENT_CLR_ALL_EVENTS;
p1021EtsecMemMap[instance].tstat = TSTAT_CLR_ALL_EVENTS;
p1021EtsecMemMap[instance].rstat = RSTAT_CLR_ALL_EVENTS;
// initialize the interrupt mask based on whether or not interrupts are being used
{
const DWORD IMASK[NUM_BOOLEANS] = {0, IMASK_ALL_EVENTS};
const BOOLEAN USE_INTERRUPTS = min( etsec->config.useInterrupts, TRUE);
p1021EtsecMemMap[instance].imask = IMASK[USE_INTERRUPTS];
}
// initialize the MAC config1 based on diagnostic type
{
const DWORD CFG1_LOOPBACK[NUM_BOOLEANS] = {0, MACCFG1_LOOPBACK};
const BOOLEAN LOOPBACK = (BOOLEAN)(etsec->config.diagType == ETSEC_DT_MAC_INTERNAL_LOOPBACK);
p1021EtsecMemMap[instance].maccfg1 = MACCFG1_RX_EN | MACCFG1_TX_EN | CFG1_LOOPBACK[LOOPBACK];
}
// set the PHY mode link type in the status
etsecDeterminePhyModeLinkType( etsec);
// set the BD and buffer addresses in the ETSEC descriptor
etsec->status.txBds = (BD8_TSEC_T *)&etsecTxBd[instance];
etsec->status.rxBds = (BD8_TSEC_T *)&etsecRxBd[instance];
etsec->status.txBufs = etsecTxBuffer[instance][0];
etsec->status.rxBufs = etsecRxBuffer[instance][0];
Regards,
Brahmam.