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

📄 flexbus_tests.c

📁 Freescale MCF5445evb 参考测试代码
💻 C
字号:
/*! * \file    flexbus_tests.c * \brief   Flexbus Test Routines * * Test the Flexbus interface on Jamaica * * \version $Revision: 1.1 $ * \author  Michael Norman */#include "common.h"#include "clock.h"#include "flexbus_tests.h"#include "memtest.h"/********************************************************************//*! Initialized data for test purposes */int test_data[] = {    0x00112233, 0x44556677, 0x8899AABB, 0xCCDDEEFF,    0x00112233, 0x44556677, 0x8899AABB, 0xCCDDEEFF,    0x00112233, 0x44556677, 0x8899AABB, 0xCCDDEEFF,    0x00112233, 0x44556677, 0x8899AABB, 0xCCDDEEFF,    0x00001111, 0x22223333, 0x44445555, 0x66667777,    0x88889999, 0xAAAABBBB, 0xCCCCDDDD, 0xEEEEFFFF,    0x00000000, 0x11111111, 0x22222222, 0x33333333,    0x44444444, 0x55555555, 0x66666666, 0x77777777,    0x11111111, 0x22222222, 0x44444444, 0x88888888,    0xAAAAAAAA, 0x55555555, 0x99999999, 0x66666666,    0xEEEEEEEE, 0x77777777, 0xFFFFFFFF, 0x00000000,    0x33333333, 0xCCCCCCCC, 0xDEADBEEF, 0xFEEDFACE };/********************************************************************//*! * \brief   Flexbus Register Dump  * \param   none * \return  none */voidflexbus_register_dump (void){    printf("FBCS Registers:\n");    printf("CSAR0        = %08X\n", MCF_FBCS_CSAR0);    printf("CSMR0        = %08X\n", MCF_FBCS_CSMR0);    printf("CSCR0        = %08X\n", MCF_FBCS_CSCR0);    printf("CSAR1        = %08X\n", MCF_FBCS_CSAR1);    printf("CSMR1        = %08X\n", MCF_FBCS_CSMR1);    printf("CSCR1        = %08X\n", MCF_FBCS_CSCR1);    printf("CSAR2        = %08X\n", MCF_FBCS_CSAR2);    printf("CSMR2        = %08X\n", MCF_FBCS_CSMR2);    printf("CSCR2        = %08X\n", MCF_FBCS_CSCR2);    printf("CSAR3        = %08X\n", MCF_FBCS_CSAR3);    printf("CSMR3        = %08X\n", MCF_FBCS_CSMR3);    printf("CSCR3        = %08X\n", MCF_FBCS_CSCR3);}/********************************************************************//*! * \brief   Flexbus Burst Read Test * \param   addr Flexbus test address  * \return  0 for success, non-zero for failure * * Test aligned and mis-aligned burst reads from the Flexbus controller.  * This test uses the cache to generate the bursts. */intflexbus_burst_read (ADDRESS addr){    int i;    uint32 lw0, lw1, lw2, lw3, *src;    #ifdef FLEXBUS_DEBUG_PRINT        printf("Flexbus Burst Read Test:\n");    #endif    /* Initialize Flexbus with known data */    src = (uint32*)(addr);    for (i = 0; i < sizeof(test_data)/4; i++)        src[i] = test_data[i];        /* Setup CACR to enable data cache; default mode is inhibited-precise */    cpu_dcache_enable(0x00000000, SIZE_1G, MCF5XXX_ACR_CM_CB);            /* Access at 0x0 aligned address */    lw0 = *(uint32*)(addr + 0);    lw1 = *(uint32*)(addr + 4);    lw2 = *(uint32*)(addr + 8);    lw3 = *(uint32*)(addr + 12);        if ((lw0 != test_data[0]) ||        (lw1 != test_data[1]) ||        (lw2 != test_data[2]) ||        (lw3 != test_data[3]))        return 1;            #ifdef FLEXBUS_DEBUG_PRINT        printf("\n0x0 aligned: ");        for (i = 0; i < 4; i++)        {            printf(" %08x", src[i]);        }    #endif        /* Invalidate the data cache */    mcf5xxx_wr_cacr(0        | MCF5XXX_CACR_DEC        | MCF5XXX_CACR_DDCM_IP        | MCF5XXX_CACR_DCINVA);    /* Access at 0x4 aligned address */    lw1 = *(uint32*)(addr + 4);    lw2 = *(uint32*)(addr + 8);    lw3 = *(uint32*)(addr + 12);    lw0 = *(uint32*)(addr + 0);       if ((lw0 != test_data[0]) ||        (lw1 != test_data[1]) ||        (lw2 != test_data[2]) ||        (lw3 != test_data[3]))        return 1;    #ifdef FLEXBUS_DEBUG_PRINT        printf("\n0x4 aligned: ");        for (i = 0; i < 4; i++)        {            printf(" %08x", src[i]);        }    #endif        /* Invalidate the data cache */    mcf5xxx_wr_cacr(0        | MCF5XXX_CACR_DEC        | MCF5XXX_CACR_DDCM_IP        | MCF5XXX_CACR_DCINVA);    /* Access at 0x8 aligned address */    lw2 = *(uint32*)(addr + 8);    lw3 = *(uint32*)(addr + 12);    lw0 = *(uint32*)(addr + 0);    lw1 = *(uint32*)(addr + 4);       if ((lw0 != test_data[0]) ||        (lw1 != test_data[1]) ||        (lw2 != test_data[2]) ||        (lw3 != test_data[3]))        return 1;    #ifdef FLEXBUS_DEBUG_PRINT        printf("\n0x8 aligned: ");        for (i = 0; i < 4; i++)        {            printf(" %08x", src[i]);        }    #endif        /* Invalidate the data cache */    mcf5xxx_wr_cacr(0        | MCF5XXX_CACR_DEC        | MCF5XXX_CACR_DDCM_IP        | MCF5XXX_CACR_DCINVA);    /* Access at 0x4 aligned address */    lw1 = *(uint32*)(addr + 4);    lw2 = *(uint32*)(addr + 8);    lw3 = *(uint32*)(addr + 12);    lw0 = *(uint32*)(addr + 0);       if ((lw0 != test_data[0]) ||        (lw1 != test_data[1]) ||        (lw2 != test_data[2]) ||        (lw3 != test_data[3]))        return 1;    #ifdef FLEXBUS_DEBUG_PRINT        printf("\n0x4 aligned: ");        for (i = 0; i < 4; i++)        {            printf(" %08x", src[i]);        }        printf("\n");    #endif        /* Disable and invalidate the data cache */    mcf5xxx_wr_cacr(MCF5XXX_CACR_DCINVA);        return 0;}/********************************************************************//*! * \brief   Flexbus Burst Write Test * \param   addr Flexbus test address  * \return  0 for pass, non-zero for failure * * Test aligned bursts to the Flexbus controller.  This test uses the * movem instruction of the ColdFire core to burst to the memory. * * \warning This test does not perform mis-aligned burst writes. There *          is no bus master on the MCF5445x that is capable of bursting *          to the Flexbus on a non-line-aligned address. */intflexbus_burst_write (ADDRESS addr){    int i;    uint32 lw0, lw1, lw2, lw3, *dest;    #ifdef FLEXBUS_DEBUG_PRINT        printf("Flexbus Burst Write Test:\n");    #endif    /* Initialize Flexbus with known data */    dest = (uint32*)(addr);    for (i = 0; i < sizeof(test_data)/4; i++)        dest[i] = 0x0;            /* Burst writes */    for (i = 0; i < sizeof(test_data); i+=16)    {        mcf5xxx_move_line((ADDRESS)&test_data[i/4], (ADDRESS)&dest[i/4]);    }    /* Verify data in Flexbus */    for (i = 0; i < sizeof(test_data)/4; i++)    {        if (dest[i] != test_data[i])            return 1;    }        return 0;}/********************************************************************//*! * \brief   Flexbus Data Bus Test * \param   addr Flexbus test address  * \return  0 for success, non-zero for failure */intflexbus_data_test(ADDRESS address){    return (memtest_databus_8((uint8*)address) ||             memtest_databus_16((uint16*)address) ||             memtest_databus_16((uint16*)address+1) ||            memtest_databus_32((uint32*)address) ||            memtest_databus_32((uint32*)address+1) ||            memtest_databus_32((uint32*)address+2) ||            memtest_databus_32((uint32*)address+3));}/********************************************************************//*! * \brief   Flexbus Address Bus Test * \param   addr    Flexbus test address  * \param   bytes   Number of bytes to test * \return  0 for success, non-zero for failure */intflexbus_addr_test(ADDRESS address, int bytes){    return (memtest_addrbus_8((uint8*)address, bytes) ||            memtest_addrbus_16((uint16*)address, bytes) ||            memtest_addrbus_16((uint16*)address+1, bytes) ||            memtest_addrbus_32((uint32*)address, bytes) ||            memtest_addrbus_32((uint32*)address+1, bytes) ||            memtest_addrbus_32((uint32*)address+2, bytes) ||            memtest_addrbus_32((uint32*)address+3, bytes));}/********************************************************************//*! * \brief   Flexbus Device Test * \param   addr Flexbus test address  * \param   bytes   Number of bytes to test * \return  0 for success, non-zero for failure */intflexbus_device_test(ADDRESS address, int bytes){    return (memtest_device_8((uint8*)address, bytes) ||            memtest_device_16((uint16*)address, bytes) ||            memtest_device_32((uint32*)address, bytes));}/********************************************************************//*! * \brief   Flexbus Invalid Access Test *          Access a region within the Flexbus slave port, but outside *          the valid Flexbus mask range */voidflexbus_invalid_access(void){    vuint32 data;        #ifdef DEBUG_PRINT    printf("\nPerforming invalid access tests.\n");    printf("You should see two internal bus faults next...\n");    #endif    printf("\nNot implemented yet.\n");        //data = *(vuint32 *)(Flexbus_ADDRESS + Flexbus_SIZE);    //*(vuint32 *)(Flexbus_ADDRESS + Flexbus_SIZE) = data;    }/********************************************************************//*! * \brief   Flexbus Jitter Test */voidflexbus_jitter(int max){    int pll_flags, i;    uint8 max_data[16] = {0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00,                           0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00};    uint8 min_data[16];                            memset(min_data, 0, sizeof(min_data));        /* Initialize the on-chip system PLL -- max FBCLK */    clock_pll_init(FREF, FSYS, 0, NULL);        /* Setup FPGA chip select for fastest operation */    MCF_FBCS_CSAR3 = MCF_FBCS_CSAR_BA(FPGA_ADDRESS);    MCF_FBCS_CSCR3 = 0        | MCF_FBCS_CSCR_BSTW        /* Burst Writes */        | MCF_FBCS_CSCR_AA          /* Auto acknowledge */        | MCF_FBCS_CSCR_WS(0)       /* Wait states */        | MCF_FBCS_CSCR_PS_8;      /* Port size: 32 bits */    MCF_FBCS_CSMR3 = 0        | MCF_FBCS_CSMR_BAM((FPGA_SIZE-1)>>16)        | MCF_FBCS_CSMR_V;          /* Activate this chip-select */            /* Enable instruction cache */    cpu_icache_enable(0, SIZE_2G);        if (FALSE == max)    {        /* min jitter / baseline */        while (!char_present())        {            for (i = 0; i < 100000; i++)                nop();        }    }    else    {        /* max jitter */        while (!char_present())        {            for (i = 0; i < 100000; i++)                nop();            /*            mcf5xxx_move_line((ADDRESS)min_data, (ADDRESS)FPGA_ADDRESS);            mcf5xxx_move_line((ADDRESS)min_data, (ADDRESS)FPGA_ADDRESS);            mcf5xxx_move_line((ADDRESS)min_data, (ADDRESS)FPGA_ADDRESS);            mcf5xxx_move_line((ADDRESS)min_data, (ADDRESS)FPGA_ADDRESS);            mcf5xxx_move_line((ADDRESS)min_data, (ADDRESS)FPGA_ADDRESS);            mcf5xxx_move_line((ADDRESS)min_data, (ADDRESS)FPGA_ADDRESS);            mcf5xxx_move_line((ADDRESS)min_data, (ADDRESS)FPGA_ADDRESS);            mcf5xxx_move_line((ADDRESS)min_data, (ADDRESS)FPGA_ADDRESS);            */            mcf5xxx_move_line((ADDRESS)max_data, (ADDRESS)FPGA_ADDRESS);            mcf5xxx_move_line((ADDRESS)max_data, (ADDRESS)FPGA_ADDRESS);            mcf5xxx_move_line((ADDRESS)max_data, (ADDRESS)FPGA_ADDRESS);            mcf5xxx_move_line((ADDRESS)max_data, (ADDRESS)FPGA_ADDRESS);            mcf5xxx_move_line((ADDRESS)max_data, (ADDRESS)FPGA_ADDRESS);            mcf5xxx_move_line((ADDRESS)max_data, (ADDRESS)FPGA_ADDRESS);            mcf5xxx_move_line((ADDRESS)max_data, (ADDRESS)FPGA_ADDRESS);            mcf5xxx_move_line((ADDRESS)max_data, (ADDRESS)FPGA_ADDRESS);        }    }    in_char();}/********************************************************************//*! * \brief   Perform all Flexbus tests * \return  0 for success, non-zero for failure */intflexbus_all_tests (void){    int result = 0;#if 0    ADDRESS addr = (ADDRESS) Flexbus_ADDRESS;        flexbus_invalid_access();        if (flexbus_data_test(addr))    {        #ifdef DEBUG_PRINT        printf("FAILED: flexbus_data_test()\n");        #endif        result += 1;    }    if (flexbus_addr_test(addr+(Flexbus_SIZE/8*3), Flexbus_SIZE/4))    {        #ifdef DEBUG_PRINT        printf("FAILED: flexbus_addr_test()\n");        #endif        result += 1;    }    if (flexbus_device_test(addr+(Flexbus_SIZE/16*7), Flexbus_SIZE/8))    {        #ifdef DEBUG_PRINT        printf("FAILED: flexbus_device_test()");        #endif        result += 1;    }    if (flexbus_burst_write(addr))    {        #ifdef DEBUG_PRINT        printf("FAILED: flexbus_burst_write()\n");        #endif        result += 1;    }    if (flexbus_burst_read(addr))    {        #ifdef DEBUG_PRINT        printf("FAILED: flexbus_burst_read()\n");        #endif        result += 1;    }        #ifdef DEBUG_PRINT    if (result == 0)            printf("All Flexbus tests passed.\n");    #endif     #endif        return result;}/********************************************************************/

⌨️ 快捷键说明

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