⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 emac_test.c

📁 TMS320DM6446平台下
💻 C
字号:
/**
*    EMAC - Basic Loopback
*
*    @date         7/21/2004
*    @author        Magdalena Iovescu
*
**/

#include "emac.h"
#include <stdio.h>
#include <cslr_emac.h>
#include <cslr_mdio.h>
#include <csl_intc.h>

#define TX_BUF    128
#define RX_BUF    1536

Uint8 packet_data[TX_BUF];
Uint8 packet_buffer1[RX_BUF];
Uint8 packet_buffer2[RX_BUF];
Uint8 packet_buffer3[RX_BUF];
Uint8 packet_buffer4[RX_BUF];
Uint8 packet_buffer5[RX_BUF];
Uint8 packet_buffer6[RX_BUF];
Uint8 packet_buffer7[RX_BUF];
Uint8 packet_buffer8[RX_BUF];
Uint8 packet_buffer9[RX_BUF];
Uint8 packet_buffer10[RX_BUF];

/*
 *  We use pDescBase for a base address. Its easier this way 
 *  because we can use indexing off the pointer.
 */
EMAC_Desc* pDescBase = ( EMAC_Desc* )_EMAC_DSC_BASE_ADDR;

/*
 *  The following are used to allow the ISR to communicate with
 *  the application.
 */
extern volatile int RxCount;
extern volatile int TxCount;
extern volatile int ErrCount;
extern volatile EMAC_Desc *pDescRx;
extern volatile EMAC_Desc *pDescTx;




Int16 verify_packet( EMAC_Desc* pDesc, Uint32 size, Uint32 flagCRC );

/* ------------------------------------------------------------------------ *
 *                                                                          *
 *  emac_test                                                               *
 *                                                                          *
 * ------------------------------------------------------------------------ */
emac_test( )
{
    Uint32 i;
    Uint32 testresult = 0;
    EMAC_Desc* pDesc;

    /* Init packet data array */
    for ( i = 0 ; i < TX_BUF ; i++ )
        packet_data[i] = i;

    /* Initialize our counts */
    TxCount = 0;
    RxCount = 0;
    ErrCount = 0;

    emac_init( );                           // Initialize EMAC

    testresult = EMAC_initIntc( );          // Init EMAC & ARM interrupts

    /* ---------------------------------------------------------------- *
     *                                                                  *
     *  Setup RX packets                                                *
     *                                                                  *
     * ---------------------------------------------------------------- */
    pDesc            = pDescBase;
    pDesc->pNext     = pDescBase + 1;
    pDesc->pBuffer   = packet_buffer1;
    pDesc->BufOffLen = RX_BUF;
    pDesc->PktFlgLen = EMAC_DSC_FLAG_OWNER;

    pDesc            = pDescBase + 1;
    pDesc->pNext     = pDescBase + 2;
    pDesc->pBuffer   = packet_buffer2;
    pDesc->BufOffLen = RX_BUF;
    pDesc->PktFlgLen = EMAC_DSC_FLAG_OWNER;

    pDesc            = pDescBase + 2;
    pDesc->pNext     = pDescBase + 3;
    pDesc->pBuffer   = packet_buffer3;
    pDesc->BufOffLen = RX_BUF;
    pDesc->PktFlgLen = EMAC_DSC_FLAG_OWNER;

    pDesc            = pDescBase + 3;
    pDesc->pNext     = pDescBase + 4;
    pDesc->pBuffer   = packet_buffer4;
    pDesc->BufOffLen = RX_BUF;
    pDesc->PktFlgLen = EMAC_DSC_FLAG_OWNER;

    pDesc            = pDescBase + 4;
    pDesc->pNext     = pDescBase + 5;
    pDesc->pBuffer   = packet_buffer5;
    pDesc->BufOffLen = RX_BUF;
    pDesc->PktFlgLen = EMAC_DSC_FLAG_OWNER;

    pDesc            = pDescBase + 5;
    pDesc->pNext     = pDescBase + 6;
    pDesc->pBuffer   = packet_buffer6;
    pDesc->BufOffLen = RX_BUF;
    pDesc->PktFlgLen = EMAC_DSC_FLAG_OWNER;

    pDesc            = pDescBase + 6;
    pDesc->pNext     = pDescBase + 7;
    pDesc->pBuffer   = packet_buffer7;
    pDesc->BufOffLen = RX_BUF;
    pDesc->PktFlgLen = EMAC_DSC_FLAG_OWNER;

    pDesc            = pDescBase + 7;
    pDesc->pNext     = pDescBase + 8;
    pDesc->pBuffer   = packet_buffer8;
    pDesc->BufOffLen = RX_BUF;
    pDesc->PktFlgLen = EMAC_DSC_FLAG_OWNER;

    pDesc            = pDescBase + 8;
    pDesc->pNext     = pDescBase + 9;
    pDesc->pBuffer   = packet_buffer9;
    pDesc->BufOffLen = RX_BUF;
    pDesc->PktFlgLen = EMAC_DSC_FLAG_OWNER;

    pDesc            = pDescBase + 9;
    pDesc->pNext     = 0;
    pDesc->pBuffer   = packet_buffer10;
    pDesc->BufOffLen = RX_BUF;
    pDesc->PktFlgLen = EMAC_DSC_FLAG_OWNER;

    pDescRx = pDescBase;
    EMAC_REGS->RX0HDP = ( Uint32 )pDescRx;          // Start RX

    /* ---------------------------------------------------------------- *
     *                                                                  *
     *  Setup TX packets                                                *
     *                                                                  *
     *  Send two copies of the same packet ( with different sizes )     *
     *                                                                  *
     * ---------------------------------------------------------------- */
    pDesc            = pDescBase + 10;
    pDesc->pNext     = pDescBase + 11;
    pDesc->pBuffer   = packet_data;
    pDesc->BufOffLen = 60;
    pDesc->PktFlgLen = EMAC_DSC_FLAG_OWNER
                     | EMAC_DSC_FLAG_SOP
                     | EMAC_DSC_FLAG_EOP
                     | 60
                     ;

    pDesc            = pDescBase + 11;
    pDesc->pNext     = 0;
    pDesc->pBuffer   = packet_data;
    pDesc->BufOffLen = TX_BUF;
    pDesc->PktFlgLen = EMAC_DSC_FLAG_OWNER
                     | EMAC_DSC_FLAG_SOP
                     | EMAC_DSC_FLAG_EOP
                     | TX_BUF
                     ;

    /* ---------------------------------------------------------------- *
     *                                                                  *
     *  Send TX packets                                                 *
     *                                                                  *
     * ---------------------------------------------------------------- */
    pDescTx           = pDescBase + 10;
    EMAC_REGS->TX0HDP = ( Uint32 )pDescTx;          // Start TX on Channel 0

    /* ---------------------------------------------------------------- *
     *                                                                  *
     *  Wait for TX to send and RX to recv                              *
     *                                                                  *
     * ---------------------------------------------------------------- */

    EMAC_isr( );                                    // Just issue an ISR check

    while ( TxCount != 2 || RxCount != 2 )          // Wait for first two packets
    {
        if ( ErrCount )
            testresult++;
    }

    /* ---------------------------------------------------------------- *
     *                                                                  *
     *  Check packet and results                                        *
     *                                                                  *
     * ---------------------------------------------------------------- */
    if ( pDescRx != pDescBase + 2 )                 // Verify Results
        testresult++;

    if ( verify_packet( pDescBase, 60, 0 ) )        // Verify Size + Contents
        testresult++;
    
    if ( verify_packet( pDescBase + 1, TX_BUF, 0 ) )// Verify Size + Contents
        testresult++;

    if ( ( i = EMAC_REGS->FRAME64 ) != 2 )          // No RX & TX frames w/ exactly 64 bytes
        testresult++;
    EMAC_REGS->FRAME64 = i;

    if ( ( i = EMAC_REGS->FRAME128T255 ) != 2 )
        testresult++;
    EMAC_REGS->FRAME128T255 = i;

    if ( ( i = EMAC_REGS->RXGOODFRAMES ) != 2 )
        testresult++;
    EMAC_REGS->RXGOODFRAMES = i;

    if ( ( i = EMAC_REGS->TXGOODFRAMES ) != 2 )
        testresult++;
    EMAC_REGS->TXGOODFRAMES = i;

    /* ---------------------------------------------------------------- *
     *                                                                  *
     *  Setup TX descriptors for two more packet sends                  *
     *                                                                  *
     *  These will be used for the RXPASSCRC test passcrc flag is       *
     *  cleared => EMAC generates and appends 4-byte CRC, so resulting  *
     *  pkt size is 64                                                  *
     *                                                                  *
     * ---------------------------------------------------------------- */
    pDesc            = pDescBase + 12;
    pDesc->pNext     = pDescBase + 13;
    pDesc->pBuffer   = packet_data;
    pDesc->BufOffLen = 60;
    pDesc->PktFlgLen = EMAC_DSC_FLAG_OWNER
                     | EMAC_DSC_FLAG_SOP
                     | EMAC_DSC_FLAG_EOP
                     | 60
                     ;

    pDesc            = pDescBase + 13;
    pDesc->pNext     = 0;
    pDesc->pBuffer   = packet_data;
    pDesc->BufOffLen = TX_BUF;
    pDesc->PktFlgLen = EMAC_DSC_FLAG_OWNER
                     | EMAC_DSC_FLAG_SOP
                     | EMAC_DSC_FLAG_EOP
                     | TX_BUF
                     ;

    /* ---------------------------------------------------------------- *
     *                                                                  *
     *  Send TX packets                                                 *
     *                                                                  *
     * ---------------------------------------------------------------- */
    /*
     *  Setup to pass CRC to memory 
     *  Rcv CRC is included in buffer descr pkt length
     */
    CSL_FINST( EMAC_REGS->RXMBPENABLE, EMAC_RXMBPENABLE_RXPASSCRC, INCLUDE );

    pDescTx           = pDescBase + 12;
    EMAC_REGS->TX0HDP = ( Uint32 )pDescTx;          // Start Transmitter on Channel 0

    /* ---------------------------------------------------------------- *
     *                                                                  *
     *  Wait for TX to send and RX to recv                              *
     *                                                                  *
     * ---------------------------------------------------------------- */

    EMAC_isr( );                                    // Just issue an ISR check

    while ( TxCount != 4 || RxCount != 4 )          // Wait for next two packets
    {
        if ( ErrCount )
            testresult++;
    }

    /* ---------------------------------------------------------------- *
     *                                                                  *
     *  Check packet and results                                        *
     *                                                                  *
     * ---------------------------------------------------------------- */
    if ( pDescRx != pDescBase + 4 )                 // Verify Results
        testresult++;

    if ( verify_packet( pDescBase + 2, 60, 1 ) )    // Verify Size + Contents
        testresult++;
    
    if ( verify_packet( pDescBase + 3, TX_BUF, 1 ) )// Verify Size + Contents
        testresult++;

    if ( ( i = EMAC_REGS->FRAME64 ) != 2 )
        testresult++;
    EMAC_REGS->FRAME64 = i;

    if ( ( i = EMAC_REGS->FRAME128T255 ) != 2 )
        testresult++;
    EMAC_REGS->FRAME128T255 = i;

    if ( ( i = EMAC_REGS->RXGOODFRAMES ) != 2 )
        testresult++;
    EMAC_REGS->RXGOODFRAMES = i;

    if ( ( i = EMAC_REGS->TXGOODFRAMES ) != 2 )
        testresult++;
    EMAC_REGS->TXGOODFRAMES = i;

    /* ---------------------------------------------------------------- *
     *                                                                  *
     *  Close EMAC                                                      *
     *                                                                  *
     * ---------------------------------------------------------------- */
    EMAC_closeIntc( );

    return testresult;
}

/* ------------------------------------------------------------------------ *
 *                                                                          *
 *  verify_packet                                                           *
 *                                                                          *
 * ------------------------------------------------------------------------ */
Int16 verify_packet( EMAC_Desc* pDesc, Uint32 size, Uint32 flagCRC )
{
    int i;
    Uint32 SizeCRC      = ( flagCRC ) ? size + 4 : size;
    Uint32 packet_flags = pDesc->PktFlgLen;

    /* We must own this packet */
    if ( packet_flags & EMAC_DSC_FLAG_OWNER )
        return 1;

    /* Must be SOP and EOP */
    if ( ( packet_flags & ( EMAC_DSC_FLAG_SOP | EMAC_DSC_FLAG_EOP ) ) 
                       != ( EMAC_DSC_FLAG_SOP | EMAC_DSC_FLAG_EOP ) )
        return 2;


    /* If flagCRC is set, it must have a CRC */
    if ( flagCRC )
        if ( ( packet_flags & EMAC_DSC_FLAG_PASSCRC ) != EMAC_DSC_FLAG_PASSCRC )
            return 3;


    /* Packet must not have any error bits set */
    if ( packet_flags & ( EMAC_DSC_FLAG_JABBER
                        | EMAC_DSC_FLAG_OVERSIZE
                        | EMAC_DSC_FLAG_FRAGMENT
                        | EMAC_DSC_FLAG_UNDERSIZED
                        | EMAC_DSC_FLAG_CONTROL
                        | EMAC_DSC_FLAG_OVERRUN
                        | EMAC_DSC_FLAG_CODEERROR
                        | EMAC_DSC_FLAG_ALIGNERROR
                        | EMAC_DSC_FLAG_CRCERROR
                        | EMAC_DSC_FLAG_NOMATCH
                        | EMAC_DSC_FLAG_EOQ
                        | EMAC_DSC_FLAG_TDOWNCMPLT ) )
        return 4;

    /* Packet must be correct size */
    if ( ( packet_flags & 0xFFFF ) != SizeCRC )
        return 5;

    /* Offset must be zero, packet size unchanged */
    if ( pDesc->BufOffLen != SizeCRC )
        return 6;

    /* Validate the data */
    for ( i = 0 ; i < size ; i++ )
        if ( pDesc->pBuffer[i] != i )
            return 7;

    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -