static unsigned char *prvGetNextBuffer( void ) { long x; unsigned char *pucReturn = NULL; unsigned long ulAttempts = 0; while( pucReturn == NULL ) { /* Look through the buffers to find one that is not in use by anything else. */ for( x = 0; x < ETH_NUM_BUFFERS; x++ ) { if( ucBufferInUse[ x ] == pdFALSE ) { ucBufferInUse[ x ] = pdTRUE; pucReturn = ( unsigned char * ) ETH_BUF( x ); break; } } /* Was a buffer found? */ if( pucReturn == NULL ) { ulAttempts++; if( ulAttempts >= emacBUFFER_WAIT_ATTEMPTS ) { break; } /* Wait then look again. */ vTaskDelay( emacBUFFER_WAIT_DELAY ); } } return pucReturn; }
static void prvReturnBuffer( unsigned char *pucBuffer ) { unsigned long ul; /* Return a buffer to the pool of free buffers. */ for( ul = 0; ul < ETH_NUM_BUFFERS; ul++ ) { if( ETH_BUF( ul ) == ( unsigned long ) pucBuffer ) { ucBufferInUse[ ul ] = pdFALSE; break; } } }
static void prevRxDescriptor(void) { int x; //デスクリプタの設定 for( x = 0; x < NUM_RX_FRAG; x++ ) { /* Allocate the next Ethernet buffer to this descriptor. */ RX_DESC_PACKET(x) = ETH_BUF(x); RX_DESC_CTRL(x) = RCTRL_INT | ( ETH_FRAG_SIZE - 1 ); RX_STAT_INFO(x) = 0; RX_STAT_HASHCRC(x) = 0; } /* Set LPC_EMAC Receive Descriptor Registers. */ LPC_EMAC->RxDescriptor = RX_DESC_BASE; LPC_EMAC->RxStatus = RX_STAT_BASE; LPC_EMAC->RxDescriptorNumber = NUM_RX_FRAG - 1; }
static void prvInitDescriptors( void ) { long x, lNextBuffer = 0; for( x = 0; x < NUM_RX_FRAG; x++ ) { /* Allocate the next Ethernet buffer to this descriptor. */ RX_DESC_PACKET( x ) = ETH_BUF( lNextBuffer ); RX_DESC_CTRL( x ) = RCTRL_INT | ( ETH_FRAG_SIZE - 1 ); RX_STAT_INFO( x ) = 0; RX_STAT_HASHCRC( x ) = 0; /* The Ethernet buffer is now in use. */ ucBufferInUse[ lNextBuffer ] = pdTRUE; lNextBuffer++; } /* Set EMAC Receive Descriptor Registers. */ EMAC->RxDescriptor = RX_DESC_BASE; EMAC->RxStatus = RX_STAT_BASE; EMAC->RxDescriptorNumber = NUM_RX_FRAG - 1; /* Rx Descriptors Point to 0 */ EMAC->RxConsumeIndex = 0; /* A buffer is not allocated to the Tx descriptors until they are actually used. */ for( x = 0; x < NUM_TX_FRAG; x++ ) { TX_DESC_PACKET( x ) = ( unsigned long ) NULL; TX_DESC_CTRL( x ) = 0; TX_STAT_INFO( x ) = 0; } /* Set EMAC Transmit Descriptor Registers. */ EMAC->TxDescriptor = TX_DESC_BASE; EMAC->TxStatus = TX_STAT_BASE; EMAC->TxDescriptorNumber = NUM_TX_FRAG - 1; /* Tx Descriptors Point to 0 */ EMAC->TxProduceIndex = 0; }