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

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

?? pciext.c

?? WinCE5.0BSP for Renesas SH7770
?? C
?? 第 1 頁 / 共 2 頁
字號:
 *              nothing, but returning the actual PCI addresses.
 ****************************************************************************/
int MapRegisters(void)
{
	static int RegistersMapped = 0;
	int retval = TRUE;

  	DEBUGMSG(1, (TEXT("+PCI: MapRegisters\r\n")));

	// If the registers have already been mapped, just return.
	if(RegistersMapped) {
		return TRUE;
	}
	RegistersMapped = TRUE;

	PciConfigBase	 	= (DWORD)(PHYSICAL_PCI_CONFIG_BASE|UNCACHED_BASE);
//	V3_InternalRegBase 	= PHYSICAL_V3_INTERNAL_REG_BASE;

  	DEBUGMSG(1, (TEXT("PCI: -MapRegisters returning %d\r\n"), retval));
	return retval;
}




// PCI Bridge
int OEM_InitPCIHostBridge( void ) 
{
	unsigned tmp, i;

  	RETAILMSG(1, (TEXT("\r\n+InitPCIHostBridge\r\n")));

	/* Map Registers into your virtual address space. */
	MapRegisters();




	INIT_WAIT;
	RETAILMSG(1, (TEXT("PCI_INIT: Writing 0x%x to 0x%x\r\n"), (PHYSICAL_V3_INTERNAL_REG_BASE + 0x6c), &V360_LB_IO_BASE_RES));
	V360_LB_IO_BASE_RES	= (0x6c+PHYSICAL_V3_INTERNAL_REG_BASE);
	INIT_WAIT;

#if 0
	DbgPrintf("Set io base register. \r\n");
	{
		unsigned tmp;
		DbgPrintf("BCR1 = 0x%x\r\n", *(unsigned long *)0xFF800000);
		tmp = V3_PCI_DEV_VEN;
		DbgPrintf("tmp = %x\r\n", tmp);
	}
#endif 0

  	RETAILMSG(1, (TEXT("PCI_INIT: V3 device reads Vendor ID = %x, Device ID = %x\r\n"), 
			(V3_PCI_DEV_VEN & 0xFFFF), ((V3_PCI_DEV_VEN >> 16) & 0xFFFF)) );

	// Flush ALL FIFOs
	V360_LB_CFG_SYSTEM = 0x00008077; // 0x8000; // 0x00008077; // 0x63008077;
	V360_LB_CFG_SYSTEM = 0x00000000; // 0x63008077;
	V360_LB_CFG_SYSTEM = 0x63c08000; // 0x8000; // 0x63c08000; // 

	INIT_WAIT;

	V3_PCI_STAT_CMD =  0x00000246; // 0x00000246;
	V3_PCI_HDR_CFG = 0x0000F800; // 0x00000800;



	// Find out what to write in the BASE1 registers, Size bits.
	// The size bits contain the encoded value of the bits that is 1 above 1 Mb.
	i = 0;
	tmp = MB_1;
	// Possible values of ADR_SIZE are from 0 (1Mb) to 11 (2 Gb). Though SH4 will not support such big value
	// I still check for it.
	for(i = 0; i <= 11; i++) {
		if(tmp == PCI_MEM_SIZE)
			break;
		tmp <<= 1;
	}
	// At present i support only slots up to 64 Mb.
	if( i > 6) {
		ERRORMSG(1, (TEXT("Error: Got invalid size of PCI Memory Space (0x%x). Check PCI_MEM_SIZE in oempci.c\n"), PCI_MEM_SIZE));
		return -1;
	}
	tmp = PHYSICAL_PCI_MEM_BASE |UNCACHED_BASE | (i << 4) | 0x1;
	// DbgPrintf("Writing 0x%x to LB_BASE1\n", tmp);

	V360_LB_BASE0			 = PHYSICAL_PCI_IO_BASE |UNCACHED_BASE| 0x01;   // Enable.
	V360_LB_BASE1			 = tmp;
	V360_LB_MAP0_RES		 = 0x00020000; // Map PHYSICAL_PCI_IO_BASE to -> 0
	V360_LB_MAP1_RES		 = 0x00060000 | (tmp&0xfff00000L) ; // It is One to one MAP

	DEBUGMSG(1, (TEXT("LB_BASE0=0x%x, 1=0x%x, MAP0=0x%x, 1=0x%x, tmp=0x%x\r\n"), V360_LB_BASE0, V360_LB_BASE1, 
			V360_LB_MAP0_RES, V360_LB_MAP1_RES, tmp));

	// PCI to LOCAL map
	V360_PCI_BASE0           = ((DRAM_BASE | UNCACHED_BASE) & 0xfff00000);
	V360_PCI_MAP0			 = ((DRAM_BASE | UNCACHED_BASE ) & 0xfff00000) | 3 | (5<4); // 64 M uncached memory
	// PCI to LOCAL map
	V360_PCI_BASE1           = ((DRAM_BASE ) & 0xfff00000);
	V360_PCI_MAP1			 = ((DRAM_BASE ) & 0xfff00000) | 3 | (5<4); // 64 M cached memory

	V360_FIFO_PRIOR_CFG		 = 0x0f0f0000;

	// PCI Interrupt
	V360_PCI_INT_CFG         = 0x8421;
	V360_LB_ISTAT			= 0x1010;
#if 0
	WRITE_REGISTER_USHORT(V3_LB_MAP0, 0x000a);
	WRITE_REGISTER_USHORT(FPGA_PCI_CNT, 0xa0FF);
#endif

	CONFIG_WAIT;
	RETAILMSG(1, (TEXT("-InitPCIHostBridge\r\n")));

//	Command_Scan();
	return 0;

#if 0
	/* Enable Bus Mastering on the primary PCI segment for the ATU through the	*/
	/*	Primary ATU Command Register											*/
	*(volatile WORD *)0x00001204 = 0x0157;

	/* Set PCI Interrupt Routing Control so that it does not route CPU board	*/
	/*	secondary interrupts to primary PCI segment								*/
	*(volatile DWORD *)0x00001050 = 0x0000000F;

	/* Make sure that the internal bridge does not accept any accesses			*/
	*(volatile WORD *)0x00001004 = 0;

#endif
	return 0;
}

/* This function will encode a Type 0 or Type 1 configuration address based on	*/
/*	the parameters passed in.													*/
void OEM_EncodeConfigAddress( DWORD dwBusNo, DWORD dwDevNo, DWORD dwFuncNo, DWORD dwOffset, DWORD *pdwAddress ) {

	/* Assume that we need to generate Type 0 bus cycles for Bus 0, based on	*/
	/*	the assumption that bus 0 is the one connected to the PCI host bridge.	*/
	if (dwBusNo == 0) {
		*pdwAddress = (0x00000800 << dwDevNo) | (dwFuncNo << 8) | (dwOffset & 0xFC);
	}
	else {
		/* Generate a Type 1 address for everything not on Bus 0.	*/
		*pdwAddress = (dwBusNo << 16) | (dwDevNo << 11) | (dwFuncNo << 8) | (dwOffset & 0xFC) | 1;
	}

} /* OEM_EncodeConfigAddress */

DWORD OEM_ReadConfigDword(IN ULONG BusNumber, IN ULONG DeviceNumber, IN ULONG FunctionNumber,
                            IN ULONG Offset)
{

	// This routine would check out the entire range of idsels by asserting
	// bits 11 - 31, one bit at a time.
	// If some of the bits are don't care, it would not make any difference.

	// So the configuration addresses generated would be of the form :-
	//	      dwDevNo == 0, idSel = 0x00000800
	//        dwDevNo == 1, idSel = 0x00001000

	//        dwDevNo == 21, idSel = 0x8000000
	// This way a max. of 21 devices are supported.


	DWORD dwConfigAddress;
	DWORD dwReturn;
	unsigned addr;
	unsigned old_val;

//	DEBUGMSG(0, (TEXT("RCD: dwBusNo = 0x%x, dwDevNo = 0x%x, dwFuncNo = 0x%x, dwOffset = 0x%x\r\n"), BusNumber, DeviceNumber, FunctionNumber,Offset));
//	CONFIG_WAIT;

	// Get the address in the PCI configuration space for the requested register
	OEM_EncodeConfigAddress( BusNumber, DeviceNumber, FunctionNumber, Offset, &dwConfigAddress );

	// Save OLD Value of LB_MAP1 so that you can restore it after the access
	old_val = V360_LB_MAP1_RES;

//	DEBUGMSG(0, (TEXT("Encoded Address = 0x%x\r\n"), dwConfigAddress));

	// Now is the address bigger than PCI memory size that you mapped ?
	if(dwConfigAddress >= PCI_CONFIG_SIZE) {
//		DEBUGMSG(1, (TEXT("Writing to LB_MAP1_RES1 0x%x\n"), ((dwConfigAddress & 0xFFF00000) | (TYPE_CONFIG << 16)) ));

		// Split dwConfigAddress into two parts. The upper part gets written
		// to MAP1 register and the lower part is the address that gets accessed.
		V360_LB_MAP1_RES = ((dwConfigAddress & 0xFFF00000) | (TYPE_CONFIG << 16));
	}
	else {
//		DEBUGMSG(0, (TEXT("Writing to LB_MAP1_RES2 0x%x\r\n"), (TYPE_CONFIG) << 16) );
		V360_LB_MAP1_RES =  (TYPE_CONFIG) << 16 ;
	}

	addr = PciConfigBase + (dwConfigAddress & (PCI_CONFIG_SIZE - 1));
//	DEBUGMSG(1, (TEXT("addr = 0x%x\r\n"), addr));

	//  If type is 1, that is address bits 0,1 are 01, Then you need to 
	// program AD_LOW_ENABLE in LB_MAP1_RES and AD_LOW=01 in PCI_CFG
	if(addr & 3) {
		volatile unsigned long *tmp_addr = (unsigned *) (addr & 0xFFFFFFFC);

//		CONFIG_WAIT;
		// Set bits 8,9 of PCI_CFG register to the override value of address.
		V360_PCI_CFG = ( V360_PCI_CFG & ~(0x300) ) | ( (addr & 3) << 8);
		V360_LB_MAP1_RES =  (V360_LB_MAP1_RES | 0x10000);
//		DEBUGMSG(1, (TEXT("RCD: addr = 0x%x, V360_PCI_CFG = 0x%x, V360_LB_MAP1_RES = 0x%x\n"), tmp_addr, V360_PCI_CFG, V360_LB_MAP1_RES));
		dwReturn = *tmp_addr;
	}
	else {
//		CONFIG_WAIT;
//		DEBUGMSG(1, (TEXT("About to read location 0x%x, \r\n"), addr));
		dwReturn = *(volatile unsigned long *)(addr);
//		DEBUGMSG(1, (TEXT("read data %x\r\n"), dwReturn));
	}

//	DEBUGMSG(1, (TEXT("RCD(BDFO)=(%d:%d:%d:0x%x),A=%x,*D=%x,M1=%x,CA=%x\r\n"), BusNumber, DeviceNumber, FunctionNumber, Offset, addr, dwReturn, V360_LB_MAP1_RES, dwConfigAddress));

	// Switch back the area to old mode
	V360_LB_MAP1_RES 	= old_val;

	// No need to reset PCI_CFG AD_LOW bits since they would not be used.

	return dwReturn;
} 
int glbl_wait = 1000;
/* Junk global variable to make sure it does not get removed while optimization */
int my_wait=0;

void OEM_WriteConfigDword(IN ULONG BusNumber, IN ULONG DeviceNumber, IN ULONG FunctionNumber,
                            IN ULONG Offset, IN ULONG dwData)
{
    
	DWORD dwConfigAddress;
	unsigned addr;
	unsigned old_val;

//	CONFIG_WAIT;
	// Get the address in the PCI configuration space for the requested register
	OEM_EncodeConfigAddress( BusNumber, DeviceNumber, FunctionNumber, Offset, &dwConfigAddress );
	// Save OLD Value of LB_MAP1 so that you can restore it after the access
	old_val = V360_LB_MAP1_RES;

	// Now is the address is bigger than PCI memory size that you mapped,
	if(dwConfigAddress >= PCI_CONFIG_SIZE) {
		// Split dwConfigAddress into two parts. The upper part gets written
		// to MAP1 register and the lower part is the address that gets accessed.
		V360_LB_MAP1_RES = ((dwConfigAddress & 0xFFF00000) | (TYPE_CONFIG << 16));
	}
	else {
		V360_LB_MAP1_RES =  (TYPE_CONFIG) << 16 ;
	}

	addr = PciConfigBase + (dwConfigAddress & (PCI_CONFIG_SIZE - 1));
//	DEBUGMSG(1, (TEXT("WCD: (B:D:F:O) = (%d:%d:%d:0x%x), *Data=%x, addr=%x, MAP1=%x\r\n"),  BusNumber, DeviceNumber, FunctionNumber,Offset, dwData, addr, V360_LB_MAP1_RES));

	//  If type is 1, that is address bits 0,1 are 01, Then you need to 
	// program AD_LOW_ENABLE in LB_MAP1_RES and AD_LOW=01 in PCI_CFG
	if(addr & 3) {

		volatile unsigned long *tmp_addr = (unsigned long *)(addr & 0xFFFFFFFC);

		// Set bits 8,9 of PCI_CFG register to the override value of address.
		V360_PCI_CFG = ( V360_PCI_CFG & ~(0x300) ) | ( (addr & 3) << 8);
		V360_LB_MAP1_RES =  (V360_LB_MAP1_RES | 0x10000);
//		DEBUGMSG(1, (TEXT("WCD: addr = 0x%x, V360_PCI_CFG = 0x%x, V360_LB_MAP1_RES = 0x%x "), tmp_addr, V360_PCI_CFG, V360_LB_MAP1_RES));

		// Presently i need to write to this register many times, since if i
		// write only once, it does not reliably get written to the register.
		// Either some timing problem or some wrongly set paramter.
		*tmp_addr = dwData;		// Write code

#if 1 // def PUT_PCI_DELAY
		{
			int i;
			for(i = 0; i < 1; i++)
				for(glbl_wait = 0; glbl_wait < my_wait; glbl_wait ++);	
				*tmp_addr = dwData;		// Write code
		}
		
//		DEBUGMSG(1, (TEXT("RB: 0x%x\n"), *(volatile unsigned long *)(tmp_addr)));
#endif PUT_PCI_DELAY
	}
	else {
		*(volatile unsigned long *)(addr) = dwData;		// Write code

//		DEBUGMSG(1, (TEXT("RB: 0x%x\n"), *(volatile unsigned long *)(addr)));
	}

//	DEBUGMSG(1, (TEXT("WCD: (B:D:F:O) = (%d:%d:%d:0x%x), *Data=%x, addr=%x, MAP1=%x, dwConfigAddress=%x\r\n"), BusNumber, DeviceNumber, FunctionNumber,Offset, dwData, addr, V360_LB_MAP1_RES, dwConfigAddress));

	// Switch back the area to old mode
	V360_LB_MAP1_RES 	= old_val;

	// No need to reset PCI_CFG AD_LOW bits since they would not be used.

	return;

} /* OEM_WriteConfigDword() */

ULONG PCI_Type1_Configuration(ULONG BusNumber, ULONG SlotNumber, PVOID Buffer,
                              ULONG Offset, ULONG Length, BOOL  fSet)
{
    PULONG   pBuffer;
    int      registerOffset, endOffset;
    ULONG    DeviceNumber, FunctionNumber;

    if (BusNumber >= PCI_MAX_BUS)
        return (0);

    DeviceNumber = ((PCI_SLOT_NUMBER *)&SlotNumber)->u.bits.DeviceNumber;
    FunctionNumber = ((PCI_SLOT_NUMBER *)&SlotNumber)->u.bits.FunctionNumber;

    if (DeviceNumber >= PCI_MAX_DEVICES)
        return (0);

    registerOffset = Offset / sizeof(ULONG);
    endOffset = registerOffset + (Length + sizeof(ULONG) - 1) / sizeof(ULONG);
    pBuffer = Buffer;

    for ( ; registerOffset < endOffset; ++registerOffset)
    {
        if (fSet)
            OEM_WriteConfigDword(BusNumber, DeviceNumber, FunctionNumber,
                                 registerOffset * 4, *pBuffer++);
        else
            *(pBuffer++) = OEM_ReadConfigDword(BusNumber, DeviceNumber,
                                               FunctionNumber,
                                               registerOffset * 4);
    }

    return (Length);
}
#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品成人一区二区| www.久久精品| 欧美zozozo| 国产一区二区三区在线看麻豆| 欧美精品一区二区三区蜜桃视频| 久久成人久久爱| 欧美激情一区二区三区四区| av在线播放成人| 亚洲一二三四在线| 欧美一级日韩免费不卡| 国产在线播放一区三区四| 国产精品丝袜一区| 欧美视频一二三区| 久久99精品一区二区三区| 中文字幕精品在线不卡| 在线观看成人小视频| 日av在线不卡| 国产精品久久综合| 欧美性猛片xxxx免费看久爱| 日本不卡一区二区三区| 国产日韩欧美一区二区三区综合 | 欧美日韩国产成人在线91| 婷婷综合另类小说色区| 久久综合一区二区| 欧美中文一区二区三区| 精品综合久久久久久8888| 国产精品毛片大码女人| 欧美裸体bbwbbwbbw| 成人免费高清视频在线观看| 亚洲成av人影院| 久久久不卡网国产精品一区| 欧美这里有精品| 国产精品资源在线看| 一区二区三区精品久久久| 2020国产精品久久精品美国| 在线亚洲欧美专区二区| 精品一区二区三区欧美| 一区二区三区日本| 国产亚洲人成网站| 欧美午夜寂寞影院| 成人动漫一区二区三区| 久久精品国产亚洲aⅴ| 亚洲精品成人天堂一二三| 久久免费电影网| 欧美肥妇毛茸茸| 91在线云播放| 国产白丝网站精品污在线入口| 亚洲午夜久久久久久久久电影院| 久久蜜臀中文字幕| 欧美一区二区三区白人| www.日韩av| 国产高清精品网站| 美女一区二区三区| 午夜视频在线观看一区二区 | 欧美高清视频一二三区 | 全部av―极品视觉盛宴亚洲| 国产精品不卡在线观看| 精品国产成人系列| 欧美一个色资源| 欧美吞精做爰啪啪高潮| 91一区一区三区| 成人美女在线视频| 国产精品系列在线观看| 国内外成人在线| 蜜臀va亚洲va欧美va天堂| 日韩精品久久久久久| 亚洲一区电影777| 亚洲综合成人网| 亚洲综合男人的天堂| 亚洲精品va在线观看| 国产精品成人一区二区艾草 | 91老师片黄在线观看| 国产成人精品网址| 国产a区久久久| 不卡电影一区二区三区| 国产麻豆视频精品| 国产成人在线视频网站| 国产成人自拍高清视频在线免费播放| 国产又黄又大久久| 国产乱码精品一区二区三区五月婷 | 欧美日韩一级二级| 欧美三级在线看| 欧美三级视频在线| 欧美精品丝袜久久久中文字幕| 制服视频三区第一页精品| 欧美日韩成人综合天天影院| 欧美日韩国产片| 337p亚洲精品色噜噜| 91精品国产aⅴ一区二区| 日韩精品中文字幕一区二区三区| 精品久久久久av影院| 久久久久99精品国产片| 国产精品久久久久aaaa| 亚洲欧美激情一区二区| 一个色在线综合| 免费观看久久久4p| 国产麻豆成人精品| a级精品国产片在线观看| 日本精品一区二区三区四区的功能| 在线看国产一区二区| 日韩三级精品电影久久久| 精品少妇一区二区三区视频免付费| 久久精品网站免费观看| 亚洲天堂2014| 婷婷亚洲久悠悠色悠在线播放| 久久99热这里只有精品| a在线播放不卡| 欧美日韩电影在线| 国产日韩精品一区二区浪潮av| 亚洲美女屁股眼交| 蜜臀a∨国产成人精品| 成人精品免费网站| 欧美三级一区二区| 国产欧美一二三区| 天天综合天天做天天综合| 国产乱子轮精品视频| 91国模大尺度私拍在线视频| 亚洲精品一区二区三区影院| 中文字幕一区不卡| 日日夜夜一区二区| 成人黄色小视频在线观看| 欧美日韩情趣电影| 国产精品美女视频| 美女视频一区在线观看| 色婷婷av一区二区三区之一色屋| 欧美电影免费观看高清完整版在 | 日本视频在线一区| www.亚洲免费av| 精品国产三级电影在线观看| 亚洲欧洲日产国码二区| 久久电影网站中文字幕| 欧洲视频一区二区| 久久久久国产一区二区三区四区| 亚洲综合久久久| 波多野结衣中文字幕一区| 日韩免费高清电影| 亚洲国产精品精华液网站| 91网站在线观看视频| 久久久久久毛片| 蜜桃av一区二区三区| 欧美亚洲日本一区| 亚洲色图制服丝袜| 成人免费高清在线| 国产欧美一区二区精品性色| 日韩高清欧美激情| 欧美图区在线视频| 尤物在线观看一区| 91原创在线视频| 久久久国产一区二区三区四区小说 | 欧美电影一区二区三区| 亚洲人精品一区| hitomi一区二区三区精品| 2024国产精品视频| 久久国产欧美日韩精品| 日韩亚洲欧美中文三级| 亚洲成av人影院在线观看网| 欧美午夜在线观看| 亚洲人一二三区| 99精品黄色片免费大全| 国产精品久久久久久久蜜臀 | 一本大道久久a久久精二百| 国产色产综合色产在线视频| 麻豆成人免费电影| 精品欧美久久久| 国内一区二区视频| 久久综合狠狠综合久久综合88 | 韩国v欧美v日本v亚洲v| 日韩一区二区视频在线观看| 丝袜美腿一区二区三区| 欧美老年两性高潮| 蜜臀av一区二区在线免费观看| 91精品国产综合久久久久久| 日本伊人色综合网| 欧美电视剧免费全集观看| 美国一区二区三区在线播放| 欧美成人a视频| 国产盗摄女厕一区二区三区| 国产女主播一区| 成人av集中营| 亚洲男女毛片无遮挡| 欧美丝袜自拍制服另类| 日韩二区三区四区| 337p粉嫩大胆色噜噜噜噜亚洲 | 欧美mv和日韩mv国产网站| 国产乱人伦精品一区二区在线观看| 国产精品视频免费看| 色综合中文字幕| 婷婷久久综合九色综合伊人色| 日韩精品一区国产麻豆| 国产裸体歌舞团一区二区| 亚洲欧美一区二区视频| 欧美三级日韩三级国产三级| 免费xxxx性欧美18vr| 欧美激情一区二区三区四区| 日本韩国精品在线| 看电影不卡的网站| 国产精品欧美久久久久无广告 | 91在线免费看| 天堂久久久久va久久久久| 久久久不卡网国产精品二区|