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