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 + -
显示快捷键?