Bool xMACBInit( volatile avr32_macb_t * macb ) { volatile unsigned long status; // set up registers macb->ncr = 0; macb->tsr = ~0UL; macb->rsr = ~0UL; macb->idr = ~0UL; status = macb->isr; #if ETHERNET_CONF_USE_RMII_INTERFACE // RMII used, set 0 to the USRIO Register macb->usrio &= ~AVR32_MACB_RMII_MASK; #else // RMII not used, set 1 to the USRIO Register macb->usrio |= AVR32_MACB_RMII_MASK; #endif // Load our MAC address into the MACB. prvSetupMACAddress(macb); // Setup the buffers and descriptors. prvSetupDescriptors(macb); #if ETHERNET_CONF_SYSTEM_CLOCK <= 20000000 macb->ncfgr |= (AVR32_MACB_NCFGR_CLK_DIV8 << AVR32_MACB_NCFGR_CLK_OFFSET); #elif ETHERNET_CONF_SYSTEM_CLOCK <= 40000000 macb->ncfgr |= (AVR32_MACB_NCFGR_CLK_DIV16 << AVR32_MACB_NCFGR_CLK_OFFSET); #elif ETHERNET_CONF_SYSTEM_CLOCK <= 80000000 macb->ncfgr |= AVR32_MACB_NCFGR_CLK_DIV32 << AVR32_MACB_NCFGR_CLK_OFFSET; #elif ETHERNET_CONF_SYSTEM_CLOCK <= 160000000 macb->ncfgr |= AVR32_MACB_NCFGR_CLK_DIV64 << AVR32_MACB_NCFGR_CLK_OFFSET; #else # error System clock too fast #endif // Are we connected? if( prvProbePHY(macb) == TRUE ) { // Enable the interrupt! portENTER_CRITICAL(); { prvSetupMACBInterrupt(macb); } portEXIT_CRITICAL(); // Enable Rx and Tx, plus the stats register. macb->ncr = AVR32_MACB_NCR_TE_MASK | AVR32_MACB_NCR_RE_MASK; return (TRUE); } return (FALSE); }
bool xMACBInit(volatile avr32_macb_t *macb) { bool global_interrupt_enabled = Is_global_interrupt_enabled(); volatile unsigned long status; // generate an hardware reset of the phy ethernet_phy_hw_reset(); // generate a software reset of the phy ethernet_phy_sw_reset(macb); // set up registers macb->ncr = 0; macb->tsr = ~0UL; macb->rsr = ~0UL; if (global_interrupt_enabled) Disable_global_interrupt(); macb->idr = ~0UL; status = macb->isr; if (global_interrupt_enabled) Enable_global_interrupt(); #if ETHERNET_CONF_USE_RMII_INTERFACE // RMII used, set 0 to the USRIO Register macb->usrio &= ~AVR32_MACB_RMII_MASK; #else // RMII not used, set 1 to the USRIO Register macb->usrio |= AVR32_MACB_RMII_MASK; #endif // Load our MAC address into the MACB. prvSetupMACAddress(macb); // Setup the buffers and descriptors. prvSetupDescriptors(macb); #if ETHERNET_CONF_SYSTEM_CLOCK <= 20000000 macb->ncfgr |= (AVR32_MACB_NCFGR_CLK_DIV8 << AVR32_MACB_NCFGR_CLK_OFFSET); #elif ETHERNET_CONF_SYSTEM_CLOCK <= 40000000 macb->ncfgr |= (AVR32_MACB_NCFGR_CLK_DIV16 << AVR32_MACB_NCFGR_CLK_OFFSET); #elif ETHERNET_CONF_SYSTEM_CLOCK <= 80000000 macb->ncfgr |= AVR32_MACB_NCFGR_CLK_DIV32 << AVR32_MACB_NCFGR_CLK_OFFSET; #elif ETHERNET_CONF_SYSTEM_CLOCK <= 160000000 macb->ncfgr |= AVR32_MACB_NCFGR_CLK_DIV64 << AVR32_MACB_NCFGR_CLK_OFFSET; #else # error System clock too fast #endif // Are we connected? if( prvProbePHY(macb) == true ) { // Enable the interrupt! portENTER_CRITICAL(); { prvSetupMACBInterrupt(macb); } portEXIT_CRITICAL(); // Enable Rx and Tx, plus the stats register. macb->ncr = AVR32_MACB_NCR_TE_MASK | AVR32_MACB_NCR_RE_MASK; return (true); } return (false); }