pci_tests.c

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

C
2,442
字号
memtestbst (int argc, char **argv){    uint32 size      = 0;    uint32 startaddr = 0;    uint32 address   = 0;    uint32 endaddr   = 0;    uint32 repeat    = 0;    uint32 length	= 0;    uint32 data8     = 0;    uint32 data16    = 0;    uint32 data32    = 0;    int success, i;    //unsigned int pattern[8];    uint32 pattern = 0;    uint32 *buffSrc, *buffDst;    /* 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)    {        startaddr = get_value(argv[2],&success,16);        if (!success)        {            printf(INVALUE,argv[2]);            return;        }    }    /* get data value */    if(argc > 3)    {        endaddr = get_value(argv[3],&success,16);        if (!success)        {            printf(INVALUE,argv[3]);            return;        }    }    /* get length value */    if(argc > 4)    {        repeat = get_value(argv[4],&success,10);        if (!success)        {            printf(INVALUE,argv[4]);            return;        }    }    else        repeat =1;        if (argc > 5)    {        pattern = get_value(argv[5],&success,10);        if (!success)        {            printf(INVALUE,argv[5]);            return;        }       }    else        pattern = 0;    /* set up initiator windows */    address = startaddr;    MCF_PCI_PCIIW0BTAR = ((PCI_HOST_MEM & 0xFF000000) | ((address & 0xFF000000) >>16));    loop = 1;    i = 0;    length = (endaddr - startaddr)/4;    setupPatBuf(pattern, (uint32 *)DATA0_BLOCK_START , length * 4);    while(loop && (repeat > 0)) // DO while still looping or my repeat value is still going    {        //while((address < endaddr)&& loop)        {            switch(size)            {#if 0                            case 8:                    *(uint8*)(PCI_HOST_MEM + (address &0x00FFFFFF)) = (uint8)(pattern[i]);                    data8 = *(uint8*)(PCI_HOST_MEM + (address &0x00FFFFFF));                    if(data8 != (uint8)(pattern[i]))                    {                        printf("memtest error: addr: 0x%08X=0x%02X != 0x%02X\n",address,data8,(uint8)(pattern[i]));                        return;                    }                    address = address +1;                    break;                case 16:                    *(uint16*)(PCI_HOST_MEM + (address &0x00FFFFFF)) = swap16((uint16)(pattern[i]));                    data16 = swap16(*(uint16*)(PCI_HOST_MEM + (address &0x00FFFFFF)));                    if(data16 != (uint16)(pattern[i]))                    {                        printf("memtest error: addr: 0x%08X=0x%04X != 0x%04X\n",address,data16,(uint16)(pattern[i]));                        return;                    }                    address = address +2;                    break;#endif                     case 32:                    asm_memcpy32((void *)DATA0_BLOCK_START, (void*)(PCI_HOST_MEM + (address &0x00FFFFFF)), length);                    asm_memcpy32((void*)(PCI_HOST_MEM + (address &0x00FFFFFF)),(void *)DATA1_BLOCK_START,  length);                 					buffSrc =  (uint32 *)DATA0_BLOCK_START; 					buffDst =  (uint32 *)DATA1_BLOCK_START;                      			for (i=0; i< length; i++)        			{        				if(buffSrc[i] != buffDst[i])        				{        					printf("memtest error %x %x\n",buffSrc[i], buffDst[i]);        				}        			}                            break;                default:                    printf("Invalid size: pick 8, 16, or 32\n");                    return;            }            /* increment pattern */            //i++;            //if(i >= 8)            //    i=0;        }        /* reset start address */        address = startaddr;        /* decrement repeat */        repeat = repeat -1;    }    /* we are done! */    if(loop == 0)        printf("Memtest aborted...\n");    else        printf("Memtest passed...\n");}voidmemtestbstdma (int argc, char **argv){    uint32 size      = 0;    uint32 startaddr = 0;    uint32 address   = 0;    uint32 endaddr   = 0;    uint32 repeat    = 0;    uint32 length	= 0;    uint32 data8     = 0;    uint32 data16    = 0;    uint32 data32    = 0;    int success, i;    //unsigned int pattern[8];    uint32 pattern = 0;    uint32 *buffSrc, *buffDst;    /* 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)    {        startaddr = get_value(argv[2],&success,16);        if (!success)        {            printf(INVALUE,argv[2]);            return;        }    }    /* get data value */    if(argc > 3)    {        endaddr = get_value(argv[3],&success,16);        if (!success)        {            printf(INVALUE,argv[3]);            return;        }    }    /* get length value */    if(argc > 4)    {        repeat = get_value(argv[4],&success,10);        if (!success)        {            printf(INVALUE,argv[4]);            return;        }    }    else        repeat =1;        if (argc > 5)    {        pattern = get_value(argv[5],&success,10);        if (!success)        {            printf(INVALUE,argv[5]);            return;        }       }    else        pattern = 0;    /* set up initiator windows */    address = startaddr;    MCF_PCI_PCIIW0BTAR = ((PCI_HOST_MEM & 0xFF000000) | ((address & 0xFF000000) >>16));    loop = 1;    i = 0;    length = endaddr - startaddr;    setupPatBuf(pattern, (uint32 *)DATA0_BLOCK_START , length);    while(loop && (repeat > 0)) // DO while still looping or my repeat value is still going    {        //while((address < endaddr)&& loop)        {            switch(size)            {#if 0                            case 8:                    *(uint8*)(PCI_HOST_MEM + (address &0x00FFFFFF)) = (uint8)(pattern[i]);                    data8 = *(uint8*)(PCI_HOST_MEM + (address &0x00FFFFFF));                    if(data8 != (uint8)(pattern[i]))                    {                        printf("memtest error: addr: 0x%08X=0x%02X != 0x%02X\n",address,data8,(uint8)(pattern[i]));                        return;                    }                    address = address +1;                    break;                case 16:                    *(uint16*)(PCI_HOST_MEM + (address &0x00FFFFFF)) = swap16((uint16)(pattern[i]));                    data16 = swap16(*(uint16*)(PCI_HOST_MEM + (address &0x00FFFFFF)));                    if(data16 != (uint16)(pattern[i]))                    {                        printf("memtest error: addr: 0x%08X=0x%04X != 0x%04X\n",address,data16,(uint16)(pattern[i]));                        return;                    }                    address = address +2;                    break;#endif                     case 32:                    dma_memcpy32((void *)DATA0_BLOCK_START, (void*)(PCI_HOST_MEM + (address &0x00FFFFFF)), length);                    dma_memcpy32((void*)(PCI_HOST_MEM + (address &0x00FFFFFF)),(void *)DATA1_BLOCK_START,  length);                 					buffSrc =  (uint32 *)DATA0_BLOCK_START; 					buffDst =  (uint32 *)DATA1_BLOCK_START;                      			for (i=0; i< length/4; i++)        			{        				if(buffSrc[i] != buffDst[i])        				{        					printf("memtest error %x %x\n",buffSrc[i], buffDst[i]);        				}        			}                            break;                default:                    printf("Invalid size: pick 8, 16, or 32\n");                    return;            }            /* increment pattern */            //i++;            //if(i >= 8)            //    i=0;        }        /* reset start address */        address = startaddr;        /* decrement repeat */        repeat = repeat -1;    }    /* we are done! */    if(loop == 0)        printf("Memtest aborted...\n");    else        printf("Memtest passed...\n");}voidtarget (int argc, char **argv){    uint32 size      = 0;    uint32 startaddr = 0;    uint32 address   = 0;    uint32 endaddr   = 0;    uint32 repeat    = 0;    uint32 length	= 0;    uint32 data8     = 0;    uint32 data16    = 0;    uint32 data32    = 0;    int success, i;    //unsigned int pattern[8];    uint32 pattern = 0;    uint32 *buffSrc, *buffDst;    /* 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)    {        startaddr = get_value(argv[2],&success,16);        if (!success)        {            printf(INVALUE,argv[2]);            return;        }    }    /* get data value */    if(argc > 3)    {        endaddr = get_value(argv[3],&success,16);        if (!success)        {            printf(INVALUE,argv[3]);            return;        }    }    /* get length value */    if(argc > 4)    {        repeat = get_value(argv[4],&success,10);        if (!success)        {            printf(INVALUE,argv[4]);            return;        }    }    else        repeat =1;        if (argc > 5)    {        pattern = get_value(argv[5],&success,10);        if (!success)        {            printf(INVALUE,argv[5]);            return;        }       }    else        pattern = 0;    /* set up initiator windows */    address = startaddr;    MCF_PCI_PCIIW0BTAR = ((PCI_HOST_MEM & 0xFF000000) | ((address & 0xFF000000) >>16));    loop = 1;    i = 0;    length = (endaddr - startaddr)/4;    setupPatBuf(pattern, (uint32 *)DATA0_BLOCK_START , length * 4);    while(loop && (repeat > 0)) // DO while still looping or my repeat value is still going    {        //while((address < endaddr)&& loop)        {            switch(size)            {#if 0                            case 8:                    *(uint8*)(PCI_HOST_MEM + (address &0x00FFFFFF)) = (uint8)(pattern[i]);                    data8 = *(uint8*)(PCI_HOST_MEM + (address &0x00FFFFFF));                    if(data8 != (uint8)(pattern[i]))                    {                        printf("memtest error: addr: 0x%08X=0x%02X != 0x%02X\n",address,data8,(uint8)(pattern[i]));                        return;                    }                    address = address +1;                    break;                case 16:                    *(uint16*)(PCI_HOST_MEM + (address &0x00FFFFFF)) = swap16((uint16)(pattern[i]));                    data16 = swap16(*(uint16*)(PCI_HOST_MEM + (address &0x00FFFFFF)));                    if(data16 != (uint16)(pattern[i]))                    {                        printf("memtest error: addr: 0x%08X=0x%04X != 0x%04X\n",address,data16,(uint16)(pattern[i]));                        return;                    }                    address = address +2;                    break;#endif                     case 32:                *(volatile uint32*)(DATA1_BLOCK_START + 0x20000) = 0;                                //    asm_memcpy32((void *)DATA0_BLOCK_START, (void*)(PCI_HOST_MEM + (address &0x00FFFFFF)), length);                //    asm_memcpy32((void*)(PCI_HOST_MEM + (address &0x00FFFFFF)),(void *)DATA1_BLOCK_START,  length);                 				    /* poll for done - this will affect the test for now*/ 				    /* this type of test won't work if the data is cached on CF since there is no 				       cache invalidate instruction which allows to invalidate a single line */ 				    while (*(volatile uint32*)(DATA1_BLOCK_START + 0x20000) != 0xdeadbeef); 				 					buffSrc =  (uint32 *)DATA0_BLOCK_START; 					buffDst =  (uint32 *)DATA1_BLOCK_START;                      			for (i=0; i< length; i++)        			{        				if(buffSrc[i] != buffDst[i])        				{        					printf("memtest error %x %x\n",buffSrc[i], buffDst[i]);        				}        			}                            break;                default:                    printf("Invalid size: pick 8, 16, or 32\n");                    return;            }            /* increment pattern */            //i++;            //if(i >= 8)            //    i=0;        }        /* reset start address */        address = startaddr;        /* decrement repeat */        repeat = repeat -1;    }    /* we are done! */    if(loop == 0)        printf("Memtest aborted...\n");    else        printf("Memtest passed...\n");}voidtarget2 (int argc, char **argv){    uint32 size      = 0;    uint32 startaddr = 0;    uint32 address   = 0;    uint32 endaddr   = 0;    uint32 repeat    = 0;    uint32 length	= 0;

⌨️ 快捷键说明

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