⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cislib.c

📁 VxWorks BSP框架源代码包含头文件和驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
		    dllInit ((DL_LIST *)&pConfig->node);		    }		dllAdd (&pCard->cisConfigList, &pConfig->node);		pConfig->index = *pChar & 0x3f;		if (*pChar++ & 0x80)		    pConfig->interfaceType = *pChar++ & 0x0f;		featureSelection = *pChar++;		if (featureSelection & 0x03)	/* power description */		    {		    for (ix=1; ix <= (featureSelection & 0x03); ix++)			{			if (ix == 1)			    pv = &pConfig->vcc[0];			else if (ix == 2)			    pv = &pConfig->vpp1[0];			else			    pv = &pConfig->vpp2[0];						parameterSelection = *pChar++;			if (parameterSelection & 0x01)			    {			    *pv++ = powerMantissa[(*pChar & 0x78) >> 3] *				    powerExponent[(*pChar & 0x07)];			    while (*pChar++ & 0x80)				;			    }			if (parameterSelection & 0x02)			    {			    *pv++ = powerMantissa[(*pChar & 0x78) >> 3] *				    powerExponent[(*pChar & 0x07)];			    while (*pChar++ & 0x80)				;			    }			if (parameterSelection & 0x04)			    {			    *pv++ = powerMantissa[(*pChar & 0x78) >> 3] *				    powerExponent[(*pChar & 0x07)];			    while (*pChar++ & 0x80)				;			    }			if (parameterSelection & 0x08)			    {			    while (*pChar++ & 0x80)				;			    }			if (parameterSelection & 0x10)			    {			    while (*pChar++ & 0x80)				;			    }			if (parameterSelection & 0x20)			    {			    while (*pChar++ & 0x80)				;			    }			if (parameterSelection & 0x40)			    {			    while (*pChar++ & 0x80)				;			    }			}		    }		if (featureSelection & 0x04)	/* timing description */		    {		    waitScale	  = *pChar & 0x03;		    busyScale	  = (*pChar & 0x1c) >> 2;		    reservedScale = (*pChar & 0xe0) >> 5;		    pChar++;		    if (waitScale != 0x03)			while (*pChar++ & 0x80)			    ;		    if (busyScale != 0x03)			while (*pChar++ & 0x80)			    ;		    if (reservedScale != 0x03)			while (*pChar++ & 0x80)			    ;		    }		if (featureSelection & 0x08)	/* IO description */		    {		    pConfig->ioAddrlines = *pChar & 0x1f;		    pConfig->ioBuswidth	 = (*pChar & 0x60) >> 5;		    pConfig->ioRanges	 = 0;		    if (*pChar++ & 0x80)			{			pConfig->ioRanges = (*pChar & 0x07) + 1;			addrSize   = (*pChar & 0x30) >> 4;			lengthSize = (*pChar & 0xc0) >> 6;			pChar++;			for (ix = 0; ix < pConfig->ioRanges; ix++)			    {			    addr.l = 0;			    if (addrSize == 1)				addr.c[0] = *pChar++;			    else if (addrSize == 2)				{				addr.c[0] = *pChar++;				addr.c[1] = *pChar++;				}			    else if (addrSize == 3)				{				addr.c[0] = *pChar++;				addr.c[1] = *pChar++;				addr.c[2] = *pChar++;				addr.c[3] = *pChar++;				}			    length.l = 0;			    if (lengthSize == 1)				length.c[0] = *pChar++;			    else if (lengthSize == 2)				{				length.c[0] = *pChar++;				length.c[1] = *pChar++;				}			    else if (lengthSize == 3)				{				length.c[0] = *pChar++;				length.c[1] = *pChar++;				length.c[2] = *pChar++;				length.c[3] = *pChar++;				}			    pConfig->io[ix].start = addr.l;			    pConfig->io[ix].stop  = addr.l + length.l;			    }			}		    }		if (featureSelection & 0x10)	/* IRQ description */		    {		    pConfig->irqMode = (*pChar & 0xe0) >> 5;		    pConfig->irqMask = (*pChar & 0x10) >> 4;		    if (pConfig->irqMask == 1)			{			pConfig->irqSpecial  = *pChar++ & 0x0f;			pConfig->irqBit.c[0] = *pChar++;			pConfig->irqBit.c[1] = *pChar++;			}		    else			{			pConfig->irqSpecial  = 0;			pConfig->irqBit.c[0] = 0;			pConfig->irqBit.c[1] = 0;			pConfig->irqLevel    = *pChar++ & 0x0f;			}		    }		if (featureSelection & 0x60)	/* memory description */		    {		    if ((featureSelection & 0x60) == 0x20)			{			length.l = 0;			length.c[0] = *pChar++;			length.c[1] = *pChar++;			pConfig->mem[0].length = length.l;			pConfig->mem[0].cAddr  = 0;			pConfig->mem[0].hAddr  = 0;			}		    else if ((featureSelection & 0x60) == 0x40)			{			length.l    = 0;			cAddr.l     = 0;			length.c[0] = *pChar++;			length.c[1] = *pChar++;			cAddr.c[0]  = *pChar++;			cAddr.c[1]  = *pChar++;			pConfig->mem[0].length = length.l;			pConfig->mem[0].cAddr  = cAddr.l;			pConfig->mem[0].hAddr  = 0;			}		    else if ((featureSelection & 0x60) == 0x60)			{			windows    = (*pChar & 0x07) + 1;			lengthSize = (*pChar & 0x18) >> 3;			addrSize   = (*pChar & 0x60) >> 5;			hostaddr   = *pChar & 0x80;			for (ix = 0; ix < windows; ix++)			    {			    length.l = 0;			    cAddr.l  = 0;			    hAddr.l  = 0;			    if (lengthSize == 1)				length.c[0] = *pChar++;			    else if (lengthSize == 2)				{				length.c[0] = *pChar++;				length.c[1] = *pChar++;				}			    else if (lengthSize == 3)				{				length.c[0] = *pChar++;				length.c[1] = *pChar++;				length.c[2] = *pChar++;				length.c[3] = *pChar++;				}			    if (addrSize == 1)				cAddr.c[0] = *pChar++;			    else if (addrSize == 2)				{				cAddr.c[0] = *pChar++;				cAddr.c[1] = *pChar++;				}			    else if (addrSize == 3)				{				cAddr.c[0] = *pChar++;				cAddr.c[1] = *pChar++;				cAddr.c[2] = *pChar++;				cAddr.c[3] = *pChar++;				}		    			    if (hostaddr == 0x80)				{			        if (addrSize == 1)				    cAddr.c[0] = *pChar++;			        else if (addrSize == 2)				    {				    cAddr.c[0] = *pChar++;				    cAddr.c[1] = *pChar++;				    }			        else if (addrSize == 3)				    {				    cAddr.c[0] = *pChar++;				    cAddr.c[1] = *pChar++;				    cAddr.c[2] = *pChar++;				    cAddr.c[3] = *pChar++;				    }				}			    pConfig->mem[ix].length = length.l;			    pConfig->mem[ix].cAddr  = cAddr.l;			    pConfig->mem[ix].hAddr  = hAddr.l;			    }			}		    }		if (featureSelection & 0x80)	/* misc info. description */		    {		    pConfig->twins    = *pChar & 0x07;		    pConfig->audio    = (*pChar & 0x08) >> 3;		    pConfig->readonly = (*pChar & 0x10) >> 4;		    pConfig->pwrdown  = (*pChar & 0x20) >> 5;		    }		break;	    }	}    return (OK);    }/********************************************************************************* cisResourceGet - config the PC card from the configuration table link list** Config the PC card from the configuration table link list.** RETURNS: OK, or ERROR if the enabler couldn't initialize the PC card.*/LOCAL STATUS cisResourceGet    (    int sock			/* socket no. */    )    {    PCMCIA_CTRL *pCtrl	= &pcmciaCtrl;    PCMCIA_CARD *pCard	= &pCtrl->card[sock];    STATUS status	= ERROR;    PCCARD_ENABLER *pEnabler;    int ix;    for (ix = 0; ix < pccardEnablerNumEnt; ix++)	{	pEnabler = &pccardEnabler[ix];	if (pEnabler->enableRtn != NULL)	    {	    if ((pCard->initStatus = (* pEnabler->enableRtn) (					sock, 					pEnabler->pResource,					pEnabler->resourceNumEnt,					pEnabler->showRtn)) == ERROR_FIND)		{		continue;		}	    else		{		break;		}	    }	}    if (pCard->initStatus == OK)	status = OK;    return (status);    }/********************************************************************************* cisFree - free tuples from the linked list** This routine free tuples from the linked list.** RETURNS: N/A** INTERNAL* This funcion should not do it by itself, it should called an enabler* supplied destroy function to delete the device (if possible) in device* dependent manner.*/void cisFree    (    int sock			/* socket no. */    )    {    PCMCIA_CTRL *pCtrl	= &pcmciaCtrl;    PCMCIA_CHIP *pChip	= &pCtrl->chip;    PCMCIA_CARD *pCard	= &pCtrl->card[sock];    PCMCIA_IOWIN iowin;    PCMCIA_MEMWIN memwin;    DL_NODE *pNode;    DL_NODE *pTemp;    int ix;    semTake (&cisMuteSem, WAIT_FOREVER);	/* mutual exclusion begin */    (void) (* pChip->cscOff) (sock, pChip->intLevel);    pCard->type		= 0;    pCard->sock		= 0;    pCard->ctrl		= 0;    pCard->detected	= FALSE;    pCard->installed	= FALSE;    pCard->changed	= TRUE;    pCard->regBase	= 0;    pCard->regMask	= 0;    pCard->initStatus	= 0;    pCard->cscIntr	= NULL;    pCard->showRtn	= NULL;    pCard->pResource	= NULL;    if (pCard->pBlkDev != NULL)        pCard->pBlkDev->bd_readyChanged = TRUE ;    if (pCard->pNetIf != NULL)        free ((char *)pCard->pNetIf);  /* XXX - lrn */    pCard->pNetIf	= NULL;    if (pCard->pDos != NULL)	{#if FALSE	/* DosFs 2.0 - can not remove dos device */	iosDevDelete (&pCard->pDos->dosvd_devHdr);	free ((char *)pCard->pDos);#endif /*FALSE*/	}    pCard->pDos = NULL;    for (pNode = DLL_FIRST(&pCard->cisTupleList); pNode != NULL; pNode = pTemp)	{	pTemp = DLL_NEXT(pNode);	free (pNode);	}    dllInit (&pCard->cisTupleList);    for (pNode = DLL_FIRST(&pCard->cisConfigList); pNode != NULL; pNode = pTemp)	{	pTemp = DLL_NEXT(pNode);	free (pNode);	}    dllInit (&pCard->cisConfigList);    (void) (* pChip->irqSet) (sock, 0);    (void) (* pChip->flagSet) (sock, PC_PWR_AUTO);    memwin.window	= 0;    memwin.flags	= 0;    memwin.extraws	= 0;    memwin.start	= 0;    memwin.stop		= 0;    memwin.cardstart	= 0;    for (ix = 0; ix < pChip->memWindows; ix++)	{        memwin.window	= ix;        (void) (* pChip->memwinSet) (sock, &memwin);	}    iowin.window	= 0;    iowin.flags		= 0;    iowin.extraws	= 0;    iowin.start		= 0;    iowin.stop		= 0;    for (ix = 0; ix < pChip->ioWindows; ix++)	{        iowin.window	= ix;        (void) (* pChip->iowinSet) (sock, &iowin);	}    (void) (* pChip->cscPoll) (sock);    (void) (* pChip->cscOn) (sock, pChip->intLevel);    semGive (&cisMuteSem);			/* mutual exclusion end */    }/********************************************************************************* cisConfigregGet - get the PCMCIA configuration register** This routine gets that PCMCIA configuration register.** RETURNS: OK, or ERROR if it cannot set a value on the PCMCIA chip.*/STATUS cisConfigregGet    (    int sock,			/* socket no. */    int reg,			/* configuration register no. */    int *pValue			/* content of the register */    )    {    PCMCIA_CTRL *pCtrl	= &pcmciaCtrl;    PCMCIA_CHIP *pChip	= &pCtrl->chip;    PCMCIA_CARD *pCard	= &pCtrl->card[sock];    PCMCIA_MEMWIN memWin;    char *pReg;    if ((pCard->regBase == 0) || ((pCard->regMask & (1 << reg)) == 0) ||        (pChip->installed != TRUE))	return (ERROR);        memWin.window	= PCMCIA_CIS_WINDOW;    memWin.flags	= MAP_ACTIVE | MAP_16BIT | MAP_ATTRIB;    memWin.extraws	= 2;    memWin.start	= pcmciaMemwin[CIS_MEM_CONFIG].start;    memWin.stop		= pcmciaMemwin[CIS_MEM_CONFIG].stop;    memWin.cardstart	= pCard->regBase;    if ((* pChip->memwinSet)(sock, &memWin) != OK)	return (ERROR);    pReg = (char *)memWin.start + (pCard->regBase & 0xfff) + (reg * 2) +	   pCtrl->memBase;    *pValue = *pReg;    memWin.window	= 0;    memWin.flags	= 0;    memWin.extraws	= 0;    memWin.start	= 0;    memWin.stop		= 0;    memWin.cardstart	= 0;    if ((* pChip->memwinSet)(sock, &memWin) != OK)	return (ERROR);        return (OK);    }/********************************************************************************* cisConfigregSet - set the PCMCIA configuration register** This routine sets the PCMCIA configuration register.** RETURNS: OK, or ERROR if it cannot set a value on the PCMCIA chip.*/STATUS cisConfigregSet    (    int sock,			/* socket no. */    int reg,			/* register no. */    int value			/* content of the register */    )    {    PCMCIA_CTRL *pCtrl	= &pcmciaCtrl;    PCMCIA_CHIP *pChip	= &pCtrl->chip;    PCMCIA_CARD *pCard	= &pCtrl->card[sock];    PCMCIA_MEMWIN memWin;    char *pReg;    if ((pCard->regBase == 0) || ((pCard->regMask & (1 << reg)) == 0) ||        (pChip->installed != TRUE))	return (ERROR);        memWin.window	= PCMCIA_CIS_WINDOW;    memWin.flags	= MAP_ACTIVE | MAP_16BIT | MAP_ATTRIB;    memWin.extraws	= 2;    memWin.start	= pcmciaMemwin[CIS_MEM_CONFIG].start;    memWin.stop		= pcmciaMemwin[CIS_MEM_CONFIG].stop;    memWin.cardstart	= pCard->regBase;    if ((* pChip->memwinSet)(sock, &memWin) != OK)	return (ERROR);    pReg = (char *)memWin.start + (pCard->regBase & 0xfff) + (reg * 2) +	   pCtrl->memBase;    *pReg = value;    memWin.window	= 0;    memWin.flags	= 0;    memWin.extraws	= 0;    memWin.start	= 0;    memWin.stop		= 0;    memWin.cardstart	= 0;    if ((* pChip->memwinSet)(sock, &memWin) != OK)	return (ERROR);        return (OK);    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -