📄 pccardlib.c
字号:
{
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 + -