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

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

?? cpcimultiint.c

?? Vxworks下
?? C
字號:
/**********************************************************************
 chengjy@felab, copyright 2002-2004
 cpciMultiInt.c
 函數:	
		void f9656Init();
		void f9656IntFunc(int intIndex);
		void f9656IntHandle(int boardNum);
		void f9656ShutDown();
 調用:			無
 被調用:		硬件響應底層函數,被命令通道調用
 說明:			本文件與硬件關聯緊密,僅為中斷響應的框架,
 				需要根據實際情況添加中斷響應和處理代碼才能使用
 **********************************************************************/
#include "vxWorks.h"
#include "logLib.h"
#include "arch/ppc/ivPpc.h"
#include "intLib.h"
#include "taskLib.h"
#include "semLib.h"
#include "string.h"

#include "cpciMultiInt.h"

#if 0	/*不打印9656中斷信息*/
#define F9656LOG(a,b,c,d,e,f,g)	;			/*帶6個參數的logMsg*/
#define F9656PRINT1(x)		;			/*沒有參數的printf*/
#define F9656PRINT2(x,y)		;			/*帶一個參數的printf*/
#else
#define F9656LOG(a,b,c,d,e,f,g)	;		/*logMsg((a),(b),(c),(d),(e),(f),(g))*/
#define F9656PRINT1(x)			printf(x)			
#define F9656PRINT2(x,y)		printf((x),(y))			
#endif

struct pciBoardIndex	pciBoard[MAX_BOARD_SUPPORT];
struct pciIntIndex		pciInt[MAX_INT_SUPPORT];
int pciBoardNum;				/*實際使用的pci板的數目,從0開始*/

void f9656Init();
void f9656IntFunc(int intIndex);
void f9656IntHandle(int boardNum);
void f9656ShutDown();

/**********************************************************************
 void f9656Init()
 函數描述: 	9656初始化,創建信號燈,發起服務任務,
               		計算基地址,掛接中斷。
 參數:		無
 返回:		無
 調用:		void f9656IntFunc(int intIndex);
			void f9656IntHandle(int boardNum);
 被調用:	用戶程序初始化部分
 			命令通道的命令
 **********************************************************************/
void f9656Init()
{
	int busNo,deviceNo,funcNo;
	int intIndex;
	int intNum;
	int i,j;
	STATUS state;
	
	char taskName[30];
	
	/*需要避免重入的控制*/

	/*初始化每塊插板信息*/
	for(i=0;i<MAX_BOARD_SUPPORT;i++)
	{
		/*首先全部設置為0*/
		pciBoard[i].pcimem0		= 0;
		pciBoard[i].pcimem1		= 0;
		pciBoard[i].intNum		= 0xFF;
		pciBoard[i].intTimes	= 0;
	}

	/*初始化*/
	for(pciBoardNum=0;pciBoardNum<MAX_BOARD_SUPPORT;pciBoardNum++)
	{
		/*尋找9656*/
		if(pciFindDevice(PCI_F9656_VENDOR_ID,PCI_F9656_DEVICE_ID,pciBoardNum,&busNo,&deviceNo,&funcNo)!=OK)
		{
			break;
		}
		logMsg("f9656Init: pci device, vendor 0x%x,device 0x%x, index 0x%x\n",PCI_F9656_VENDOR_ID,PCI_F9656_DEVICE_ID,pciBoardNum,0,0,0);

		/*mem基地址*/
		pciConfigInLong(busNo,deviceNo,funcNo,0x10,&(pciBoard[pciBoardNum].pcimem0));
		pciBoard[pciBoardNum].pcimem0 = (UINT)PCIMEM2CPU(pciBoard[pciBoardNum].pcimem0&(~0xf));
		pciConfigInLong(busNo,deviceNo,funcNo,0x18,&(pciBoard[pciBoardNum].pcimem1));
		pciBoard[pciBoardNum].pcimem1 = (UINT)PCIMEM2CPU(pciBoard[pciBoardNum].pcimem1&(~0xf));

		/*中斷號*/
		pciConfigInByte(busNo,deviceNo,funcNo,0x3C,&(pciBoard[pciBoardNum].intNum));
		pciBoard[pciBoardNum].intNum = CPCIINT2CPU(pciBoard[pciBoardNum].intNum);

		/*板號,可以通過9656的首部寄存器或者memory 1 某個地址的值不同來區分,
		這里為了簡便直接賦值為pciBoardNum+1*/
		pciBoard[pciBoardNum].index = pciBoardNum+1;
		
		logMsg("f9656Init: memBase: 0x%8x,0x%8x,intNum 0x%x\n",
				pciBoard[pciBoardNum].pcimem0,pciBoard[pciBoardNum].pcimem1,pciBoard[pciBoardNum].intNum,0,0,0);			
	}	
		
	/*如果沒有找到任何cpci 器件,退出*/
	if(pciBoardNum==0)
	{
		logMsg("f9656Init: no cpci board found, now exit\n",0,0,0,0,0,0);
		return;
	}

	/*沒有找到cpci器件的中斷index,對應的enable全部為0*/
	for(i=0;i<MAX_INT_SUPPORT;i++)
	{
		pciInt[i].enable = 0;
	}
	for(i=0;i<pciBoardNum;i++)
	{
		/*某個中斷相應位上的1表示對應有插板使用此中斷*/
		intIndex = INT_NUM2INDEX(pciBoard[pciBoardNum].intNum);
		pciInt[intIndex].enable = (pciInt[intIndex].enable | (0x01<<i));	
	}

	/*逐個使能中斷*/
	for(intIndex=0;intIndex<MAX_INT_SUPPORT;intIndex++)
	{
		if(pciInt[intIndex].enable!=0)
		{
			intNum = INT_INDEX2NUM(intIndex);
			F9656LOG("f9656Init: int number: 0x%x connected\n",intNum,0,0,0,0,0);
			state = intConnect((INUM_TO_IVEC(intNum)),f9656IntFunc,intIndex);
			if(state!=OK)
				logMsg("f9656Init: error in intConnect\n",0,0,0,0,0,0);
			intEnable(intNum);
		}
	}

	/*逐個初始化插板*/
	for(i=0;i<pciBoardNum;i++)
	{
		/*創建信號燈*/
		pciBoard[i].semPci = semCCreate(SEM_Q_FIFO,SEM_EMPTY);
				
		if(pciBoard[i].semPci == NULL)
		{
			logMsg("f9656Init: unable to create semF9656\n",0,0,0,0,0,0);
			exit(-1);
		}

		/*發起相應的處理函數*/
		sprintf(taskName,TNAME_F9656INTHDL,"%d",i);
		taskSpawn(taskName,TPRI_F9656INTHDL,0,USER_STACK_SIZE,(FUNCPTR)f9656IntHandle,i,0,0,0,0,0,0,0,0,0);
	}
}

/**********************************************************************
 void f9656IntFunc(int intIndex)
 函數描述:	中斷服務程序,掛接到9656中斷,中斷時自動被
 				調用。具體工作由f9656IntHandle() 完成,使用各板的
                 		semPci 同步。此函數中的清中斷機制直接針對硬件,
                 		如果使用9656之外的其它pci橋片,請參閱芯片的datasheet.
 參數:		index,	產生的中斷的index,取值范圍從0 到3.
 返回:		無
 調用:		無
 被調用:	void f9656Init()
 **********************************************************************/
void f9656IntFunc(int intIndex)
{
	int  intNum;
	UINT regValue;
	int  pciIndex;

	intNum = INT_INDEX2NUM(intIndex);
	/*屏蔽中斷*/
	intDisable(intNum);
		
	F9656LOG("f9656IntFunc: interrupt received\n",0,0,0,0,0,0);

	/*獲取中斷的板號*/
	for(pciIndex=0;pciIndex<MAX_BOARD_SUPPORT;pciIndex++)
	{
		if((pciInt[intIndex].enable&(0x01<<pciIndex))!=0)
		{
			/*逐個判斷可能產生此中斷的cpci 插板是否已經產生了中斷*/
			regValue = *F9656MEM2CPU0(0x68,pciIndex);
			if((regValue&0x00002000)!=0)
			{
				/*清 單板的中斷標志*/
				*F9656MEM2CPU0(0xA8,pciIndex)	= 0x18000000;
				/*釋放信號燈,通知f9656IntHandle 開始處理*/
				semGive(pciBoard[pciIndex].semPci);
			}
		}
	}

	/*允許響應其它使用此中斷號的插板的中斷*/
	intEnable(intNum);
}

/**********************************************************************
 void f9656IntHandle(int boardNum)
 函數描述:	中斷后的實際任務處理函數,中斷服務程序
                		并不執行大量工作,只是通知此函數。
 參數:		boardNum,	產生中斷的板的cpci 號,取值范圍0~7
 返回:		無
 調用:		void f9656ShutDown()
 被調用:	void f9656Init()
 **********************************************************************/
void f9656IntHandle(int boardNum)
{
	while(1)
	{
		if(semTake(pciBoard[boardNum].semPci,WAIT_FOREVER)!=OK)
		{
			logMsg("f9656IntHandle: error in semTake %d\n",boardNum,0,0,0,0,0);
			break;
		}

		/*成功獲取信號燈,說明該板產生了一次中斷*/
		pciBoard[boardNum].intTimes++;

		/*防止過界*/
		if(pciBoard[boardNum].intTimes==0x1000000)
			pciBoard[boardNum].intTimes = 0;

		/*允許9656 再次傳送數據到零槽*/
	}
	/*出錯退出*/
	logMsg("f9656IntHandle: something wrong, now exit\n",0,0,0,0,0,0);
	f9656ShutDown();
}

/**********************************************************************
 void f9656ShutDown()
 函數描述:	關閉9656 的操作,主要是解決一些在SHELL 下重復
 				使用F9656Init()的信號燈沒有刪除的問題,在這里
                 		刪除信號燈以及中斷后的處理函數。
 參數:		無
 返回:		無
 調用:		無
 被調用:	void f9656IntHandle(int boardNum)
 			用戶在shell下調用
 			命令通道的某個命令
 **********************************************************************/
void f9656ShutDown()
{
	int i;
	int intIndex;
	char taskName[30];

	/*需要添加避免重入的判斷*/

	/*按中斷index 0~3 關閉中斷*/
	for(intIndex=0;intIndex<4;intIndex++)
	{
		intDisable(INT_INDEX2NUM(intIndex));
	}
	/*按插板index 0~7結束任務*/
	for(i=0;i<pciBoardNum;i++)
	{
		/*刪除中斷服務任務*/
		sprintf(taskName,TNAME_F9656INTHDL,"%d",i);
		/*如果是被f9656IntHandle()調用,自己會退出,否則必須刪除任務*/
		if(taskNameToId(taskName)!=taskIdSelf())
		{
			taskDelete(taskNameToId(taskName));
			F9656LOG("f9656ShutDown:%d deleted\n",i,0,0,0,0,0);
		}
			
		/*刪除信號燈*/
		semDelete(pciBoard[i].semPci);
	}
	logMsg("f9656ShutDown:9656 shut down now\n",0,0,0,0,0,0);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91女厕偷拍女厕偷拍高清| 五月婷婷久久丁香| 日韩成人一区二区三区在线观看| 91网页版在线| 18欧美乱大交hd1984| 成人免费视频国产在线观看| 欧美精品一区二区在线观看| 精品一区二区三区视频在线观看| 日韩视频一区二区在线观看| 日本视频在线一区| 日韩一卡二卡三卡四卡| 久久99精品国产91久久来源| 精品少妇一区二区三区在线播放 | 精品国产伦一区二区三区免费| 日本在线不卡视频一二三区| 6080日韩午夜伦伦午夜伦| 日韩主播视频在线| 一本一道久久a久久精品综合蜜臀| 最新中文字幕一区二区三区| gogo大胆日本视频一区| 一区二区三区四区五区视频在线观看| 国产xxx精品视频大全| 国产精品美女久久久久久久久| 99在线热播精品免费| 亚洲色图在线播放| 欧美在线视频不卡| 日本亚洲电影天堂| 国产亚洲欧洲997久久综合| jizz一区二区| 亚洲免费在线观看视频| 色综合久久久久久久久| 午夜精品一区在线观看| 精品国产sm最大网站免费看| 懂色av噜噜一区二区三区av| 亚洲国产岛国毛片在线| 91成人免费电影| 久久国产精品一区二区| 国产精品免费视频观看| 91免费版pro下载短视频| 午夜日韩在线电影| 国产网站一区二区三区| 欧美中文字幕一区二区三区| 亚洲影院在线观看| 久久日一线二线三线suv| av毛片久久久久**hd| 日韩va亚洲va欧美va久久| 久久精品人人做人人综合| 日本精品一区二区三区四区的功能| 亚洲黄网站在线观看| 精品av综合导航| 欧美性一级生活| 丁香啪啪综合成人亚洲小说 | 中文字幕第一区第二区| 在线观看欧美日本| 激情久久久久久久久久久久久久久久| 亚洲视频在线观看三级| 日韩小视频在线观看专区| 99国产欧美另类久久久精品| 热久久久久久久| 日韩理论片在线| 精品国产一区二区精华| 91福利在线看| 粉嫩蜜臀av国产精品网站| 青椒成人免费视频| 亚洲欧美日韩一区| 久久久久国产精品免费免费搜索| 精品视频免费在线| 91美女在线观看| 丰满放荡岳乱妇91ww| 免费高清在线视频一区·| 午夜精品久久久久久久蜜桃app| 一区二区不卡在线视频 午夜欧美不卡在| 国产亚洲人成网站| 欧美国产丝袜视频| 中文字幕精品在线不卡| 国产精品污网站| 国产精品久久影院| 亚洲欧洲成人自拍| 亚洲精品成人在线| 亚洲高清在线精品| 日韩va亚洲va欧美va久久| 日韩精品视频网站| 久久电影网电视剧免费观看| 美脚の诱脚舐め脚责91| 极品销魂美女一区二区三区| 国产中文一区二区三区| 国产精品一区二区三区乱码| 国产成人在线看| 99精品视频中文字幕| 日本黄色一区二区| 欧美老肥妇做.爰bbww视频| 91精品国产综合久久福利软件 | 欧美一区二区精品在线| 欧美tickling网站挠脚心| 国产亚洲视频系列| 亚洲精品欧美激情| 亚洲bt欧美bt精品777| 久久99精品国产91久久来源| 国产成人精品午夜视频免费 | 欧美丝袜自拍制服另类| 3d动漫精品啪啪| 久久精品人人做人人综合| 18欧美乱大交hd1984| 午夜在线电影亚洲一区| 捆绑变态av一区二区三区| 国产精品亚洲专一区二区三区| 99riav久久精品riav| 欧美日韩午夜精品| 久久久噜噜噜久久中文字幕色伊伊 | 日韩不卡一二三区| 国产a区久久久| 欧美日韩国产系列| 国产日韩精品一区| 亚洲图片欧美一区| 国产剧情av麻豆香蕉精品| 一本久道中文字幕精品亚洲嫩| 这里只有精品视频在线观看| 中文字幕乱码亚洲精品一区| 亚洲国产wwwccc36天堂| 国产一区美女在线| 欧美日韩黄视频| 国产精品色哟哟| 丝袜诱惑亚洲看片| 成人18精品视频| 日韩精品一区二区三区视频在线观看| 国产精品家庭影院| 麻豆freexxxx性91精品| 91蜜桃网址入口| 26uuu另类欧美亚洲曰本| 亚洲一区二区三区美女| 国产精品一区2区| 3d成人动漫网站| 综合久久久久久| 国产激情偷乱视频一区二区三区| 欧美视频一区二区| 国产精品久久久久久久久图文区| 免费的国产精品| 在线观看视频91| 亚洲图片你懂的| 国产激情一区二区三区桃花岛亚洲| 91精品黄色片免费大全| 一区二区久久久久久| thepron国产精品| 久久久电影一区二区三区| 日本成人在线看| 欧美私模裸体表演在线观看| 亚洲天堂中文字幕| 成人妖精视频yjsp地址| 久久九九99视频| 韩国视频一区二区| 精品剧情v国产在线观看在线| 天天爽夜夜爽夜夜爽精品视频| 色哟哟在线观看一区二区三区| 国产精品久久久久影院老司| 国产精品乡下勾搭老头1| 日韩精品在线一区二区| 亚洲成人中文在线| 欧美羞羞免费网站| 亚洲国产综合人成综合网站| av不卡在线播放| 亚洲国产成人午夜在线一区| 国产酒店精品激情| 国产欧美精品一区二区三区四区| 国产精品99久久久久久有的能看| 日韩欧美国产麻豆| 狠狠色丁香婷综合久久| 2019国产精品| 国产精品99久久久| 欧美韩国日本不卡| 成人av网在线| 亚洲欧美偷拍另类a∨色屁股| 99综合电影在线视频| 亚洲黄色小说网站| 精品视频色一区| 日产国产欧美视频一区精品| 日韩免费福利电影在线观看| 麻豆国产欧美一区二区三区| 精品日本一线二线三线不卡| 国内精品国产成人| 欧美国产精品v| 91色综合久久久久婷婷| 亚洲欧美一区二区久久 | 99久久精品国产毛片| 综合av第一页| 欧美日韩中文字幕精品| 日韩av电影一区| 久久精品夜色噜噜亚洲a∨| 成人亚洲一区二区一| 一区二区在线看| 91精品国产91综合久久蜜臀| 国产综合色在线视频区| 国产精品免费久久久久| 欧美在线短视频| 日韩极品在线观看| 国产视频一区在线播放| 色婷婷综合久色| 麻豆精品视频在线观看| 中文字幕va一区二区三区| 欧美在线免费播放| 精品一区二区免费|