pci_tests.c
来自「Freescale MCF5445evb 参考测试代码」· C语言 代码 · 共 2,442 行 · 第 1/5 页
C
2,442 行
break; case 16: *(uint16*)(PCI_HOST_MEM + (address &0x00FFFFFF)) = swap16((uint16)data); printf("write addr 0x%08x = 0x%04X\n",address,data); address = address +2; break; case 32: /**(uint32*)(PCI_HOST_MEM + (address &0x00FFFFFF)) = swap32((uint32)data);*/ *(uint32*)(PCI_HOST_MEM + (address &0x00FFFFFF)) = swap32((uint32)data); printf("write addr 0x%08x = 0x%08X\n",address,data); address = address +4; break; default: printf("Invalid size: pick 8, 16, or 32\n"); return; } }}/********************************************************************//********************************************************************/voidwritembst (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; printf("size 8 not supported\n"); break; case 16: //*(uint16*)(PCI_HOST_MEM + (address &0x00FFFFFF)) = swap16((uint16)data); //printf("write addr 0x%08x = 0x%04X\n",address,data); //address = address +2; printf("size 16 not supported\n"); break; case 32: //*(uint32*)(PCI_HOST_MEM + (address &0x00FFFFFF)) = swap32((uint32)data); asm_memcpy32((void *)DATA0_BLOCK_START, (void*)(PCI_HOST_MEM + (address &0x00FFFFFF)), length); //printf("write addr 0x%08x = 0x%08X\n",address,data); //address = address +4; break; default: printf("Invalid size: pick 8, 16, or 32\n"); return; } }}/********************************************************************//********************************************************************/#if 0#define PCI_AG_MEM 0xa9000000#define PCI_ISP_MEM 0xa0000000voidtest1 (int argc, char **argv){ int i, data, success, *datablock; printf("Loop write - press any key to stop\n"); /* set up initiator windows */ MCF_PCI_PCIIW0BTAR = ((PCI_HOST_MEM & 0xFF000000) | ((0xA0000000 & 0xFF000000) >>16)); *(uint32*)(PCI_HOST_MEM) = swap32((uint32)0xDEADBEEF); //cpu_pause(DELAY_BETWEEN_WRITES); for (i = 0; i < 20; i++) nop();/* for (i = 0; i < 1000; i++) { *(uint32*)(PCI_HOST_MEM) = 0xAA556699; nop(); }*/ while(!(MCF_PSC_SR(TERMINAL_PORT) & MCF_PSC_SR_RXRDY)) { *(uint32*)(PCI_HOST_MEM+0x0c) = 0x00000000; *(uint32*)(PCI_HOST_MEM+0x0c) = 0x00000000; *(uint32*)(PCI_HOST_MEM+0x0c) = 0x00000000; *(uint32*)(PCI_HOST_MEM+0x14) = 0xffffffff; *(uint32*)(PCI_HOST_MEM+0x10) = 0x00000000; //cpu_pause(DELAY_BETWEEN_WRITES); for (i = 0; i < 4; i++) nop(); } in_char(); /* * Read block from Agilent card and compare to original buffer */ /* set up initiator windows */ MCF_PCI_PCIIW0BTAR = ((PCI_HOST_MEM & 0xFF000000) | ((0xA8000000 & 0xFF000000) >>16)); success = TRUE; datablock = (int *)DATA0_BLOCK_START; for (i = 0; i < (DATA_BLOCK_SIZE / 4); i++) { data = (*(uint32*)(PCI_HOST_MEM + (i*4))); if (datablock[i] != data) { printf("Error! lw%d - src: %#08X, dst: %#08X\n",i,datablock[i],data); success = FALSE; break; } } if (success) printf("Test passed\n"); else printf("Test failed\n");}#endif/********************************************************************//********************************************************************/voidwriteio (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_PCIIW1BTAR = ((PCI_HOST_IO & 0xFF000000) | ((address & 0xFF000000) >>16)); for(i=0;i<length;i++) { switch(size) { case 8: *(uint8*)(PCI_HOST_IO + (address &0x00FFFFFF)) = (uint8)data; printf("write addr 0x%08x = 0x%02X\n",address,data); address = address +1; break; case 16: *(uint16*)(PCI_HOST_IO + (address &0x00FFFFFF)) = swap16((uint16)data); printf("write addr 0x%08x = 0x%04X\n",address,data); address = address +2; break; case 32: *(uint32*)(PCI_HOST_IO + (address &0x00FFFFFF)) = swap32((uint32)data); printf("write addr 0x%08x = 0x%08X\n",address,data); address = address +4; break; default: printf("Invalid size: pick 8, 16, or 32\n"); return; } }}/********************************************************************//********************************************************************/voidmemtest (int argc, char **argv){ uint32 size = 0; uint32 startaddr = 0; uint32 address = 0; uint32 endaddr = 0; uint32 repeat = 0; uint32 data8 = 0; uint32 data16 = 0; uint32 data32 = 0; int success, i; unsigned int pattern[8]; pattern[0] = 0xa5a5a5a5; pattern[1] = 0x5a5a5a5a; pattern[2] = 0x69696969; pattern[3] = 0x96969696; pattern[4] = 0xdeadbeef; pattern[5] = 0xbabeface; pattern[6] = 0xabbafeed; pattern[7] = 0x96969696; /* 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; /* set up initiator windows */ address = startaddr; MCF_PCI_PCIIW0BTAR = ((PCI_HOST_MEM & 0xFF000000) | ((address & 0xFF000000) >>16)); loop = 1; i = 0; while(loop && (repeat > 0)) // DO while still looping or my repeat value is still going { while((address < endaddr)&& loop) { switch(size) { 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; case 32: *(uint32*)(PCI_HOST_MEM + (address &0x00FFFFFF)) = swap32((uint32)(pattern[i])); data32 = swap32(*(uint32*)(PCI_HOST_MEM + (address &0x00FFFFFF))); if(data32 != (uint32)(pattern[i])) { printf("memtest error: addr: 0x%08X=0x%08X != 0x%08X\n",address,data32,(uint32)(pattern[i])); return; } address = address +4; 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");}#define PATTERN_DATA_ADDRESS 0#define PATTERN_SWITCHING 1 /* 0xaaaaaaa, 0x55555555, ....*/#define PATTERN_SWITCHING2 5 /* 0x00000000,0xfffffff ...*/#define PATTERN_BYTE_INC 2 /* 0x00, 0x01, 0x02, ...*/#define PATTERN_RANDOM 3#define PATTERN_CHECKER_BYTE 4 /* 0x00ff00ff,0xff00ff00 */#define PATTERN_CHECKER_BYTE2 6 /* 0xaa55aa55,0x55aa55aa */int setupPatBuf(uint8 pattern, uint32 *src, uint32 size){ uint32 *p32 = src; int j; uint8 *p8; if (size == 0) return(-1); /* making some assumptions here about the source buffer and size address is longword aligned size is divisible by longword */ switch(pattern) { case PATTERN_DATA_ADDRESS: for (j = 0; j < size; j+=4) { *p32 = (uint32)p32; p32++; } break; case PATTERN_SWITCHING: for (j = 0; j < size; j+=8) { *p32 = (uint32)0xaa55aa55; p32++; *p32 = (uint32)0x55aa55aa; p32++; } break; case PATTERN_BYTE_INC: p8 = (uint8*)src; for (j = 0; j < size; j++) { *p8 = (uint8) (j % 256); p8++; } break;#if 0 case PATTERN_RANDOM: for (j = 0; j < size; j+=4) { *p32++ = ((((UINT32)rand()) << 16) & 0xffff0000) | ((UINT32)rand() & 0x0000ffff); } break;#endif case PATTERN_CHECKER_BYTE: for (j = 0; j < size; j+=8) { *p32 = (uint32)0x00ff00ff; p32++; *p32 = (uint32)0xff00ff00; p32++; } break; case PATTERN_SWITCHING2: for (j = 0; j < size; j+=8) { *p32 = (uint32)0x00000000; p32++; *p32 = (uint32)0xffffffff; p32++; } break; default: return(-1); break; } return(0); }void
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?