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

📄 pccardlib.c

📁 VXWORKS源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
    	}    /* resize cache and RESET device */    dcacheDevMemResize (sockCbioDevs[ sock ], cacheSize);    stat = cbioIoctl (sockCbioDevs[ sock ], CBIO_RESET, pBlkDev );    if( stat != OK )	{	printErr("pccardDosDevCreate: error substituting block driver, "		"errno=%#x\n", errno);	}    return stat;    } /* pccardDosDevCreate() */#endif /* INCLUDE_DOSFS */#ifdef	INCLUDE_ATA/********************************************************************************* pccardAtaEnabler - enable the PCMCIA-ATA device** This routine enables the PCMCIA-ATA device.** RETURNS:* OK, ERROR_FIND if there is no ATA card, or ERROR if another error occurs.*/STATUS pccardAtaEnabler    (    int		 sock,		/* socket no. */    ATA_RESOURCE *pAtaResource,	/* pointer to ATA resources */    int		 numEnt,	/* number of ATA resource entries */    FUNCPTR	 showRtn 	/* ATA show routine */    )    {    PCMCIA_CTRL *pCtrl		= &pcmciaCtrl;    PCMCIA_CHIP *pChip		= &pCtrl->chip;    PCMCIA_CARD *pCard		= &pCtrl->card[sock];    CIS_CONFIG  *pConfig	= (CIS_CONFIG *)&pCard->cisConfigList;    PCCARD_RESOURCE *pResource	= &pAtaResource->resource;    int drive			= 0;    int functionCode		= 0;    int diskInterface		= 0;    PCMCIA_IOWIN pcmciaIowin;    DL_LIST *pList;    DL_NODE *pNode;    CIS_TUPLE *pTuple;    ATA_CTRL *pAtaCtrl;    int flag;    int ctrl;    int sock0;    char *pChar;    if (!pChip->installed)	return (ERROR);    pList = &pCard->cisTupleList;    for (pNode = DLL_FIRST (pList); pNode != NULL; pNode = DLL_NEXT(pNode))	{	pTuple	= (CIS_TUPLE *)((char *)pNode + sizeof (DL_NODE));	pChar	= (char *)pTuple + sizeof (CIS_TUPLE);	switch (pTuple->code)	    {	    case CISTPL_FUNCID:		functionCode = *pChar;		break;	    case CISTPL_FUNCE:		if (*pChar++ == FUNCE_TYPE_DISK)		    diskInterface = *pChar;		break;	    }	}    if ((pcmciaDebug) && (_func_logMsg != NULL))	(* _func_logMsg) ("ATA sock=%d functionCode=%x diskInterface=%x\n",			      sock, functionCode, diskInterface, 0, 0, 0);    /* return if we didn't recognize the card */    if ((functionCode != FUNC_FIXEDDISK) || (diskInterface != FUNCE_DATA_ATA))	return (ERROR_FIND);    if ((pcmciaDebug) && (_func_logMsg != NULL))	(* _func_logMsg) ("ATA sock=%d detected\n",			      sock, 0, 0, 0, 0, 0);    /* get un-used resource */    for (ctrl = 0; ctrl < numEnt; ctrl++)	{        pResource = &pAtaResource->resource;	if (pAtaResource->ctrlType == ATA_PCMCIA)	    {	    for (sock0 = 0; sock0 < pChip->socks; sock0++)		{    		PCMCIA_CARD *pCard0 = &pCtrl->card[sock0];		if (pCard0->pResource == pResource)	/* used resource */		    break;		}	    if (sock0 == pChip->socks)			/* un-used resource */		break;	    }	pAtaResource++;	}    if (ctrl == numEnt)	{	if (_func_logMsg != NULL)	    (* _func_logMsg) ("pccardAtaEnabler: sock=%d out of resource\n",			      sock, 0, 0, 0, 0, 0);	return (ERROR);	}    /* configure the card with the resource */    pList = &pCard->cisConfigList;    for (pNode = DLL_FIRST(pList); pNode != NULL; pNode = DLL_NEXT(pNode))	{	pConfig = (CIS_CONFIG *)pNode;	if ((pConfig->ioRanges == 2) &&	    (pConfig->io[0].start == pResource->ioStart[0]) &&	    (pConfig->io[1].start == pResource->ioStart[1]))	    {	    pAtaCtrl		= &ataCtrl[ctrl];	    pAtaCtrl->ctrlType	= ATA_PCMCIA;	    pCard->type		= PCCARD_ATA;	    pCard->sock		= sock;	    pCard->ctrl		= ctrl;	    pCard->detected	= TRUE;	    pCard->pResource	= pResource;            pCard->cardStatus	= (* pChip->status)(sock);	    pCard->cscIntr	= (FUNCPTR)pccardAtaCscIntr;	    pCard->showRtn	= (FUNCPTR)showRtn;	    flag = PC_PWR_AUTO | PC_IOCARD;	    if (pResource->vcc == PCCARD_5V)	        flag |= PC_VCC_5V;	    else if (pResource->vcc == PCCARD_3V)	        flag |= PC_VCC_3V;	    if (pResource->vpp == PCCARD_5V)	        flag |= PC_VPP_5V;	    else if (pResource->vpp == PCCARD_12V)	        flag |= PC_VPP_12V;	    if ((* pChip->flagSet)(sock, flag) != OK)	        return (ERROR);	    cisConfigregSet (sock, CONFIG_STATUS_REG, 0x00);	    cisConfigregSet (sock, PIN_REPLACEMENT_REG,			     PRR_RBVD1 | PRR_RBVD2 | PRR_RRDY | PRR_RWPROT);	    cisConfigregSet (sock, SOCKET_COPY_REG, 0x00 | (sock & 0x0f));	    cisConfigregSet (sock, CONFIG_OPTION_REG,			     COR_LEVIREQ | pConfig->index);	    pcmciaIowin.window	= PCCARD_IOWIN0;	    pcmciaIowin.flags	= MAP_ACTIVE | MAP_16BIT;	    pcmciaIowin.extraws	= pResource->ioExtraws;	    pcmciaIowin.start	= pResource->ioStart[0];	    pcmciaIowin.stop	= pResource->ioStop[0];	    if ((* pChip->iowinSet)(sock, &pcmciaIowin) != OK)	        return (ERROR);	    pcmciaIowin.window	= PCCARD_IOWIN1;	    pcmciaIowin.flags	= MAP_ACTIVE | MAP_16BIT;	    pcmciaIowin.extraws	= pResource->ioExtraws;	    pcmciaIowin.start	= pResource->ioStart[1];	    pcmciaIowin.stop	= pResource->ioStop[1];	    if ((* pChip->iowinSet)(sock, &pcmciaIowin) != OK)	        return (ERROR);	    if ((* pChip->irqSet)(sock, pAtaResource->intLevel) != OK)	        return (ERROR);	    if ((pCard->initStatus = ataDrv (ctrl,					     pAtaResource->drives,					     pAtaResource->intVector,					     pAtaResource->intLevel,					     pAtaResource->configType,					     pAtaResource->semTimeout,					     pAtaResource->wdgTimeout					     )) != OK)		{    		if (_func_logMsg != NULL)			(* _func_logMsg) ("ATA sock=%d ataDrv failed %x\n",			      sock, errno, 0, 0, 0, 0);	        return (ERROR);		}	    pCard->installed = TRUE;    	    taskDelay (sysClkRateGet());		/* 1 sec */	    break;	    }	}    /* return if we didn't install the driver */    if (!pCard->installed)	return (ERROR);    if (pCard->pBlkDev != NULL)	free ((char *)pCard->pBlkDev);    if ((pCard->pBlkDev = ataDevCreate(ctrl, drive, 0, 0)) ==	(BLK_DEV *)NULL)        {        printErr ("Error during ataDevCreate: %x\n", errno);	return (ERROR);        }#ifdef INCLUDE_DOSFS    {    return pccardDosDevCreate( sock, pCard->pBlkDev,	ATA_CACHE_SIZE, USE_PARTITIONS );    }#else    printErr ("DosFs not included, card in socket %d ignored\n", sock);    return (OK);#endif /* INCLUDE_DOSFS */    }/********************************************************************************* pccardAtaCscIntr - ATA controller PCMCIA card status change interrupt handler.** RETURNS: OK (always).*/LOCAL STATUS pccardAtaCscIntr    (    int sock,			/* socket no. */    int csc			/* CSC bits */    )    {    PCMCIA_CTRL *pCtrl		= &pcmciaCtrl;    PCMCIA_CARD *pCard		= &pCtrl->card[sock];    ATA_RESOURCE *pAtaResource	= (ATA_RESOURCE *)pCard->pResource;    ATA_CTRL *pAtaCtrl		= &ataCtrl[pCard->ctrl];    /* hot insertion */    /* hot removal */    if ((csc & PC_DETECT) && ((pCard->cardStatus & PC_DETECT) == 0x0))	{        if (pAtaResource != NULL)            sysIntDisablePIC (pAtaResource->intLevel);	pAtaCtrl->installed	= FALSE;	pAtaCtrl->changed	= FALSE;	semFlush (&pAtaCtrl->syncSem);	pcmciaJobAdd ((VOIDFUNCPTR)semTerminate, (int)&pAtaCtrl->muteSem,		      0,0,0,0,0);	}    return (OK);    }#endif	/* INCLUDE_ATA */#ifdef	INCLUDE_SRAM/********************************************************************************* pccardSramEnabler - enable the PCMCIA-SRAM driver** This routine enables the PCMCIA-SRAM driver.** RETURNS:* OK, ERROR_FIND if there is no SRAM card, or ERROR if another error occurs.*/STATUS pccardSramEnabler    (    int		  sock,		  /* socket no. */    SRAM_RESOURCE *pSramResource, /* pointer to SRAM resources */    int		  numEnt,	  /* number of SRAM resource entries */    FUNCPTR	  showRtn 	  /* SRAM show routine */    )    {    PCMCIA_CTRL *pCtrl		= &pcmciaCtrl;    PCMCIA_CHIP *pChip		= &pCtrl->chip;    PCMCIA_CARD *pCard		= &pCtrl->card[sock];    BOOL typeExtended		= FALSE;    BOOL speedExtended		= FALSE;    int formatOffset		= 0;    int formatNbytes		= 0;    int deviceType		= 0;    int deviceSize		= 0;    int functionCode		= NONE;    PCCARD_RESOURCE *pResource;    DL_NODE *pNode;    CIS_TUPLE *pTuple;    CIS_BYTE4 offset;    CIS_BYTE4 nbytes;    int unit;    int size;    int flag;    char *pChar;    if ((!pChip->installed) || (sock >= numEnt))	return (ERROR);    for (pNode = DLL_FIRST (&pCard->cisTupleList);	 pNode != NULL;	 pNode = DLL_NEXT(pNode))	{	pTuple	= (CIS_TUPLE *)((char *)pNode + sizeof (DL_NODE));	pChar	= (char *)pTuple + sizeof (CIS_TUPLE);	switch (pTuple->code)	    {	    case CISTPL_FUNCID:		functionCode = *pChar;		break;	    case CISTPL_DEVICE:		deviceType = *pChar & 0xf0;		if (deviceType == DTYPE_EXTEND)		    typeExtended = TRUE;		if ((*pChar & 0x0f) == DSPEED_EXT)		    speedExtended = TRUE;		pChar++;		while (speedExtended)		    if ((*pChar++ & 0x80) == 0)			speedExtended = FALSE;		while (typeExtended)		    if ((*pChar++ & 0x80) == 0)			typeExtended = FALSE;		unit = ((*pChar & 0xf8) >> 3) + 1;		size = sramSizeTable [*pChar & 0x07];		deviceSize = unit * size;		break;	    case CISTPL_FORMAT:		pChar += 2;		offset.c[0] = *pChar++;		offset.c[1] = *pChar++;		offset.c[2] = *pChar++;		offset.c[3] = *pChar++;		nbytes.c[0] = *pChar++;		nbytes.c[1] = *pChar++;		nbytes.c[2] = *pChar++;		nbytes.c[3] = *pChar++;		formatOffset = offset.l;		formatNbytes = nbytes.l;		break;	    }	}    /* configure the card with a resource which is assigned for the socket */    if (((functionCode == NONE) || (functionCode == FUNC_MEMORY)) &&        ((deviceType == DTYPE_SRAM) || (formatNbytes != 0)))	{        sramResourceNumEnt	= numEnt;        pSramResource		+= sock;        pResource		= &pSramResource->resource;        pCard->type		= PCCARD_SRAM;        pCard->sock		= sock;        pCard->detected		= TRUE;        pCard->pResource	= pResource;        pCard->cardStatus	= (* pChip->status)(sock);        pCard->cscIntr		= (FUNCPTR)pccardSramCscIntr;        pCard->showRtn		= (FUNCPTR)showRtn;        pResource->memStart	&= 0xfffff000;        pResource->memStop	|= 0x00000fff;        pResource->memOffset	= formatOffset;        if (deviceSize != 0)	    pResource->memLength = deviceSize;        else if (formatNbytes != 0)	    pResource->memLength = formatNbytes;	else	    return (ERROR);        flag = PC_PWR_AUTO;        if (pResource->vcc == PCCARD_5V)	    flag |= PC_VCC_5V;        else if (pResource->vcc == PCCARD_3V)	    flag |= PC_VCC_3V;        if (pResource->vpp == PCCARD_5V)	    flag |= PC_VPP_5V;        else if (pResource->vpp == PCCARD_12V)	    flag |= PC_VPP_12V;        if ((* pChip->flagSet)(sock, flag) != OK)	    return (ERROR);        if ((pCard->initStatus = sramDrv (sock)) != OK)	    return (ERROR);        pCard->installed = TRUE;	}    else	return (ERROR_FIND);    /* return if we didn't recognize the card or didn't install the driver */    if (!pCard->installed)	return (ERROR);    if (pCard->pBlkDev != NULL)	free ((char *)pCard->pBlkDev);    size = pResource->memLength / DEFAULT_SEC_SIZE - 1;	/* number of blocks */    pCard->pBlkDev = sramDevCreate (sock, DEFAULT_SEC_SIZE, size, size, 0);    if (pCard->pBlkDev == (BLK_DEV *)NULL)	{	printErr ("Error during sramDevCreate: %x\n", errno);	return (ERROR);	}#ifdef INCLUDE_DOSFS    /*     * init DOS device with new block device driver and     * valid disk cache size

⌨️ 快捷键说明

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