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

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

?? bsl_pcibus.c

?? BSL64xx是一dsp的程序代碼
?? C
字號:
/******************************************************************************\
* Copyright (C) 2004 by RTD Embedded Technologies, Inc.   All rights reserved.
* Confidential and Proprietary, Not for Public Release
*------------------------------------------------------------------------------
* PROJECT.......... Board Support Library for SPM6420
* VERSION.......... (Defined in README.TXT)
*------------------------------------------------------------------------------
* CONTENT.......... C source file for API of peripheral PCI Bus
* FILENAME......... bsl_pcibus.c
\******************************************************************************/
#define _BSL_PCIBUS_MOD_

#include <bsl_pcibus.h>
#include <c6x.h>		// for SAVE_AMR, RESTORE_AMR, SAVE_SAT, RESTORE_SAT


#if (BSL_PCIBUS_SUPPORT)
/******************************************************************************\
*                         L O C A L   S E C T I O N
\******************************************************************************/


/******************************************************************************\
* static macro declarations
\******************************************************************************/

#if (C64_SUPPORT)
	#define PCIBUS_PCIIS_ERROR_FLAGS (	\
		  _PCI_PCIIS_PCIMASTER_MASK		\
		| _PCI_PCIIS_PCITARGET_MASK )
#else
	#define PCIBUS_PCIIS_ERROR_FLAGS (	\
		  _PCI_PCIIS_PCIMASTER_MASK		\
		| _PCI_PCIIS_PCITARGET_MASK		\
		| _PCI_PCIIS_DMAHALTED_MASK )
#endif

#define PCIBUS_PCIIS_SYSTEM_FLAGS \
	( _PCI_PCIIS_MASTEROK_MASK | PCIBUS_PCIIS_ERROR_FLAGS )

#define PCIBUS_PCIIS_USER_PRST				_PCI_PCIIS_PRST_MASK
#define PCIBUS_PCIIS_USER_EERDY				_PCI_PCIIS_EERDY_MASK
#define PCIBUS_PCIIS_USER_CFGERR			_PCI_PCIIS_CFGERR_MASK
#define PCIBUS_PCIIS_USER_CFGDONE			_PCI_PCIIS_CFGDONE_MASK
#define PCIBUS_PCIIS_USER_PWRHL				_PCI_PCIIS_PWRHL_MASK
#define PCIBUS_PCIIS_USER_PWRLH				_PCI_PCIIS_PWRLH_MASK
#define PCIBUS_PCIIS_USER_HOSTSW			_PCI_PCIIS_HOSTSW_MASK
#define PCIBUS_PCIIS_USER_PWRMGMT			_PCI_PCIIS_PWRMGMT_MASK

#define PCIBUS_PCIIS_USER_FLAGS (	\
	  PCIBUS_PCIIS_USER_PRST		\
	| PCIBUS_PCIIS_USER_EERDY		\
	| PCIBUS_PCIIS_USER_CFGERR		\
	| PCIBUS_PCIIS_USER_CFGDONE		\
	| PCIBUS_PCIIS_USER_PWRHL		\
	| PCIBUS_PCIIS_USER_PWRLH		\
	| PCIBUS_PCIIS_USER_HOSTSW		\
	| PCIBUS_PCIIS_USER_PWRMGMT )


/******************************************************************************\
* static typedef declarations
\******************************************************************************/


/******************************************************************************\
* static function declarations
\******************************************************************************/

void PCIBUS_RDY_ISR_CB();
void PCIBUS_ERR_ISR_CB(Uint32 regPCIIS);

void PCIBUS_accessReqExec();


/******************************************************************************\
* static variable definitions
\******************************************************************************/

// PCI interrupt source mask of user
// Accoring to this mask, the PCIBUS_USER_ISR_CB() function will be called.
Uint32	PCIBUS_PCIIEN_UserMask = 0;

// Pointer to the user's ISR for PCI interrupts
VFxn PCIBUS_USER_ISR_CB = INVALID_VFXN;

volatile Uint32 PCIBUS_breakWait = 0;

volatile PCIBUS_AccessReqObj *PCIBUS_pCurrentAccessReqObj = 0;


/******************************************************************************\
* static function definitions
\******************************************************************************/

/*----------------------------------------------------------------------------*/
void PCIBUS_init()
{
	// remove the flags of the BSL system interrupt sources
	Uint32 Reg = PCI_RGET(PCIIS);
	Reg |= PCIBUS_PCIIS_SYSTEM_FLAGS;
	PCI_RSET(PCIIS,Reg);

	//PCI_RSET( PCIIS, PCIBUS_PCIIS_SYSTEM_FLAGS );

	// enable the proper intettupt sources
	PCI_RSET( PCIIEN, PCIBUS_PCIIS_SYSTEM_FLAGS );

	// init/abort PCI transfer
	PCI_RSET( PCIMC, 0x00040000u );	// CNT is not 0 to enable START field write
	PCI_RSET( PCIMC, 0x00040000u );	// writing START field by 0 --> transfer stop
}

/*----------------------------------------------------------------------------*/
interrupt void BSL_PCI_ISR_DISPATCHER()
{
	// In this ISR, there are assembly instructions whose results depend on
	// AMR and SAT. That is, the AMR and SAT have to be saved and restored.
	Uint32	temp_AMR, temp_SAT;	// to save the AMR and SAT
	register Uint32	regPCIIS;

	// save AMR and SAT
	SAVE_AMR(temp_AMR);
	SAVE_SAT(temp_SAT);

	regPCIIS = PCI_RGET(PCIIS);
	if( regPCIIS & _PCI_PCIIS_MASTEROK_MASK )
	{
		// data transfer has completed successfully
		// there must be no MASTER/TARGET ABORT error
		PCIBUS_RDY_ISR_CB();
	}
	else if( regPCIIS & PCIBUS_PCIIS_ERROR_FLAGS )
	{
		// there is MASTER/TARGET ABORT error
		PCIBUS_ERR_ISR_CB(regPCIIS);
	}

	if( regPCIIS & PCIBUS_PCIIEN_UserMask )
	{
		if( PCIBUS_USER_ISR_CB != INVALID_VFXN ) PCIBUS_USER_ISR_CB();
	}

	// remove flags of all the enabled interrupt sources
	PCI_RSET( PCIIS, PCI_RGET(PCIIEN) );

	// restore AMR and SAT
	RESTORE_AMR(temp_AMR);
	RESTORE_SAT(temp_SAT);
}

/*----------------------------------------------------------------------------*/
// data transfer has completed successfully
void PCIBUS_RDY_ISR_CB()
{
	// clear error flags
	PCIBUS_pCurrentAccessReqObj->regPCIMC &= PCIBUS_TOE_MASK_INV;

	// data transfer has completed
	PCIBUS_pCurrentAccessReqObj->completed = TRUE;

	// release the HW peripheral unit
	PCIBUS_pCurrentAccessReqObj = 0;
}

/*----------------------------------------------------------------------------*/
// an error occured during data transfer
void PCIBUS_ERR_ISR_CB(Uint32 regPCIIS)
{
	Uint32 err = 0;

	// set error flags for user
	if( regPCIIS & _PCI_PCIIS_PCIMASTER_MASK ) err |= PCIBUS_TOE_REC_TARGET_ABORT;
	if( regPCIIS & _PCI_PCIIS_PCITARGET_MASK ) err |= PCIBUS_TOE_REC_MASTER_ABORT;

	#if !(C64_SUPPORT)
	if( regPCIIS & _PCI_PCIIS_DMAHALTED_MASK ) err |= PCIBUS_TOE_DMAHALTED;
	#endif

	PCIBUS_pCurrentAccessReqObj->regPCIMC =
		(PCIBUS_pCurrentAccessReqObj->regPCIMC & PCIBUS_TOE_MASK_INV) | err;

	// data transfer has completed
	PCIBUS_pCurrentAccessReqObj->completed = TRUE;

	// release the HW peripheral unit
	PCIBUS_pCurrentAccessReqObj = 0;
}

/*----------------------------------------------------------------------------*/
/*
 * There is no check whether the previous transfer has already completed !!!
 */
void PCIBUS_accessReqExec()
{
	register Uint32 r0;

	// assert internal address
	PCI_RSET( DSPMA, PCIBUS_pCurrentAccessReqObj->regDSPMA );

	// assert PCI address
	PCI_RSET( PCIMA, PCIBUS_pCurrentAccessReqObj->regPCIMA );

	// preload Master Control register
	r0 = PCIBUS_pCurrentAccessReqObj->regPCIMC;
	PCI_RSET( PCIMC, r0 & 0xFFFF0000u );

	// start data transfer
	PCI_RSET( PCIMC, r0 & 0xFFFF0007u );	// unnecessary to do bit-AND
	//PCI_RSET( PCIMC, r0 );
}


/******************************************************************************\
*                        G L O B A L   S E C T I O N
\******************************************************************************/


/******************************************************************************\
* global variable definitions
\******************************************************************************/


/******************************************************************************\
* global function definitions
\******************************************************************************/

/*----------------------------------------------------------------------------*/
void PCIBUS_makeReq_Mem( PCIBUS_AccessReqObj * pReqObj,
	Uint32 * pInternalBuffer, Uint32 pciAddress,
	Uint16 lengthIn32bWs, Uint32 trDir_autoIncr)
{
	// fill up request object
	if( trDir_autoIncr & PCIBUS_AUTOINCREMENT_OFF )
	{
		// Set bit 1 of DSPMA
		pReqObj->regDSPMA = ((Uint32)(pInternalBuffer) & 0xFFFFFFFCu) | 0x02;
	}
	else
	{
		pReqObj->regDSPMA = ((Uint32)(pInternalBuffer) & 0xFFFFFFFCu);
	}

	pReqObj->regPCIMA = pciAddress;
	pReqObj->regPCIMC =
		((Uint32)(lengthIn32bWs) << 18) |	// 16 (for upper 16 bits) + 2 (32-bit words)
		(trDir_autoIncr & _PCI_PCIMC_START_MASK);
	pReqObj->completed = FALSE;
}

/*----------------------------------------------------------------------------*/
void PCIBUS_makeReq_IO( PCIBUS_AccessReqObj * pReqObj,
	Uint32 *val, Uint32 pciAddress, Uint32 trDir)
{
	// fill up request object
	pReqObj->regDSPMA = (Uint32)(val);

	pReqObj->regPCIMA = pciAddress & 0x0000FFFFu;	// 16-bit I/O address

	if( trDir == PCIBUS_TRANSFER_FROM_DSP )
	{
		pReqObj->regPCIMC = 0x00040000u | PCI_PCIMC_START_IOWRITE;
	}
	else
	{
		pReqObj->regPCIMC = 0x00040000u | PCI_PCIMC_START_IOREAD;
	}
	pReqObj->completed = FALSE;
}

/*----------------------------------------------------------------------------*/
void PCIBUS_makeReq_Cfg( PCIBUS_AccessReqObj * pReqObj,
	Uint32 reg, Uint32 func, Uint32 dev, Uint32 *val, Uint32 trDir)
{
	// fill up request object
	pReqObj->regDSPMA = (Uint32)(val);

	pReqObj->regPCIMA =
		  (((Uint32)0x00010000u) << (dev & 0xF))
		| ((func << 8) & 0xF00u)
		| ((reg << 2) & 0xFFu);

	if( (trDir & _PCI_PCIMC_START_MASK) == PCIBUS_TRANSFER_FROM_DSP )
	{
		pReqObj->regPCIMC = 0x00040000u | PCI_PCIMC_START_CONFIGWRITE;
	}
	else
	{
		pReqObj->regPCIMC = 0x00040000u | PCI_PCIMC_START_CONFIGREAD;
	}
	pReqObj->completed = FALSE;
}

/*----------------------------------------------------------------------------*/
BOOL PCIBUS_accessReq( PCIBUS_AccessReqObj * pReqObj)
{
	Uint32 gie;

	gie = IRQ_globalDisable();

	if (PCIBUS_pCurrentAccessReqObj != 0)
	{
		IRQ_globalRestore(gie);
		pReqObj->regPCIMC = (pReqObj->regPCIMC & PCIBUS_TOE_MASK_INV) | PCIBUS_TOE_HARDWARE_BUSY;
		return FALSE;
	}

	// lock the HW peripheral unit
	PCIBUS_pCurrentAccessReqObj = pReqObj;

	// data transfer is in process
	pReqObj->completed = FALSE;
	pReqObj->regPCIMC = (pReqObj->regPCIMC & PCIBUS_TOE_MASK_INV) | PCIBUS_TOE_TRANSFER_IN_PROCESS;

	IRQ_globalRestore(gie);

	PCIBUS_accessReqExec();

	return TRUE;
}

/*----------------------------------------------------------------------------*/
void PCIBUS_accessMoreReq(
	PCIBUS_AccessReqObj * pReqObjArray, Uint32 numberOfReqs)
{
	PCIBUS_AccessReqObj * pReqObj;
	Uint32 req;

	pReqObj = pReqObjArray;

	while (!PCIBUS_accessReqWithWait(pReqObj));

	pReqObj++;

	for( req = numberOfReqs - 1; req != 0; req--, pReqObj++ )
	{
		PCIBUS_accessReqWithWait( pReqObj );
	}
}

BOOL PCIBUS_accessReqWithWait( PCIBUS_AccessReqObj *reqObj )
{
	if( !PCIBUS_accessReq(reqObj) ) return FALSE;

	while( !(reqObj->completed) );

	return TRUE;
}


#endif /* BSL_PCIBUS_SUPPORT */
/******************************************************************************\
* End of bsl_pcibus.c
\******************************************************************************/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产99久久久久| 欧美日韩高清在线| 色噜噜狠狠色综合欧洲selulu| 91成人免费在线视频| 久久五月婷婷丁香社区| 亚洲免费在线视频一区 二区| 午夜精品成人在线视频| 不卡电影免费在线播放一区| 91精品国产麻豆| 自拍偷拍亚洲欧美日韩| 国产美女一区二区| 欧美日韩性生活| 18欧美乱大交hd1984| 国产另类ts人妖一区二区| 欧美三级午夜理伦三级中视频| 久久久三级国产网站| 日本不卡在线视频| 欧美在线观看视频一区二区三区| 国产欧美一区二区精品婷婷| 理论片日本一区| 欧美人牲a欧美精品| 一区二区三区中文字幕| 9i在线看片成人免费| 国产亚洲综合在线| 久久99久久99| 欧美一区二区人人喊爽| 欧美aaa在线| 欧美精品在线一区二区三区| 亚洲成人你懂的| 色噜噜狠狠成人中文综合| 亚洲色图欧洲色图| jlzzjlzz亚洲女人18| 国产区在线观看成人精品| 精品在线你懂的| 精品国产一区二区三区久久久蜜月 | 久久美女高清视频| 国内精品伊人久久久久av一坑| 精品欧美一区二区在线观看 | 欧美日韩大陆在线| 天堂久久一区二区三区| 69久久夜色精品国产69蝌蚪网| 午夜成人在线视频| 欧美一级在线视频| 久久99国产精品麻豆| 欧美精品一区二区三区蜜桃视频| 久久99热这里只有精品| 国产亚洲精品bt天堂精选| 丰满少妇久久久久久久| 1024成人网| 91久久精品一区二区三| 亚洲最新视频在线观看| 欧美军同video69gay| 精品在线一区二区| 国产精品久久久久一区二区三区共 | 麻豆国产精品777777在线| 久久影音资源网| 成人免费视频一区二区| 亚洲精品视频一区二区| 在线播放中文一区| 国产精品18久久久久久vr | 久久免费精品国产久精品久久久久 | 国产日韩欧美综合一区| 91麻豆免费看| 青青草国产成人99久久| 国产亚洲综合在线| 欧美亚洲一区三区| 国产在线不卡一区| 亚洲欧美韩国综合色| 日韩欧美在线123| 成人网页在线观看| 亚洲午夜视频在线观看| 精品对白一区国产伦| 色哟哟一区二区在线观看| 美女免费视频一区二区| 最新国产成人在线观看| 日韩欧美综合在线| 色八戒一区二区三区| 狠狠色2019综合网| 亚洲欧美视频在线观看视频| 精品国产一区二区亚洲人成毛片| 91丨porny丨最新| 精品一区二区精品| 亚洲国产美国国产综合一区二区| 久久久欧美精品sm网站| 91精品欧美一区二区三区综合在| 岛国精品在线播放| 久久精品国产澳门| 亚洲午夜免费电影| 国产精品青草久久| 久久久三级国产网站| 欧美一区在线视频| 欧美视频在线不卡| av高清不卡在线| 国产宾馆实践打屁股91| 免费观看在线色综合| 亚洲精品成人a在线观看| 国产女主播视频一区二区| 91精品国产入口| 在线观看国产91| 白白色 亚洲乱淫| 国产成人在线观看| 国产麻豆午夜三级精品| 免费精品99久久国产综合精品| 亚洲一区二区三区四区的| 最新国产成人在线观看| 日韩美女久久久| 国产精品成人一区二区三区夜夜夜 | 亚洲色图欧美偷拍| 中文字幕综合网| 亚洲视频资源在线| 成人免费一区二区三区在线观看| 欧美精品一区二区三区四区| 欧美大胆人体bbbb| 精品人伦一区二区色婷婷| 精品国产乱码久久久久久久| 日韩一区二区免费视频| 欧美一区二区在线免费观看| 制服丝袜一区二区三区| 欧美日韩成人综合天天影院| 欧美日韩免费观看一区二区三区 | 精品美女在线播放| 日韩欧美中文字幕一区| www国产亚洲精品久久麻豆| 久久夜色精品一区| 国产日韩欧美综合在线| 国产精品久久久久影院亚瑟| 亚洲六月丁香色婷婷综合久久| 亚洲欧美电影院| 亚洲一区二区精品久久av| 午夜精品免费在线观看| 蜜桃av噜噜一区二区三区小说| 麻豆国产一区二区| 粉嫩aⅴ一区二区三区四区五区 | 国产乱子伦一区二区三区国色天香| 精品一区二区三区蜜桃| 成人一区二区三区在线观看| 99re热这里只有精品视频| 91黄色免费观看| 欧美一二三区精品| 中文字幕av免费专区久久| 亚洲美女视频一区| 日韩福利电影在线| 国产宾馆实践打屁股91| 欧美伊人久久大香线蕉综合69| 91精品国产福利在线观看| 久久久久国产成人精品亚洲午夜| 国产精品视频你懂的| 亚洲国产精品久久久久婷婷884| 男女性色大片免费观看一区二区| 国产精品综合一区二区| 欧洲日韩一区二区三区| 日韩免费一区二区| 亚洲欧洲国产专区| 免费在线观看日韩欧美| 白白色亚洲国产精品| 欧美一区二区三区四区高清| 欧美国产日韩精品免费观看| 午夜精品久久久久久久蜜桃app| 国产一区啦啦啦在线观看| 在线观看亚洲专区| 欧美国产一区二区| 日本美女一区二区三区| 成人激情免费视频| 337p亚洲精品色噜噜噜| 亚洲女同一区二区| 国产一区二区三区精品欧美日韩一区二区三区| 99久久精品免费看国产 | 国产一区二区三区久久久| 欧美视频日韩视频在线观看| 国产亚洲短视频| 日韩电影在线观看一区| 色吊一区二区三区| 国产精品久久久久久久第一福利| 蜜桃免费网站一区二区三区| 欧美色网一区二区| 国产精品久久久一本精品 | 在线观看亚洲成人| 国产精品欧美一区喷水| 青娱乐精品视频| 欧美无乱码久久久免费午夜一区 | 久久精品亚洲精品国产欧美kt∨| 亚洲大片在线观看| 在线观看日韩国产| 亚洲色图欧美偷拍| 99久久久久久99| 国产精品久久久久aaaa| 国产91精品入口| 久久九九久精品国产免费直播| 免费成人你懂的| 777色狠狠一区二区三区| 亚洲一区二区精品视频| 91精彩视频在线| 亚洲欧洲成人精品av97| 成人免费av在线| 中文一区一区三区高中清不卡| 精油按摩中文字幕久久| 欧美变态tickle挠乳网站| 日本不卡视频在线观看| 91精品国产欧美一区二区| 五月天一区二区三区|