This is Webservice SDK for mbed. LPCXpresso1769/LPC1768/FRDM-K64F/LPC4088
Dependents: MbedFileServer_1768MiniDK2 RedWireBridge IssueDebug_gcc MiMicRemoteMCU-for-Mbed ... more
EthDev_K64F.c
00001 #include "NyLPC_config.h" 00002 #if NyLPC_MCU==NyLPC_MCU_K64F 00003 #include "NyLPC_stdlib.h" 00004 #include "NyLPC_os.h" 00005 #include "copy_of_ethernet_api.h" 00006 #include "NyLPC_IEthernetDevice.h" 00007 #include "NyLPC_cEthernetMM.h" 00008 ////////// 00009 #include "fsl_enet_driver.h" 00010 #include "fsl_enet_hal.h" 00011 #include "fsl_device_registers.h" 00012 #include "fsl_phy_driver.h" 00013 #include "fsl_interrupt_manager.h" 00014 #include "k64f_emac_config.h" 00015 #include <string.h> 00016 #include <stdlib.h> 00017 00018 /** 00019 */ 00020 static NyLPC_TBool start(const struct NyLPC_TEthAddr* i_eth_addr,NyLPC_TiEthernetDevice_onEvent i_handler,void* i_param); 00021 static void stop(void); 00022 static void* getRxEthFrame(unsigned short* o_len_of_data); 00023 static void nextRxEthFrame(void); 00024 static void* allocTxBuf(NyLPC_TUInt16 i_hint,NyLPC_TUInt16* o_size); 00025 static void releaseTxBuf(void* i_buf); 00026 static void sendTxEthFrame(void* i_buf,unsigned short i_size); 00027 00028 const static struct TiEthernetDevice _interface_KSZ8081RNACA= 00029 { 00030 "KSZ8081RNACA", 00031 start, 00032 stop, 00033 getRxEthFrame, 00034 nextRxEthFrame, 00035 allocTxBuf, 00036 releaseTxBuf, 00037 sendTxEthFrame, 00038 NULL //deleted API 00039 }; 00040 00041 00042 00043 struct TEtherDriver{ 00044 int rx_idx; 00045 int tx_idx; 00046 uint8_t *tx_desc_start_addr; /**< TX descriptor start address */ 00047 uint8_t *rx_desc_start_addr; /**< RX descriptor start address */ 00048 }; 00049 00050 static struct TEtherDriver _driver; 00051 static void* _event_param; 00052 static NyLPC_TiEthernetDevice_onEvent _event_handler; 00053 00054 //////////////////////////////////////////////////////////////////////////////// 00055 // LANパケットバッファ 00056 //////////////////////////////////////////////////////////////////////////////// 00057 #define NUM_OF_RX_BUF 4 00058 #define SIZE_OF_ETH_PACKET (1536) //16バイト単位であること 00059 static void* RX_BUF_BASE; //[NUM_OF_RX_BUF][SIZE_OF_ETH_PACKET] 00060 static unsigned char* RX_BUF; //[NUM_OF_RX_BUF][SIZE_OF_ETH_PACKET] 00061 static void* TX_BUF_BASE; // 00062 static unsigned char* TX_BUF; //sizeof(struct NyLPC_TcEthernetMM_TxMemoryBlock) 00063 00064 #define NUM_OF_RX_RING NUM_OF_RX_BUF 00065 #define NUM_OF_TX_RING 4 00066 00067 //////////////////////////////////////////////////////////////////////////////// 00068 //private function 00069 //////////////////////////////////////////////////////////////////////////////// 00070 00071 00072 static NyLPC_TBool low_level_init(const unsigned char* i_ethaddr,int i_addr_len); 00073 static void setRxDesc(void* rx_buf, int idx); 00074 static void updateRxDesc(int idx); 00075 static void setTxDesc(int idx); 00076 static void updateTxDesc(int idx, uint8_t *buffer, uint16_t length, bool isLast); 00077 static void eth_arch_enable_interrupts(void); 00078 static void eth_arch_disable_interrupts(void); 00079 static NyLPC_TUInt32 waitForTxEthFrameEmpty(void); 00080 00081 //////////////////////////////////////////////////////////////////////////////// 00082 //LAN API 00083 //////////////////////////////////////////////////////////////////////////////// 00084 NyLPC_TBool EthDev_K64F_getInterface( 00085 const struct TiEthernetDevice** o_dev) 00086 { 00087 *o_dev=&_interface_KSZ8081RNACA; 00088 RX_BUF_BASE=(unsigned char*)malloc(SIZE_OF_ETH_PACKET*NUM_OF_RX_BUF+RX_BUF_ALIGNMENT); 00089 RX_BUF=(unsigned char*)ENET_ALIGN((NyLPC_TUInt32)RX_BUF_BASE,RX_BUF_ALIGNMENT); 00090 TX_BUF_BASE=malloc(sizeof(struct NyLPC_TcEthernetMM_TxMemoryBlock)+TX_BUF_ALIGNMENT); 00091 TX_BUF=(unsigned char*)ENET_ALIGN((NyLPC_TUInt32)TX_BUF_BASE,TX_BUF_ALIGNMENT); 00092 00093 return NyLPC_TBool_TRUE; 00094 } 00095 00096 static NyLPC_TBool start(const struct NyLPC_TEthAddr* i_eth_addr,NyLPC_TiEthernetDevice_onEvent i_handler,void* i_param) 00097 { 00098 _driver.rx_idx=0; 00099 _driver.tx_idx=0; 00100 //ISRw割り込み設定 00101 _event_handler=i_handler; 00102 _event_param=i_param; 00103 00104 if(!low_level_init((const NyLPC_TUInt8*)(i_eth_addr->addr),6)){ 00105 return NyLPC_TBool_FALSE; 00106 } 00107 //TXメモリマネージャの準備(バッファのアライメントは16,パディングも16にしてね。謎バイトが2個いるから。) 00108 NyLPC_cEthernetMM_initialize(TX_BUF); 00109 00110 //Ethernetの割込み開始設定 00111 NyLPC_cIsr_enterCritical(); 00112 //Ethernetの初期化シーケンス。割込みONとか 00113 { 00114 eth_arch_enable_interrupts(); 00115 } 00116 NyLPC_cIsr_exitCritical(); 00117 00118 return NyLPC_TBool_TRUE; 00119 } 00120 00121 static void stop(void) 00122 { 00123 NyLPC_cIsr_enterCritical(); 00124 { 00125 eth_arch_disable_interrupts(); 00126 } 00127 NyLPC_cIsr_exitCritical(); 00128 return; 00129 } 00130 00131 00132 #define err_mask (kEnetRxBdTrunc | kEnetRxBdCrc | kEnetRxBdNoOctet | kEnetRxBdLengthViolation) 00133 00134 static void* getRxEthFrame(unsigned short* o_len_of_data) 00135 { 00136 int idx=_driver.rx_idx; 00137 enet_bd_struct_t * bdPtr = (enet_bd_struct_t*)_driver.rx_desc_start_addr; 00138 if((bdPtr[idx].control & kEnetRxBdEmpty)!=0){ 00139 //パケット未着 00140 return NULL; 00141 } 00142 if((bdPtr[idx].control & err_mask) != 0){ 00143 //エラー:パケットバッファを再設定して返却 00144 setRxDesc(RX_BUF+(idx*SIZE_OF_ETH_PACKET),idx); 00145 _driver.rx_idx=(idx+1)%NUM_OF_RX_BUF; 00146 return NULL; 00147 } 00148 *o_len_of_data =(unsigned short)enet_hal_get_bd_length(&(bdPtr[idx]))-2; 00149 return &RX_BUF[idx*SIZE_OF_ETH_PACKET+2]; 00150 } 00151 00152 static void nextRxEthFrame(void) 00153 { 00154 int idx=_driver.rx_idx; 00155 enet_bd_struct_t * bdPtr = (enet_bd_struct_t*)_driver.rx_desc_start_addr; 00156 //現在のRXメモリが有効かを確認 00157 if((bdPtr[idx].control & kEnetRxBdEmpty)==0){ 00158 //パケットバッファを復活させる 00159 updateRxDesc(idx); 00160 //キューのエントリを進行 00161 _driver.rx_idx=(idx+1)%NUM_OF_RX_BUF; 00162 return; 00163 } 00164 } 00165 00166 static void* allocTxBuf(NyLPC_TUInt16 i_hint,NyLPC_TUInt16* o_size) 00167 { 00168 return ((NyLPC_TUInt8*)NyLPC_cEthernetMM_alloc(i_hint,o_size))+2; 00169 } 00170 static void releaseTxBuf(void* i_buf) 00171 { 00172 NyLPC_cEthernetMM_release((NyLPC_TUInt8*)i_buf-2); 00173 } 00174 00175 00176 static void sendTxEthFrame(void* i_buf,unsigned short i_size) 00177 { 00178 int Index; 00179 struct NyLPC_TTxBufferHeader* bh=NyLPC_TTxBufferHeader_getBufferHeaderAddr(i_buf-2); 00180 //サイズ0なら送信の必要なし 00181 if(i_size == 0) 00182 { 00183 return; 00184 } 00185 //送信デスクリプタが使えるようになるのを待つよ! 00186 waitForTxEthFrameEmpty(); 00187 00188 //送信対象のメモリブロックを送信中に設定。 00189 if(bh->is_lock){ 00190 //送信中のメモリブロックなら無視 00191 return; 00192 } 00193 00194 //送信中にセット 00195 bh->is_lock=NyLPC_TUInt8_TRUE; 00196 00197 //最大送信サイズの制限 00198 if (i_size > ETH_FRAG_SIZE){ 00199 i_size = ETH_FRAG_SIZE; 00200 } 00201 Index=_driver.tx_idx; 00202 00203 updateTxDesc(Index,(uint8_t*)((unsigned char*)i_buf-2),i_size+2,Index==(NUM_OF_TX_RING-1)); 00204 _driver.tx_idx=(_driver.tx_idx+1)%NUM_OF_TX_RING; 00205 return; 00206 } 00207 00208 /** 00209 * 送信キューが空くまで待ちます。 00210 * @return 00211 * 次に書き込むことが出来る送信キューのIDだけど使わないで 00212 */ 00213 static NyLPC_TUInt32 waitForTxEthFrameEmpty(void) 00214 { 00215 int idx; 00216 int i; 00217 struct NyLPC_TTxBufferHeader *b; 00218 volatile void* p; 00219 volatile enet_bd_struct_t * bdPtr = (enet_bd_struct_t*)_driver.tx_desc_start_addr; 00220 00221 00222 //送信キューフルが解除されるまで待ち.現在のTQDescがReady状態の間ループ 00223 00224 while((bdPtr[_driver.tx_idx].control & kEnetTxBdReady)!=0) 00225 { 00226 NyLPC_cThread_sleep(10); 00227 } 00228 //インデクスを起点にReady状態が0のデスクリプタを全て解放(無駄があるけど無視) 00229 for(i=0;i<NUM_OF_TX_RING;i++){ 00230 idx=(_driver.tx_idx+i)%NUM_OF_TX_RING; 00231 if((bdPtr[idx].control & kEnetTxBdReady)!=0){ 00232 //if Ready state then break! 00233 break; 00234 } 00235 bdPtr[idx].control=(bdPtr[idx].control)&(~kEnetTxBdReady); 00236 //バッファを参照してたらそいつのロックビットも解放 00237 p=(void*)NTOHL(bdPtr[idx].buffer); 00238 if(p!=NULL){ 00239 b=((struct NyLPC_TTxBufferHeader*)p)-1; 00240 b->is_lock=NyLPC_TUInt8_FALSE; 00241 bdPtr[idx].buffer=0; 00242 } 00243 } 00244 return _driver.tx_idx; 00245 } 00246 00247 //////////////////////////////////////////////////////////////////////////////// 00248 // Ethernet interdface functions 00249 //////////////////////////////////////////////////////////////////////////////// 00250 00251 00252 // K64F-specific macros 00253 #define RX_PBUF_AUTO_INDEX (-1) 00254 extern void k64f_init_eth_hardware(void); 00255 00256 00257 //static struct k64f_enetdata k64f_enetdata; 00258 00259 static enet_dev_if_t enetDevIf[HW_ENET_INSTANCE_COUNT]; 00260 static enet_mac_config_t g_enetMacCfg[HW_ENET_INSTANCE_COUNT] = 00261 { 00262 { 00263 ENET_ETH_MAX_FLEN , /*!< enet receive buffer size*/ 00264 ENET_RX_LARGE_BUFFER_NUM, /*!< enet large receive buffer number*/ 00265 NUM_OF_RX_RING, /*!< enet receive bd number*/ 00266 NUM_OF_TX_RING, /*!< enet transmit bd number*/ 00267 {0}, /*!< enet mac address*/ 00268 kEnetCfgRmii, /*!< enet rmii interface*/ 00269 kEnetCfgSpeed100M, /*!< enet rmii 100M*/ 00270 kEnetCfgFullDuplex, /*!< enet rmii Full- duplex*/ 00271 /*!< enet mac control flag recommended to use enet_mac_control_flag_t 00272 we send frame with crc so receive crc forward for data length check test*/ 00273 kEnetRxCrcFwdEnable | kEnetRxFlowControlEnable, 00274 true, /*!< enet txaccelerator enabled*/ 00275 true, /*!< enet rxaccelerator enabled*/ 00276 false, /*!< enet store and forward*/ 00277 {false, false, true, false, true}, /*!< enet rxaccelerator config*/ 00278 {false, false, true}, /*!< enet txaccelerator config*/ 00279 true, /*!< vlan frame support*/ 00280 true, /*!< phy auto discover*/ 00281 ENET_MII_CLOCK, /*!< enet MDC clock*/ 00282 }, 00283 }; 00284 static enet_phy_config_t g_enetPhyCfg[HW_ENET_INSTANCE_COUNT] = 00285 { 00286 {0, false} 00287 }; 00288 00289 static NyLPC_TBool k64f_rx_setup(enet_rxbd_config_t *rxbdCfg); 00290 static NyLPC_TBool k64f_tx_setup(enet_txbd_config_t *txbdCfg); 00291 00292 00293 /** 00294 * i_idx番目のデスクリプタにバッファをセット 00295 */ 00296 static void setRxDesc(void* rx_buf, int idx) 00297 { 00298 enet_bd_struct_t *start = (enet_bd_struct_t *)_driver.rx_desc_start_addr; 00299 /* Setup descriptor and clear statuses */ 00300 enet_hal_init_rxbds(start + idx, (uint8_t*)rx_buf,idx ==(NUM_OF_RX_RING - 1)); 00301 enet_hal_active_rxbd(BOARD_DEBUG_ENET_INSTANCE); 00302 } 00303 static void updateRxDesc(int idx) 00304 { 00305 enet_bd_struct_t *start = (enet_bd_struct_t *)_driver.rx_desc_start_addr; 00306 /* Setup descriptor and clear statuses */ 00307 enet_hal_update_rxbds(start + idx,NULL,false); 00308 enet_hal_active_rxbd(BOARD_DEBUG_ENET_INSTANCE); 00309 } 00310 static void setTxDesc(int idx) 00311 { 00312 enet_bd_struct_t *start = (enet_bd_struct_t *)_driver.tx_desc_start_addr; 00313 /* Setup descriptor and clear statuses */ 00314 enet_hal_init_txbds(start + idx,idx ==(NUM_OF_RX_RING - 1)); 00315 enet_hal_active_txbd(BOARD_DEBUG_ENET_INSTANCE); 00316 } 00317 00318 static void updateTxDesc(int idx, uint8_t *buffer, uint16_t length, bool isLast) 00319 { 00320 volatile enet_bd_struct_t * bdPtr = (enet_bd_struct_t *)(_driver.tx_desc_start_addr + idx * enet_hal_get_bd_size()); 00321 00322 bdPtr->length = HTONS(length); /* Set data length*/ 00323 bdPtr->buffer = (uint8_t *)HTONL((uint32_t)buffer); /* Set data buffer*/ 00324 bdPtr->control |= kEnetTxBdLast;//最終フラグメントのフラグね 00325 bdPtr->controlExtend1 |= kEnetTxBdTxInterrupt; 00326 bdPtr->controlExtend2 &= ~TX_DESC_UPDATED_MASK; // descriptor not updated by DMA 00327 bdPtr->control |= kEnetTxBdTransmitCrc | kEnetTxBdReady; 00328 if(isLast){ 00329 //これはデスクリプタの終了位置のフラグ 00330 bdPtr->control |=kEnetTxBdWrap; 00331 } 00332 enet_hal_active_txbd(BOARD_DEBUG_ENET_INSTANCE); 00333 } 00334 00335 static void* ENET_MAC_CONTEXT_BUF=NULL; 00336 00337 /** \brief Low level init of the MAC and PHY. 00338 * 00339 * \param[in] netif Pointer to LWIP netif structure 00340 */ 00341 NyLPC_TBool low_level_init(const unsigned char* i_ethaddr,int i_addr_len) 00342 { 00343 enet_dev_if_t * enetIfPtr; 00344 uint32_t device = BOARD_DEBUG_ENET_INSTANCE; 00345 enet_rxbd_config_t rxbdCfg; 00346 enet_txbd_config_t txbdCfg; 00347 enet_phy_speed_t phy_speed; 00348 enet_phy_duplex_t phy_duplex; 00349 00350 //RX/TXメモリはデバイス選択時に確保 00351 k64f_init_eth_hardware(); 00352 00353 /* Initialize device*/ 00354 enetIfPtr = (enet_dev_if_t *)&enetDevIf[device]; 00355 enetIfPtr->deviceNumber = device; 00356 enetIfPtr->macCfgPtr = &g_enetMacCfg[device]; 00357 enetIfPtr->phyCfgPtr = &g_enetPhyCfg[device]; 00358 enetIfPtr->macApiPtr = &g_enetMacApi; 00359 enetIfPtr->phyApiPtr = (void *)&g_enetPhyApi; 00360 //macアドレスのコピー 00361 memcpy(enetIfPtr->macCfgPtr->macAddr,(char*)i_ethaddr,i_addr_len); 00362 //enetIfPtr->macContextPtrはgetInterface 00363 if(ENET_MAC_CONTEXT_BUF!=NULL){ 00364 free(ENET_MAC_CONTEXT_BUF); 00365 ENET_MAC_CONTEXT_BUF=NULL; 00366 } 00367 ENET_MAC_CONTEXT_BUF=calloc(1, sizeof(enet_mac_context_t)); 00368 if(ENET_MAC_CONTEXT_BUF==NULL){ 00369 return NyLPC_TBool_FALSE;//ERR_BUF; 00370 } 00371 enetIfPtr->macContextPtr = (enet_mac_context_t *)ENET_MAC_CONTEXT_BUF; 00372 00373 /* Initialize enet buffers*/ 00374 if(!k64f_rx_setup(&rxbdCfg)) { 00375 return NyLPC_TBool_FALSE;//ERR_BUF; 00376 } 00377 /* Initialize enet buffers*/ 00378 if(!k64f_tx_setup(&txbdCfg)) { 00379 return NyLPC_TBool_FALSE;//ERR_BUF; 00380 } 00381 /* Initialize enet module*/ 00382 if (enet_mac_init(enetIfPtr, &rxbdCfg, &txbdCfg) == kStatus_ENET_Success) 00383 { 00384 /* Initialize PHY*/ 00385 if (enetIfPtr->macCfgPtr->isPhyAutoDiscover) { 00386 if (((enet_phy_api_t *)(enetIfPtr->phyApiPtr))->phy_auto_discover(enetIfPtr) != kStatus_PHY_Success) 00387 return NyLPC_TBool_FALSE;//ERR_IF; 00388 } 00389 if (((enet_phy_api_t *)(enetIfPtr->phyApiPtr))->phy_init(enetIfPtr) != kStatus_PHY_Success) 00390 return NyLPC_TBool_FALSE;//ERR_IF; 00391 enetIfPtr->isInitialized = true; 00392 }else{ 00393 // TODOETH: cleanup memory 00394 return NyLPC_TBool_FALSE;//ERR_IF; 00395 } 00396 00397 /* Get link information from PHY */ 00398 phy_get_link_speed(enetIfPtr, &phy_speed); 00399 phy_get_link_duplex(enetIfPtr, &phy_duplex); 00400 BW_ENET_RCR_RMII_10T(enetIfPtr->deviceNumber, phy_speed == kEnetSpeed10M ? kEnetCfgSpeed10M : kEnetCfgSpeed100M); 00401 BW_ENET_TCR_FDEN(enetIfPtr->deviceNumber, phy_duplex == kEnetFullDuplex ? kEnetCfgFullDuplex : kEnetCfgHalfDuplex); 00402 00403 /* Enable Ethernet module*/ 00404 enet_hal_config_ethernet(device, true, true); 00405 00406 /* Active Receive buffer descriptor must be done after module enable*/ 00407 enet_hal_active_rxbd(enetIfPtr->deviceNumber); 00408 enet_hal_active_txbd(enetIfPtr->deviceNumber); 00409 00410 return NyLPC_TBool_TRUE;//ERR_OK; 00411 } 00412 00413 00414 static void* RX_DESC_BUF_BASE=NULL; 00415 00416 00417 /** \brief Sets up the RX descriptor ring buffers. 00418 * 00419 * This function sets up the descriptor list used for receive packets. 00420 * 00421 * \param[in] netif Pointer to driver data structure 00422 * \returns true/false 00423 */ 00424 static NyLPC_TBool k64f_rx_setup(enet_rxbd_config_t *rxbdCfg) 00425 { 00426 // struct k64f_enetdata *k64f_enet = &(netif->state); 00427 enet_dev_if_t *enetIfPtr = (enet_dev_if_t *)&enetDevIf[BOARD_DEBUG_ENET_INSTANCE]; 00428 uint32_t rxBufferSizeAligned; 00429 int i; 00430 00431 // Allocate RX descriptors 00432 if(RX_DESC_BUF_BASE!=NULL){ 00433 free(RX_DESC_BUF_BASE); 00434 RX_DESC_BUF_BASE=NULL; 00435 } 00436 RX_DESC_BUF_BASE = (void*)calloc(1, enet_hal_get_bd_size() * enetIfPtr->macCfgPtr->rxBdNumber + ENET_BD_ALIGNMENT); 00437 if(RX_DESC_BUF_BASE==NULL){ 00438 return NyLPC_TBool_FALSE; 00439 } 00440 //16byteアライメントに修正 00441 _driver.rx_desc_start_addr = (uint8_t *)ENET_ALIGN((NyLPC_TUInt32)RX_DESC_BUF_BASE, ENET_BD_ALIGNMENT); 00442 rxBufferSizeAligned = ENET_ALIGN(enetIfPtr->macCfgPtr->rxBufferSize, ENET_RX_BUFFER_ALIGNMENT); 00443 enetIfPtr->macContextPtr->rxBufferSizeAligned = rxBufferSizeAligned; 00444 rxbdCfg->rxBdPtrAlign = _driver.rx_desc_start_addr; 00445 rxbdCfg->rxBdNum = enetIfPtr->macCfgPtr->rxBdNumber; 00446 rxbdCfg->rxBufferNum = enetIfPtr->macCfgPtr->rxBdNumber; 00447 00448 //初期化 00449 enet_hal_active_rxbd(BOARD_DEBUG_ENET_INSTANCE); 00450 for(i=0;i<NUM_OF_RX_RING;i++){ 00451 setRxDesc(RX_BUF+(i*SIZE_OF_ETH_PACKET),i); 00452 } 00453 // k64f_rx_queue(netif, RX_PBUF_AUTO_INDEX); 00454 return NyLPC_TBool_TRUE; 00455 } 00456 00457 00458 00459 00460 static void* TX_DESC_BUF_BASE=NULL; 00461 /** \brief Sets up the TX descriptor ring buffers. 00462 * 00463 * This function sets up the descriptor list used for transmit packets. 00464 * 00465 * \param[in] netif Pointer to driver data structure 00466 * \returns true/false 00467 */ 00468 static NyLPC_TBool k64f_tx_setup(enet_txbd_config_t *txbdCfg) 00469 { 00470 int i; 00471 00472 enet_dev_if_t *enetIfPtr = (enet_dev_if_t *)&enetDevIf[BOARD_DEBUG_ENET_INSTANCE]; 00473 00474 // Allocate TX descriptors 00475 if(TX_DESC_BUF_BASE!=NULL){ 00476 free(TX_DESC_BUF_BASE); 00477 TX_DESC_BUF_BASE=NULL; 00478 } 00479 TX_DESC_BUF_BASE = (void*)calloc(1, enet_hal_get_bd_size() * enetIfPtr->macCfgPtr->txBdNumber + ENET_BD_ALIGNMENT); 00480 if(TX_DESC_BUF_BASE==NULL){ 00481 return NyLPC_TBool_FALSE; 00482 } 00483 00484 _driver.tx_desc_start_addr = (uint8_t *)ENET_ALIGN((uint32_t)TX_DESC_BUF_BASE, ENET_BD_ALIGNMENT); 00485 00486 txbdCfg->txBdPtrAlign = _driver.tx_desc_start_addr; 00487 txbdCfg->txBufferNum = enetIfPtr->macCfgPtr->txBdNumber; 00488 txbdCfg->txBufferSizeAlign = ENET_ALIGN(enetIfPtr->maxFrameSize, ENET_TX_BUFFER_ALIGNMENT); 00489 00490 // Make the TX descriptor ring circular 00491 for(i=0;i<NUM_OF_TX_RING;i++){ 00492 setTxDesc(i); 00493 } 00494 return NyLPC_TBool_TRUE; 00495 } 00496 00497 00498 //-------------------------------------------------------------------------------- 00499 // ISR 00500 //-------------------------------------------------------------------------------- 00501 extern IRQn_Type enet_irq_ids[HW_ENET_INSTANCE_COUNT][FSL_FEATURE_ENET_INTERRUPT_COUNT]; 00502 extern uint8_t enetIntMap[kEnetIntNum]; 00503 extern void *enetIfHandle; 00504 00505 static void eth_arch_enable_interrupts(void) 00506 { 00507 enet_hal_config_interrupt(BOARD_DEBUG_ENET_INSTANCE, (kEnetTxFrameInterrupt | kEnetRxFrameInterrupt), true); 00508 interrupt_enable(enet_irq_ids[BOARD_DEBUG_ENET_INSTANCE][enetIntMap[kEnetRxfInt]]); 00509 interrupt_enable(enet_irq_ids[BOARD_DEBUG_ENET_INSTANCE][enetIntMap[kEnetTxfInt]]); 00510 } 00511 00512 static void eth_arch_disable_interrupts(void) 00513 { 00514 interrupt_disable(enet_irq_ids[BOARD_DEBUG_ENET_INSTANCE][enetIntMap[kEnetRxfInt]]); 00515 interrupt_disable(enet_irq_ids[BOARD_DEBUG_ENET_INSTANCE][enetIntMap[kEnetTxfInt]]); 00516 } 00517 void ENET_Transmit_IRQHandler(void) 00518 { 00519 // led(0,-1); 00520 enet_hal_clear_interrupt(((enet_dev_if_t *)enetIfHandle)->deviceNumber, kEnetTxFrameInterrupt); 00521 _event_handler(_event_param,NyLPC_TiEthernetDevice_EVENT_ON_TX); 00522 } 00523 00524 void ENET_Receive_IRQHandler(void) 00525 { 00526 enet_hal_clear_interrupt(((enet_dev_if_t *)enetIfHandle)->deviceNumber, kEnetRxFrameInterrupt); 00527 _event_handler(_event_param,NyLPC_TiEthernetDevice_EVENT_ON_RX); 00528 } 00529 00530 00531 #endif 00532 00533 00534
Generated on Tue Jul 12 2022 15:46:14 by 1.7.2