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

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

?? qdinit.c

?? Mavell AP32 無線模塊驅動。VxWorks BSP BootRom源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/********************************************************************************* qdInit.c** DESCRIPTION:*       QD initialization module** DEPENDENCIES:   Platform** FILE REVISION NUMBER:********************************************************************************/#include "qd.h"#include "armboot.h"#include <stdarg.h>#define PORTS_COUNT				  7#define SMI_OP_CODE_BIT_READ      1#define SMI_OP_CODE_BIT_WRITE     0#define SMI_BUSY                  (1<<28)#define READ_VALID                (1<<27)#define SMI_TIMEOUT_COUNTER		  10000#define ETHER_SMI_REG			  0x80008010typedef unsigned int              SMI_REG;#define GT_LPORT_2_PORT(lport)    (GT_U8)(lport & 0xff)#define GT_PORT_2_LPORT(port)     (GT_32)(port & 0xff)/* Start address of ports related register.             */#define PORT_REGS_START_ADDR    0x8/* Start address of global register.                    */#define GLOBAL_REGS_START_ADDR  0xF#define QD_REG_SWITCH_ID		0x3#define QD_REG_PORT_CONTROL		0x4#define QD_REG_PORT_VLAN_MAP		0x6#define QD_REG_PVID			0x7#define QD_REG_GLOBAL_CONTROL		0x4#define DEV_MC_RATE_PERCENT	\						( DEV_88E6021 | DEV_88E6051 | DEV_88E6052 )#define DEV_QoS			\						( DEV_88E6021 | DEV_FF_XP | DEV_FF_HG |		\						  DEV_88E6051 | DEV_88E6052 | DEV_88E6061 |	\						  DEV_88E6062 | DEV_88E6063 | DEV_FH_VPN )/* This macro is used to calculate the register's SMI   *//* device address, according to the baseAddr            *//* field in the Switch configuration struct.            */#define CALC_SMI_DEV_ADDR(_baseAddr,_smiDevAddr)        \            ((_baseAddr) + (_smiDevAddr))#define CALC_MASK(fieldOffset,fieldLen,mask)        \            if((fieldLen + fieldOffset) >= 16)      \                mask = (0 - (1 << fieldOffset));    \            else                                    \                mask = (((1 << (fieldLen + fieldOffset))) - (1 << fieldOffset))/* need to check port number(_hwPort) later */#define IS_VALID_API_CALL(dev,_hwPort, _devName)	    	\	(( (!(dev->devName & (_devName))) 		\	 ) ? GT_NOT_SUPPORTED : GT_OK)#define SMI_READ(pData)                                		\*pData = *(volatile unsigned int *) (ETHER_SMI_REG);  		\*pData = WORD_SWAP(*pData)#define SMI_WRITE(data)                                 	\*(volatile unsigned int *)(ETHER_SMI_REG) = WORD_SWAP(data)#define CPU_PORT_NUM	5//GT_SYS_CONFIG   	cfg;GT_QD_DEV       	qddev;GT_QD_DEV       	*qd_dev = &qddev;/******************************************************************************* bool etherReadMIIReg (unsigned int portNumber , unsigned int MIIReg,* unsigned int* value)** Description* This function will access the MII registers and will read the value of* the MII register , and will retrieve the value in the pointer.* Inputs* portNumber - one of the 2 possiable Ethernet ports (0-1).* MIIReg - the MII register offset.* Outputs* value - pointer to unsigned int which will receive the value.* Returns Value* true if success.* false if fail to make the assignment.* Error types (and exceptions if exist)*/GT_STATUS evFFReadMii (GT_QD_DEV* dev, unsigned int portNumber , unsigned int MIIReg,					 unsigned int* value){	SMI_REG smiReg;	unsigned int phyAddr;	unsigned int timeOut = 100; /* in 100MS units */	int i;			/* first check that it is not busy */	SMI_READ (&smiReg);		if (smiReg & SMI_BUSY) {		for(i = 0 ; i < SMI_TIMEOUT_COUNTER; i++);		do {			SMI_READ (&smiReg);			if (timeOut-- < 1) {				return GT_FAIL;			}					} while (smiReg & SMI_BUSY);	}		/* not busy */	phyAddr = portNumber;	smiReg =  (phyAddr << 16) | (SMI_OP_CODE_BIT_READ << 26) | (MIIReg << 21) 		| SMI_OP_CODE_BIT_READ << 26;	SMI_WRITE (smiReg);	timeOut = 100; /* initialize the time out var again */	SMI_READ (&smiReg);	if (!(smiReg & READ_VALID))     {		i = 0;		while (i < SMI_TIMEOUT_COUNTER) {	i++; }		do 		{			SMI_READ (&smiReg);			if (timeOut-- < 1 ) 			{				return GT_FAIL;			}        } while (!(smiReg & READ_VALID));    }	*value = (unsigned int)(smiReg & 0xffff);    	return GT_OK;}/****************************************************************************** * bool etherWriteMIIReg (unsigned int portNumber , unsigned int MIIReg,* unsigned int value)* * Description* This function will access the MII registers and will write the value* to the MII register.* Inputs* portNumber - one of the 2 possiable Ethernet ports (0-1).* MIIReg - the MII register offset.* value -the value that will be written.* Outputs* Returns Value* true if success.* false if fail to make the assignment.* Error types (and exceptions if exist)*/GT_STATUS evFFWriteMii (GT_QD_DEV* dev, unsigned int portNumber , unsigned int MIIReg,						unsigned int value){	SMI_REG smiReg;	unsigned int phyAddr;	unsigned int timeOut = 10; /* in 100MS units */	int i;		/* first check that it is not busy */	    SMI_READ (&smiReg);    if (smiReg & SMI_BUSY)     {        for (i = 0 ; i < SMI_TIMEOUT_COUNTER; i++);        do 		{            SMI_READ (&smiReg);            if (timeOut-- < 1) 			{				return GT_FAIL;			}			        } while (smiReg & SMI_BUSY);    }	/* not busy */    phyAddr = portNumber;	    smiReg = 0; /* make sure no garbage value in reserved bits */    smiReg = smiReg | (phyAddr << 16) | (SMI_OP_CODE_BIT_WRITE << 26) |		(MIIReg << 21) | (value & 0xffff);	    SMI_WRITE (smiReg);	    return (GT_OK);}/******************************************************************************** hwReadPortReg** DESCRIPTION:*       This function reads a switch's port register.** INPUTS:*       portNum - Port number to read the register for.*       regAddr - The register's address.** OUTPUTS:*       data    - The read register's data.** RETURNS:*       GT_OK on success, or*       GT_FAIL otherwise.** COMMENTS:*       None.********************************************************************************/GT_STATUS hwReadPortReg(    IN GT_QD_DEV *dev,    IN  GT_U8    portNum,    IN  GT_U8    regAddr,    OUT GT_U16   *pData){    GT_U8       phyAddr;    GT_STATUS   retVal;	GT_U32 u32Data;    phyAddr = CALC_SMI_DEV_ADDR(dev->baseRegAddr,                                portNum + PORT_REGS_START_ADDR);	//evFFReadMii(dev, phyAddr, regAddr,(GT_U32*) pData);    retVal =  evFFReadMii(dev, (unsigned int) phyAddr, (unsigned int) regAddr, (unsigned int*)&u32Data);	DBG_INFO("hwReadPortReg:retVal= 0x%x.\n",retVal);    DBG_INFO("Read from port(%d) register:",portNum);	DBG_INFO("phyAddr 0x%x",phyAddr);	DBG_INFO("regAddr 0x%x",regAddr);	DBG_INFO("data 0x%x.\n",u32Data);	*pData = (GT_U16)u32Data;    DBG_INFO("data 0x%x.\n",*pData);    return retVal;}/******************************************************************************** hwWritePortReg** DESCRIPTION:*       This function writes to a switch's port register.** INPUTS:*       portNum - Port number to write the register for.*       regAddr - The register's address.*       data    - The data to be written.** OUTPUTS:*       None.** RETURNS:*       GT_OK on success, or*       GT_FAIL otherwise.** COMMENTS:*       None.********************************************************************************/GT_STATUS hwWritePortReg(    IN GT_QD_DEV *dev,    IN  GT_U8    portNum,    IN  GT_U8    regAddr,    IN  GT_U16   data){    GT_U8   phyAddr;    phyAddr = CALC_SMI_DEV_ADDR(dev->baseRegAddr,                                portNum + PORT_REGS_START_ADDR);    DBG_INFO("Write to port(%d) register: phyAddr 0x%x, regAddr 0x%x, ",              portNum,phyAddr,regAddr);    DBG_INFO("data 0x%x.\n",data);    return evFFWriteMii(dev,phyAddr,regAddr,data);}GT_STATUS phyPatch(GT_QD_DEV *dev){	GT_U32 u32Data;	/*	 * Set Bit2 of Register 29 of any phy	 */    if(evFFReadMii(dev, (unsigned int)dev->baseRegAddr,(unsigned int)29,(unsigned int*)&u32Data) != GT_OK)	{				return GT_FAIL;	}    if(evFFWriteMii(dev,(unsigned int)dev->baseRegAddr,(unsigned int)29,(GT_U16)u32Data|0x4) != GT_OK)	{				return GT_FAIL;	}	/*	 * ReSet Bit6 of Register 30 of any phy	 */    if(evFFReadMii(dev,(unsigned int)dev->baseRegAddr,(unsigned int)30,(unsigned int*)&u32Data) != GT_OK)	{				return GT_FAIL;	}    if(evFFWriteMii(dev,(unsigned int)dev->baseRegAddr,(unsigned int)30,(GT_U16)u32Data&(~0x40)) != GT_OK)	{				return GT_FAIL;	}	return GT_OK;}/******************************************************************************** hwSetPortRegField** DESCRIPTION:*       This function writes to specified field in a switch's port register.** INPUTS:*       portNum     - Port number to write the register for.*       regAddr     - The register's address.*       fieldOffset - The field start bit index. (0 - 15)*       fieldLength - Number of bits to write.*       data        - Data to be written.** OUTPUTS:*       None.** RETURNS:*       GT_OK on success, or*       GT_FAIL otherwise.** COMMENTS:*       1.  The sum of fieldOffset & fieldLength parameters must be smaller-*           equal to 16.********************************************************************************/GT_STATUS hwSetPortRegField(    IN GT_QD_DEV *dev,    IN  GT_U8    portNum,    IN  GT_U8    regAddr,    IN  GT_U8    fieldOffset,    IN  GT_U8    fieldLength,    IN  GT_U16   data){    GT_U16 mask;    GT_U16 tmpData;    if(hwReadPortReg(dev,portNum,regAddr,&tmpData) != GT_OK)        return GT_FAIL;    CALC_MASK(fieldOffset,fieldLength,mask);    /* Set the desired bits to 0.                       */    tmpData &= ~mask;    /* Set the given data into the above reset bits.    */    tmpData |= ((data << fieldOffset) & mask);    DBG_INFO("Write to port(%d) register: regAddr 0x%x, ",              portNum,regAddr);    DBG_INFO("fieldOff %d, fieldLen %d, data 0x%x.\n",fieldOffset,              fieldLength,data);    return hwWritePortReg(dev,portNum,regAddr,tmpData);}/******************************************************************************** gstpSetPortState** DESCRIPTION:*       This routine set the port state.** INPUTS:*       port  - the logical port number.*       state - the port state to set.** OUTPUTS:*       None.** RETURNS:*       GT_OK   - on success*       GT_FAIL - on error** COMMENTS:*** GalTis:********************************************************************************/GT_STATUS gstpSetPortState(    IN GT_QD_DEV *dev,    IN GT_LPORT           port,    IN GT_PORT_STP_STATE  state){    GT_U8           phyPort;        /* Physical port                */    GT_U16          data;           /* Data to write to register.   */    GT_STATUS       retVal;         /* Functions return value.      */    DBG_INFO("gstpSetPortState Called.\n");    phyPort = GT_LPORT_2_PORT(port);    data    = state;    /* Set the port state bits.             */    retVal= hwSetPortRegField(dev,phyPort, QD_REG_PORT_CONTROL,0,2,data);    if(retVal != GT_OK)    {        DBG_INFO("Failed.\n");        return retVal;    }    DBG_INFO("OK.\n");    return GT_OK;}/******************************************************************************** qdLoadDriver** DESCRIPTION:*       QuarterDeck Driver Initialization Routine. *       This is the first routine that needs be called by system software. *       It takes *cfg from system software, and retures a pointer (*dev) *       to a data structure which includes infomation related to this QuarterDeck*       device. This pointer (*dev) is then used for all the API functions. ** INPUTS:*       cfg  - Holds device configuration parameters provided by system software.** OUTPUTS:*       dev  - Holds device information to be used for each API call.** RETURNS:*       GT_OK               - on success*       GT_FAIL             - on error*       GT_ALREADY_EXIST    - if device already started*       GT_BAD_PARAM        - on bad parameters** COMMENTS:* 	qdUnloadDriver is also provided to do driver cleanup.********************************************************************************/GT_STATUS qdLoadDriver(    IN  GT_SYS_CONFIG   *cfg,    OUT GT_QD_DEV	*dev){    GT_STATUS   retVal;    GT_U16          deviceId;    //GT_BOOL         highSmiDevAddr;    //GT_U32	    portsCount;    DBG_INFO("qdLoadDriver Called.\n");    /* Check for parameters validity        */    if(dev == NULL)    {        DBG_INFO("Failed.\n");        return GT_BAD_PARAM;    }    /* Check for parameters validity        */    /* The initialization was already done. */    /* Initialize the driver    */    //retVal = driverConfig(dev);	//////////driverConfig(dev);		//DBG_INFO("highSmiDevAddr=%x\n",highSmiDevAddr);	dev->baseRegAddr = 0x10;//(highSmiDevAddr)?0x10:0;	    if(hwReadPortReg(dev,1,QD_REG_SWITCH_ID,&deviceId) != GT_OK)    {        return GT_FAIL;                         };        /* Init the device's config struct.             */    	dev->deviceId       = deviceId >> 4;    dev->revision       = (GT_U8)deviceId & 0xF; 	DBG_INFO("driverConfig:Device ID = %x\n", dev->deviceId);    /* Get the number of active ports               */    dev->numOfPorts = PORTS_COUNT;//(GT_U8)portsCount; 	DBG_INFO("Device ID = %x\n", dev->deviceId);    /* Initialize dev fields.         */    //dev->cpuPortNum = cfg->cpuPortNum;    dev->maxPhyNum = 5;    /* Assign Device Name */    switch(dev->deviceId)    {		case GT_88E6021:		case GT_88E6051:		case GT_88E6052:		case GT_88E6060:		case GT_88E6061:		case GT_88E6062:		case GT_88E6063:		case GT_FH_VPN_L:		case GT_FH_VPN:		case GT_FF_XP:		case GT_FF_EG:		case GT_FF_HG:		break;		default:		     DBG_INFO("Unknown Device. Initialization failed\n");		     dev = NULL;		     return GT_FAIL;    }    /* Initialize the ATU semaphore.    */    	/* Initialize the ports states. */    //if(cfg->initPorts == GT_TRUE)    //{	       //retVal = gstpSetMode(dev,GT_FALSE);	/////////////////////gstpSetMode{	GT_U8           i;    DBG_INFO("gstpSetMode Called.\n");    /* Set the STP state in the relevant register.  */       for(i = 0; i < MAX_SWITCH_PORTS; i++)    {        retVal = gstpSetPortState(dev,i,GT_PORT_FORWARDING);        if(retVal != GT_OK)        {            DBG_INFO("Failed.\n");            return retVal;        }    }    dev->stpMode = 2;    if(retVal == GT_OK)        DBG_INFO("OK.\n");    else        DBG_INFO("Failed.\n");    return retVal;	retVal = GT_OK;}/////////////////////gstpSetMode     //}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
voyeur盗摄精品| 色av成人天堂桃色av| 99在线热播精品免费| 精品视频1区2区| 久久久久久电影| 五月天亚洲精品| 91在线视频播放地址| 国产日韩一级二级三级| 石原莉奈在线亚洲二区| 91性感美女视频| 欧美激情一区三区| 久久99蜜桃精品| 8x福利精品第一导航| 亚洲一区二区视频| 99久久99久久精品免费看蜜桃 | 日本va欧美va欧美va精品| 99久久精品国产导航| 久久久久9999亚洲精品| 美女爽到高潮91| 777午夜精品视频在线播放| 一二三区精品视频| 色哟哟欧美精品| 中文字幕一区二区三区视频| 国产成人午夜精品影院观看视频 | 日日夜夜免费精品| 日本韩国一区二区三区| 亚洲欧美日韩成人高清在线一区| 成人一区二区三区| 欧美激情艳妇裸体舞| 国产成人亚洲精品青草天美| 久久―日本道色综合久久| 国模无码大尺度一区二区三区| 欧美一级片免费看| 韩日精品视频一区| 国产亚洲精品精华液| 国产一区二区网址| 久久久精品2019中文字幕之3| 国产一区二区久久| 中文一区在线播放| 99精品欧美一区二区三区小说| 国产精品网站一区| 色综合视频一区二区三区高清| 亚洲精品中文在线影院| 在线免费观看日本欧美| 午夜精品123| 欧美成人高清电影在线| 粉嫩av亚洲一区二区图片| 国产女主播视频一区二区| 成人免费视频播放| 亚洲与欧洲av电影| 日韩免费一区二区三区在线播放| 九九在线精品视频| 国产精品成人一区二区艾草| 色就色 综合激情| 日韩av不卡在线观看| 国产日韩欧美一区二区三区综合| 成人免费三级在线| 亚洲影院久久精品| 精品国产一区二区三区四区四 | 国产精品美女久久久久aⅴ国产馆| 成人av影院在线| 亚洲国产日产av| 久久亚洲精品国产精品紫薇| 99国产精品久| 蜜桃视频免费观看一区| 中文字幕乱码久久午夜不卡 | 成人av在线资源网站| 亚洲综合偷拍欧美一区色| 日韩欧美高清在线| 91蜜桃免费观看视频| 久久99精品久久久久婷婷| 国产精品久久久久精k8 | 欧洲亚洲国产日韩| 激情综合色综合久久| 一区二区三区精品在线| 精品国产区一区| 欧美性受xxxx| 成人国产精品视频| 免费人成精品欧美精品| 亚洲色大成网站www久久九九| 日韩精品一区二区三区视频| 色偷偷88欧美精品久久久| 精品系列免费在线观看| 亚洲午夜久久久久久久久久久 | 欧美一区二区三区四区在线观看 | 在线免费亚洲电影| 夫妻av一区二区| 裸体歌舞表演一区二区| 亚洲一区二区av电影| 国产精品美女久久久久久2018| 欧美成人a视频| 欧美疯狂性受xxxxx喷水图片| 成人av资源在线观看| 国产中文一区二区三区| 日韩电影在线一区二区三区| 一区二区在线观看视频| 国产精品热久久久久夜色精品三区 | 国产精品白丝在线| 久久综合狠狠综合久久综合88 | 欧美激情一区二区| 精品1区2区在线观看| 91精品国产综合久久精品| 欧美亚男人的天堂| 色中色一区二区| 91偷拍与自偷拍精品| 成人app软件下载大全免费| 国内精品自线一区二区三区视频| 日本成人在线一区| 日av在线不卡| 日韩电影免费在线| 日本不卡中文字幕| 日本欧美久久久久免费播放网| 亚洲高清不卡在线观看| 亚洲va欧美va天堂v国产综合| 亚洲美女区一区| 一区二区三区四区中文字幕| 亚洲免费成人av| 亚洲一区二区成人在线观看| 亚洲第一成人在线| 婷婷开心久久网| 美女精品一区二区| 精品一区二区在线免费观看| 国产一区91精品张津瑜| 国产成人免费视频 | 激情偷乱视频一区二区三区| 久久99国产精品久久99 | 国产亚洲美州欧州综合国| 国产欧美va欧美不卡在线| 国产精品黄色在线观看| 亚洲精品亚洲人成人网在线播放| 亚洲自拍与偷拍| 久久精品国产77777蜜臀| 国产黑丝在线一区二区三区| 99综合电影在线视频| 欧美视频在线观看一区二区| 91精品国产综合久久久蜜臀图片| 欧美成人精精品一区二区频| 日本一区二区三区dvd视频在线| 亚洲视频一区在线| 丝袜亚洲精品中文字幕一区| 狠狠色2019综合网| 99精品国产视频| 91.xcao| 日本一区二区视频在线| 亚洲影视在线播放| 国产一区二区三区在线看麻豆| 床上的激情91.| 欧美美女黄视频| 亚洲国产电影在线观看| 亚洲二区在线观看| 国产电影精品久久禁18| 欧洲亚洲国产日韩| 久久精品一区二区三区不卡| **欧美大码日韩| 久久精工是国产品牌吗| 日本精品视频一区二区| 久久免费精品国产久精品久久久久| 国产精品护士白丝一区av| 免费精品视频最新在线| 97久久超碰精品国产| 精品国产免费视频| 一区二区高清免费观看影视大全 | 日韩精品中午字幕| 亚洲欧美一区二区三区孕妇| 免费黄网站欧美| 日本乱人伦aⅴ精品| 国产亚洲精品中文字幕| 美女一区二区三区在线观看| 91在线小视频| 中文欧美字幕免费| 久久精品99国产国产精| 欧美日韩精品欧美日韩精品一| 国产精品看片你懂得| 看电视剧不卡顿的网站| 欧美日韩一区二区三区不卡| 国产精品视频第一区| 国产又粗又猛又爽又黄91精品| 欧美丝袜丝交足nylons| 亚洲理论在线观看| kk眼镜猥琐国模调教系列一区二区 | av福利精品导航| 国产亚洲婷婷免费| 激情综合色综合久久| 欧美精品久久一区| 亚洲一区二区3| 在线观看日产精品| 亚洲精品v日韩精品| 成人v精品蜜桃久久一区| 国产偷国产偷亚洲高清人白洁| 裸体一区二区三区| 91精品国产综合久久精品app| 亚洲福利一区二区| 欧美日韩国产乱码电影| 亚洲国产一区视频| 欧美少妇xxx| 亚洲国产精品欧美一二99| 欧美性色综合网| 亚洲成人av资源| 日韩午夜精品视频| 久久99久久久久|