hpi.c
来自「U-boot源码 ARM7启动代码」· C语言 代码 · 共 612 行 · 第 1/2 页
C
612 行
/* printf("hpi_write_noinc: data1=0x%x, data2=0x%x\n", data1, data2); */ HPI_HPID_NOINC_1 = data1; HPI_HPID_NOINC_2 = data2; return 0;}/* read from non- auto inc regs */static u32 hpi_read_noinc(u32 addr){ u16 addr1, addr2, data1, data2; u32 ret; addr1 = (u16) ((addr >> 16) & 0xffff); /* First HW is most significant */ addr2 = (u16) (addr & 0xffff); HPI_HPIA_1 = addr1; HPI_HPIA_2 = addr2; /* printf("hpi_read_noinc: addr1=0x%x, addr2=0x%x\n", addr1, addr2); */ data1 = HPI_HPID_NOINC_1; data2 = HPI_HPID_NOINC_2; /* printf("hpi_read_noinc: data1=0x%x, data2=0x%x\n", data1, data2); */ ret = (((u32) data1) << 16) | (data2 & 0xffff); return ret;}/* * Host Port Interface Tests */#ifndef HPI_TEST_OSZI/* main test function */int hpi_test(void){ int err = 0; u32 i, ii, pattern, tmp; pattern = HPI_TEST_PATTERN; u32 test_data[HPI_TEST_CHUNKSIZE]; u32 read_data[HPI_TEST_CHUNKSIZE]; debugX(2, "hpi_test: activating hpi..."); hpi_activate(); debugX(2, "OK.\n");#if 0 /* Dump the first 1024 bytes * */ for(i=0; i<1024; i+=4) { if(i%16==0) printf("\n0x%08x: ", i); printf("0x%08x ", hpi_read_noinc(i)); }#endif /* HPIA read-write test * */ debugX(1, "hpi_test: starting HPIA read-write tests...\n"); err |= hpi_write_addr_test(0xdeadc0de); err |= hpi_write_addr_test(0xbeefd00d); err |= hpi_write_addr_test(0xabcd1234); err |= hpi_write_addr_test(0xaaaaaaaa); if(err) { debugX(1, "hpi_test: HPIA read-write tests: *** FAILED ***\n"); return -1; } debugX(1, "hpi_test: HPIA read-write tests: OK\n"); /* read write test using nonincremental data regs * */ debugX(1, "hpi_test: starting nonincremental tests...\n"); for(i=HPI_TEST_START; i<HPI_TEST_END; i+=4) { err |= hpi_read_write_test(i, pattern); /* stolen from cmd_mem.c */ if(pattern & 0x80000000) { pattern = -pattern; /* complement & increment */ } else { pattern = ~pattern; } err |= hpi_read_write_test(i, pattern); if(err) { debugX(1, "hpi_test: nonincremental tests *** FAILED ***\n"); return -1; } } debugX(1, "hpi_test: nonincremental test OK\n"); /* read write a chunk of data using nonincremental data regs * */ debugX(1, "hpi_test: starting nonincremental chunk tests...\n"); pattern = HPI_TEST_PATTERN; for(i=HPI_TEST_START; i<HPI_TEST_END; i+=4) { hpi_write_noinc(i, pattern); /* stolen from cmd_mem.c */ if(pattern & 0x80000000) { pattern = -pattern; /* complement & increment */ } else { pattern = ~pattern; } } pattern = HPI_TEST_PATTERN; for(i=HPI_TEST_START; i<HPI_TEST_END; i+=4) { tmp = hpi_read_noinc(i); if(tmp != pattern) { debugX(1, "hpi_test: noninc chunk test *** FAILED *** @ 0x%x, written=0x%x, read=0x%x\n", i, pattern, tmp); err = -1; } /* stolen from cmd_mem.c */ if(pattern & 0x80000000) { pattern = -pattern; /* complement & increment */ } else { pattern = ~pattern; } } if(err) return -1; debugX(1, "hpi_test: nonincremental chunk test OK\n");#ifdef DO_TINY_TEST /* small verbose test using autoinc and nonautoinc to compare * */ debugX(1, "hpi_test: tiny_autoinc_test...\n"); hpi_tiny_autoinc_test(); debugX(1, "hpi_test: tiny_autoinc_test done\n");#endif /* DO_TINY_TEST */ /* $%& write a chunk of data using the autoincremental regs * */ debugX(1, "hpi_test: starting autoinc test %d chunks with 0x%x bytes...\n", ((HPI_TEST_END - HPI_TEST_START) / HPI_TEST_CHUNKSIZE), HPI_TEST_CHUNKSIZE); for(i=HPI_TEST_START; i < ((HPI_TEST_END - HPI_TEST_START) / HPI_TEST_CHUNKSIZE); i++) { /* generate the pattern data */ debugX(3, "generating pattern data: "); for(ii = 0; ii < HPI_TEST_CHUNKSIZE; ii++) { debugX(3, "0x%x ", pattern); test_data[ii] = pattern; read_data[ii] = 0x0; /* zero to be sure */ /* stolen from cmd_mem.c */ if(pattern & 0x80000000) { pattern = -pattern; /* complement & increment */ } else { pattern = ~pattern; } } debugX(3, "done\n"); debugX(2, "Writing autoinc data @ 0x%x\n", i); hpi_write_inc(i, test_data, HPI_TEST_CHUNKSIZE); debugX(2, "Reading autoinc data @ 0x%x\n", i); hpi_read_inc(i, read_data, HPI_TEST_CHUNKSIZE); /* compare */ for(ii = 0; ii < HPI_TEST_CHUNKSIZE; ii++) { debugX(3, "hpi_test_autoinc: @ 0x%x, written=0x%x, read=0x%x", i+ii, test_data[ii], read_data[ii]); if(read_data[ii] != test_data[ii]) { debugX(0, "hpi_test: autoinc test @ 0x%x, written=0x%x, read=0x%x *** FAILED ***\n", i+ii, test_data[ii], read_data[ii]); return -1; } } } debugX(1, "hpi_test: autoinc test OK\n"); return 0;}#else /* HPI_TEST_OSZI */int hpi_test(void){ int i; u32 read_data[TINY_AUTOINC_DATA_SIZE]; unsigned int dummy_data[TINY_AUTOINC_DATA_SIZE] = { 0x11112222, 0x33334444, 0x55556666, 0x77778888, 0x9999aaaa, 0xbbbbcccc, 0xddddeeee, 0xffff1111, 0x00010002, 0x00030004, 0x00050006, 0x00070008, 0x0009000a, 0x000b000c, 0x000d000e, 0x000f0001 }; debugX(0, "hpi_test: activating hpi..."); hpi_activate(); debugX(0, "OK.\n"); while(1) { led9(1); debugX(0, " writing to autoinc...\n"); hpi_write_inc(TINY_AUTOINC_BASE_ADDR, dummy_data, TINY_AUTOINC_DATA_SIZE); debugX(0, " reading from autoinc...\n"); hpi_read_inc(TINY_AUTOINC_BASE_ADDR, read_data, TINY_AUTOINC_DATA_SIZE); for(i=0; i < (TINY_AUTOINC_DATA_SIZE); i++) { debugX(0, " written=0x%x, read(inc)=0x%x\n", dummy_data[i], read_data[i]); } led9(0); udelay(2000000); } return 0;}#endif/* test if Host Port Address Register can be written correctly */static int hpi_write_addr_test(u32 addr){ u32 read_back; /* write address */ HPI_HPIA_1 = ((u16) (addr >> 16)); /* First HW is most significant */ HPI_HPIA_2 = ((u16) addr); read_back = (((u32) HPI_HPIA_1)<<16) | ((u32) HPI_HPIA_2); if(read_back == addr) { debugX(2, " hpi_write_addr_test OK: written=0x%x, read=0x%x\n", addr, read_back); return 0; } else { debugX(0, " hpi_write_addr_test *** FAILED ***: written=0x%x, read=0x%x\n", addr, read_back); return -1; } return 0;}/* test if a simple read/write sequence succeeds */static int hpi_read_write_test(u32 addr, u32 data){ u32 read_back; hpi_write_noinc(addr, data); read_back = hpi_read_noinc(addr); if(read_back == data) { debugX(2, " hpi_read_write_test: OK, addr=0x%x written=0x%x, read=0x%x\n", addr, data, read_back); return 0; } else { debugX(0, " hpi_read_write_test: *** FAILED ***, addr=0x%x written=0x%x, read=0x%x\n", addr, data, read_back); return -1; } return 0;}#ifdef DO_TINY_TESTstatic int hpi_tiny_autoinc_test(void){ int i; u32 read_data[TINY_AUTOINC_DATA_SIZE]; u32 read_data_noinc[TINY_AUTOINC_DATA_SIZE]; unsigned int dummy_data[TINY_AUTOINC_DATA_SIZE] = { 0x11112222, 0x33334444, 0x55556666, 0x77778888, 0x9999aaaa, 0xbbbbcccc, 0xddddeeee, 0xffff1111, 0x00010002, 0x00030004, 0x00050006, 0x00070008, 0x0009000a, 0x000b000c, 0x000d000e, 0x000f0001 }; printf(" writing to autoinc...\n"); hpi_write_inc(TINY_AUTOINC_BASE_ADDR, dummy_data, TINY_AUTOINC_DATA_SIZE); printf(" reading from autoinc...\n"); hpi_read_inc(TINY_AUTOINC_BASE_ADDR, read_data, TINY_AUTOINC_DATA_SIZE); printf(" reading from noinc for comparison...\n"); for(i=0; i < (TINY_AUTOINC_DATA_SIZE); i++) read_data_noinc[i] = hpi_read_noinc(TINY_AUTOINC_BASE_ADDR+i*4); for(i=0; i < (TINY_AUTOINC_DATA_SIZE); i++) { printf(" written=0x%x, read(inc)=0x%x, read(noinc)=0x%x\n", dummy_data[i], read_data[i], read_data_noinc[i]); } return 0;}#endif /* DO_TINY_TEST */#endif /* CONFIG_SPC1920_HPI_TEST */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?