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

📄 pccardlib.c

📁 用于EQUATOR处理器上的FAT32文件系统(vxWorks5.5)
💻 C
📖 第 1 页 / 共 3 页
字号:
	{
	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
     */
    return pccardDosDevCreate( sock, pCard->pBlkDev,
	SRAM_CACHE_SIZE, USE_PARTITIONS );
#else

⌨️ 快捷键说明

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