📄 pccardlib.c
字号:
return (OK);
#endif /* INCLUDE_DOSFS */
}
/*******************************************************************************
*
* pccardSramCscIntr - PCMCIA memory card status change interrupt handler
*
* RETURNS: OK, or ERROR if the CSC event is Ready.
*/
LOCAL STATUS pccardSramCscIntr
(
int sock, /* socket no. */
int csc /* CSC bits */
)
{
PCMCIA_CTRL *pCtrl = &pcmciaCtrl;
PCMCIA_CARD *pCard = &pCtrl->card[sock];
SEM_ID muteSemID = &sramCtrl.muteSem[sock];
SEM_ID syncSemID = &sramCtrl.syncSem[sock];
/* hot insertion */
/* hot removal */
if ((csc & PC_DETECT) && ((pCard->cardStatus & PC_DETECT) == 0x0))
{
semFlush (syncSemID);
pcmciaJobAdd ((VOIDFUNCPTR)semTerminate, (int)muteSemID, 0, 0, 0, 0, 0);
}
/* card is ready */
if (csc & PC_READY)
{
semGive (syncSemID);
return (ERROR);
}
/* other card status changes */
if ((csc & PC_BATDEAD) && (_func_logMsg != NULL))
(* _func_logMsg) ("sramDrv: socket=%d Battery dead\n",
sock, 0, 0, 0, 0, 0);
if ((csc & PC_BATWARN) && (_func_logMsg != NULL))
(* _func_logMsg) ("sramDrv: socket=%d Battery warn\n",
sock, 0, 0, 0, 0, 0);
if ((csc & PC_WRPROT) && (_func_logMsg != NULL))
(* _func_logMsg) ("sramDrv: socket=%d Write protect\n",
sock, 0, 0, 0, 0, 0);
return (OK);
}
#endif /* INCLUDE_SRAM */
#ifdef INCLUDE_ELT
/*******************************************************************************
*
* pccardEltEnabler - enable the PCMCIA Etherlink III card
*
* This routine enables the PCMCIA Etherlink III (ELT) card.
*
* RETURNS:
*
* OK, ERROR_FIND if there is no ELT card, or ERROR if another error occurs.
*/
STATUS pccardEltEnabler
(
int sock, /* socket no. */
ELT_RESOURCE *pEltResource, /* pointer to ELT resources */
int numEnt, /* number of ELT resource entries */
FUNCPTR showRtn /* show routine */
)
{
PCMCIA_CTRL *pCtrl = &pcmciaCtrl;
PCMCIA_CHIP *pChip = &pCtrl->chip;
PCMCIA_CARD *pCard = &pCtrl->card[sock];
DL_LIST *pList = &pCard->cisTupleList;
PCCARD_RESOURCE *pResource = &pEltResource->resource;
short manufacturerID0 = 0;
short manufacturerID1 = 0;
int functionCode = 0;
DL_NODE *pNode;
PCMCIA_IOWIN pcmciaIowin;
CIS_TUPLE *pTuple;
char *pChar;
int flag;
int ctrl;
int sock0;
if (!pChip->installed)
return (ERROR);
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_MANFID:
manufacturerID0 = *(short *)pChar;
manufacturerID1 = *(short *)(pChar+2);
break;
}
}
/* return if we didn't recognize the card */
if ((functionCode != FUNC_LAN) ||
(manufacturerID0 != ELT_PCMCIA_ID0) ||
((manufacturerID1 != ELT_PCMCIA_ID1_589) &&
(manufacturerID1 != ELT_PCMCIA_ID1_562)))
return (ERROR_FIND);
/* get un-used resource */
for (ctrl = 0; ctrl < numEnt; ctrl++)
{
pResource = &pEltResource->resource;
for (sock0 = 0; sock0 < pChip->socks; sock0++)
{
PCMCIA_CARD *pCard0 = &pCtrl->card[sock0];
if (pCard0->pResource == pResource)
break;
}
if (sock0 == pChip->socks)
break;
pEltResource++;
}
if (ctrl == numEnt)
{
if (_func_logMsg != NULL)
(* _func_logMsg) ("pccardEltEnabler: sock=%d out of resource\n",
sock, 0, 0, 0, 0, 0);
return (ERROR);
}
/* configure the card with the resource */
pCard->type = PCCARD_LAN_ELT;
pCard->sock = sock;
pCard->ctrl = ctrl;
pCard->detected = TRUE;
pCard->pResource = pResource;
pCard->cardStatus = (* pChip->status)(sock);
pCard->cscIntr = (FUNCPTR)pccardEltCscIntr;
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, CONFIG_OPTION_REG, COR_LEVIREQ | 0x03);
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);
if ((* pChip->irqSet)(sock, pEltResource->intLevel) != OK)
return (ERROR);
sysOutWord (pResource->ioStart[0] + ELT_COMMAND, SELECT_WINDOW|WIN_CONFIG);
sysOutWord (pResource->ioStart[0] + RESOURCE_CONFIG, 0x3f00);
if (pCard->pNetIf != NULL)
free (pCard->pNetIf);
if ((pCard->pNetIf = malloc (sizeof(NETIF))) == NULL)
return (ERROR);
pCard->pNetIf->ifName = "pcmcia";
pCard->pNetIf->attachRtn = eltattach;
pCard->pNetIf->arg1 = (char *)pResource->ioStart[0];
pCard->pNetIf->arg2 = pEltResource->intVector;
pCard->pNetIf->arg3 = pEltResource->intLevel;
pCard->pNetIf->arg4 = pEltResource->rxFrames;
pCard->pNetIf->arg5 = pEltResource->connector;
pCard->pNetIf->arg6 = (int)pCard->pNetIf->ifName;
pCard->pNetIf->arg7 = 0;
pCard->pNetIf->arg8 = 0;
pCard->installed = TRUE;
return (OK);
}
/*******************************************************************************
*
* pccardEltCscIntr - ELT controller PCMCIA card status change interrupt handler.
*
* RETURNS: OK (always).
*/
LOCAL STATUS pccardEltCscIntr
(
int sock, /* socket no. */
int csc /* CSC bits */
)
{
PCMCIA_CTRL *pCtrl = &pcmciaCtrl;
PCMCIA_CARD *pCard = &pCtrl->card[sock];
ELT_RESOURCE *pEltResource = (ELT_RESOURCE *)pCard->pResource;
ELT_CTRL *pDrvCtrl = pEltCtrl [pCard->ctrl];
/* card is inserted */
/* card is removed */
if ((csc & PC_DETECT) && ((pCard->cardStatus & PC_DETECT) == 0x0))
{
if (pCard->pResource != 0)
sysIntDisablePIC (pEltResource->intLevel);
pDrvCtrl->idr.ac_if.if_flags = 0;
pDrvCtrl->attached = FALSE;
}
return (OK);
}
#endif /* INCLUDE_ELT */
#ifdef INCLUDE_TFFS
/*******************************************************************************
*
* pccardTffsEnabler - enable the PCMCIA-TFFS driver
*
* This routine enables the PCMCIA-TFFS driver.
*
* RETURNS:
* OK, ERROR_FIND if there is no TFFS(Flash) card, or ERROR if another error occurs.
*/
STATUS pccardTffsEnabler
(
int sock, /* socket no. */
TFFS_RESOURCE *pTffsResource, /* pointer to TFFS resources */
int numEnt, /* number of SRAM resource entries */
FUNCPTR showRtn /* TFFS show routine */
)
{
PCMCIA_CTRL *pCtrl = &pcmciaCtrl;
PCMCIA_CHIP *pChip = &pCtrl->chip;
PCMCIA_CARD *pCard = &pCtrl->card[sock];
int deviceType = 0;
PCCARD_RESOURCE *pResource;
DL_NODE *pNode;
CIS_TUPLE *pTuple;
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_DEVICE:
deviceType = *pChar & 0xf0;
break;
}
}
/* configure the card with a resource which is assigned for the socket */
if (deviceType == DTYPE_FLASH)
{
pTffsResource += sock;
pResource = &pTffsResource->resource;
pCard->type = PCCARD_FLASH;
pCard->sock = sock;
pCard->detected = TRUE;
pCard->pResource = pResource;
pCard->cardStatus = (* pChip->status)(sock);
pCard->cscIntr = (FUNCPTR)pccardTffsCscIntr;
pCard->showRtn = (FUNCPTR)showRtn;
pResource->memStart &= 0xfffff000;
pResource->memStop |= 0x00000fff;
flag = PC_PWR_AUTO;
if (pResource->vcc == PCCARD_5V)
flag |= PC_VCC_5V;
else if (pResource->vcc == PCCARD_3V)
flag |= PC_VCC_3V;
if ((* pChip->flagSet)(sock, flag) != OK)
return (ERROR);
if ((pCard->initStatus = tffsDrv ()) != OK) /* just in case */
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);
/* we assume that a media on the socket is formated by tffsDevFormat() */
if (pcDriveNo[sock] == NONE)
{
printErr ("pccardTffs:pcDriveNo[%d] == NONE\n", sock);
return ERROR ;
}
if (pCard->pBlkDev != NULL)
free ((char *)pCard->pBlkDev);
pCard->pBlkDev = tffsDevCreate (pcDriveNo[sock], TRUE);
if (pCard->pBlkDev == (BLK_DEV *)NULL)
{
printErr ("Error during tffsDevCreate: %x\n", errno);
return (ERROR);
}
if ((pcmciaDebug) && (_func_logMsg != NULL))
(* _func_logMsg) ("TFFS sock=%d blkDev=%x\n",
sock,pCard->pBlkDev , 0, 0, 0, 0);
#ifdef INCLUDE_DOSFS
/*
* init DOS device with new block device driver and
* valid disk cache size
*/
return pccardDosDevCreate( sock, pCard->pBlkDev,
TFFS_CACHE_SIZE, USE_PARTITIONS );
#else
printErr ("DosFs not included, card in socket %d ignored\n", sock);
#endif /* INCLUDE_DOSFS */
return (OK);
}
/*******************************************************************************
*
* pccardTffsCscIntr - PCMCIA flash card status change interrupt handler
*
* RETURNS: OK, or ERROR if the CSC event is Ready.
*/
LOCAL STATUS pccardTffsCscIntr
(
int sock, /* socket no. */
int csc /* CSC bits */
)
{
PCMCIA_CTRL *pCtrl = &pcmciaCtrl;
PCMCIA_CARD *pCard = &pCtrl->card[sock];
/* hot insertion */
/* hot removal */
if ((csc & PC_DETECT) && ((pCard->cardStatus & PC_DETECT) == 0x0))
{
}
/* card is ready */
if (csc & PC_READY)
{
return (ERROR);
}
/* other card status changes */
if ((csc & PC_WRPROT) && (_func_logMsg != NULL))
(* _func_logMsg) ("TFFS: socket=%d Write protect\n",
sock, 0, 0, 0, 0, 0);
return (OK);
}
#endif /* INCLUDE_TFFS */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -