mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-08-20 01:58:32 -04:00
Update the A2F SoftConsole project to match the current A2F IAR project.
This commit is contained in:
parent
9b6bd9e419
commit
5831485bdf
10 changed files with 563 additions and 539 deletions
|
@ -7,6 +7,8 @@
|
|||
* SVN $Revision: 2152 $
|
||||
* SVN $Date: 2010-02-11 14:44:11 +0000 (Thu, 11 Feb 2010) $
|
||||
*/
|
||||
|
||||
|
||||
#include "i2c.h"
|
||||
#include "../../CMSIS/mss_assert.h"
|
||||
|
||||
|
@ -145,6 +147,14 @@ void MSS_I2C_init
|
|||
this_i2c->hw_reg_bit->CTRL_CR1 = (clock_speed >> 1) & 0x01;
|
||||
this_i2c->hw_reg_bit->CTRL_CR0 = clock_speed & 0x01;
|
||||
this_i2c->hw_reg->ADDR = this_i2c->ser_address;
|
||||
|
||||
/* The interrupt can cause a context switch, so ensure its priority is
|
||||
between configKERNEL_INTERRUPT_PRIORITY and configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
||||
NVIC_SetPriority( this_i2c->irqn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );
|
||||
|
||||
vSemaphoreCreateBinary( ( this_i2c->xI2CCompleteSemaphore ) );
|
||||
xSemaphoreTake( ( this_i2c->xI2CCompleteSemaphore ), 0 );
|
||||
configASSERT( ( this_i2c->xI2CCompleteSemaphore ) );
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
|
@ -196,6 +206,7 @@ void MSS_I2C_write
|
|||
uint32_t primask;
|
||||
|
||||
ASSERT( (this_i2c == &g_mss_i2c0) || (this_i2c == &g_mss_i2c1) );
|
||||
configASSERT( ( this_i2c->xI2CCompleteSemaphore ) );
|
||||
|
||||
primask = disable_interrupts();
|
||||
|
||||
|
@ -431,11 +442,28 @@ mss_i2c_status_t MSS_I2C_wait_complete
|
|||
{
|
||||
ASSERT( (this_i2c == &g_mss_i2c0) || (this_i2c == &g_mss_i2c1) );
|
||||
|
||||
#ifdef USE_OLD_I2C_POLLING_CODE
|
||||
while ( this_i2c->status == MSS_I2C_IN_PROGRESS )
|
||||
{
|
||||
/* Wait for transaction to compltete.*/
|
||||
;
|
||||
}
|
||||
#else
|
||||
configASSERT( ( this_i2c->xI2CCompleteSemaphore ) );
|
||||
if( xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED )
|
||||
{
|
||||
while ( this_i2c->status == MSS_I2C_IN_PROGRESS )
|
||||
{
|
||||
/* Wait for transaction to compltete.*/
|
||||
;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
xSemaphoreTake( this_i2c->xI2CCompleteSemaphore, portMAX_DELAY );
|
||||
}
|
||||
#endif
|
||||
|
||||
return this_i2c->status;
|
||||
}
|
||||
|
||||
|
@ -451,12 +479,14 @@ mss_i2c_status_t MSS_I2C_wait_complete
|
|||
static void mss_i2c_isr
|
||||
(
|
||||
mss_i2c_instance_t * this_i2c
|
||||
)
|
||||
)
|
||||
{
|
||||
volatile uint8_t status;
|
||||
uint8_t data;
|
||||
uint8_t hold_bus;
|
||||
uint8_t clear_irq = 1;
|
||||
long lHigherPriorityTaskWoken = pdFALSE;
|
||||
configASSERT( ( this_i2c->xI2CCompleteSemaphore ) );
|
||||
|
||||
ASSERT( (this_i2c == &g_mss_i2c0) || (this_i2c == &g_mss_i2c1) );
|
||||
|
||||
|
@ -539,6 +569,7 @@ static void mss_i2c_isr
|
|||
clear_irq = 0;
|
||||
}
|
||||
this_i2c->status = MSS_I2C_SUCCESS;
|
||||
xSemaphoreGiveFromISR( this_i2c->xI2CCompleteSemaphore, &lHigherPriorityTaskWoken );
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -577,6 +608,7 @@ static void mss_i2c_isr
|
|||
clear_irq = 0;
|
||||
}
|
||||
this_i2c->status = MSS_I2C_SUCCESS;
|
||||
xSemaphoreGiveFromISR( this_i2c->xI2CCompleteSemaphore, &lHigherPriorityTaskWoken );
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -600,6 +632,7 @@ static void mss_i2c_isr
|
|||
case ST_SLAR_NACK: /* SLA+R tx'ed; let's release the bus (send a stop condition) */
|
||||
this_i2c->hw_reg_bit->CTRL_STO = 0x01;
|
||||
this_i2c->status = MSS_I2C_FAILED;
|
||||
xSemaphoreGiveFromISR( this_i2c->xI2CCompleteSemaphore, &lHigherPriorityTaskWoken );
|
||||
break;
|
||||
|
||||
case ST_RX_DATA_ACK: /* Data byte received, ACK returned */
|
||||
|
@ -630,6 +663,7 @@ static void mss_i2c_isr
|
|||
}
|
||||
|
||||
this_i2c->status = MSS_I2C_SUCCESS;
|
||||
// xSemaphoreGiveFromISR( this_i2c->xI2CCompleteSemaphore, &lHigherPriorityTaskWoken );
|
||||
break;
|
||||
|
||||
/******************** SLAVE RECEIVER **************************/
|
||||
|
@ -696,6 +730,7 @@ static void mss_i2c_isr
|
|||
}
|
||||
/* Mark any previous master write transaction as complete. */
|
||||
this_i2c->status = MSS_I2C_SUCCESS;
|
||||
// xSemaphoreGiveFromISR( this_i2c->xI2CCompleteSemaphore, &lHigherPriorityTaskWoken );
|
||||
break;
|
||||
|
||||
case ST_SLV_RST: /* SMBUS ONLY: timeout state. must clear interrupt */
|
||||
|
@ -747,6 +782,8 @@ static void mss_i2c_isr
|
|||
/* Read the status register to ensure the last I2C registers write took place
|
||||
* in a system built around a bus making use of posted writes. */
|
||||
status = this_i2c->hw_reg->STATUS;
|
||||
|
||||
portEND_SWITCHING_ISR( lHigherPriorityTaskWoken );
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
|
|
|
@ -194,6 +194,11 @@
|
|||
|
||||
#include "../../CMSIS/a2fxxxm3.h"
|
||||
|
||||
/* FreeRTOS includes. */
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
#include "semphr.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
@ -324,7 +329,10 @@ typedef struct mss_i2c_instance
|
|||
/* Slave data: */
|
||||
uint_fast8_t slave_mem_offset_length;
|
||||
mss_i2c_slave_wr_handler_t slave_write_handler;
|
||||
|
||||
|
||||
/* Used to get access to and wait for completion of an I2C transaction. */
|
||||
xSemaphoreHandle xI2CCompleteSemaphore;
|
||||
|
||||
} mss_i2c_instance_t;
|
||||
|
||||
/*-------------------------------------------------------------------------*//**
|
||||
|
|
|
@ -9,9 +9,18 @@
|
|||
*
|
||||
******************************************************************************/
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
* NOTE: This driver has been modified specifically for use with the* uIP stack.
|
||||
* It is no longer a generic driver.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
|
@ -29,7 +38,7 @@ extern "C" {
|
|||
/**************************** INTERNAL DEFINES ********************************/
|
||||
|
||||
#define MAC_CHECK(CHECK,ERRNO) \
|
||||
{if(!(CHECK)){g_mss_mac.last_error=(ERRNO); ASSERT((CHECK));}}
|
||||
{if(!(CHECK)){g_mss_mac.last_error=(ERRNO); configASSERT((CHECK));}}
|
||||
|
||||
/*
|
||||
* Flags
|
||||
|
@ -54,8 +63,8 @@ extern "C" {
|
|||
/* Allocating this many buffers will always ensure there is one free as, even
|
||||
though TX_RING_SIZE is set to two, the two Tx descriptors will only ever point
|
||||
to the same buffer. */
|
||||
#define macNUM_BUFFERS RX_RING_SIZE + TX_RING_SIZE
|
||||
#define macBUFFER_SIZE 1500
|
||||
#define macNUM_BUFFERS RX_RING_SIZE + TX_RING_SIZE + 1
|
||||
#define macBUFFER_SIZE 1488
|
||||
|
||||
/***************************************************************/
|
||||
MAC_instance_t g_mss_mac;
|
||||
|
@ -78,15 +87,16 @@ static const int8_t ErrorMessages[][MAX_ERROR_MESSAGE_WIDTH] = {
|
|||
/*
|
||||
* Null variables
|
||||
*/
|
||||
static MAC_instance_t* NULL_instance;
|
||||
static uint8_t* NULL_buffer;
|
||||
static MSS_MAC_callback_t NULL_callback;
|
||||
|
||||
/* Declare the uip_buf as a pointer, rather than the traditional array, as this
|
||||
is a zero copy driver. uip_buf just gets set to whichever buffer is being
|
||||
processed. */
|
||||
unsigned char *uip_buf = NULL;
|
||||
|
||||
/**************************** INTERNAL FUNCTIONS ******************************/
|
||||
|
||||
static int32_t MAC_test_instance( void );
|
||||
|
||||
static int32_t MAC_dismiss_bad_frames( void );
|
||||
static int32_t MAC_send_setup_frame( void );
|
||||
|
||||
|
@ -109,12 +119,17 @@ static void MAC_release_buffer( unsigned char *pcBufferToRelease );
|
|||
#error This uIP Ethernet driver required TX_RING_SIZE to be set to 2
|
||||
#endif
|
||||
|
||||
/* Buffers that will dynamically be allocated to/from the Tx and Rx descriptors. */
|
||||
static unsigned char ucMACBuffers[ macNUM_BUFFERS ][ macBUFFER_SIZE ];
|
||||
/* Buffers that will dynamically be allocated to/from the Tx and Rx descriptors.
|
||||
The union is used for alignment only. */
|
||||
static union xMAC_BUFFERS
|
||||
{
|
||||
unsigned long ulAlignmentVariable; /* For alignment only, not used anywhere. */
|
||||
unsigned char ucBuffer[ macNUM_BUFFERS ][ macBUFFER_SIZE ];
|
||||
} xMACBuffers;
|
||||
|
||||
/* Each array position indicated whether or not the buffer of the same index
|
||||
is currently allocated to a descriptor (pdFALSE) or is free for use (pdTRUE). */
|
||||
static unsigned char ucMACBufferFree[ macNUM_BUFFERS ];
|
||||
/* Each array position indicates whether or not the buffer of the same index
|
||||
is currently allocated to a descriptor (pdTRUE) or is free for use (pdFALSE). */
|
||||
static unsigned char ucMACBufferInUse[ macNUM_BUFFERS ] = { 0 };
|
||||
|
||||
/***************************************************************************//**
|
||||
* Initializes the Ethernet Controller.
|
||||
|
@ -138,7 +153,7 @@ MSS_MAC_init
|
|||
/* To start with all buffers are free. */
|
||||
for( a = 0; a < macNUM_BUFFERS; a++ )
|
||||
{
|
||||
ucMACBufferFree[ a ] = pdTRUE;
|
||||
ucMACBufferInUse[ a ] = pdFALSE;
|
||||
}
|
||||
|
||||
/* Try to reset chip */
|
||||
|
@ -151,9 +166,9 @@ MSS_MAC_init
|
|||
|
||||
/* Check reset values of some registers to constrol
|
||||
* base address validity */
|
||||
ASSERT( MAC->CSR0 == 0xFE000000uL );
|
||||
ASSERT( MAC->CSR5 == 0xF0000000uL );
|
||||
ASSERT( MAC->CSR6 == 0x32000040uL );
|
||||
configASSERT( MAC->CSR0 == 0xFE000000uL );
|
||||
configASSERT( MAC->CSR5 == 0xF0000000uL );
|
||||
configASSERT( MAC->CSR6 == 0x32000040uL );
|
||||
|
||||
/* Instance setup */
|
||||
MAC_memset_All( &g_mss_mac, 0u );
|
||||
|
@ -169,8 +184,8 @@ MSS_MAC_init
|
|||
|
||||
/* Allocate a buffer to the descriptor, then mark the buffer as in use
|
||||
(not free). */
|
||||
g_mss_mac.rx_descriptors[a].buffer_1 = ( unsigned long ) &( ucMACBuffers[ a ][ 0 ] );
|
||||
ucMACBufferFree[ a ] = pdFALSE;
|
||||
g_mss_mac.rx_descriptors[a].buffer_1 = ( unsigned long ) &( xMACBuffers.ucBuffer[ a ][ 0 ] );
|
||||
ucMACBufferInUse[ a ] = pdTRUE;
|
||||
}
|
||||
g_mss_mac.rx_descriptors[RX_RING_SIZE-1].descriptor_1 |= RDES1_RER;
|
||||
|
||||
|
@ -189,8 +204,6 @@ MSS_MAC_init
|
|||
MAC_BITBAND->CSR0_BAR = (uint32_t)BUS_ARBITRATION_SCHEME;
|
||||
|
||||
/* Fixed settings */
|
||||
/* No automatic polling */
|
||||
MAC->CSR0 = MAC->CSR0 &~ CSR0_TAP_MASK;
|
||||
/* No space between descriptors */
|
||||
MAC->CSR0 = MAC->CSR0 &~ CSR0_DSL_MASK;
|
||||
/* General-purpose timer works in continuous mode */
|
||||
|
@ -198,39 +211,41 @@ MSS_MAC_init
|
|||
/* Start general-purpose */
|
||||
MAC->CSR11 = (MAC->CSR11 & ~CSR11_TIM_MASK) | (0x0000FFFFuL << CSR11_TIM_SHIFT);
|
||||
|
||||
/* Disable promiscuous mode */
|
||||
MAC_BITBAND->CSR6_PR = 0u;
|
||||
|
||||
/* Enable store and forward */
|
||||
MAC_BITBAND->CSR6_SF = 1u;
|
||||
|
||||
/* Ensure promiscous mode is off (it should be by default anyway). */
|
||||
MAC_BITBAND->CSR6_PR = 0;
|
||||
|
||||
/* Perfect filter. */
|
||||
MAC_BITBAND->CSR6_HP = 1;
|
||||
|
||||
/* Pass multcast. */
|
||||
MAC_BITBAND->CSR6_PM = 1;
|
||||
|
||||
/* Set descriptors */
|
||||
MAC->CSR3 = (uint32_t)&(g_mss_mac.rx_descriptors[0].descriptor_0);
|
||||
MAC->CSR4 = (uint32_t)&(g_mss_mac.tx_descriptors[0].descriptor_0);
|
||||
|
||||
|
||||
/* enable normal interrupts */
|
||||
MAC_BITBAND->CSR7_NIE = 1u;
|
||||
|
||||
/* Set default MAC address and reset mac filters */
|
||||
MAC_memcpy( g_mss_mac.mac_address, mac_address, 6u );
|
||||
MSS_MAC_set_mac_address((uint8_t *)mac_address);
|
||||
|
||||
/* Detect PHY */
|
||||
if( g_mss_mac.phy_address > MSS_PHY_ADDRESS_MAX )
|
||||
{
|
||||
PHY_probe();
|
||||
ASSERT( g_mss_mac.phy_address <= MSS_PHY_ADDRESS_MAX );
|
||||
configASSERT( g_mss_mac.phy_address <= MSS_PHY_ADDRESS_MAX );
|
||||
}
|
||||
|
||||
/* Reset PHY */
|
||||
PHY_reset();
|
||||
|
||||
/* Set flags */
|
||||
g_mss_mac.flags = FLAG_MAC_INIT_DONE | FLAG_PERFECT_FILTERING;
|
||||
|
||||
/* Configure chip according to PHY status */
|
||||
MSS_MAC_auto_setup_link();
|
||||
|
||||
/* Set default MAC address and reset mac filters */
|
||||
MAC_memcpy( g_mss_mac.mac_address, mac_address, 6u );
|
||||
MSS_MAC_set_mac_filters( 0u, NULL_buffer );
|
||||
MAC_BITBAND->CSR6_RA = 1; /* Receive all. */
|
||||
|
||||
/* Ensure uip_buf starts by pointing somewhere. */
|
||||
uip_buf = MAC_obtain_buffer();
|
||||
}
|
||||
|
||||
|
||||
|
@ -259,18 +274,16 @@ MSS_MAC_configure
|
|||
{
|
||||
int32_t ret;
|
||||
|
||||
ASSERT( MAC_test_instance() == MAC_OK );
|
||||
|
||||
ret = MAC_stop_transmission();
|
||||
ASSERT( ret == MAC_OK );
|
||||
configASSERT( ret == MAC_OK );
|
||||
|
||||
ret = MAC_stop_receiving();
|
||||
ASSERT( ret == MAC_OK );
|
||||
configASSERT( ret == MAC_OK );
|
||||
|
||||
MAC_BITBAND->CSR6_RA = (uint32_t)(((configuration & MSS_MAC_CFG_RECEIVE_ALL) != 0u) ? 1u : 0u );
|
||||
MAC_BITBAND->CSR6_TTM = (((configuration & MSS_MAC_CFG_TRANSMIT_THRESHOLD_MODE) != 0u) ? 1u : 0u );
|
||||
MAC_BITBAND->CSR6_SF = (uint32_t)(((configuration & MSS_MAC_CFG_STORE_AND_FORWARD) != 0u) ? 1u : 0u );
|
||||
|
||||
|
||||
switch( configuration & MSS_MAC_CFG_THRESHOLD_CONTROL_11 ) {
|
||||
case MSS_MAC_CFG_THRESHOLD_CONTROL_00:
|
||||
MAC->CSR6 = MAC->CSR6 & ~CSR6_TR_MASK;
|
||||
|
@ -322,8 +335,6 @@ MSS_MAC_get_configuration( void )
|
|||
{
|
||||
uint32_t configuration;
|
||||
|
||||
ASSERT( MAC_test_instance() == MAC_OK );
|
||||
|
||||
configuration = 0u;
|
||||
if( MAC_BITBAND->CSR6_RA != 0u ) {
|
||||
configuration |= MSS_MAC_CFG_RECEIVE_ALL;
|
||||
|
@ -370,7 +381,7 @@ MSS_MAC_get_configuration( void )
|
|||
if( MAC_BITBAND->CSR6_HP != 0u ) {
|
||||
configuration |= MSS_MAC_CFG_HASH_PERFECT_RECEIVE_FILTERING_MODE;
|
||||
}
|
||||
|
||||
|
||||
return (int32_t)configuration;
|
||||
}
|
||||
|
||||
|
@ -382,11 +393,11 @@ MSS_MAC_get_configuration( void )
|
|||
the transmit FIFO and then activates the transmitter for this packet. If space
|
||||
is available in the FIFO, the function will return once pac_len bytes of the
|
||||
packet have been placed into the FIFO and the transmitter has been started.
|
||||
This function will not wait for the transmission to complete.
|
||||
This function will not wait for the transmission to complete.
|
||||
|
||||
@return
|
||||
The function returns zero if a timeout occurs otherwise it returns size of the packet.
|
||||
|
||||
|
||||
@see MAC_rx_packet()
|
||||
*/
|
||||
|
||||
|
@ -399,42 +410,42 @@ MSS_MAC_tx_packet
|
|||
uint32_t desc;
|
||||
unsigned long ulDescriptor;
|
||||
int32_t error = MAC_OK;
|
||||
extern unsigned char *uip_buf;
|
||||
|
||||
ASSERT( MAC_test_instance() == MAC_OK );
|
||||
configASSERT( uip_buf != NULL_buffer );
|
||||
|
||||
ASSERT( uip_buf != NULL_buffer );
|
||||
|
||||
ASSERT( usLength >= 12 );
|
||||
configASSERT( usLength >= 12 );
|
||||
|
||||
if( (g_mss_mac.flags & FLAG_EXCEED_LIMIT) == 0u )
|
||||
{
|
||||
ASSERT( usLength <= MSS_MAX_PACKET_SIZE );
|
||||
configASSERT( usLength <= MSS_MAX_PACKET_SIZE );
|
||||
}
|
||||
|
||||
/* Check if second descriptor is free, if it is then the first must
|
||||
also be free. */
|
||||
if(((g_mss_mac.tx_descriptors[ 1 ].descriptor_0) & TDES0_OWN) == TDES0_OWN )
|
||||
if( ( ( (g_mss_mac.tx_descriptors[ 0 ].descriptor_0) & TDES0_OWN) == TDES0_OWN ) || ( ( (g_mss_mac.tx_descriptors[ 1 ].descriptor_0) & TDES0_OWN) == TDES0_OWN ) )
|
||||
{
|
||||
error = MAC_BUFFER_IS_FULL;
|
||||
}
|
||||
|
||||
if( error == MAC_OK ) {
|
||||
/* Assumed TX_RING_SIZE == 2. */
|
||||
|
||||
if( error == MAC_OK )
|
||||
{
|
||||
/* Assumed TX_RING_SIZE == 2. A #error directive checks this is the
|
||||
case. */
|
||||
for( ulDescriptor = 0; ulDescriptor < TX_RING_SIZE; ulDescriptor++ )
|
||||
{
|
||||
g_mss_mac.tx_descriptors[ ulDescriptor ].descriptor_1 = 0u;
|
||||
g_mss_mac.tx_descriptors[ g_mss_mac.tx_desc_index ].descriptor_1 = 0u;
|
||||
|
||||
if( (g_mss_mac.flags & FLAG_CRC_DISABLE) != 0u ) {
|
||||
g_mss_mac.tx_descriptors[ ulDescriptor ].descriptor_1 |= TDES1_AC;
|
||||
g_mss_mac.tx_descriptors[ g_mss_mac.tx_desc_index ].descriptor_1 |= TDES1_AC;
|
||||
}
|
||||
|
||||
/* Every buffer can hold a full frame so they are always first and last
|
||||
descriptor */
|
||||
g_mss_mac.tx_descriptors[ ulDescriptor ].descriptor_1 |= TDES1_LS | TDES1_FS;
|
||||
g_mss_mac.tx_descriptors[ g_mss_mac.tx_desc_index ].descriptor_1 |= TDES1_LS | TDES1_FS | TDES1_IC;
|
||||
|
||||
/* set data size */
|
||||
g_mss_mac.tx_descriptors[ ulDescriptor ].descriptor_1 |= usLength;
|
||||
g_mss_mac.tx_descriptors[ g_mss_mac.tx_desc_index ].descriptor_1 |= usLength;
|
||||
|
||||
/* reset end of ring */
|
||||
g_mss_mac.tx_descriptors[TX_RING_SIZE-1].descriptor_1 |= TDES1_TER;
|
||||
|
@ -445,10 +456,10 @@ MSS_MAC_tx_packet
|
|||
}
|
||||
|
||||
/* The data buffer is assigned to the Tx descriptor. */
|
||||
g_mss_mac.tx_descriptors[ ulDescriptor ].buffer_1 = ( unsigned long ) uip_buf;
|
||||
g_mss_mac.tx_descriptors[ g_mss_mac.tx_desc_index ].buffer_1 = ( unsigned long ) uip_buf;
|
||||
|
||||
/* update counters */
|
||||
desc = g_mss_mac.tx_descriptors[ ulDescriptor ].descriptor_0;
|
||||
desc = g_mss_mac.tx_descriptors[ g_mss_mac.tx_desc_index ].descriptor_0;
|
||||
if( (desc & TDES0_LO) != 0u ) {
|
||||
g_mss_mac.statistics.tx_loss_of_carrier++;
|
||||
}
|
||||
|
@ -468,26 +479,22 @@ MSS_MAC_tx_packet
|
|||
(desc >> TDES0_CC_OFFSET) & TDES0_CC_MASK;
|
||||
|
||||
/* Give ownership of descriptor to the MAC */
|
||||
g_mss_mac.tx_descriptors[ ulDescriptor ].descriptor_0 = TDES0_OWN;
|
||||
|
||||
g_mss_mac.tx_desc_index = 0;
|
||||
}
|
||||
g_mss_mac.tx_descriptors[ g_mss_mac.tx_desc_index ].descriptor_0 = RDES0_OWN;
|
||||
|
||||
g_mss_mac.tx_desc_index = (g_mss_mac.tx_desc_index + 1u) % (uint32_t)TX_RING_SIZE;
|
||||
|
||||
MAC_start_transmission();
|
||||
MAC->CSR1 = 1u;
|
||||
}
|
||||
}
|
||||
|
||||
/* Start transmission */
|
||||
MAC_start_transmission();
|
||||
|
||||
/* transmit poll demand */
|
||||
MAC->CSR1 = 1u;
|
||||
|
||||
|
||||
|
||||
if (error == MAC_OK)
|
||||
{
|
||||
/* The buffer uip_buf was pointing to is now under the control of the
|
||||
MAC (it is being transmitted). Set uip_buf to point to a free buffer. */
|
||||
uip_buf = MAC_obtain_buffer();
|
||||
error = (int32_t)usLength;
|
||||
|
||||
/* The buffer pointed to by uip_buf is now assigned to a Tx descriptor.
|
||||
Find anothere free buffer for uip_buf. */
|
||||
uip_buf = MAC_obtain_buffer();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -512,8 +519,6 @@ MSS_MAC_rx_pckt_size
|
|||
)
|
||||
{
|
||||
int32_t retval;
|
||||
ASSERT( MAC_test_instance() == MAC_OK );
|
||||
|
||||
MAC_dismiss_bad_frames();
|
||||
|
||||
if( (g_mss_mac.rx_descriptors[ g_mss_mac.rx_desc_index ].descriptor_0 & RDES0_OWN) != 0u )
|
||||
|
@ -535,7 +540,7 @@ MSS_MAC_rx_pckt_size
|
|||
* Receives a packet from the Ethernet Controller into the uIP stack.
|
||||
* This function reads a packet from the receive FIFO of the controller and
|
||||
* places it into uip_buf.
|
||||
|
||||
|
||||
* @return Size of packet if packet fits in uip_buf.
|
||||
* 0 if there is no received packet.
|
||||
* @see MAC_rx_pckt_size()
|
||||
|
@ -549,8 +554,6 @@ MSS_MAC_rx_packet
|
|||
{
|
||||
uint16_t frame_length=0u;
|
||||
|
||||
ASSERT( MAC_test_instance() == MAC_OK );
|
||||
|
||||
MAC_dismiss_bad_frames();
|
||||
|
||||
if( (g_mss_mac.rx_descriptors[ g_mss_mac.rx_desc_index ].descriptor_0 & RDES0_OWN) == 0u )
|
||||
|
@ -565,7 +568,7 @@ MSS_MAC_rx_packet
|
|||
if( frame_length > macBUFFER_SIZE ) {
|
||||
return MAC_NOT_ENOUGH_SPACE;
|
||||
}
|
||||
|
||||
|
||||
/* uip_buf is about to point to the buffer that contains the received
|
||||
data, mark the buffer that uip_buf is currently pointing to as free
|
||||
again. */
|
||||
|
@ -585,7 +588,7 @@ MSS_MAC_rx_packet
|
|||
/***************************************************************************//**
|
||||
* Receives a packet from the Ethernet Controller.
|
||||
* This function reads a packet from the receive FIFO of the controller and
|
||||
* sets the address of pacData to the received data.
|
||||
* sets the address of pacData to the received data.
|
||||
* If time_out parameter is zero the function will return
|
||||
* immediately (after the copy operation if data is available. Otherwise the function
|
||||
* will keep trying to read till time_out expires or data is read, if MSS_MAC_BLOCKING
|
||||
|
@ -614,9 +617,7 @@ MSS_MAC_rx_packet_ptrset
|
|||
uint16_t frame_length = 0u;
|
||||
int8_t exit = 0;
|
||||
|
||||
ASSERT( MAC_test_instance() == MAC_OK );
|
||||
|
||||
ASSERT( (time_out == MSS_MAC_BLOCKING) ||
|
||||
configASSERT( (time_out == MSS_MAC_BLOCKING) ||
|
||||
(time_out == MSS_MAC_NONBLOCKING) ||
|
||||
((time_out >= 1) && (time_out <= 0x01000000UL)) );
|
||||
|
||||
|
@ -653,11 +654,11 @@ MSS_MAC_rx_packet_ptrset
|
|||
|
||||
/* Here we are setting the buffer 'pacData' address to the address
|
||||
RX descriptor address. After this is called, the following function
|
||||
must be called 'MAC_prepare_rx_descriptor'
|
||||
must be called 'MAC_prepare_rx_descriptor'
|
||||
to prepare the current rx descriptor for receiving the next packet.
|
||||
*/
|
||||
*pacData = (uint8_t *)g_mss_mac.rx_descriptors[ g_mss_mac.rx_desc_index ].buffer_1 ;
|
||||
|
||||
*/
|
||||
*pacData = (uint8_t *)g_mss_mac.rx_descriptors[ g_mss_mac.rx_desc_index ].buffer_1 ;
|
||||
|
||||
}
|
||||
return ((int32_t)frame_length);
|
||||
}
|
||||
|
@ -679,8 +680,6 @@ MSS_MAC_link_status
|
|||
{
|
||||
uint32_t link;
|
||||
|
||||
ASSERT( MAC_test_instance() == MAC_OK );
|
||||
|
||||
link = PHY_link_status();
|
||||
if( link == MSS_MAC_LINK_STATUS_LINK ) {
|
||||
link |= PHY_link_type();
|
||||
|
@ -706,7 +705,6 @@ MSS_MAC_auto_setup_link
|
|||
)
|
||||
{
|
||||
int32_t link;
|
||||
ASSERT( MAC_test_instance() == MAC_OK );
|
||||
|
||||
PHY_auto_negotiate();
|
||||
|
||||
|
@ -741,9 +739,8 @@ MSS_MAC_set_mac_address
|
|||
const uint8_t *new_address
|
||||
)
|
||||
{
|
||||
ASSERT( MAC_test_instance() == MAC_OK );
|
||||
/* Check if the new address is unicast */
|
||||
ASSERT( (new_address[0]&1) == 0 );
|
||||
configASSERT( (new_address[0]&1) == 0 );
|
||||
|
||||
MAC_memcpy( g_mss_mac.mac_address, new_address, 6u );
|
||||
|
||||
|
@ -777,8 +774,6 @@ MSS_MAC_get_mac_address
|
|||
uint8_t *address
|
||||
)
|
||||
{
|
||||
ASSERT( MAC_test_instance() == MAC_OK );
|
||||
|
||||
MAC_memcpy( address, g_mss_mac.mac_address, 6u );
|
||||
}
|
||||
|
||||
|
@ -796,13 +791,12 @@ MSS_MAC_set_mac_filters
|
|||
const uint8_t *filters
|
||||
)
|
||||
{
|
||||
ASSERT( MAC_test_instance() == MAC_OK );
|
||||
ASSERT( (filter_count==0) || (filters != NULL_buffer) );
|
||||
configASSERT( (filter_count==0) || (filters != NULL_buffer) );
|
||||
/* Check if the mac addresses is multicast */
|
||||
{
|
||||
int32_t a;
|
||||
for( a = 0u; a < filter_count; a++ ) {
|
||||
ASSERT( (filters[a*6]&1) == 1 );
|
||||
configASSERT( (filters[a*6]&1) == 1 );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -852,8 +846,6 @@ void EthernetMAC_IRQHandler( void )
|
|||
uint32_t events;
|
||||
uint32_t intr_status;
|
||||
|
||||
ASSERT( MAC_test_instance() == MAC_OK );
|
||||
|
||||
events = 0u;
|
||||
intr_status = MAC->CSR5;
|
||||
|
||||
|
@ -871,7 +863,7 @@ void EthernetMAC_IRQHandler( void )
|
|||
|
||||
/* Clear interrupts */
|
||||
MAC->CSR5 = CSR5_INT_BITS;
|
||||
|
||||
|
||||
if( (events != 0u) && (g_mss_mac.listener != NULL_callback) ) {
|
||||
g_mss_mac.listener( events );
|
||||
}
|
||||
|
@ -896,12 +888,10 @@ MSS_MAC_set_callback
|
|||
MSS_MAC_callback_t listener
|
||||
)
|
||||
{
|
||||
ASSERT( MAC_test_instance() == MAC_OK );
|
||||
|
||||
/* disable tx and rx interrupts */
|
||||
MAC_BITBAND->CSR7_RIE = 0u;
|
||||
MAC_BITBAND->CSR7_TIE = 0u;
|
||||
|
||||
|
||||
g_mss_mac.listener = listener;
|
||||
|
||||
if( listener != NULL_callback ) {
|
||||
|
@ -929,8 +919,6 @@ MSS_MAC_last_error
|
|||
{
|
||||
int8_t error_msg_nb;
|
||||
const int8_t* returnvalue;
|
||||
|
||||
ASSERT( MAC_test_instance() == MAC_OK );
|
||||
|
||||
error_msg_nb = -(g_mss_mac.last_error);
|
||||
if( error_msg_nb >= ERROR_MESSAGE_COUNT ) {
|
||||
|
@ -957,7 +945,6 @@ MSS_MAC_get_statistics
|
|||
)
|
||||
{
|
||||
uint32_t returnval = 0u;
|
||||
ASSERT( MAC_test_instance() == MAC_OK );
|
||||
|
||||
switch( stat_id ) {
|
||||
case MSS_MAC_RX_INTERRUPTS:
|
||||
|
@ -1024,31 +1011,6 @@ MSS_MAC_get_statistics
|
|||
|
||||
/**************************** INTERNAL FUNCTIONS ******************************/
|
||||
|
||||
/***************************************************************************//**
|
||||
* Checks if instace is valid.
|
||||
*/
|
||||
static int32_t
|
||||
MAC_test_instance
|
||||
(
|
||||
void
|
||||
)
|
||||
{
|
||||
uint32_t val1;
|
||||
uint32_t val2;
|
||||
int32_t retval = MAC_WRONG_PARAMETER;
|
||||
|
||||
val1 = MAC->CSR3;
|
||||
val2 = MAC->CSR4;
|
||||
|
||||
if( (&g_mss_mac != NULL_instance) &&
|
||||
((g_mss_mac.flags & FLAG_MAC_INIT_DONE) != 0u) &&
|
||||
( val1 == (uint32_t)g_mss_mac.rx_descriptors) &&
|
||||
(val2 == (uint32_t)g_mss_mac.tx_descriptors ) )
|
||||
{
|
||||
retval = MAC_OK;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
/***************************************************************************//**
|
||||
* Prepares current rx descriptor for receiving.
|
||||
|
@ -1087,7 +1049,7 @@ MSS_MAC_prepare_rx_descriptor
|
|||
if( (desc & RDES0_CE) != 0u ) {
|
||||
g_mss_mac.statistics.rx_crc_error++;
|
||||
}
|
||||
|
||||
|
||||
desc = MAC->CSR8;
|
||||
g_mss_mac.statistics.rx_fifo_overflow +=
|
||||
(desc & (CSR8_OCO_MASK|CSR8_FOC_MASK)) >> CSR8_FOC_SHIFT;
|
||||
|
@ -1166,22 +1128,22 @@ MAC_send_setup_frame
|
|||
|
||||
/* Stop transmission */
|
||||
ret = MAC_stop_transmission();
|
||||
ASSERT( ret == MAC_OK );
|
||||
configASSERT( ret == MAC_OK );
|
||||
|
||||
ret = MAC_stop_receiving();
|
||||
ASSERT( ret == MAC_OK );
|
||||
configASSERT( ret == MAC_OK );
|
||||
|
||||
/* Set descriptor */
|
||||
MAC->CSR4 = (uint32_t)&descriptor;
|
||||
|
||||
|
||||
/* Start transmission */
|
||||
MAC_start_transmission();
|
||||
|
||||
/* Wait until transmission over */
|
||||
ret = MAC_OK;
|
||||
MAC_set_time_out( (uint32_t)SETUP_FRAME_TIME_OUT );
|
||||
|
||||
while( (((MAC->CSR5 & CSR5_TS_MASK) >> CSR5_TS_SHIFT) !=
|
||||
|
||||
while( (((MAC->CSR5 & CSR5_TS_MASK) >> CSR5_TS_SHIFT) !=
|
||||
CSR5_TS_SUSPENDED) && (MAC_OK == ret) )
|
||||
{
|
||||
/* transmit poll demand */
|
||||
|
@ -1195,7 +1157,7 @@ MAC_send_setup_frame
|
|||
|
||||
/* Set tx descriptor */
|
||||
MAC->CSR4 = (uint32_t)g_mss_mac.tx_descriptors;
|
||||
|
||||
|
||||
/* Start receiving and transmission */
|
||||
MAC_start_receiving();
|
||||
MAC_start_transmission();
|
||||
|
@ -1219,7 +1181,7 @@ MAC_stop_transmission
|
|||
{
|
||||
int32_t retval = MAC_OK;
|
||||
MAC_set_time_out( (uint16_t)STATE_CHANGE_TIME_OUT );
|
||||
|
||||
|
||||
while( (((MAC->CSR5 & CSR5_TS_MASK) >> CSR5_TS_SHIFT) !=
|
||||
CSR5_TS_STOPPED) && (retval == MAC_OK) )
|
||||
{
|
||||
|
@ -1300,7 +1262,7 @@ MAC_dismiss_bad_frames
|
|||
{
|
||||
int32_t dc = 0;
|
||||
int8_t cont = 1;
|
||||
|
||||
|
||||
if( MAC_BITBAND->CSR6_PB != 0u ) {
|
||||
/* User wants bad frames too, don't dismiss anything */
|
||||
cont = 0;
|
||||
|
@ -1357,14 +1319,14 @@ MAC_get_time_out
|
|||
{
|
||||
uint32_t timer;
|
||||
uint32_t time = 0u;
|
||||
|
||||
|
||||
timer = ( MAC->CSR11 & CSR11_TIM_MASK );
|
||||
|
||||
|
||||
if( timer > g_mss_mac.last_timer_value ) {
|
||||
time = 0x0000ffffUL;
|
||||
}
|
||||
time += g_mss_mac.last_timer_value - timer;
|
||||
|
||||
|
||||
if( MAC_BITBAND->CSR6_TTM == 0u ) {
|
||||
time *= 10u;
|
||||
}
|
||||
|
@ -1409,10 +1371,6 @@ static void MAC_memset_All(MAC_instance_t *s, uint32_t c)
|
|||
MAC_memset( s->mac_address, (uint8_t)c, 6u );
|
||||
MAC_memset( s->mac_filter_data, (uint8_t)c, 90u );
|
||||
s->phy_address = (uint8_t)c;
|
||||
// for(count = 0; count<RX_RING_SIZE ;count++)
|
||||
// {
|
||||
// MAC_memset(s->rx_buffers[count], (uint8_t)c, (MSS_RX_BUFF_SIZE + 4u) );
|
||||
// }
|
||||
s->rx_desc_index =c;
|
||||
for(count = 0; count<RX_RING_SIZE ;count++)
|
||||
{
|
||||
|
@ -1440,10 +1398,6 @@ static void MAC_memset_All(MAC_instance_t *s, uint32_t c)
|
|||
s->statistics.tx_no_carrier = c;
|
||||
s->statistics.tx_underflow_error = c;
|
||||
s->time_out_value = c;
|
||||
// for(count = 0; count < TX_RING_SIZE ;count++)
|
||||
// {
|
||||
// MAC_memset( s->tx_buffers[count], (uint8_t)c, MSS_TX_BUFF_SIZE );
|
||||
// }
|
||||
s->tx_desc_index = c;
|
||||
for(count = 0; count < TX_RING_SIZE ;count++)
|
||||
{
|
||||
|
@ -1470,21 +1424,28 @@ static void MAC_memcpy(uint8_t *dest, const uint8_t *src, uint32_t n)
|
|||
}
|
||||
}
|
||||
|
||||
void MSS_MAC_TxBufferCompleted( void )
|
||||
/***************************************************************************//**
|
||||
* Tx has completed, mark the buffers that were assigned to the Tx descriptors
|
||||
* as free again.
|
||||
*
|
||||
*/
|
||||
void MSS_MAC_FreeTxBuffers( void )
|
||||
{
|
||||
unsigned char *pxTransmittedBuffer;
|
||||
|
||||
/* Was it the second transmission that has completed? */
|
||||
if( ( g_mss_mac.tx_descriptors[ 1 ].descriptor_0 & TDES0_OWN ) == 0UL )
|
||||
if( ( ( (g_mss_mac.tx_descriptors[ 0 ].descriptor_0) & TDES0_OWN) == 0 ) && ( ( (g_mss_mac.tx_descriptors[ 1 ].descriptor_0) & TDES0_OWN) == 0 ) )
|
||||
{
|
||||
pxTransmittedBuffer = ( unsigned char * ) g_mss_mac.tx_descriptors[ 1 ].buffer_1;
|
||||
|
||||
/* The buffer has been transmitted and is no longer in use. */
|
||||
MAC_release_buffer( pxTransmittedBuffer );
|
||||
MAC_release_buffer( ( unsigned char * ) g_mss_mac.tx_descriptors[ 0 ].buffer_1 );
|
||||
MAC_release_buffer( ( unsigned char * ) g_mss_mac.tx_descriptors[ 1 ].buffer_1 );
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned char *MAC_obtain_buffer( void )
|
||||
/***************************************************************************//**
|
||||
* Look through the array of buffers until one is found that is free for use -
|
||||
* that is, not currently assigned to an Rx or a Tx descriptor. Mark the buffer
|
||||
* as in use, then return its address.
|
||||
*
|
||||
* @return a pointer to a free buffer.
|
||||
*/
|
||||
unsigned char *MAC_obtain_buffer( void )
|
||||
{
|
||||
long lIndex;
|
||||
unsigned char *pcReturn = NULL;
|
||||
|
@ -1493,9 +1454,10 @@ unsigned char *pcReturn = NULL;
|
|||
the buffer as now in use. */
|
||||
for( lIndex = 0; lIndex < macNUM_BUFFERS; lIndex++ )
|
||||
{
|
||||
if( ucMACBufferFree[ lIndex ] == pdTRUE )
|
||||
if( ucMACBufferInUse[ lIndex ] == pdFALSE )
|
||||
{
|
||||
pcReturn = &( ucMACBuffers[ lIndex ][ 0 ] );
|
||||
pcReturn = &( xMACBuffers.ucBuffer[ lIndex ][ 0 ] );
|
||||
ucMACBufferInUse[ lIndex ] = pdTRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1504,6 +1466,10 @@ unsigned char *pcReturn = NULL;
|
|||
return pcReturn;
|
||||
}
|
||||
|
||||
/***************************************************************************//**
|
||||
* Return a buffer to the list of free buffers, it was in use, but is not now.
|
||||
*
|
||||
*/
|
||||
void MAC_release_buffer( unsigned char *pucBufferToRelease )
|
||||
{
|
||||
long lIndex;
|
||||
|
@ -1512,13 +1478,15 @@ long lIndex;
|
|||
it is currently pointing to is marked as being free again. */
|
||||
for( lIndex = 0; lIndex < macNUM_BUFFERS; lIndex++ )
|
||||
{
|
||||
if( pucBufferToRelease == &( ucMACBuffers[ lIndex ][ 0 ] ) )
|
||||
if( pucBufferToRelease == &( xMACBuffers.ucBuffer[ lIndex ][ 0 ] ) )
|
||||
{
|
||||
/* This is the buffer in use, mark it as being free. */
|
||||
ucMACBufferFree[ lIndex ] = pdTRUE;
|
||||
ucMACBufferInUse[ lIndex ] = pdFALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
configASSERT( lIndex < macNUM_BUFFERS );
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/******************************** DEFINES *************************************/
|
||||
|
||||
|
@ -160,7 +160,7 @@ extern "C" {
|
|||
#define MSS_PHY_ADDRESS_AUTO_DETECT 255u
|
||||
|
||||
/***************************************************************************//**
|
||||
* Listener function type defines the function prototype that might be followed
|
||||
* Listener function type defines the function prototype that might be followed
|
||||
* by MAC_isr which is triggered with each receive and transmit related interrupts.
|
||||
* Listener functions should follow the following prototype:
|
||||
* void MAC_Listener( uint32_t events );
|
||||
|
@ -168,7 +168,7 @@ extern "C" {
|
|||
* or events. Events input to the system are:
|
||||
* #define MSS_MAC_EVENT_PACKET_SEND 1
|
||||
* #define MSS_MAC_EVENT_PACKET_RECEIVED 2
|
||||
* Listener function should be defined by the application using this driver if
|
||||
* Listener function should be defined by the application using this driver if
|
||||
* needed. This function may be assigned to the driver using MAC_set_callback
|
||||
* routine and may be un assigned again by using the same routine with a NULL pointer
|
||||
* as the event listener function. It is recommended to use this property for interrupt
|
||||
|
@ -177,7 +177,7 @@ extern "C" {
|
|||
typedef void (*MSS_MAC_callback_t)(uint32_t events);
|
||||
|
||||
/***************************************************************************//**
|
||||
* Statistics counter identifiers are used with MAC_get_statistics routine to
|
||||
* Statistics counter identifiers are used with MAC_get_statistics routine to
|
||||
* receive the count of the requested errors/interrupts occurrences.
|
||||
*
|
||||
* MSS_MAC_RX_INTERRUPTS
|
||||
|
@ -270,7 +270,7 @@ typedef enum {
|
|||
MSS_MAC_TX_EXCESSIVE_COLLISION,
|
||||
MSS_MAC_TX_COLLISION_COUNT,
|
||||
MSS_MAC_TX_UNDERFLOW_ERROR
|
||||
} mss_mac_statistics_id_t;
|
||||
} mss_mac_statistics_id_t;
|
||||
|
||||
/******************************* FUNCTIONS ************************************/
|
||||
|
||||
|
@ -317,7 +317,7 @@ MSS_MAC_configure
|
|||
|
||||
/***************************************************************************//**
|
||||
* Returns the configuration of the Ethernet Controller.
|
||||
* After the MAC_init function has been called, this API function can be used to
|
||||
* After the MAC_init function has been called, this API function can be used to
|
||||
* get the configuration of the Ethernet Controller.
|
||||
*
|
||||
* @return The logical OR of the following values:
|
||||
|
@ -366,7 +366,7 @@ MSS_MAC_tx_packet
|
|||
* Returns available packet's size.
|
||||
*
|
||||
* @return Size of packet, bigger than 0, if a packet is available,
|
||||
* if not, returns 0.
|
||||
* if not, returns 0.
|
||||
* @see MAC_rx_packet()
|
||||
*/
|
||||
int32_t
|
||||
|
@ -416,26 +416,26 @@ MSS_MAC_rx_packet
|
|||
used by the user application or copied to another buffer, the
|
||||
MSS_MAC_prepare_rx_descriptor() function must be called to free up the receive
|
||||
memory buffer used by the MSS Ethernet MAC
|
||||
|
||||
|
||||
@param pacData
|
||||
The pacData parameter is a pointer to a memory buffer pointer. The uint8_t
|
||||
pointer pointed to by the pacData parameter will contain the address of the
|
||||
memory buffer containing the received packet after this function returns. The
|
||||
value of pacData is only valid if the return value is larger than zero,
|
||||
indicating that a packet was received.
|
||||
|
||||
|
||||
@param time_out
|
||||
The time_out parameter is the timeout value for the transmission in milliseconds.
|
||||
The time_out parameter value can be one of the following values:
|
||||
• Unsigned integer greater than 0 and less than 0x01000000
|
||||
• MSS_MAC_BLOCKING – there will be no timeout.
|
||||
• MSS_MAC_BLOCKING – there will be no timeout.
|
||||
• MSS_MAC_NONBLOCKING – the function will return immediately if no packets
|
||||
have been received.
|
||||
have been received.
|
||||
|
||||
@return
|
||||
The function returns the size of the packet if the packet fits in pacData.
|
||||
Returns zero if there is no received packet.
|
||||
|
||||
|
||||
@see MAC_rx_pckt_size()
|
||||
@see MAC_tx_packet()
|
||||
*/
|
||||
|
@ -537,10 +537,10 @@ MSS_MAC_set_callback
|
|||
/***************************************************************************//**
|
||||
* Returns description of latest error happened.
|
||||
*
|
||||
* @return A string describing the error. This string must not be
|
||||
* @return A string describing the error. This string must not be
|
||||
* modified by the application.
|
||||
*/
|
||||
const int8_t*
|
||||
const int8_t*
|
||||
MSS_MAC_last_error
|
||||
(
|
||||
void
|
||||
|
@ -549,7 +549,7 @@ MSS_MAC_last_error
|
|||
|
||||
/***************************************************************************//**
|
||||
* Returns statistics counter of stat_id identifier.
|
||||
*
|
||||
*
|
||||
* @param stat_id Identifier of statistics counter.
|
||||
* @return Statistics counter of stat_id identifier.
|
||||
* On error returns 0.
|
||||
|
@ -560,23 +560,11 @@ MSS_MAC_get_statistics
|
|||
mss_mac_statistics_id_t stat_id
|
||||
);
|
||||
|
||||
/*
|
||||
* Ensure uip_buf is pointing to a valid and free buffer before any transmissions
|
||||
* initiated by the uIP stack occur.
|
||||
*/
|
||||
unsigned char *MSS_MAC_GetTxDescriptor( void );
|
||||
|
||||
/*
|
||||
* A buffer is no longer required by the application. Hand it back to the
|
||||
* control of the MAC hardware.
|
||||
*/
|
||||
void MSS_MAC_ReleaseBuffer( unsigned char *pucBuffer );
|
||||
|
||||
/*
|
||||
* The double Tx has completed. Hand back the Tx buffer to the control of
|
||||
* the MAC hardware.
|
||||
* the MAC hardware.
|
||||
*/
|
||||
void MSS_MAC_TxBufferCompleted( void );
|
||||
void MSS_MAC_FreeTxBuffers( void );
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -19,12 +19,12 @@
|
|||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "../../CMSIS/a2fxxxm3.h"
|
||||
#include "mss_ethernet_mac.h"
|
||||
#include "mss_ethernet_mac_user_cfg.h"
|
||||
|
||||
|
||||
typedef uint32_t addr_t;
|
||||
|
||||
|
||||
|
@ -42,78 +42,78 @@ typedef struct {
|
|||
/***************************************************************************//**
|
||||
* There should be one instance of this structure for each instance of
|
||||
* the MAC in your system. MSS_MAC_init routine initializes this structure.
|
||||
* It is used to identify the various MACs in your system and an initilized
|
||||
* MAC instance's structure should be passed as first parameter to MAC functions
|
||||
* It is used to identify the various MACs in your system and an initilized
|
||||
* MAC instance's structure should be passed as first parameter to MAC functions
|
||||
* to identify which MAC should perform the requested operation.
|
||||
* Software using the MAC driver should only need to create one single
|
||||
* instance of this data structure for each MAC hardware instance in
|
||||
* Software using the MAC driver should only need to create one single
|
||||
* instance of this data structure for each MAC hardware instance in
|
||||
* the system. Using MAC_get_configuration routine, latest status of the driver
|
||||
* may be read by receiving its flags field, similarly MAC_configure routine lets
|
||||
* you modify some of these flags.
|
||||
*/
|
||||
#include "net/pack_struct_start.h"
|
||||
typedef struct {
|
||||
addr_t base_address; /**< Register base address of the driver*/
|
||||
uint8_t flags; /**< Configuration of the driver*/
|
||||
int8_t last_error; /**< Index of last error happened inside the driver*/
|
||||
uint8_t mac_address[6]; /**< MAC address of the drived instance*/
|
||||
uint8_t mac_filter_data[90]; /**< MAC filter data, 15 addresses to be used for
|
||||
uint8_t mac_filter_data[90]; /**< MAC filter data, 15 addresses to be used for
|
||||
received data filtering*/
|
||||
uint16_t last_timer_value; /**< Last read value of timer */
|
||||
uint32_t time_out_value; /**< Time out value */
|
||||
MSS_MAC_callback_t listener; /**< Pointer to the call-back function to be triggered
|
||||
MSS_MAC_callback_t listener; /**< Pointer to the call-back function to be triggered
|
||||
when a package is received*/
|
||||
|
||||
/* transmit related info: */
|
||||
uint32_t tx_desc_index; /**< index of the transmit descriptor getting used*/
|
||||
// uint8_t tx_buffers[TX_RING_SIZE][MSS_TX_BUFF_SIZE];/**< array of transmit buffers*/
|
||||
MAC_descriptor_t tx_descriptors[TX_RING_SIZE];/**< array of transmit descriptors*/
|
||||
|
||||
/* receive related info: */
|
||||
uint32_t rx_desc_index; /**< index of the receive descriptor getting used*/
|
||||
// uint8_t rx_buffers[RX_RING_SIZE][MSS_RX_BUFF_SIZE+4];/**< array of receive buffers*/
|
||||
MAC_descriptor_t rx_descriptors[RX_RING_SIZE];/**< array of receive descriptors*/
|
||||
|
||||
|
||||
uint8_t phy_address; /**< MII address of the connected PHY*/
|
||||
|
||||
|
||||
struct {
|
||||
uint32_t rx_interrupts; /**< Number of receive interrupts occurred.*/
|
||||
uint32_t rx_filtering_fail; /**< Number of received frames which did not pass
|
||||
uint32_t rx_filtering_fail; /**< Number of received frames which did not pass
|
||||
the address recognition process.*/
|
||||
uint32_t rx_descriptor_error; /**< Number of occurrences of; no receive buffer was
|
||||
available when trying to store the received data.*/
|
||||
uint32_t rx_runt_frame; /**< Number of occurrences of; the frame is damaged by
|
||||
a collision or by a premature termination before
|
||||
uint32_t rx_runt_frame; /**< Number of occurrences of; the frame is damaged by
|
||||
a collision or by a premature termination before
|
||||
the end of a collision window.*/
|
||||
uint32_t rx_not_first; /**< Number of occurrences of; start of the frame is
|
||||
uint32_t rx_not_first; /**< Number of occurrences of; start of the frame is
|
||||
not the first descriptor of a frame.*/
|
||||
uint32_t rx_not_last; /**< Number of occurrences of; end of the frame is not
|
||||
uint32_t rx_not_last; /**< Number of occurrences of; end of the frame is not
|
||||
the first descriptor of a frame.*/
|
||||
uint32_t rx_frame_too_long; /**< Number of occurrences of; a current frame is
|
||||
longer than maximum size of 1,518 bytes, as specified
|
||||
uint32_t rx_frame_too_long; /**< Number of occurrences of; a current frame is
|
||||
longer than maximum size of 1,518 bytes, as specified
|
||||
by 802.3.*/
|
||||
uint32_t rx_collision_seen; /**< Number of occurrences of; a late collision was seen
|
||||
uint32_t rx_collision_seen; /**< Number of occurrences of; a late collision was seen
|
||||
(collision after 64 bytes following SFD).*/
|
||||
uint32_t rx_crc_error; /**< Number of occurrences of; a CRC error has occurred
|
||||
uint32_t rx_crc_error; /**< Number of occurrences of; a CRC error has occurred
|
||||
in the received frame.*/
|
||||
uint32_t rx_fifo_overflow; /**< Number of frames not accepted due to the receive
|
||||
uint32_t rx_fifo_overflow; /**< Number of frames not accepted due to the receive
|
||||
FIFO overflow.*/
|
||||
uint32_t rx_missed_frame; /**< Number of frames not accepted due to the
|
||||
uint32_t rx_missed_frame; /**< Number of frames not accepted due to the
|
||||
unavailability of the receive descriptor.*/
|
||||
|
||||
uint32_t tx_interrupts; /**< Number of transmit interrupts occurred.*/
|
||||
uint32_t tx_loss_of_carrier; /**< Number of occurrences of; a loss of the carrier
|
||||
uint32_t tx_loss_of_carrier; /**< Number of occurrences of; a loss of the carrier
|
||||
during a transmission.*/
|
||||
uint32_t tx_no_carrier; /**< Number of occurrences of; the carrier was not asserted
|
||||
by an external transceiver during the transmission.*/
|
||||
uint32_t tx_late_collision; /**< Number of occurrences of; a collision was detected
|
||||
uint32_t tx_late_collision; /**< Number of occurrences of; a collision was detected
|
||||
after transmitting 64 bytes.*/
|
||||
uint32_t tx_excessive_collision;/**< Number of occurrences of; the transmission was
|
||||
uint32_t tx_excessive_collision;/**< Number of occurrences of; the transmission was
|
||||
aborted after 16 retries.*/
|
||||
uint32_t tx_collision_count; /**< Number of collisions occurred.*/
|
||||
uint32_t tx_underflow_error; /**< Number of occurrences of; the FIFO was empty during
|
||||
uint32_t tx_underflow_error; /**< Number of occurrences of; the FIFO was empty during
|
||||
the frame transmission.*/
|
||||
} statistics;
|
||||
} MAC_instance_t;
|
||||
} MAC_instance_t
|
||||
#include "net/pack_struct_end.h"
|
||||
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
|
@ -130,29 +130,29 @@ typedef struct
|
|||
uint32_t CSR0_TAP[3];
|
||||
uint32_t CSR0_DBO;
|
||||
uint32_t CSR0_RESERVED1[11];
|
||||
|
||||
|
||||
uint32_t MAC_CSR_RESERVED0[32];
|
||||
|
||||
|
||||
uint32_t CSR1[32];
|
||||
|
||||
|
||||
uint32_t MAC_CSR_RESERVED1[32];
|
||||
|
||||
|
||||
uint32_t CSR2[32];
|
||||
|
||||
|
||||
uint32_t MAC_CSR_RESERVED2[32];
|
||||
|
||||
|
||||
uint32_t CSR3[32];
|
||||
|
||||
|
||||
uint32_t MAC_CSR_RESERVED3[32];
|
||||
|
||||
|
||||
uint32_t CSR4[32];
|
||||
|
||||
|
||||
uint32_t MAC_CSR_RESERVED4[32];
|
||||
|
||||
|
||||
uint32_t CSR5_TI;
|
||||
uint32_t CSR5_TPS;
|
||||
uint32_t CSR5_TU;
|
||||
uint32_t CSR5_RESERVED0[2];
|
||||
uint32_t CSR5_RESERVED0[2];
|
||||
uint32_t CSR5_UNF;
|
||||
uint32_t CSR5_RI;
|
||||
uint32_t CSR5_RU;
|
||||
|
@ -169,7 +169,7 @@ typedef struct
|
|||
uint32_t CSR5_RESERVED3[9];
|
||||
|
||||
uint32_t MAC_CSR_RESERVED5[32];
|
||||
|
||||
|
||||
uint32_t CSR6_HP;
|
||||
uint32_t CSR6_SR;
|
||||
uint32_t CSR6_HO;
|
||||
|
@ -191,7 +191,7 @@ typedef struct
|
|||
uint32_t CSR6_RESERVED5;
|
||||
|
||||
uint32_t MAC_CSR_RESERVED6[32];
|
||||
|
||||
|
||||
uint32_t CSR7_TIE;
|
||||
uint32_t CSR7_TSE;
|
||||
uint32_t CSR7_TUE;
|
||||
|
@ -210,11 +210,11 @@ typedef struct
|
|||
uint32_t CSR7[15];
|
||||
|
||||
uint32_t MAC_CSR_RESERVED7[32];
|
||||
|
||||
|
||||
uint32_t CSR8[32];
|
||||
|
||||
uint32_t MAC_CSR_RESERVED8[32];
|
||||
|
||||
|
||||
uint32_t CSR9_SCS;
|
||||
uint32_t CSR9_SCLK;
|
||||
uint32_t CSR9_SDI;
|
||||
|
@ -227,11 +227,11 @@ typedef struct
|
|||
uint32_t CSR9_RESERVED1[12];
|
||||
|
||||
uint32_t MAC_CSR_RESERVED9[32];
|
||||
|
||||
|
||||
uint32_t CSR10[32];
|
||||
|
||||
uint32_t MAC_CSR_RESERVED10[32];
|
||||
|
||||
|
||||
uint32_t CSR11_TIM[16];
|
||||
uint32_t CSR11_CON;
|
||||
uint32_t CSR11_NRP[3];
|
||||
|
@ -559,19 +559,19 @@ typedef struct
|
|||
#define CSR5_TS_SHIFT 20
|
||||
|
||||
/** 000 - Stopped; RESET or STOP TRANSMIT command issued. */
|
||||
#define CSR5_TS_STOPPED 0u
|
||||
#define CSR5_TS_STOPPED 0u
|
||||
/** 001 - Running, fetching the transmit descriptor. */
|
||||
#define CSR5_TS_RUNNING_FD 1u
|
||||
#define CSR5_TS_RUNNING_FD 1u
|
||||
/** 010 - Running, waiting for end of transmission. */
|
||||
#define CSR5_TS_RUNNING_WT 2u
|
||||
#define CSR5_TS_RUNNING_WT 2u
|
||||
/** 011 - Running, transferring data buffer from host memory to FIFO. */
|
||||
#define CSR5_TS_RUNNING_TD 3u
|
||||
#define CSR5_TS_RUNNING_TD 3u
|
||||
/** 101 - Running, setup packet. */
|
||||
#define CSR5_TS_RUNNING_SP 5u
|
||||
#define CSR5_TS_RUNNING_SP 5u
|
||||
/** 110 - Suspended; FIFO underflow or unavailable descriptor. */
|
||||
#define CSR5_TS_SUSPENDED 6u
|
||||
#define CSR5_TS_SUSPENDED 6u
|
||||
/** 111 - Running, closing transmit descriptor. */
|
||||
#define CSR5_TS_RUNNING_CD 7u
|
||||
#define CSR5_TS_RUNNING_CD 7u
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* CSR5_RS:
|
||||
|
@ -584,19 +584,19 @@ typedef struct
|
|||
#define CSR5_RS_SHIFT 17
|
||||
|
||||
/** 000 - Stopped; RESET or STOP RECEIVE command issued. */
|
||||
#define CSR5_RS_STOPPED 0u
|
||||
#define CSR5_RS_STOPPED 0u
|
||||
/** 001 - Running, fetching the receive descriptor. */
|
||||
#define CSR5_RS_RUNNING_FD 1u
|
||||
#define CSR5_RS_RUNNING_FD 1u
|
||||
/** 010 - Running, waiting for the end-of-receive packet before prefetch of the
|
||||
*next descriptor. */
|
||||
#define CSR5_RS_RUNNING_WR 2u
|
||||
*next descriptor. */
|
||||
#define CSR5_RS_RUNNING_WR 2u
|
||||
/** 011 - Running, waiting for the receive packet. */
|
||||
#define CSR5_RS_RUNNING_RB 3u
|
||||
#define CSR5_RS_RUNNING_RB 3u
|
||||
/** 100 - Suspended, unavailable receive buffer. */
|
||||
#define CSR5_RS_SUSPENDED 4u
|
||||
#define CSR5_RS_SUSPENDED 4u
|
||||
/** 101 - Running, closing the receive descriptor. */
|
||||
#define CSR5_RS_RUNNING_CD 5u
|
||||
/** 111 - Running, transferring data from FIFO to host memory. */
|
||||
#define CSR5_RS_RUNNING_CD 5u
|
||||
/** 111 - Running, transferring data from FIFO to host memory. */
|
||||
#define CSR5_RS_RUNNING_TD 7u
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue