pci_tests.c

来自「Freescale MCF5445evb 参考测试代码」· C语言 代码 · 共 2,442 行 · 第 1/5 页

C
2,442
字号
/* * File:        main.c * Purpose:     Main process * *//*#define PCI_TEST_SMALL*/#include "common.h"#include "uif.h"#include "pci/pci.h"/*#include "dma/dma.h"*/#include "pci_tests.h"char targ0;char targ1;char targ2;char targ3;char targ4;char targ5;char loop = 0;void test1 (int, char**);asm void asm_memcpy32(void *source, void *dest, uint32 num);void writembst (int argc, char **argv);void memtestbst (int argc, char **argv);void memtestbstdma (int argc, char **argv);int setupPatBuf(uint8 pattern, uint32 *src, uint32 size);void target (int argc, char **argv);void target2 (int argc, char **argv);void dma_memcpy32(void *source, void *dest, uint32 num);void interruptTest();/*********//*  offsets to internal arbitration stuff ? */#if 0/********************************************************************//* The command table entry data structure */typedef const struct{    char *  cmd;                    /* command name user types, ie. GO  */    int     min_args;               /* min num of args command accepts  */    int     max_args;               /* max num of args command accepts  */    void    (*func)(int, char **);  /* actual function to call          */    char *  description;            /* brief description of command     */    char *  syntax;                 /* syntax of command                */} CMD;/********************************************************************/static char input[MAX_LINE];static const char PROMPT[] = "dPCI> ";#ifndef PCI_TEST_SMALLstatic const char BANNER[] = "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n.                                       .\n.                ~dPCI~                 .\n.                                       .\n.     PCI Test program for M54x5EVB     .\n.                                       .\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";#elsestatic const char BANNER[] = "\n PCI Tests\n";#endifstatic const char HELPMSG[] = "Enter 'help' for help.\n\n";static const char SYNTAX[] = "Error: Invalid syntax for: %s\n";static const char INVCMD[] = "Error: No such command: %s\n";static const char INVALUE[] = "Error: Invalid value: %s\n";static const char HELPFORMAT[] = "    %-10s %-22s %s %s\n";CMD CMDTAB[] ={    {"help",    0, 0, help,    "Display this message", ""},    {"show",    0, 1, show,    "Show PCI devices",    "<targ#>"},    {"readm",   2, 3, readm,   "Read PCI Mem space",  "<size> <add h> <len h>"},    {"readio",  2, 3, readio,  "Read PCI I/O space",  "<size> <add h> <len h>"},    {"writem",  3, 4, writem,  "Write PCI Mem space", "<size> <add h> <data h> <len h>"},    {"writeio", 3, 4, writeio, "Write PCI I/O space", "<size> <add h> <data h> <len h>"},    {"memtest", 3, 4, memtest, "Test Memory space",   "<size> <start h> <end h> <loop h>"},    {"memcmp",  3, 3, memcmp,  "Compare Memory",      "<src1 h> <src2 h> <len h>"},    {"writemb",  3, 4, writembst,  "Write PCI Mem space burst", "<size> <add h> <data h> <len h>"},    {"memtestb", 3, 5, memtestbst, "Test Memory space burst",   "<size> <start h> <end h> <loop h> <pattern d>"},    {"memtestd", 3, 5, memtestbstdma, "Test Memory space dma",   "<size> <start h> <end h> <loop h> <pattern d>"},        {"target1", 3, 5, target, "Test as target",   "<size> <start h> <end h> <loop h>"},    {"target2", 3, 5, target2, "Test as target2",   "<addr h> <length h> <loop> <pattern>"},    {"interrupt", 0,0,interruptTest, "Test PCI FPGA ints", ""},    #if 0    {"dmatx",   3, 3, dmatx,   "DMA tx test",         "<MEM src h> <PCI dest h> <len h>"},    {"dmarx",   3, 3, dmarx,   "DMA rx test",         "<PCI src h> <MEM dest h> <len h>"},    {"dmastat", 0, 0, dmastat, "DMA status",          ""},    {"fifotx",  3, 3, fifotx,  "FIFO tx test",        "<src h> <dest h> <len h>"},    {"fiforx",  3, 3, fiforx,  "<not implemented>",   "<src h> <dest h> <len h>"},    {"fifostat",0, 0, fifostat,"FIFO status",         ""},        {"test1",   0, 0, test1,   "Loop writes to PCI",  ""},#endif        {"quit",    0, 0, quit,    "Exit", " "}};const int NUM_CMD = sizeof(CMDTAB)/sizeof(CMD);#endifconst char PROMPT[] = "dPCI> ";UIF_CMD UIF_CMDTAB[] ={    UIF_CMDS_ALL    {"showdev",  0,1,0, show,    "Show PCI devices",    "<targ#>"},    {"readm",    2,3,0, readm,   "Read PCI Mem space",  "<size> <add h> <len h>"},    {"readio",   2,3,0, readio,  "Read PCI I/O space",  "<size> <add h> <len h>"},    {"writem",   3,4,0, writem,  "Write PCI Mem space", "<size> <add h> <data h> <len h>"},    {"writeio",  3,4,0, writeio, "Write PCI I/O space", "<size> <add h> <data h> <len h>"},    {"memtest",  3,4,0, memtest, "Test Memory space",   "<size> <start h> <end h> <loop h>"},    {"memcmp",   3,3,0, memcmp,  "Compare Memory",      "<src1 h> <src2 h> <len h>"},    {"writemb",  3,4,0, writembst,  "Write PCI Mem space burst", "<size> <add h> <data h> <len h>"},    {"memtestb", 3,5,0, memtestbst, "Test Memory space burst",   "<size> <start h> <end h> <loop h> <pattern d>"},    {"memtestd", 3,5,0, memtestbstdma, "Test Memory space dma",   "<size> <start h> <end h> <loop h> <pattern d>"},        {"target1",  3,5,0, target, "Test as target",   "<size> <start h> <end h> <loop h>"},    {"target2",  3,5,0, target2, "Test as target2",   "<addr h> <length h> <loop> <pattern>"},    {"interrupt",0,0,0, interruptTest, "Test PCI FPGA ints", ""},};const int UIF_NUM_CMD = UIF_CMDTAB_SIZE;UIF_SETCMD UIF_SETCMDTAB[] = {"",0,0,NULL,""};const int UIF_NUM_SETCMD = 0;#define DATA_BLOCK_SIZE         (256 * 1024)//#define DATA0_BLOCK_START       (0x100000)//#define DATA0_BLOCK_START       (SDRAM_ADDRESS + 0x100000) /* dram + 1MB */#define DATA0_BLOCK_START       (SDRAM_ADDRESS + 0x1000000) /* dram + 16MB *///#define DATA0_BLOCK_START       (SDRAM_ADDRESS + 0x40000) /* dram + 256KB  for testing BAR1*/#define DATA1_BLOCK_START       (DATA0_BLOCK_START + DATA_BLOCK_SIZE)#define DELAY_BETWEEN_WRITES    (1)  /* usec *//*******************************************************************/voidmain (void){    char ch;    int i, *datablock;    targ1 = PCI_NO_DEV;    targ2 = PCI_NO_DEV;    targ3 = PCI_NO_DEV;    targ4 = PCI_NO_DEV;    targ5 = PCI_NO_DEV;    /*     * Allow interrupts from IRQ7 (black button)     */#if 0 /*rtmtbd*/    /* Set IRQ7 to be rising edge triggered */    MCF_EPORT_EPPAR = MCF_EPORT_EPPAR_EPPA7(MCF_EPORT_EPPAR_EPPAx_RISING);    /* Enable EPORT interrupt 7 requests */    MCF_EPORT_EPIER = MCF_EPORT_EPIER_EPIE7;    /* Enable IRQ7 in the IMR */    MCF_INTC_IMRL &= ~(MCF_INTC_INTFRCL_INT7 | MCF_INTC_IMRL_MASKALL);#endif    /*     * Enable the instruction and branch caches     */#if 0     mcf5xxx_wr_cacr(0        | MCF5XXX_CACR_BCINVA        | MCF5XXX_CACR_ICINVA);        mcf5xxx_wr_cacr(0        /*| MCF5XXX_CACR_BEC*/        | MCF5XXX_CACR_IEC);#endif#if 1 /* enable caching for code instruction and data space, pci data space isuncached due to difficulty managing cached space */    /* SDRAM will be copy-back cacheable */     mcf5xxx_wr_acr0(0        | MCF5XXX_ACR_AB(SDRAM_ADDRESS)        | MCF5XXX_ACR_AM_16M        | MCF5XXX_ACR_EN        | MCF5XXX_ACR_SM_IGNORE        | MCF5XXX_ACR_DCM_CB);      mcf5xxx_wr_acr2(0        | MCF5XXX_ACR_AB(SDRAM_ADDRESS)        | MCF5XXX_ACR_AM_16M        | MCF5XXX_ACR_EN        | MCF5XXX_ACR_SM_IGNORE        | MCF5XXX_ACR_DCM_CB);      mcf5xxx_wr_cacr(0        | MCF5XXX_CACR_DEC        | MCF5XXX_CACR_DDCM_IP        | MCF5XXX_CACR_DCINVA        | MCF5XXX_CACR_IEC        | MCF5XXX_CACR_ICINVA);          #endif            /* Enable interrupts (set interrupt priority level to 0) *///    asm_set_ipl(0);	printf("0xfc0a8000 %x 0xfc0a8060 %x\n", *(unsigned long*)0xfc0a8000,*(unsigned long*)0xfc0a8060 );    printf("Initialization Complete\n");    /* init PCI */    initPci();    /* Set device parameters */    pciInitDevices();    /* Display banner */    //printf(BANNER);    //printf(HELPMSG);    /* Allocate a block of data and initialize it */    datablock = (int *)DATA0_BLOCK_START;    datablock[0] = swap32(0xDEADBEEF);    for (i = 1; i < (DATA_BLOCK_SIZE / 4); i++)        datablock[i] = swap32(i);    /* Start command loop */    while (1)    {        printf(PROMPT);        run_cmd();    }    return;}/********************************************************************//********************************************************************/voidshow (int argc, char **argv){    uint32 arg1=0;    int success;    /* turn off initiator abort interrupt */    MCF_PCI_PCIICR &= ~(MCF_PCI_PCIICR_IAE);    /* get arg1 value */    if(argc > 1)    {        arg1 = get_value(argv[1],&success,10);        if (!success)        {            printf(INVALUE,argv[1]);            return;        }        printpciheaderinfo(PCI_TARG1_IDSEL + (arg1-1));    }    else    {        printpciheaderinfo(PCI_TARG1_IDSEL);        printpciheaderinfo(PCI_TARG2_IDSEL);        printpciheaderinfo(PCI_TARG3_IDSEL);        printpciheaderinfo(PCI_TARG4_IDSEL);                /*printpciheaderinfo(PCI_TARG5_IDSEL);*/    }    /* turn on initiator abort interrupt */    MCF_PCI_PCIICR |= MCF_PCI_PCIICR_IAE;}/********************************************************************//********************************************************************/voidreadm (int argc, char **argv){    uint32 size   = 0;    uint32 address= 0;    uint32 length = 0;    uint32 data8  = 0;    uint32 data16 = 0;    uint32 data32 = 0;    int success, i;    /* get size value */    if(argc > 1)    {        size = get_value(argv[1],&success,10);        if (!success)        {            printf(INVALUE,argv[1]);            return;        }    }    /* get address value */    if(argc > 2)    {        address = get_value(argv[2],&success,16);        if (!success)        {            printf(INVALUE,argv[2]);            return;        }    }    /* get length value */    if(argc > 3)    {        length = get_value(argv[3],&success,16);        if (!success)        {            printf(INVALUE,argv[3]);            return;        }    }    else        length =1;    /* set up initiator windows */        MCF_PCI_PCIIW0BTAR = ((PCI_HOST_MEM & 0xFF000000) | ((address & 0xFF000000) >>16));    for(i=0;i<length;i++)    {        switch(size)        {            case 8:                data8 = *(uint8*)(PCI_HOST_MEM + (address &0x00FFFFFF));                printf("addr 0x%08x = 0x%02X\n",address,data8);                address = address +1;                break;            case 16:                data16 = swap16(*(uint16*)(PCI_HOST_MEM + (address &0x00FFFFFF)));                printf("addr 0x%08x = 0x%04X\n",address,data16);                address = address +2;                break;            case 32:                data32 = swap32(*(uint32*)(PCI_HOST_MEM + (address &0x00FFFFFF)));                printf("addr 0x%08x = 0x%08X\n",address,data32);                address = address +4;                break;            default:                printf("Invalid size: pick 8, 16, or 32\n");                return;        }    }}/********************************************************************//********************************************************************/voidreadio (int argc, char **argv){    uint32 size   = 0;    uint32 address= 0;    uint32 length = 0;    uint32 data8  = 0;    uint32 data16 = 0;    uint32 data32 = 0;    int success, i;    /* get size value */    if(argc > 1)    {        size = get_value(argv[1],&success,10);        if (!success)        {            printf(INVALUE,argv[1]);            return;        }    }    /* get address value */    if(argc > 2)    {        address = get_value(argv[2],&success,16);        if (!success)        {            printf(INVALUE,argv[2]);            return;        }    }    /* get length value */    if(argc > 3)    {        length = get_value(argv[3],&success,16);        if (!success)        {            printf(INVALUE,argv[3]);            return;        }    }    else        length =1;    /* set up initiator windows */        MCF_PCI_PCIIW1BTAR = ((PCI_HOST_IO & 0xFF000000) | ((address & 0xFF000000) >>16));    for(i=0;i<length;i++)    {        switch(size)        {            case 8:                data8 = *(uint8*)(PCI_HOST_IO + (address &0x00FFFFFF));                printf("addr 0x%08x = 0x%02X\n",address,data8);                address = address +1;                break;            case 16:                data16 = swap16(*(uint16*)(PCI_HOST_IO + (address &0x00FFFFFF)));                printf("addr 0x%08x = 0x%04X\n",address,data16);                address = address +2;                break;            case 32:                data32 = swap32(*(uint32*)(PCI_HOST_IO + (address &0x00FFFFFF)));                printf("addr 0x%08x = 0x%08X\n",address,data32);                address = address +4;                break;            default:                printf("Invalid size: pick 8, 16, or 32\n");                return;        }    }}/********************************************************************//********************************************************************/voidwritem (int argc, char **argv){    uint32 size   = 0;    uint32 address= 0;    uint32 length = 0;    uint32 data   = 0;    int success, i;    /* get size value */    if(argc > 1)    {        size = get_value(argv[1],&success,10);        if (!success)        {            printf(INVALUE,argv[1]);            return;        }    }    /* get address value */    if(argc > 2)    {        address = get_value(argv[2],&success,16);        if (!success)        {            printf(INVALUE,argv[2]);            return;        }    }    /* get data value */    if(argc > 3)    {        data = get_value(argv[3],&success,16);        if (!success)        {            printf(INVALUE,argv[3]);            return;        }    }    /* get length value */    if(argc > 4)    {        length = get_value(argv[4],&success,16);        if (!success)        {            printf(INVALUE,argv[4]);            return;        }    }    else        length =1;    /* set up initiator windows */        MCF_PCI_PCIIW0BTAR = ((PCI_HOST_MEM & 0xFF000000) | ((address & 0xFF000000) >>16));    for(i=0;i<length;i++)    {        switch(size)        {            case 8:                *(uint8*)(PCI_HOST_MEM + (address &0x00FFFFFF)) = (uint8)data;                printf("write addr 0x%08x = 0x%02X\n",address,data);                address = address +1;

⌨️ 快捷键说明

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