OSDN Git Service

update libMiMic
[mimic/MiMicSDK.git] / lib / src / driver / ethernet / k64f / EthDev_K64F.c
diff --git a/lib/src/driver/ethernet/k64f/EthDev_K64F.c b/lib/src/driver/ethernet/k64f/EthDev_K64F.c
new file mode 100644 (file)
index 0000000..dee8a59
--- /dev/null
@@ -0,0 +1,534 @@
+#include "NyLPC_config.h"
+#if NyLPC_MCU==NyLPC_MCU_K64F
+#include "NyLPC_stdlib.h"
+#include "NyLPC_os.h"
+#include "copy_of_ethernet_api.h"
+#include "NyLPC_IEthernetDevice.h"
+#include "NyLPC_cEthernetMM.h"
+//////////
+#include "fsl_enet_driver.h"
+#include "fsl_enet_hal.h"
+#include "fsl_device_registers.h"
+#include "fsl_phy_driver.h"
+#include "fsl_interrupt_manager.h"
+#include "k64f_emac_config.h"
+#include <string.h>
+#include <stdlib.h>
+
+/**
+ */
+static NyLPC_TBool start(const struct NyLPC_TEthAddr* i_eth_addr,NyLPC_TiEthernetDevice_onEvent i_handler,void* i_param);
+static void stop(void);
+static void* getRxEthFrame(unsigned short* o_len_of_data);
+static void nextRxEthFrame(void);
+static void* allocTxBuf(NyLPC_TUInt16 i_hint,NyLPC_TUInt16* o_size);
+static void releaseTxBuf(void* i_buf);
+static void sendTxEthFrame(void* i_buf,unsigned short i_size);
+
+const static struct TiEthernetDevice _interface_KSZ8081RNACA=
+{
+       "KSZ8081RNACA",
+       start,
+       stop,
+       getRxEthFrame,
+       nextRxEthFrame,
+       allocTxBuf,
+       releaseTxBuf,
+       sendTxEthFrame,
+       NULL    //deleted API
+};
+
+
+
+struct TEtherDriver{
+    int rx_idx;
+    int tx_idx;
+       uint8_t *tx_desc_start_addr; /**< TX descriptor start address */
+       uint8_t *rx_desc_start_addr; /**< RX descriptor start address */
+};
+
+static struct TEtherDriver _driver;
+static void* _event_param;
+static NyLPC_TiEthernetDevice_onEvent _event_handler;
+
+////////////////////////////////////////////////////////////////////////////////
+// LANパケットバッファ
+////////////////////////////////////////////////////////////////////////////////
+#define NUM_OF_RX_BUF 4
+#define SIZE_OF_ETH_PACKET (1536)   //16バイト単位であること
+static void* RX_BUF_BASE;              //[NUM_OF_RX_BUF][SIZE_OF_ETH_PACKET]
+static unsigned char* RX_BUF;          //[NUM_OF_RX_BUF][SIZE_OF_ETH_PACKET]
+static void* TX_BUF_BASE;              //
+static unsigned char* TX_BUF;          //sizeof(struct NyLPC_TcEthernetMM_TxMemoryBlock)
+
+#define NUM_OF_RX_RING NUM_OF_RX_BUF
+#define NUM_OF_TX_RING 4
+
+////////////////////////////////////////////////////////////////////////////////
+//private function
+////////////////////////////////////////////////////////////////////////////////
+
+
+static NyLPC_TBool low_level_init(const unsigned char* i_ethaddr,int i_addr_len);
+static void setRxDesc(void* rx_buf, int idx);
+static void updateRxDesc(int idx);
+static void setTxDesc(int idx);
+static void updateTxDesc(int idx, uint8_t *buffer, uint16_t length, bool isLast);
+static void eth_arch_enable_interrupts(void);
+static void eth_arch_disable_interrupts(void);
+static NyLPC_TUInt32 waitForTxEthFrameEmpty(void);
+
+////////////////////////////////////////////////////////////////////////////////
+//LAN API
+////////////////////////////////////////////////////////////////////////////////
+NyLPC_TBool EthDev_K64F_getInterface(
+       const struct TiEthernetDevice** o_dev)
+{
+       *o_dev=&_interface_KSZ8081RNACA;
+    RX_BUF_BASE=(unsigned char*)malloc(SIZE_OF_ETH_PACKET*NUM_OF_RX_BUF+RX_BUF_ALIGNMENT);
+    RX_BUF=(unsigned char*)ENET_ALIGN((NyLPC_TUInt32)RX_BUF_BASE,RX_BUF_ALIGNMENT);
+       TX_BUF_BASE=malloc(sizeof(struct NyLPC_TcEthernetMM_TxMemoryBlock)+TX_BUF_ALIGNMENT);
+       TX_BUF=(unsigned char*)ENET_ALIGN((NyLPC_TUInt32)TX_BUF_BASE,TX_BUF_ALIGNMENT);
+       
+       return NyLPC_TBool_TRUE;
+}
+
+static NyLPC_TBool start(const struct NyLPC_TEthAddr* i_eth_addr,NyLPC_TiEthernetDevice_onEvent i_handler,void* i_param)
+{
+    _driver.rx_idx=0;
+    _driver.tx_idx=0;
+    //ISRw割り込み設定
+    _event_handler=i_handler;
+    _event_param=i_param;
+    
+    if(!low_level_init((const NyLPC_TUInt8*)(i_eth_addr->addr),6)){
+        return NyLPC_TBool_FALSE;
+    }
+    //TXメモリマネージャの準備(バッファのアライメントは16,パディングも16にしてね。謎バイトが2個いるから。)
+       NyLPC_cEthernetMM_initialize(TX_BUF);
+
+    //Ethernetの割込み開始設定
+    NyLPC_cIsr_enterCritical();
+    //Ethernetの初期化シーケンス。割込みONとか
+    {
+       eth_arch_enable_interrupts();
+    }
+    NyLPC_cIsr_exitCritical();
+
+    return NyLPC_TBool_TRUE;
+}
+
+static void stop(void)
+{
+    NyLPC_cIsr_enterCritical();
+    {
+       eth_arch_disable_interrupts();
+    }
+    NyLPC_cIsr_exitCritical();
+   return;
+}
+
+
+#define err_mask (kEnetRxBdTrunc | kEnetRxBdCrc | kEnetRxBdNoOctet | kEnetRxBdLengthViolation)
+
+static void* getRxEthFrame(unsigned short* o_len_of_data)
+{
+    int idx=_driver.rx_idx;
+    enet_bd_struct_t * bdPtr = (enet_bd_struct_t*)_driver.rx_desc_start_addr;
+    if((bdPtr[idx].control & kEnetRxBdEmpty)!=0){
+        //パケット未着
+        return NULL;
+    }
+    if((bdPtr[idx].control & err_mask) != 0){
+        //エラー:パケットバッファを再設定して返却
+        setRxDesc(RX_BUF+(idx*SIZE_OF_ETH_PACKET),idx);        
+        _driver.rx_idx=(idx+1)%NUM_OF_RX_BUF;
+        return NULL;
+    }
+    *o_len_of_data =(unsigned short)enet_hal_get_bd_length(&(bdPtr[idx]))-2;
+    return &RX_BUF[idx*SIZE_OF_ETH_PACKET+2];
+}
+
+static void nextRxEthFrame(void)
+{
+    int idx=_driver.rx_idx;
+    enet_bd_struct_t * bdPtr = (enet_bd_struct_t*)_driver.rx_desc_start_addr;
+    //現在のRXメモリが有効かを確認
+    if((bdPtr[idx].control & kEnetRxBdEmpty)==0){
+        //パケットバッファを復活させる
+        updateRxDesc(idx);
+        //キューのエントリを進行
+        _driver.rx_idx=(idx+1)%NUM_OF_RX_BUF;
+        return;
+    }
+}
+
+static void* allocTxBuf(NyLPC_TUInt16 i_hint,NyLPC_TUInt16* o_size)
+{
+       return ((NyLPC_TUInt8*)NyLPC_cEthernetMM_alloc(i_hint,o_size))+2;
+}
+static void releaseTxBuf(void* i_buf)
+{
+       NyLPC_cEthernetMM_release((NyLPC_TUInt8*)i_buf-2);
+}
+
+
+static void sendTxEthFrame(void* i_buf,unsigned short i_size)
+{
+       int Index;
+       struct NyLPC_TTxBufferHeader* bh=NyLPC_TTxBufferHeader_getBufferHeaderAddr(i_buf-2);
+       //サイズ0なら送信の必要なし
+       if(i_size == 0)
+       {
+               return;
+       }
+       //送信デスクリプタが使えるようになるのを待つよ!
+       waitForTxEthFrameEmpty();
+
+       //送信対象のメモリブロックを送信中に設定。
+       if(bh->is_lock){
+               //送信中のメモリブロックなら無視
+               return;
+       }
+
+       //送信中にセット
+       bh->is_lock=NyLPC_TUInt8_TRUE;
+
+       //最大送信サイズの制限
+       if (i_size > ETH_FRAG_SIZE){
+               i_size = ETH_FRAG_SIZE;
+       }
+       Index=_driver.tx_idx;
+
+       updateTxDesc(Index,(uint8_t*)((unsigned char*)i_buf-2),i_size+2,Index==(NUM_OF_TX_RING-1));
+       _driver.tx_idx=(_driver.tx_idx+1)%NUM_OF_TX_RING;
+       return;
+}
+
+/**
+ * 送信キューが空くまで待ちます。
+ * @return
+ * 次に書き込むことが出来る送信キューのIDだけど使わないで
+ */
+static NyLPC_TUInt32 waitForTxEthFrameEmpty(void)
+{
+       int idx;
+       int i;
+       struct NyLPC_TTxBufferHeader *b;
+       volatile void* p;
+       volatile enet_bd_struct_t * bdPtr = (enet_bd_struct_t*)_driver.tx_desc_start_addr;
+
+
+       //送信キューフルが解除されるまで待ち.現在のTQDescがReady状態の間ループ
+       
+       while((bdPtr[_driver.tx_idx].control & kEnetTxBdReady)!=0)
+       {
+               NyLPC_cThread_sleep(10);
+       }
+       //インデクスを起点にReady状態が0のデスクリプタを全て解放(無駄があるけど無視)
+       for(i=0;i<NUM_OF_TX_RING;i++){
+               idx=(_driver.tx_idx+i)%NUM_OF_TX_RING;
+               if((bdPtr[idx].control & kEnetTxBdReady)!=0){
+                       //if Ready state then break!
+                       break;
+               }
+               bdPtr[idx].control=(bdPtr[idx].control)&(~kEnetTxBdReady);
+               //バッファを参照してたらそいつのロックビットも解放
+               p=(void*)NTOHL(bdPtr[idx].buffer);
+               if(p!=NULL){
+                       b=((struct NyLPC_TTxBufferHeader*)p)-1;
+                       b->is_lock=NyLPC_TUInt8_FALSE;
+                       bdPtr[idx].buffer=0;
+               }
+       }
+       return _driver.tx_idx;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Ethernet interdface functions
+////////////////////////////////////////////////////////////////////////////////
+
+
+// K64F-specific macros
+#define RX_PBUF_AUTO_INDEX    (-1)
+extern void k64f_init_eth_hardware(void);
+
+
+//static struct k64f_enetdata k64f_enetdata;
+
+static enet_dev_if_t enetDevIf[HW_ENET_INSTANCE_COUNT];
+static enet_mac_config_t g_enetMacCfg[HW_ENET_INSTANCE_COUNT] = 
+{
+  {
+    ENET_ETH_MAX_FLEN ,  /*!< enet receive buffer size*/
+    ENET_RX_LARGE_BUFFER_NUM, /*!< enet large receive buffer number*/
+    NUM_OF_RX_RING,        /*!< enet receive bd number*/
+    NUM_OF_TX_RING,        /*!< enet transmit bd number*/
+    {0},                /*!< enet mac address*/
+    kEnetCfgRmii,       /*!< enet rmii interface*/
+    kEnetCfgSpeed100M,  /*!< enet rmii 100M*/
+    kEnetCfgFullDuplex, /*!< enet rmii Full- duplex*/
+     /*!< enet mac control flag recommended to use enet_mac_control_flag_t
+      we send frame with crc so receive crc forward for data length check test*/
+    kEnetRxCrcFwdEnable | kEnetRxFlowControlEnable,
+    true,         /*!< enet txaccelerator enabled*/
+    true,        /*!< enet rxaccelerator enabled*/
+    false,        /*!< enet store and forward*/
+    {false, false, true, false, true},  /*!< enet rxaccelerator config*/
+    {false, false, true},          /*!< enet txaccelerator config*/
+    true,               /*!< vlan frame support*/
+    true,               /*!< phy auto discover*/
+    ENET_MII_CLOCK,     /*!< enet MDC clock*/
+  },
+};
+static enet_phy_config_t g_enetPhyCfg[HW_ENET_INSTANCE_COUNT] =
+{
+       {0, false}
+};
+
+static NyLPC_TBool k64f_rx_setup(enet_rxbd_config_t *rxbdCfg);
+static NyLPC_TBool k64f_tx_setup(enet_txbd_config_t *txbdCfg);
+
+
+/**
+ * i_idx番目のデスクリプタにバッファをセット
+ */
+static void setRxDesc(void* rx_buf, int idx)
+{
+    enet_bd_struct_t *start = (enet_bd_struct_t *)_driver.rx_desc_start_addr;
+    /* Setup descriptor and clear statuses */
+    enet_hal_init_rxbds(start + idx, (uint8_t*)rx_buf,idx ==(NUM_OF_RX_RING - 1));
+    enet_hal_active_rxbd(BOARD_DEBUG_ENET_INSTANCE);
+}
+static void updateRxDesc(int idx)
+{
+    enet_bd_struct_t *start = (enet_bd_struct_t *)_driver.rx_desc_start_addr;
+    /* Setup descriptor and clear statuses */
+    enet_hal_update_rxbds(start + idx,NULL,false);
+    enet_hal_active_rxbd(BOARD_DEBUG_ENET_INSTANCE);
+}
+static void setTxDesc(int idx)
+{
+    enet_bd_struct_t *start = (enet_bd_struct_t *)_driver.tx_desc_start_addr;
+    /* Setup descriptor and clear statuses */
+    enet_hal_init_txbds(start + idx,idx ==(NUM_OF_RX_RING - 1));
+    enet_hal_active_txbd(BOARD_DEBUG_ENET_INSTANCE);
+}
+
+static void updateTxDesc(int idx, uint8_t *buffer, uint16_t length, bool isLast)
+{
+       volatile enet_bd_struct_t * bdPtr = (enet_bd_struct_t *)(_driver.tx_desc_start_addr + idx * enet_hal_get_bd_size());
+       
+       bdPtr->length = HTONS(length); /* Set data length*/
+       bdPtr->buffer = (uint8_t *)HTONL((uint32_t)buffer); /* Set data buffer*/
+       bdPtr->control |= kEnetTxBdLast;//最終フラグメントのフラグね
+       bdPtr->controlExtend1 |= kEnetTxBdTxInterrupt;
+       bdPtr->controlExtend2 &= ~TX_DESC_UPDATED_MASK; // descriptor not updated by DMA
+       bdPtr->control |= kEnetTxBdTransmitCrc | kEnetTxBdReady;
+       if(isLast){
+               //これはデスクリプタの終了位置のフラグ
+               bdPtr->control |=kEnetTxBdWrap;
+       }
+       enet_hal_active_txbd(BOARD_DEBUG_ENET_INSTANCE);        
+}
+
+static void* ENET_MAC_CONTEXT_BUF=NULL;
+
+/** \brief  Low level init of the MAC and PHY.
+ *
+ *  \param[in]      netif  Pointer to LWIP netif structure
+ */
+NyLPC_TBool low_level_init(const unsigned char* i_ethaddr,int i_addr_len)
+{
+    enet_dev_if_t * enetIfPtr;
+    uint32_t device = BOARD_DEBUG_ENET_INSTANCE;
+    enet_rxbd_config_t rxbdCfg;
+    enet_txbd_config_t txbdCfg;
+    enet_phy_speed_t phy_speed;
+    enet_phy_duplex_t phy_duplex;
+    
+    //RX/TXメモリはデバイス選択時に確保
+    k64f_init_eth_hardware();
+  
+    /* Initialize device*/
+    enetIfPtr = (enet_dev_if_t *)&enetDevIf[device];
+    enetIfPtr->deviceNumber = device;
+    enetIfPtr->macCfgPtr = &g_enetMacCfg[device];
+    enetIfPtr->phyCfgPtr = &g_enetPhyCfg[device];
+    enetIfPtr->macApiPtr = &g_enetMacApi;
+    enetIfPtr->phyApiPtr = (void *)&g_enetPhyApi;
+    //macアドレスのコピー
+    memcpy(enetIfPtr->macCfgPtr->macAddr,(char*)i_ethaddr,i_addr_len);
+       //enetIfPtr->macContextPtrはgetInterface
+       if(ENET_MAC_CONTEXT_BUF!=NULL){
+               free(ENET_MAC_CONTEXT_BUF);
+               ENET_MAC_CONTEXT_BUF=NULL;
+       }
+       ENET_MAC_CONTEXT_BUF=calloc(1, sizeof(enet_mac_context_t));
+       if(ENET_MAC_CONTEXT_BUF==NULL){
+               return NyLPC_TBool_FALSE;//ERR_BUF;
+       }
+       enetIfPtr->macContextPtr = (enet_mac_context_t *)ENET_MAC_CONTEXT_BUF;
+
+       /* Initialize enet buffers*/
+       if(!k64f_rx_setup(&rxbdCfg)) {
+               return NyLPC_TBool_FALSE;//ERR_BUF;
+       }
+       /* Initialize enet buffers*/
+       if(!k64f_tx_setup(&txbdCfg)) {
+               return NyLPC_TBool_FALSE;//ERR_BUF;
+       }
+       /* Initialize enet module*/
+       if (enet_mac_init(enetIfPtr, &rxbdCfg, &txbdCfg) == kStatus_ENET_Success)
+       {
+               /* Initialize PHY*/
+               if (enetIfPtr->macCfgPtr->isPhyAutoDiscover) {
+                       if (((enet_phy_api_t *)(enetIfPtr->phyApiPtr))->phy_auto_discover(enetIfPtr) != kStatus_PHY_Success)
+                               return NyLPC_TBool_FALSE;//ERR_IF;
+               }
+               if (((enet_phy_api_t *)(enetIfPtr->phyApiPtr))->phy_init(enetIfPtr) != kStatus_PHY_Success)
+                       return NyLPC_TBool_FALSE;//ERR_IF;              
+               enetIfPtr->isInitialized = true;
+       }else{
+               // TODOETH: cleanup memory
+               return NyLPC_TBool_FALSE;//ERR_IF;
+       }
+       
+       /* Get link information from PHY */
+       phy_get_link_speed(enetIfPtr, &phy_speed);
+       phy_get_link_duplex(enetIfPtr, &phy_duplex);
+       BW_ENET_RCR_RMII_10T(enetIfPtr->deviceNumber, phy_speed == kEnetSpeed10M ? kEnetCfgSpeed10M : kEnetCfgSpeed100M);
+       BW_ENET_TCR_FDEN(enetIfPtr->deviceNumber, phy_duplex == kEnetFullDuplex ? kEnetCfgFullDuplex : kEnetCfgHalfDuplex);
+       
+       /* Enable Ethernet module*/
+       enet_hal_config_ethernet(device, true, true);
+       
+       /* Active Receive buffer descriptor must be done after module enable*/
+       enet_hal_active_rxbd(enetIfPtr->deviceNumber);
+       enet_hal_active_txbd(enetIfPtr->deviceNumber);
+       
+       return NyLPC_TBool_TRUE;//ERR_OK;
+}
+
+
+static void* RX_DESC_BUF_BASE=NULL;
+
+
+/** \brief  Sets up the RX descriptor ring buffers.
+ *
+ *  This function sets up the descriptor list used for receive packets.
+ *
+ *  \param[in]  netif  Pointer to driver data structure
+ *  \returns    true/false
+ */
+static NyLPC_TBool k64f_rx_setup(enet_rxbd_config_t *rxbdCfg)
+{   
+//    struct k64f_enetdata *k64f_enet = &(netif->state);
+    enet_dev_if_t *enetIfPtr = (enet_dev_if_t *)&enetDevIf[BOARD_DEBUG_ENET_INSTANCE];
+    uint32_t rxBufferSizeAligned;
+    int i;
+
+    // Allocate RX descriptors
+    if(RX_DESC_BUF_BASE!=NULL){
+       free(RX_DESC_BUF_BASE);
+       RX_DESC_BUF_BASE=NULL;
+    }
+    RX_DESC_BUF_BASE = (void*)calloc(1, enet_hal_get_bd_size() * enetIfPtr->macCfgPtr->rxBdNumber + ENET_BD_ALIGNMENT);
+    if(RX_DESC_BUF_BASE==NULL){
+        return NyLPC_TBool_FALSE;
+    }
+    //16byteアライメントに修正
+    _driver.rx_desc_start_addr = (uint8_t *)ENET_ALIGN((NyLPC_TUInt32)RX_DESC_BUF_BASE, ENET_BD_ALIGNMENT);
+    rxBufferSizeAligned = ENET_ALIGN(enetIfPtr->macCfgPtr->rxBufferSize, ENET_RX_BUFFER_ALIGNMENT);
+    enetIfPtr->macContextPtr->rxBufferSizeAligned = rxBufferSizeAligned;
+    rxbdCfg->rxBdPtrAlign = _driver.rx_desc_start_addr;
+    rxbdCfg->rxBdNum = enetIfPtr->macCfgPtr->rxBdNumber;
+    rxbdCfg->rxBufferNum = enetIfPtr->macCfgPtr->rxBdNumber;
+    
+    //初期化
+    enet_hal_active_rxbd(BOARD_DEBUG_ENET_INSTANCE);
+    for(i=0;i<NUM_OF_RX_RING;i++){
+        setRxDesc(RX_BUF+(i*SIZE_OF_ETH_PACKET),i);
+    }
+    //  k64f_rx_queue(netif, RX_PBUF_AUTO_INDEX);
+    return NyLPC_TBool_TRUE;
+}
+
+
+
+
+static void* TX_DESC_BUF_BASE=NULL;
+/** \brief  Sets up the TX descriptor ring buffers.
+ *
+ *  This function sets up the descriptor list used for transmit packets.
+ *
+ *  \param[in]      netif  Pointer to driver data structure
+ *  \returns        true/false
+ */
+static NyLPC_TBool k64f_tx_setup(enet_txbd_config_t *txbdCfg)
+{
+       int i;
+
+       enet_dev_if_t *enetIfPtr = (enet_dev_if_t *)&enetDevIf[BOARD_DEBUG_ENET_INSTANCE];
+       
+       // Allocate TX descriptors
+    if(TX_DESC_BUF_BASE!=NULL){
+       free(TX_DESC_BUF_BASE);
+       TX_DESC_BUF_BASE=NULL;
+    }  
+       TX_DESC_BUF_BASE = (void*)calloc(1, enet_hal_get_bd_size() * enetIfPtr->macCfgPtr->txBdNumber + ENET_BD_ALIGNMENT);
+       if(TX_DESC_BUF_BASE==NULL){
+               return NyLPC_TBool_FALSE;
+       }
+       
+       _driver.tx_desc_start_addr = (uint8_t *)ENET_ALIGN((uint32_t)TX_DESC_BUF_BASE, ENET_BD_ALIGNMENT);
+       
+       txbdCfg->txBdPtrAlign = _driver.tx_desc_start_addr;
+       txbdCfg->txBufferNum = enetIfPtr->macCfgPtr->txBdNumber;
+       txbdCfg->txBufferSizeAlign = ENET_ALIGN(enetIfPtr->maxFrameSize, ENET_TX_BUFFER_ALIGNMENT);
+       
+       // Make the TX descriptor ring circular
+       for(i=0;i<NUM_OF_TX_RING;i++){
+               setTxDesc(i);
+       }
+       return NyLPC_TBool_TRUE;
+}
+
+
+//--------------------------------------------------------------------------------
+// ISR
+//--------------------------------------------------------------------------------
+extern IRQn_Type enet_irq_ids[HW_ENET_INSTANCE_COUNT][FSL_FEATURE_ENET_INTERRUPT_COUNT];
+extern uint8_t enetIntMap[kEnetIntNum];
+extern void *enetIfHandle;
+
+static void eth_arch_enable_interrupts(void)
+{
+       enet_hal_config_interrupt(BOARD_DEBUG_ENET_INSTANCE, (kEnetTxFrameInterrupt | kEnetRxFrameInterrupt), true);  
+       interrupt_enable(enet_irq_ids[BOARD_DEBUG_ENET_INSTANCE][enetIntMap[kEnetRxfInt]]);
+       interrupt_enable(enet_irq_ids[BOARD_DEBUG_ENET_INSTANCE][enetIntMap[kEnetTxfInt]]); 
+}
+
+static void eth_arch_disable_interrupts(void)
+{
+       interrupt_disable(enet_irq_ids[BOARD_DEBUG_ENET_INSTANCE][enetIntMap[kEnetRxfInt]]);
+       interrupt_disable(enet_irq_ids[BOARD_DEBUG_ENET_INSTANCE][enetIntMap[kEnetTxfInt]]);  
+}
+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_Receive_IRQHandler(void)
+{
+       enet_hal_clear_interrupt(((enet_dev_if_t *)enetIfHandle)->deviceNumber, kEnetRxFrameInterrupt);
+       _event_handler(_event_param,NyLPC_TiEthernetDevice_EVENT_ON_RX);
+}
+
+
+#endif
+
+
+