/** \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; }
/** \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; }
/** \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 ERR_MEM if out of memory, ERR_OK otherwise */ static err_t k64f_tx_setup(struct netif *netif, enet_txbd_config_t *txbdCfg) { struct k64f_enetdata *k64f_enet = netif->state; enet_dev_if_t *enetIfPtr = (enet_dev_if_t *)&enetDevIf[BOARD_DEBUG_ENET_INSTANCE]; uint8_t *txBdPtr; // Allocate TX descriptors txBdPtr = (uint8_t *)calloc(1, enet_hal_get_bd_size() * enetIfPtr->macCfgPtr->txBdNumber + ENET_BD_ALIGNMENT); if(!txBdPtr) return ERR_MEM; k64f_enet->tx_desc_start_addr = (uint8_t *)ENET_ALIGN((uint32_t)txBdPtr, ENET_BD_ALIGNMENT); k64f_enet->tx_consume_index = k64f_enet->tx_produce_index = 0; txbdCfg->txBdPtrAlign = k64f_enet->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 enet_hal_init_txbds(k64f_enet->tx_desc_start_addr + enet_hal_get_bd_size() * (ENET_TX_RING_LEN - 1), 1); return ERR_OK; }
/*FUNCTION**************************************************************** * * Function Name: enet_mac_rxbd_init * Return Value: The execution status. * Description:Initialize the ENET receive buffer descriptors. * Note: If you do receive on receive interrupt handler the receive * data buffer number can be the same as the receive descriptor numbers. * But if you are polling receive frames please make sure the receive data * buffers are more than buffer descriptors to guarantee a good performance. *END*********************************************************************/ uint32_t enet_mac_rxbd_init(enet_dev_if_t * enetIfPtr, enet_rxbd_config_t *rxbdCfg) { /* Check the input parameters*/ if ((!enetIfPtr) || (!rxbdCfg)) { return kStatus_ENET_InvalidInput; } enetIfPtr->macContextPtr->bufferdescSize = enet_hal_get_bd_size(); /* Initialize the bd status*/ enetIfPtr->macContextPtr->isRxFull = false; /* Initialize receive bd base address and current address*/ enetIfPtr->macContextPtr->rxBdBasePtr = rxbdCfg->rxBdPtrAlign; enetIfPtr->macContextPtr->rxBdCurPtr = enetIfPtr->macContextPtr->rxBdBasePtr; enetIfPtr->macContextPtr->rxBdDirtyPtr = enetIfPtr->macContextPtr->rxBdBasePtr; enet_hal_set_rxbd_address(enetIfPtr->deviceNumber, (uint32_t)(enetIfPtr->macContextPtr->rxBdBasePtr)); return kStatus_ENET_Success; }
/** \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 ERR_MEM if out of memory, ERR_OK otherwise */ static err_t k64f_rx_setup(struct netif *netif, 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]; uint8_t *rxBdPtr; uint32_t rxBufferSizeAligned; // Allocate RX descriptors rxBdPtr = (uint8_t *)calloc(1, enet_hal_get_bd_size() * enetIfPtr->macCfgPtr->rxBdNumber + ENET_BD_ALIGNMENT); if(!rxBdPtr) return ERR_MEM; k64f_enet->rx_desc_start_addr = (uint8_t *)ENET_ALIGN((uint32_t)rxBdPtr, ENET_BD_ALIGNMENT); k64f_enet->rx_free_descs = enetIfPtr->macCfgPtr->rxBdNumber; k64f_enet->rx_fill_index = 0; rxBufferSizeAligned = ENET_ALIGN(enetIfPtr->macCfgPtr->rxBufferSize, ENET_RX_BUFFER_ALIGNMENT); enetIfPtr->macContextPtr->rxBufferSizeAligned = rxBufferSizeAligned; rxbdCfg->rxBdPtrAlign = k64f_enet->rx_desc_start_addr; rxbdCfg->rxBdNum = enetIfPtr->macCfgPtr->rxBdNumber; rxbdCfg->rxBufferNum = enetIfPtr->macCfgPtr->rxBdNumber; k64f_rx_queue(netif, RX_PBUF_AUTO_INDEX); return ERR_OK; }
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); }
/*FUNCTION**************************************************************** * * Function Name: enet_hal_update_txbds * Description: Update ENET transmit buffer descriptors. *END*********************************************************************/ void k64f_update_txbds(struct k64f_enetdata *k64f_enet, int idx, uint8_t *buffer, uint16_t length, bool isLast) { volatile enet_bd_struct_t * bdPtr = (enet_bd_struct_t *)(k64f_enet->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*/ if (isLast) bdPtr->control |= kEnetTxBdLast; else bdPtr->control &= ~kEnetTxBdLast; bdPtr->controlExtend1 |= kEnetTxBdTxInterrupt; bdPtr->controlExtend2 &= ~TX_DESC_UPDATED_MASK; // descriptor not updated by DMA bdPtr->control |= kEnetTxBdTransmitCrc | kEnetTxBdReady; }