void enet_mac_tx_isr(void *enetIfPtr) { struct k64f_enetdata *k64f_enet = &k64f_enetdata; /*Clear interrupt*/ enet_hal_clear_interrupt(((enet_dev_if_t *)enetIfPtr)->deviceNumber, kEnetTxFrameInterrupt); k64f_tx_reclaim(k64f_enet); }
/*FUNCTION**************************************************************** * * Function Name: enet_mii_read * Return Value: The execution status. * Description: Read function. * This interface read data over the (R)MII bus from the specified PHY register, * This function is called by all PHY interfaces. *END*********************************************************************/ uint32_t enet_mii_read(uint32_t instance, uint32_t phyAddr, uint32_t phyReg, uint32_t *dataPtr) { uint32_t counter; /* Check the input parameters*/ if (!dataPtr) { return kStatus_ENET_InvalidInput; } /* Check if the mii is enabled*/ if (!enet_hal_is_mii_enabled(instance)) { return kStatus_ENET_Miiuninitialized; } /* Clear the MII interrupt event*/ enet_hal_clear_interrupt(instance, kEnetMiiInterrupt); /* Read command operation*/ enet_hal_set_mii_command(instance, phyAddr, phyReg, kEnetReadValidFrame, 0); /* Poll for MII complete*/ for (counter = 0; counter < kEnetMaxTimeout; counter++) { if (enet_hal_get_interrupt_status(instance, kEnetMiiInterrupt)) { break; } wait_ms(1); } /* Check for timeout*/ if (counter == kEnetMaxTimeout) { return kStatus_ENET_TimeOut; } /* Get data from mii register*/ *dataPtr = enet_hal_get_mii_data(instance); /* Clear MII interrupt event*/ enet_hal_clear_interrupt(instance, kEnetMiiInterrupt); return kStatus_ENET_Success; }
void enet_mac_rx_isr(void *enetIfPtr) { struct k64f_enetdata *k64f_enet = &k64f_enetdata; volatile enet_bd_struct_t * bdPtr = (enet_bd_struct_t*)k64f_enet->rx_desc_start_addr; static int idx = 0; /* Clear interrupt */ enet_hal_clear_interrupt(((enet_dev_if_t *)enetIfPtr)->deviceNumber, kEnetRxFrameInterrupt); while ((bdPtr[idx].control & kEnetRxBdEmpty) == 0) { k64f_enetif_input(k64f_enet->netif, idx); idx = (idx + 1) % ENET_RX_RING_LEN; } }
/*FUNCTION**************************************************************** * * Function Name: enet_mii_write * Return Value: The execution status. * Description: Write function. * This interface write data over the (R)MII bus to the specified PHY register. * This function is called by all PHY interfaces. *END*********************************************************************/ uint32_t enet_mii_write(uint32_t instance, uint32_t phyAddr, uint32_t phyReg, uint32_t data) { uint32_t counter; /* Check if the mii is enabled*/ if (!enet_hal_is_mii_enabled(instance)) { return kStatus_ENET_Miiuninitialized; } /* Clear the MII interrupt event*/ enet_hal_clear_interrupt(instance, kEnetMiiInterrupt); /* Read command operation*/ enet_hal_set_mii_command(instance, phyAddr, phyReg, kEnetWriteValidFrame, data); /* Poll for MII complete*/ for (counter = 0; counter < kEnetMaxTimeout; counter++) { if (enet_hal_get_interrupt_status(instance, kEnetMiiInterrupt)) { break; } wait_ms(1); } /* Check for timeout*/ if (counter == kEnetMaxTimeout) { return kStatus_ENET_TimeOut; } /* Clear MII intrrupt event*/ enet_hal_clear_interrupt(instance, kEnetMiiInterrupt); return kStatus_ENET_Success; }
void ENET_Receive_IRQHandler(void) { enet_hal_clear_interrupt(((enet_dev_if_t *)enetIfHandle)->deviceNumber, kEnetRxFrameInterrupt); _event_handler(_event_param,NyLPC_TiEthernetDevice_EVENT_ON_RX); }
void ENET_Transmit_IRQHandler(void) { // led(0,-1); enet_hal_clear_interrupt(((enet_dev_if_t *)enetIfHandle)->deviceNumber, kEnetTxFrameInterrupt); _event_handler(_event_param,NyLPC_TiEthernetDevice_EVENT_ON_TX); }
void enet_mac_tx_isr(void *enetIfPtr) { /*Clear interrupt*/ enet_hal_clear_interrupt(((enet_dev_if_t *)enetIfPtr)->deviceNumber, kEnetTxFrameInterrupt); sys_sem_signal(&k64f_enetdata.TxCleanSem); }
/*FUNCTION**************************************************************** * * Function Name: enet_mac_init * Return Value: The execution status. * Description:Initialize the ENET device with the basic configuration * When ENET is used, this function need to be called by the NET initialize * interface. *END*********************************************************************/ uint32_t enet_mac_init(enet_dev_if_t * enetIfPtr, enet_rxbd_config_t *rxbdCfg, enet_txbd_config_t *txbdCfg) { uint32_t timeOut = 0; uint32_t devNumber, result = 0; /* Check the input parameters*/ if (enetIfPtr == NULL) { return kStatus_ENET_InvalidInput; } /* Get device number and check the parameter*/ devNumber = enetIfPtr->deviceNumber; /* Store the global ENET structure for ISR input parameters */ enetIfHandle = enetIfPtr; /* Turn on ENET module clock gate */ CLOCK_SYS_EnableEnetClock(0U); /* Reset ENET mac*/ enet_hal_reset_ethernet(devNumber); while ((!enet_hal_is_reset_completed(devNumber)) && (timeOut < kEnetMaxTimeout)) { time_delay(1); timeOut++; } /* Check out if timeout*/ if (timeOut == kEnetMaxTimeout) { return kStatus_ENET_TimeOut; } /* Disable all ENET mac interrupt and Clear all interrupt events*/ enet_hal_config_interrupt(devNumber, kEnetAllInterrupt, false); enet_hal_clear_interrupt(devNumber, kEnetAllInterrupt); /* Program this station's physical address*/ enet_hal_set_mac_address(devNumber, enetIfPtr->macCfgPtr->macAddr); /* Enable Multicast group filtering. The entry is All F because we want to listen * all multicast*/ uint32_t i = 0; for (i=0; i<=63; i++){ enet_hal_set_group_hashtable(devNumber, i<<26, kEnetSpecialAddressEnable); } /* Enable Unicast Group with 0 hash table entry. It means it * will accept only its own MAC address as the destination address if * something is received.*/ enet_hal_set_individual_hashtable(devNumber, 0, kEnetSpecialAddressInit); /* Configure mac controller*/ result = enet_mac_configure_controller(enetIfPtr); if(result != kStatus_ENET_Success) { return result; } /* Clear mib zero counters*/ enet_hal_clear_mib(devNumber, true); /* Initialize FIFO and accelerator*/ result = enet_mac_configure_fifo_accel(enetIfPtr); if(result != kStatus_ENET_Success) { return result; } /* Initialize receive buffer descriptors*/ result = enet_mac_rxbd_init(enetIfPtr, rxbdCfg); if(result != kStatus_ENET_Success) { return result; } /* Initialize transmit buffer descriptors*/ result = enet_mac_txbd_init(enetIfPtr, txbdCfg); if(result != kStatus_ENET_Success) { return result; } /* Initialize rmii/mii interface*/ result = enet_mac_mii_init(enetIfPtr); if (result != kStatus_ENET_Success) { return result; } return kStatus_ENET_Success; }
/*FUNCTION**************************************************************** * * Function Name: enet_mac_init * Return Value: The execution status. * Description:Initialize the ENET device with the basic configuration * When ENET is used, this function need to be called by the NET initialize * interface. *END*********************************************************************/ uint32_t enet_mac_init(enet_dev_if_t * enetIfPtr, enet_rxbd_config_t *rxbdCfg, enet_txbd_config_t *txbdCfg) { uint32_t timeOut = 0; uint32_t devNumber, result = 0; /* Check the input parameters*/ if (enetIfPtr == NULL) { return kStatus_ENET_InvalidInput; } /* Get device number and check the parameter*/ devNumber = enetIfPtr->deviceNumber; /* Store the global ENET structure for ISR input parameters for instance 0*/ if (!devNumber) { enetIfHandle = enetIfPtr; } /* Turn on ENET module clock gate */ clock_manager_set_gate(kClockModuleENET, 0U, true); /* Reset ENET mac*/ enet_hal_reset_ethernet(devNumber); while ((!enet_hal_is_reset_completed(devNumber)) && (timeOut < kEnetMaxTimeout)) { time_delay(1); timeOut++; } /* Check out if timeout*/ if (timeOut == kEnetMaxTimeout) { return kStatus_ENET_TimeOut; } /* Disable all ENET mac interrupt and Clear all interrupt events*/ enet_hal_config_interrupt(devNumber, kEnetAllInterrupt, false); enet_hal_clear_interrupt(devNumber, kEnetAllInterrupt); /* Program this station's physical address*/ enet_hal_set_mac_address(devNumber, enetIfPtr->macCfgPtr->macAddr); /* Clear group and individual hash register*/ enet_hal_set_group_hashtable(devNumber, 0, kEnetSpecialAddressInit); enet_hal_set_individual_hashtable(devNumber, 0, kEnetSpecialAddressInit); /* Configure mac controller*/ result = enet_mac_configure_controller(enetIfPtr); if(result != kStatus_ENET_Success) { return result; } /* Clear mib zero counters*/ enet_hal_clear_mib(devNumber, true); /* Initialize FIFO and accelerator*/ result = enet_mac_configure_fifo_accel(enetIfPtr); if(result != kStatus_ENET_Success) { return result; } /* Initialize receive buffer descriptors*/ result = enet_mac_rxbd_init(enetIfPtr, rxbdCfg); if(result != kStatus_ENET_Success) { return result; } /* Initialize transmit buffer descriptors*/ result = enet_mac_txbd_init(enetIfPtr, txbdCfg); if(result != kStatus_ENET_Success) { return result; } /* Initialize rmii/mii interface*/ result = enet_mac_mii_init(enetIfPtr); if (result != kStatus_ENET_Success) { return result; } return kStatus_ENET_Success; }