亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? memory.c

?? 詳細介紹了一篇關于pci開發的接口芯片
?? C
字號:
/*
	memory.c

	memory-related library functions.

	Note on "physical" versions of functions...

	Non-"physical" versions can be used by machines that return
	pointer values that match actual addresses, such as
	I960 and Motorola. Other systems (i.e. PC) must use
	"physical" versions. Actually, any system may use 
	the "physical" version since it uses function calls for
	doing read/write.

*/

#include <stdtypes.h>
#include <string.h>
#include <stdio.h>

/* non-standard includes... */
#include <clib1.h>
#include <lib.h>

extern CHAR errstring[], text[];

/* ****************************************************	*/
/*                  local function protos...           	*/
/* ****************************************************	*/
static int adderr( UINT32 sb, UINT32 ws );


int address_test( UINT32 address, UINT32 size_bytes )
/*
  	Test addressing of memory.

   	Entry:  address - PCI memory address to use as start ( must be 4-byte aligned )
				"address" must be a multiple of "size_bytes", unless size_bytes is not a
				power-of-two (in which case "address" must be a multiple of the next 
				power-of-two larger	than "size_bytes").
			size_bytes - size in bytes to test

   	Return:	TRUE if OK, else FALSE and error string added.

*/
{
	UINT32 size, i, data, tsize = size_bytes;

	
	/* get size as a power-of-two based on highest bit set... */
	for( size = 0; tsize; tsize = tsize >> 1 )
	{
		if ( size == 0L ) size = 1;
		else size = size << 1;
	}

	if ( size != size_bytes )
		size = size << 1;	/* go to next higher power-of-two */

	/* see if address is multiple of size... */
	if ( (address % size) != 0L)
	{
		strcat( errstring, "Error calling address_test.\n" );
		sprintf( text, "Address %8.8lx is not multiple of size %8.8lx.\n", \
			address, size );
		strcat( errstring, text );
		sprintf( text, "Requested test size is %8.8lx.\n", size_bytes );
		strcat( errstring, text );
		return( FALSE );
	}

	size /= 2;		/* size halfway thru is the last location written */

	/* write unique data to each unique address... */
	*(UINT32 *)address = 0;					/* write unique data location 0 */
	for( i = 4; i <= size; i = i << 1 )
		*(UINT32 *)(address + i) = i;		/* write unique data */

	/* read back and compare unique data... */
	data = *(UINT32 *)address;
	if ( data != 0L )
		return( adderr( 0L, data ) );

	for( i = 4; i <= size; i = i << 1 )
	{
		data = *(UINT32 *)(address + i);
		if ( data != i )
			return( adderr( i, data ) );
	}

	return( TRUE );
}

int physical_address_test( UINT32 address, UINT32 size_bytes )
/*
	Same as address_test, but must be used by PCs.

*/
{
	UINT32 size, i, data, tsize = size_bytes;

	
	/* get size as a power-of-two based on highest bit set... */
	for( size = 0; tsize; tsize = tsize >> 1 )
	{
		if ( size == 0L ) size = 1;
		else size = size << 1;
	}

	if ( size != size_bytes )
		size = size << 1;	/* go to next higher power-of-two */

	/* see if address is multiple of size... */
	if ( (address % size) != 0L)
	{
		strcat( errstring, "Error calling address_test.\n" );
		sprintf( text, "Address %8.8lx is not multiple of size %8.8lx.\n", \
			address, size );
		strcat( errstring, text );
		sprintf( text, "Requested test size is %8.8lx.\n", size_bytes );
		strcat( errstring, text );
		return( FALSE );
	}

	size /= 2;		/* size halfway thru is the last location written */

	/* write unique data to each unique address... */
	xpoke32( address, 0L );					/* write unique data location 0 */
	for( i = 4; i <= size; i = i << 1 )
		xpoke32( address + i, i );			/* write unique data */

	/* read back and compare unique data... */
	data = xpeek32( address );
	if ( data != 0L )
		return( adderr( 0L, data ) );

	for( i = 4; i <= size; i = i << 1 )
	{
		data = xpeek32(address + i);
		if ( data != i )
			return( adderr( i, data ) );
	}

	return( TRUE );
}


static int adderr( UINT32 sb, UINT32 ws )
/*	Stuff error text.

	Entry:	sb - both the offset into the memory and the data expected
			ws - what was actually read
*/
{
	strcat( errstring, "Address test error.\n" );
	return( sb_ws32( sb, sb, ws ) );	
}


int data_test( UINT32 address, UINT32 size_bytes, UINT32 *data, int num_data )
/*
  	Test complete block of data in memory using passed values.
	Tests using using long-word accesses.
	Limited to 24-bit addresses.

   	Entry:  address - PCI memory address to use as start ( must be 4-byte aligned )
			size_bytes - size in bytes
			data - array of data values to use
				data is { value, incrementor } for each entry
			num_data - how many elements in array "data"

   	Return:	TRUE if OK, else FALSE and error string added.
*/
{
	UINT32 sbdata, wsdata;
	UINT32 *p32 = (UINT32 *)(voidaddr(address));
	UINT16 i, j;

	for( j = 0; j < num_data*2; j+=2 )
	{
		// write all data...
		sbdata = data[j];
		for( i = 0; i < (UINT16)(size_bytes/4); i ++ )
		{
			p32[i] = sbdata;
			sbdata += data[j+1];
		}

		// read back and compare...
		sbdata = data[j];
		for( i = 0; i < (UINT16)(size_bytes/4); i++ )
		{
			wsdata = p32[i];
			if ( sbdata != wsdata )
				return( data_err32( "data_test() error.\n", i*4L, sbdata, wsdata  ) );
			sbdata += data[j+1];
		}

	}

	return( TRUE );
}


int physical_data_test( UINT32 address, UINT32 size_bytes, UINT32 *data, int num_data )
/*
	Same as data_test, but uses full 32-bit addresses.
*/
{
	UINT32 i, sbdata, wsdata;
	int j; 

	for( j = 0; j < num_data; j++ )
	{
		// write...
		sbdata = data[j];
		for( i = 0; i < size_bytes; i += 4 )
		{
			xpoke32( address + i, sbdata );
			sbdata += data[j+1];
		}

		// read back and compare...
		sbdata = data[j];
		for( i = 0; i < size_bytes; i += 4 )
		{
			wsdata = xpeek32( address + i );
			if ( sbdata != wsdata )
				return( data_err32( "data_test() error.\n", i*4L, sbdata, wsdata  ) );
			sbdata += data[j+1];
		}

	}

	return( TRUE );
}


int bus_sizing( UINT32 address )
/*
  	
  	Test byte/word/long accesses at all offset 0-3.

	Note:
		Since this type of access is dependent on the CPU subsystem, and not
		the PCI subsystem, the unaligned offsets are not tested.
		Uses two longword locations at "address".

   	Entry:  address - PCI memory address to use as start ( must be 4-byte aligned )

   	Return:	TRUE if OK, else FALSE and error string added.
*/
{
   	UINT32 data, tdata;


	/* **************************** */
	/* test simple byte accesses... */
	/* **************************** */
   	*(UINT32 *)address = 0x11223344L;
   	*(UINT32 *)(address + 4) = 0L;		/* used to check for overwrite */
   	*(UINT8 *)address = 0xFF;
   	tdata = 0x112233FFL;
   	data = *(UINT32 *)address;
   	if ( data != tdata )
    	return( simbyte( 0, tdata, data ) );

   	*(UINT8 *)(address + 1) = 0xFE;
   	tdata = 0x1122FEFFL;
   	data = *(UINT32 *)address;
   	if ( data != tdata )
    	return( simbyte( 1, tdata, data ) );

   	*(UINT8 *)(address + 2) = 0xFD;
   	tdata = 0x11FDFEFFL;
   	data = *(UINT32 *)address;
   	if ( data != tdata )
    	return( simbyte( 2, tdata, data ) );

   	*(UINT8 *)(address + 3) = 0xFC;
   	tdata = 0xFCFDFEFFL;
   	data = *(UINT32 *)address;
   	if ( data != tdata )
    	return( simbyte( 3, tdata, data ) );

	/* **************************** */
	/* test simple word accesses... */
	/* **************************** */
   	*(UINT32 *)address = 0x11223344L;
   	*(UINT16 *)address = 0xFFFE;
   	tdata = 0x1122FFFEL;
   	data = *(UINT32 *)address;
   	if ( data != tdata )
    	return( simword( 0, tdata, data ) );

   	*(UINT16 *)(address + 2) = 0xFDFC;
   	tdata = 0xFDFCFFFEL;
   	data = *(UINT32 *)address;
   	if ( data != tdata )
    	return( simword( 2, tdata, data ) );

	/* check for overwrite past the long... */
   	data = *(UINT32 *)(address + 4);
	if ( data != 0L )
	{
		strcat( errstring, "Offset 4 overwritten during simple byte/word test.\n" );
		return( dynfail() );
	}

   	return(TRUE);
}


int physical_bus_sizing( UINT32 address )
/*
	Sma eas bus_sizing but uses physical address so can do 32-bit addressing.
  	Test byte/word/long accesses at all offset 0-3.

	Note:
		Since this type of access is dependent on the CPU subsystem, and not
		the PCI subsystem, the unaligned offsets are not tested.
		Uses two longword locations at "address".

   	Entry:  address - PCI memory address to use as start ( must be 4-byte aligned )

   	Return:	TRUE if OK, else FALSE and error string added.
*/
{
   	UINT32 data, tdata;


	/* **************************** */
	/* test simple byte accesses... */
	/* **************************** */
   	xpoke32( address, 0x11223344L );
   	xpoke32( address + 4, 0L );			/* used to check for overwrite */
   	xpoke8( address, 0xFF );
   	tdata = 0x112233FFL;
   	data = xpeek32( address );
   	if ( data != tdata )
    	return( simbyte( 0, tdata, data ) );

   	xpoke8( address + 1, 0xFE );
   	tdata = 0x1122FEFFL;
   	data = xpeek32( address );
   	if ( data != tdata )
    	return( simbyte( 1, tdata, data ) );

   	xpoke8( address + 2, 0xFD );
   	tdata = 0x11FDFEFFL;
   	data = xpeek32( address );
   	if ( data != tdata )
    	return( simbyte( 2, tdata, data ) );

   	xpoke8( address + 3, 0xFC );
   	tdata = 0xFCFDFEFFL;
   	data = xpeek32( address );
   	if ( data != tdata )
    	return( simbyte( 3, tdata, data ) );

	/* **************************** */
	/* test simple word accesses... */
	/* **************************** */
   	xpoke32( address, 0x11223344L );
   	xpoke16( address, 0xFFFE );
   	tdata = 0x1122FFFEL;
   	data = xpeek32( address );
   	if ( data != tdata )
    	return( simword( 0, tdata, data ) );

   	xpoke16( address + 2, 0xFDFC );
   	tdata = 0xFDFCFFFEL;
   	data = xpeek32( address );
   	if ( data != tdata )
    	return( simword( 2, tdata, data ) );

	/* check for overwrite past the long... */
   	data = xpeek32( address  + 4);
	if ( data != 0L )
	{
		strcat( errstring, "Offset 4 overwritten during simple byte/word test.\n" );
		return( dynfail() );
	}

   	return(TRUE);
}

int simbyte( int offset, UINT32 sb, UINT32 ws )
/*
	Entry:	offset - byte offset that failed 0-3
			sb - "should be" data
			ws - "was" data

	Return:	thru dynafail
*/
{
	data_err32( "Failed simple byte access.\n", (UINT32)offset, sb, ws );
	return( dynfail() );
}

int simword( int offset, UINT32 sb, UINT32 ws )
/*
	Entry:	offset - offset that failed 0-3
			sb - "should be" data
			ws - "was" data

	Return:	thru dynafail
*/
{
	data_err32( "Failed simple word access.\n", (UINT32)offset, sb, ws );
	return( dynfail() );
}

int dynfail( VOID )
{
	strcat( errstring, "Dynamic Bus Sizing Test failed.\n" );
	return( FALSE );
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99精品黄色片免费大全| 欧美精品一二三区| 91传媒视频在线播放| 日韩欧美国产三级电影视频| 国产视频一区二区在线观看| 亚洲国产日韩在线一区模特| 国产精品一卡二卡| 欧美日韩高清一区二区三区| 中文字幕免费不卡在线| 强制捆绑调教一区二区| 91丨porny丨最新| 久久欧美一区二区| 日韩av午夜在线观看| 91丨国产丨九色丨pron| 国产女同互慰高潮91漫画| 免费观看在线色综合| 欧洲一区在线电影| 国产精品福利一区二区三区| 国内久久婷婷综合| 69堂亚洲精品首页| 亚洲国产日产av| 日本道色综合久久| 亚洲日穴在线视频| 99久久国产综合色|国产精品| 精品日本一线二线三线不卡| 日韩不卡手机在线v区| 色老汉av一区二区三区| 亚洲欧洲性图库| 国产伦精品一区二区三区免费迷 | 91黄色激情网站| 欧美高清在线一区二区| 国精品**一区二区三区在线蜜桃| 欧美精选在线播放| 亚洲高清视频的网址| 在线看国产一区| 一区二区三区四区五区视频在线观看 | 亚洲欧美激情在线| gogogo免费视频观看亚洲一| 中国色在线观看另类| 成人午夜私人影院| 国产精品久久久久久久久快鸭| 成人高清伦理免费影院在线观看| 国产精品色在线观看| 91免费观看视频在线| 亚洲男人都懂的| 欧美日韩亚洲综合一区二区三区| 亚洲综合一二区| 欧美性淫爽ww久久久久无| 亚洲一区二区3| 538prom精品视频线放| 美国十次综合导航| 国产欧美日韩亚州综合| 成人黄色电影在线| 国产精品国产三级国产有无不卡 | 欧美精品自拍偷拍| 久久精品99久久久| 国产色综合一区| 色婷婷亚洲综合| 丝袜a∨在线一区二区三区不卡| 91精品国产色综合久久不卡蜜臀| 久久69国产一区二区蜜臀| 国产欧美一二三区| 久久亚洲一区二区三区四区| 国产成人精品免费视频网站| 亚洲精品免费在线观看| 日韩一级二级三级精品视频| 国产伦精品一区二区三区免费 | 成人h动漫精品| 亚洲一区欧美一区| 久久人人97超碰com| 97精品久久久午夜一区二区三区| 亚洲va韩国va欧美va精品| 精品国产乱码91久久久久久网站| 成人免费观看男女羞羞视频| 一区二区三区欧美在线观看| 欧美二区在线观看| 成人ar影院免费观看视频| 日韩高清不卡一区二区| 国产精品久久久久久亚洲伦| 欧美一区二区三区在线| 成人性生交大片免费看中文网站 | 亚洲综合精品自拍| 国产丝袜在线精品| 欧美精选一区二区| 91免费在线看| 国产91综合网| 久久国产三级精品| 亚洲成人动漫精品| 国产精品久久网站| 久久久99免费| 日韩精品一区二区在线观看| 91搞黄在线观看| 成人av在线一区二区| 国产在线精品一区二区三区不卡 | 国产精品久久午夜夜伦鲁鲁| 欧美成人激情免费网| 欧美三级电影一区| 色香蕉久久蜜桃| 成人爱爱电影网址| 国内精品国产三级国产a久久| 亚洲国产精品久久一线不卡| 日本一区二区免费在线观看视频| 欧美一区二区视频免费观看| 91色婷婷久久久久合中文| 国产成人在线网站| 久草中文综合在线| 免费在线观看日韩欧美| 亚洲高清视频的网址| 一区二区三区成人在线视频| 亚洲人成网站影音先锋播放| 亚洲国产高清aⅴ视频| 久久久亚洲午夜电影| 久久蜜桃一区二区| 国产丝袜欧美中文另类| 国产欧美一区二区三区沐欲| 欧美精品一区二区三区很污很色的| 欧美一区二区在线视频| 欧美一区二区三区小说| 88在线观看91蜜桃国自产| 欧亚洲嫩模精品一区三区| 欧美日韩视频专区在线播放| 欧美日韩国产精选| 91精品国产入口| 精品国产一区二区三区久久久蜜月| 精品对白一区国产伦| 久久久久久一二三区| 国产精品天干天干在观线| 亚洲女女做受ⅹxx高潮| 夜夜精品视频一区二区| 亚洲国产一区二区a毛片| 日韩精品亚洲一区| 久久丁香综合五月国产三级网站| 国产呦精品一区二区三区网站| 国产激情91久久精品导航| 国产999精品久久久久久绿帽| 99精品视频中文字幕| 欧美体内she精高潮| 91精品国产综合久久小美女| 精品国产乱码久久久久久闺蜜| 久久久久久日产精品| 亚洲婷婷综合久久一本伊一区 | 亚洲精品成人在线| 午夜精品视频一区| 久久激五月天综合精品| 丁香激情综合五月| 在线观看免费亚洲| 欧美电影免费提供在线观看| 国产欧美日韩另类一区| 亚洲国产日韩a在线播放性色| 久久精品国产一区二区三区免费看| 国产主播一区二区三区| 91成人网在线| 精品国免费一区二区三区| 亚洲色图在线播放| 六月丁香婷婷久久| 99久久婷婷国产| 欧美v亚洲v综合ⅴ国产v| 亚洲欧洲日韩在线| 九九精品视频在线看| 99视频在线精品| 精品国产伦一区二区三区观看方式 | 欧美三级视频在线| 久久久久九九视频| 亚洲一区二区三区视频在线播放 | 亚洲一区二区三区四区五区黄| 久久se这里有精品| 一本到高清视频免费精品| 精品国产伦一区二区三区免费| 一级日本不卡的影视| 国产麻豆午夜三级精品| 欧美狂野另类xxxxoooo| 国产精品久久夜| 精品一区二区三区免费毛片爱| 日本高清免费不卡视频| 国产精品私房写真福利视频| 美女脱光内衣内裤视频久久网站| 91蜜桃免费观看视频| 亚洲国产激情av| 国产精品一区二区在线播放 | 日本伦理一区二区| 久久久国产精品麻豆| 久久超级碰视频| 制服丝袜在线91| 一区二区三区蜜桃网| 风间由美一区二区三区在线观看| 欧美一级高清大全免费观看| 亚洲一区中文日韩| 91丨porny丨在线| 国产精品美女久久久久aⅴ国产馆| 麻豆国产欧美一区二区三区| 欧美日韩aaaaaa| 亚洲国产精品久久人人爱| eeuss鲁一区二区三区| 国产精品狼人久久影院观看方式| 韩国女主播一区| 欧美精品一区二区在线观看| 精品在线播放免费| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 欧美日韩免费观看一区三区| 亚洲免费资源在线播放|