M487, NUC472 EMAC code fulfill astyle

pull/12991/head
cyliangtw 2020-05-19 14:32:12 +08:00
parent 68e9f4a8ed
commit cda40b2788
3 changed files with 285 additions and 244 deletions

View File

@ -89,8 +89,9 @@ static int reset_phy(void)
delayCnt = 2000; delayCnt = 2000;
while (delayCnt > 0) { while (delayCnt > 0) {
delayCnt--; delayCnt--;
if((mdio_read(CONFIG_PHY_ADDR, MII_BMCR) & BMCR_RESET) == 0) if ((mdio_read(CONFIG_PHY_ADDR, MII_BMCR) & BMCR_RESET) == 0) {
break; break;
}
} }
@ -112,9 +113,10 @@ static int reset_phy(void)
while (delayCnt > 0) { while (delayCnt > 0) {
delayCnt--; delayCnt--;
if ((mdio_read(CONFIG_PHY_ADDR, MII_BMSR) & (BMSR_ANEGCOMPLETE | BMSR_LSTATUS)) if ((mdio_read(CONFIG_PHY_ADDR, MII_BMSR) & (BMSR_ANEGCOMPLETE | BMSR_LSTATUS))
== (BMSR_ANEGCOMPLETE | BMSR_LSTATUS)) == (BMSR_ANEGCOMPLETE | BMSR_LSTATUS)) {
break; break;
} }
}
if (delayCnt == 0) { if (delayCnt == 0) {
NU_DEBUGF(("AN failed. Set to 100 FULL\n")); NU_DEBUGF(("AN failed. Set to 100 FULL\n"));
@ -279,10 +281,8 @@ void numaker_eth_init(uint8_t *mac_addr)
/* Set RX FIFO threshold as 8 words */ /* Set RX FIFO threshold as 8 words */
EMAC->FIFOCTL = 0x00200100; EMAC->FIFOCTL = 0x00200100;
if (isPhyReset != true) if (isPhyReset != true) {
{ if (!reset_phy()) {
if (!reset_phy())
{
isPhyReset = true; isPhyReset = true;
} }
} else { } else {
@ -323,11 +323,15 @@ void EMAC_RX_IRQHandler(void)
if (m_status & EMAC_INTSTS_RXBEIF_Msk) { if (m_status & EMAC_INTSTS_RXBEIF_Msk) {
// Shouldn't goes here, unless descriptor corrupted // Shouldn't goes here, unless descriptor corrupted
mbed_error_printf("### RX Bus error [0x%x]\r\n", m_status); mbed_error_printf("### RX Bus error [0x%x]\r\n", m_status);
if (nu_eth_txrx_cb != NULL) nu_eth_txrx_cb('B', nu_userData); if (nu_eth_txrx_cb != NULL) {
nu_eth_txrx_cb('B', nu_userData);
}
return; return;
} }
EMAC_DISABLE_INT(EMAC, (EMAC_INTEN_RDUIEN_Msk | EMAC_INTEN_RXGDIEN_Msk)); EMAC_DISABLE_INT(EMAC, (EMAC_INTEN_RDUIEN_Msk | EMAC_INTEN_RXGDIEN_Msk));
if (nu_eth_txrx_cb != NULL) nu_eth_txrx_cb('R', nu_userData); if (nu_eth_txrx_cb != NULL) {
nu_eth_txrx_cb('R', nu_userData);
}
} }
@ -342,12 +346,14 @@ int numaker_eth_get_rx_buf(uint16_t *len, uint8_t **buf)
unsigned int cur_entry, status; unsigned int cur_entry, status;
cur_entry = EMAC->CRXDSA; cur_entry = EMAC->CRXDSA;
if ((cur_entry == (uint32_t)cur_rx_desc_ptr) && (!(m_status & EMAC_INTSTS_RDUIF_Msk))) // cur_entry may equal to cur_rx_desc_ptr if RDU occures if ((cur_entry == (uint32_t)cur_rx_desc_ptr) && (!(m_status & EMAC_INTSTS_RDUIF_Msk))) { // cur_entry may equal to cur_rx_desc_ptr if RDU occures
return -1; return -1;
}
status = cur_rx_desc_ptr->status1; status = cur_rx_desc_ptr->status1;
if(status & OWNERSHIP_EMAC) if (status & OWNERSHIP_EMAC) {
return -1; return -1;
}
if (status & RXFD_RXGD) { if (status & RXFD_RXGD) {
*buf = cur_rx_desc_ptr->buf; *buf = cur_rx_desc_ptr->buf;
@ -357,7 +363,9 @@ int numaker_eth_get_rx_buf(uint16_t *len, uint8_t **buf)
NU_DEBUGF(("%s... unexpected long packet length=%d, buf=0x%x\r\n", __FUNCTION__, *len, *buf)); NU_DEBUGF(("%s... unexpected long packet length=%d, buf=0x%x\r\n", __FUNCTION__, *len, *buf));
*len = 0; // Skip this unexpected long packet *len = 0; // Skip this unexpected long packet
} }
if (*len == (NU_ETH_MAX_FLEN - 4)) NU_DEBUGF(("%s... length=%d, buf=0x%x\r\n", __FUNCTION__, *len, *buf)); if (*len == (NU_ETH_MAX_FLEN - 4)) {
NU_DEBUGF(("%s... length=%d, buf=0x%x\r\n", __FUNCTION__, *len, *buf));
}
} }
return 0; return 0;
} }
@ -377,7 +385,9 @@ void EMAC_TX_IRQHandler(void)
if (status & EMAC_INTSTS_TXBEIF_Msk) { if (status & EMAC_INTSTS_TXBEIF_Msk) {
// Shouldn't goes here, unless descriptor corrupted // Shouldn't goes here, unless descriptor corrupted
mbed_error_printf("### TX Bus error [0x%x]\r\n", status); mbed_error_printf("### TX Bus error [0x%x]\r\n", status);
if (nu_eth_txrx_cb != NULL) nu_eth_txrx_cb('B', nu_userData); if (nu_eth_txrx_cb != NULL) {
nu_eth_txrx_cb('B', nu_userData);
}
return; return;
} }
@ -388,16 +398,19 @@ void EMAC_TX_IRQHandler(void)
fin_tx_desc_ptr = fin_tx_desc_ptr->next; fin_tx_desc_ptr = fin_tx_desc_ptr->next;
} }
if (nu_eth_txrx_cb != NULL) nu_eth_txrx_cb('T', nu_userData); if (nu_eth_txrx_cb != NULL) {
nu_eth_txrx_cb('T', nu_userData);
}
} }
uint8_t *numaker_eth_get_tx_buf(void) uint8_t *numaker_eth_get_tx_buf(void)
{ {
if(cur_tx_desc_ptr->status1 & OWNERSHIP_EMAC) if (cur_tx_desc_ptr->status1 & OWNERSHIP_EMAC) {
return (NULL); return (NULL);
else } else {
return (cur_tx_desc_ptr->buf); return (cur_tx_desc_ptr->buf);
} }
}
void numaker_eth_trigger_tx(uint16_t length, void *p) void numaker_eth_trigger_tx(uint16_t length, void *p)
{ {
@ -415,8 +428,9 @@ int numaker_eth_link_ok(void)
{ {
/* first, a dummy read to latch */ /* first, a dummy read to latch */
mdio_read(CONFIG_PHY_ADDR, MII_BMSR); mdio_read(CONFIG_PHY_ADDR, MII_BMSR);
if(mdio_read(CONFIG_PHY_ADDR, MII_BMSR) & BMSR_LSTATUS) if (mdio_read(CONFIG_PHY_ADDR, MII_BMSR) & BMSR_LSTATUS) {
return 1; return 1;
}
return 0; return 0;
} }
@ -439,8 +453,7 @@ void mbed_mac_address(char *mac)
// http://en.wikipedia.org/wiki/MAC_address // http://en.wikipedia.org/wiki/MAC_address
uint32_t word1 = *(uint32_t *)0x7F800; // 2KB Data Flash at 0x7F800 uint32_t word1 = *(uint32_t *)0x7F800; // 2KB Data Flash at 0x7F800
if( word0 == 0xFFFFFFFF ) // Not burn any mac address at 1st 2 words of Data Flash if (word0 == 0xFFFFFFFF) { // Not burn any mac address at 1st 2 words of Data Flash
{
// with a semi-unique MAC address from the UUID // with a semi-unique MAC address from the UUID
/* Enable FMC ISP function */ /* Enable FMC ISP function */
SYS_UnlockReg(); SYS_UnlockReg();
@ -468,14 +481,16 @@ void mbed_mac_address(char *mac)
NU_DEBUGF(("mac address %02x-%02x-%02x-%02x-%02x-%02x \r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5])); NU_DEBUGF(("mac address %02x-%02x-%02x-%02x-%02x-%02x \r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]));
} }
void numaker_eth_enable_interrupts(void) { void numaker_eth_enable_interrupts(void)
{
EMAC->INTEN |= EMAC_INTEN_RXIEN_Msk | EMAC->INTEN |= EMAC_INTEN_RXIEN_Msk |
EMAC_INTEN_TXIEN_Msk ; EMAC_INTEN_TXIEN_Msk ;
NVIC_EnableIRQ(EMAC_RX_IRQn); NVIC_EnableIRQ(EMAC_RX_IRQn);
NVIC_EnableIRQ(EMAC_TX_IRQn); NVIC_EnableIRQ(EMAC_TX_IRQn);
} }
void numaker_eth_disable_interrupts(void) { void numaker_eth_disable_interrupts(void)
{
NVIC_DisableIRQ(EMAC_RX_IRQn); NVIC_DisableIRQ(EMAC_RX_IRQn);
NVIC_DisableIRQ(EMAC_TX_IRQn); NVIC_DisableIRQ(EMAC_TX_IRQn);
} }

View File

@ -88,8 +88,9 @@ static int reset_phy(void)
delayCnt = 2000; delayCnt = 2000;
while (delayCnt > 0) { while (delayCnt > 0) {
delayCnt--; delayCnt--;
if((mdio_read(CONFIG_PHY_ADDR, MII_BMCR) & BMCR_RESET) == 0) if ((mdio_read(CONFIG_PHY_ADDR, MII_BMCR) & BMCR_RESET) == 0) {
break; break;
}
} }
@ -111,9 +112,10 @@ static int reset_phy(void)
while (delayCnt > 0) { while (delayCnt > 0) {
delayCnt--; delayCnt--;
if ((mdio_read(CONFIG_PHY_ADDR, MII_BMSR) & (BMSR_ANEGCOMPLETE | BMSR_LSTATUS)) if ((mdio_read(CONFIG_PHY_ADDR, MII_BMSR) & (BMSR_ANEGCOMPLETE | BMSR_LSTATUS))
== (BMSR_ANEGCOMPLETE | BMSR_LSTATUS)) == (BMSR_ANEGCOMPLETE | BMSR_LSTATUS)) {
break; break;
} }
}
if (delayCnt == 0) { if (delayCnt == 0) {
NU_DEBUGF(("AN failed. Set to 100 FULL\n")); NU_DEBUGF(("AN failed. Set to 100 FULL\n"));
@ -262,10 +264,8 @@ void numaker_eth_init(uint8_t *mac_addr)
/* Set RX FIFO threshold as 8 words */ /* Set RX FIFO threshold as 8 words */
if (isPhyReset != true) if (isPhyReset != true) {
{ if (!reset_phy()) {
if (!reset_phy())
{
isPhyReset = true; isPhyReset = true;
} }
} else { } else {
@ -306,11 +306,15 @@ void EMAC_RX_IRQHandler(void)
if (m_status & EMAC_INTSTS_RXBEIF_Msk) { if (m_status & EMAC_INTSTS_RXBEIF_Msk) {
// Shouldn't goes here, unless descriptor corrupted // Shouldn't goes here, unless descriptor corrupted
mbed_error_printf("### RX Bus error [0x%x]\r\n", m_status); mbed_error_printf("### RX Bus error [0x%x]\r\n", m_status);
if (nu_eth_txrx_cb != NULL) nu_eth_txrx_cb('B', nu_userData); if (nu_eth_txrx_cb != NULL) {
nu_eth_txrx_cb('B', nu_userData);
}
return; return;
} }
EMAC_DISABLE_INT(EMAC, (EMAC_INTEN_RDUIEN_Msk | EMAC_INTEN_RXGDIEN_Msk)); EMAC_DISABLE_INT(EMAC, (EMAC_INTEN_RDUIEN_Msk | EMAC_INTEN_RXGDIEN_Msk));
if (nu_eth_txrx_cb != NULL) nu_eth_txrx_cb('R', nu_userData); if (nu_eth_txrx_cb != NULL) {
nu_eth_txrx_cb('R', nu_userData);
}
} }
@ -325,12 +329,14 @@ int numaker_eth_get_rx_buf(uint16_t *len, uint8_t **buf)
unsigned int cur_entry, status; unsigned int cur_entry, status;
cur_entry = EMAC->CRXDSA; cur_entry = EMAC->CRXDSA;
if ((cur_entry == (uint32_t)cur_rx_desc_ptr) && (!(m_status & EMAC_INTSTS_RDUIF_Msk))) // cur_entry may equal to cur_rx_desc_ptr if RDU occures if ((cur_entry == (uint32_t)cur_rx_desc_ptr) && (!(m_status & EMAC_INTSTS_RDUIF_Msk))) { // cur_entry may equal to cur_rx_desc_ptr if RDU occures
return -1; return -1;
}
status = cur_rx_desc_ptr->status1; status = cur_rx_desc_ptr->status1;
if(status & OWNERSHIP_EMAC) if (status & OWNERSHIP_EMAC) {
return -1; return -1;
}
if (status & RXFD_RXGD) { if (status & RXFD_RXGD) {
*buf = cur_rx_desc_ptr->buf; *buf = cur_rx_desc_ptr->buf;
@ -340,7 +346,9 @@ int numaker_eth_get_rx_buf(uint16_t *len, uint8_t **buf)
NU_DEBUGF(("%s... unexpected long packet length=%d, buf=0x%x\r\n", __FUNCTION__, *len, *buf)); NU_DEBUGF(("%s... unexpected long packet length=%d, buf=0x%x\r\n", __FUNCTION__, *len, *buf));
*len = 0; // Skip this unexpected long packet *len = 0; // Skip this unexpected long packet
} }
if (*len == (NU_ETH_MAX_FLEN - 4)) NU_DEBUGF(("%s... length=%d, buf=0x%x\r\n", __FUNCTION__, *len, *buf)); if (*len == (NU_ETH_MAX_FLEN - 4)) {
NU_DEBUGF(("%s... length=%d, buf=0x%x\r\n", __FUNCTION__, *len, *buf));
}
} }
return 0; return 0;
} }
@ -360,7 +368,9 @@ void EMAC_TX_IRQHandler(void)
if (status & EMAC_INTSTS_TXBEIF_Msk) { if (status & EMAC_INTSTS_TXBEIF_Msk) {
// Shouldn't goes here, unless descriptor corrupted // Shouldn't goes here, unless descriptor corrupted
mbed_error_printf("### TX Bus error [0x%x]\r\n", status); mbed_error_printf("### TX Bus error [0x%x]\r\n", status);
if (nu_eth_txrx_cb != NULL) nu_eth_txrx_cb('B', nu_userData); if (nu_eth_txrx_cb != NULL) {
nu_eth_txrx_cb('B', nu_userData);
}
return; return;
} }
@ -371,16 +381,19 @@ void EMAC_TX_IRQHandler(void)
fin_tx_desc_ptr = fin_tx_desc_ptr->next; fin_tx_desc_ptr = fin_tx_desc_ptr->next;
} }
if (nu_eth_txrx_cb != NULL) nu_eth_txrx_cb('T', nu_userData); if (nu_eth_txrx_cb != NULL) {
nu_eth_txrx_cb('T', nu_userData);
}
} }
uint8_t *numaker_eth_get_tx_buf(void) uint8_t *numaker_eth_get_tx_buf(void)
{ {
if(cur_tx_desc_ptr->status1 & OWNERSHIP_EMAC) if (cur_tx_desc_ptr->status1 & OWNERSHIP_EMAC) {
return (NULL); return (NULL);
else } else {
return (cur_tx_desc_ptr->buf); return (cur_tx_desc_ptr->buf);
} }
}
void numaker_eth_trigger_tx(uint16_t length, void *p) void numaker_eth_trigger_tx(uint16_t length, void *p)
{ {
@ -398,8 +411,9 @@ int numaker_eth_link_ok(void)
{ {
/* first, a dummy read to latch */ /* first, a dummy read to latch */
mdio_read(CONFIG_PHY_ADDR, MII_BMSR); mdio_read(CONFIG_PHY_ADDR, MII_BMSR);
if(mdio_read(CONFIG_PHY_ADDR, MII_BMSR) & BMSR_LSTATUS) if (mdio_read(CONFIG_PHY_ADDR, MII_BMSR) & BMSR_LSTATUS) {
return 1; return 1;
}
return 0; return 0;
} }
@ -422,8 +436,7 @@ void mbed_mac_address(char *mac)
// http://en.wikipedia.org/wiki/MAC_address // http://en.wikipedia.org/wiki/MAC_address
uint32_t word1 = *(uint32_t *)0x7F800; // 2KB Data Flash at 0x7F800 uint32_t word1 = *(uint32_t *)0x7F800; // 2KB Data Flash at 0x7F800
if( word0 == 0xFFFFFFFF ) // Not burn any mac address at 1st 2 words of Data Flash if (word0 == 0xFFFFFFFF) { // Not burn any mac address at 1st 2 words of Data Flash
{
// with a semi-unique MAC address from the UUID // with a semi-unique MAC address from the UUID
/* Enable FMC ISP function */ /* Enable FMC ISP function */
SYS_UnlockReg(); SYS_UnlockReg();
@ -451,14 +464,16 @@ void mbed_mac_address(char *mac)
NU_DEBUGF(("mac address %02x-%02x-%02x-%02x-%02x-%02x \r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5])); NU_DEBUGF(("mac address %02x-%02x-%02x-%02x-%02x-%02x \r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]));
} }
void numaker_eth_enable_interrupts(void) { void numaker_eth_enable_interrupts(void)
{
EMAC->INTEN |= EMAC_INTEN_RXIEN_Msk | EMAC->INTEN |= EMAC_INTEN_RXIEN_Msk |
EMAC_INTEN_TXIEN_Msk ; EMAC_INTEN_TXIEN_Msk ;
NVIC_EnableIRQ(EMAC_RX_IRQn); NVIC_EnableIRQ(EMAC_RX_IRQn);
NVIC_EnableIRQ(EMAC_TX_IRQn); NVIC_EnableIRQ(EMAC_TX_IRQn);
} }
void numaker_eth_disable_interrupts(void) { void numaker_eth_disable_interrupts(void)
{
NVIC_DisableIRQ(EMAC_RX_IRQn); NVIC_DisableIRQ(EMAC_RX_IRQn);
NVIC_DisableIRQ(EMAC_TX_IRQn); NVIC_DisableIRQ(EMAC_TX_IRQn);
} }

View File

@ -98,8 +98,7 @@ void NUMAKER_EMAC::tx_isr()
void NUMAKER_EMAC::ethernet_callback(char event, void *param) void NUMAKER_EMAC::ethernet_callback(char event, void *param)
{ {
NUMAKER_EMAC *enet = static_cast<NUMAKER_EMAC *>(param); NUMAKER_EMAC *enet = static_cast<NUMAKER_EMAC *>(param);
switch (event) switch (event) {
{
case 'R': //For RX event case 'R': //For RX event
enet->rx_isr(); enet->rx_isr();
break; break;
@ -246,7 +245,9 @@ bool NUMAKER_EMAC::link_out(emac_mem_buf_t *buf)
TXLockMutex.lock(); TXLockMutex.lock();
buffer = numaker_eth_get_tx_buf(); buffer = numaker_eth_get_tx_buf();
NU_DEBUGF(("%s ... buffer=0x%x\r\n", __FUNCTION__, buffer)); NU_DEBUGF(("%s ... buffer=0x%x\r\n", __FUNCTION__, buffer));
if( buffer == NULL ) goto error; if (buffer == NULL) {
goto error;
}
/* copy frame from buf to driver buffers */ /* copy frame from buf to driver buffers */
for (q = buf; q != NULL; q = memory_manager->get_next(q)) { for (q = buf; q != NULL; q = memory_manager->get_next(q)) {
@ -262,7 +263,9 @@ bool NUMAKER_EMAC::link_out(emac_mem_buf_t *buf)
/* Point to next descriptor */ /* Point to next descriptor */
numaker_eth_trigger_tx(PACKET_BUFFER_SIZE, NULL); numaker_eth_trigger_tx(PACKET_BUFFER_SIZE, NULL);
buffer = numaker_eth_get_tx_buf(); buffer = numaker_eth_get_tx_buf();
if( buffer == NULL ) goto error; if (buffer == NULL) {
goto error;
}
byteslefttocopy = byteslefttocopy - (PACKET_BUFFER_SIZE - bufferoffset); byteslefttocopy = byteslefttocopy - (PACKET_BUFFER_SIZE - bufferoffset);
payloadoffset = payloadoffset + (PACKET_BUFFER_SIZE - bufferoffset); payloadoffset = payloadoffset + (PACKET_BUFFER_SIZE - bufferoffset);
@ -302,10 +305,14 @@ void NUMAKER_EMAC::phy_task()
if ((state & PHY_LINKED_STATE) && !(phy_state & PHY_LINKED_STATE)) { if ((state & PHY_LINKED_STATE) && !(phy_state & PHY_LINKED_STATE)) {
NU_DEBUGF(("Link Up\r\n")); NU_DEBUGF(("Link Up\r\n"));
if (emac_link_state_cb) emac_link_state_cb(true); if (emac_link_state_cb) {
emac_link_state_cb(true);
}
} else if (!(state & PHY_LINKED_STATE) && (phy_state & PHY_LINKED_STATE)) { } else if (!(state & PHY_LINKED_STATE) && (phy_state & PHY_LINKED_STATE)) {
NU_DEBUGF(("Link Down\r\n")); NU_DEBUGF(("Link Down\r\n"));
if (emac_link_state_cb) emac_link_state_cb(false); if (emac_link_state_cb) {
emac_link_state_cb(false);
}
} }
phy_state = state; phy_state = state;
@ -314,8 +321,9 @@ void NUMAKER_EMAC::phy_task()
bool NUMAKER_EMAC::power_up() bool NUMAKER_EMAC::power_up()
{ {
/* Initialize the hardware */ /* Initialize the hardware */
if (!low_level_init_successful()) if (!low_level_init_successful()) {
return false; return false;
}
/* Worker thread */ /* Worker thread */
thread = create_new_thread("numaker_emac_thread", &NUMAKER_EMAC::thread_function, this, THREAD_STACKSIZE * 2, THREAD_PRIORITY, &thread_cb); thread = create_new_thread("numaker_emac_thread", &NUMAKER_EMAC::thread_function, this, THREAD_STACKSIZE * 2, THREAD_PRIORITY, &thread_cb);
@ -334,8 +342,9 @@ bool NUMAKER_EMAC::power_up()
bool NUMAKER_EMAC::bus_reset() bool NUMAKER_EMAC::bus_reset()
{ {
/* Initialize the hardware */ /* Initialize the hardware */
if (!low_level_init_successful()) if (!low_level_init_successful()) {
return false; return false;
}
numaker_eth_enable_interrupts(); numaker_eth_enable_interrupts();
return true; return true;
} }
@ -410,13 +419,15 @@ void NUMAKER_EMAC::set_memory_manager(EMACMemoryManager &mem_mngr)
} }
NUMAKER_EMAC &NUMAKER_EMAC::get_instance() { NUMAKER_EMAC &NUMAKER_EMAC::get_instance()
{
static NUMAKER_EMAC emac; static NUMAKER_EMAC emac;
return emac; return emac;
} }
// Weak so a module can override // Weak so a module can override
MBED_WEAK EMAC &EMAC::get_default_instance() { MBED_WEAK EMAC &EMAC::get_default_instance()
{
return NUMAKER_EMAC::get_instance(); return NUMAKER_EMAC::get_instance();
} }