📄 pccardlib.c
字号:
/* pccardLib.c - PC CARD enabler library *//* Copyright 1984-1996 Wind River Systems, Inc. */#include "copyright_wrs.h"/*modification history--------------------01o,31aug99,jkf changed from cbio.h to cbioLib.h01n,03nov98,lrn cleanup warnings01m,06oct98,lrn merge DosFs 2.0 changes into T2.0, DosFs 2.0 API for TFFS01l,17sep98,lrn reworked DosFs 2.0 support and memory leak issues01k,13jul98,lrn DosFs 2.0 - can not delete a DOS device01j,19jan98,hdn added a check to see if the socket is registered.01i,11dec97,hdn added TFFS support for flash PC card.01h,19mar97,hdn deleted a line that writes 0 to the ELT's address config reg.01g,16jan97,hdn initialized pcmciaCtrl.01f,17nov96,jdi doc: tweaks.01e,08nov96,dgp doc: final formatting01d,28mar96,jdi doc: cleaned up language and format.01c,08mar96,hdn added more descriptions.01b,22feb96,hdn cleaned up01a,19oct95,hdn written.*//*DESCRIPTIONThis library provides generic facilities for enabling PC CARD.Each PC card device driver needs to provide an enabler routine anda CSC interrupt handler. The enabler routine must be in the`pccardEnabler' structure.Each PC card driver has its own resource structure, `xxResources'. TheATA PC card driver resource structure is `ataResources' insysLib, which also supports a local IDE disk.The resource structure has a PC card common resource structure inthe first member. Other members are device-driver dependent resources.The PCMCIA chip initialization routines tcicInit() and pcicInit() areincluded in the PCMCIA chip table `pcmciaAdapter'.This table is scanned when the PCMCIA library is initialized. If theinitialization routine finds the PCMCIA chip, it registers all functionpointers of the PCMCIA_CHIP structure.A memory window defined in `pcmciaMemwin' is used to accessthe CIS of a PC card through the routines in cisLib.SEE ALSOpcmciaLib, cisLib, tcic, pcic*//* LINTLIBRARY */#include "private/funcBindP.h"#include "drv/pcmcia/pcmciaLib.h"#include "drv/pcmcia/cisLib.h"#include "drv/pcmcia/pcic.h"#include "drv/pcmcia/tcic.h"#include "drv/pcmcia/sramDrv.h"#include "drv/hdisk/ataDrv.h"#include "cbioLib.h"#include "dcacheCbio.h"#include "dpartCbio.h"#ifdef INCLUDE_ELT#include "net/if.h"#include "netinet/if_ether.h"#include "drv/netif/if_elt.h"#endif /* INCLUDE_ELT */#ifdef INCLUDE_TFFS#include "tffs/tffsDrv.h"#endif /* INCLUDE_TFFS *//* defines */#define ELT_PCMCIA_ID0 0x0101 /* manufacturer code */#define ELT_PCMCIA_ID1_562 0x0562 /* manufacturer info for 3C562 */#define ELT_PCMCIA_ID1_589 0x0589 /* manufacturer info for 3C589B *//* XXX it should go in pc386/pc.h */#define TFFS0_MEM_START 0xd8000 /* mem start addr for TFFS in sock 0 */#define TFFS0_MEM_STOP 0xd9fff /* mem stop addr for TFFS in sock 0 */#define TFFS1_MEM_START 0xda000 /* mem start addr for TFFS in sock 1 */#define TFFS1_MEM_STOP 0xdbfff /* mem stop addr for TFFS in sock 1 *//* externs */IMPORT BOOL pcmciaDebug;/* dont use partition table decoder unless ATA is included */#define USE_PARTITIONS FALSE#ifdef INCLUDE_ELTIMPORT ELT_CTRL *pEltCtrl [];LOCAL STATUS pccardEltCscIntr (int sock, int csc);#endif /* INCLUDE_ELT */#ifdef INCLUDE_ATAIMPORT ATA_CTRL ataCtrl [ATA_MAX_CTRLS];LOCAL STATUS pccardAtaCscIntr (int sock, int csc);#undef USE_PARTITIONS#define USE_PARTITIONS TRUE#endif /* INCLUDE_ATA */#ifdef INCLUDE_SRAMIMPORT SRAM_CTRL sramCtrl;IMPORT int sramResourceNumEnt;LOCAL STATUS pccardSramCscIntr (int sock, int csc);#endif /* INCLUDE_SRAM */#ifdef INCLUDE_TFFSIMPORT char pcDriveNo [];LOCAL STATUS pccardTffsCscIntr (int sock, int csc);#endif /* INCLUDE_TFFS *//* globals */PCMCIA_CTRL pcmciaCtrl = {PCMCIA_SOCKS, PCMCIA_MEMBASE} ;PCMCIA_MEMWIN pcmciaMemwin [] = { {0, 0, 0, CIS_MEM_START, CIS_MEM_STOP, 0}, /* CIS extraction */ {0, 0, 0, CIS_REG_START, CIS_REG_STOP, 0}, /* config registers */ };PCMCIA_ADAPTER pcmciaAdapter [] = { {PCMCIA_PCIC, PCIC_BASE_ADR, PCIC_INT_VEC, PCIC_INT_LVL, pcicInit, NULL}, {PCMCIA_TCIC, TCIC_BASE_ADR, TCIC_INT_VEC, TCIC_INT_LVL, tcicInit, NULL} };#ifdef INCLUDE_ELTELT_RESOURCE eltResources[] = { { { 5, 0, {ELT0_IO_START, 0}, {ELT0_IO_STOP, 0}, 0, 0, 0, 0, 0, 0 }, ELT0_INT_VEC, ELT0_INT_LVL, ELT0_NRF, ELT0_CONFIG }, { { 5, 0, {ELT1_IO_START, 0}, {ELT1_IO_STOP, 0}, 0, 0, 0, 0, 0, 0 }, ELT1_INT_VEC, ELT1_INT_LVL, ELT1_NRF, ELT1_CONFIG } };#endif /* INCLUDE_ELT */#ifdef INCLUDE_SRAMSRAM_RESOURCE sramResources[] = { { { 5, 0, {0, 0}, {0, 0}, 0, SRAM0_MEM_START, SRAM0_MEM_STOP, 1, 0x0, SRAM0_MEM_LENGTH } }, { { 5, 0, {0, 0}, {0, 0}, 0, SRAM1_MEM_START, SRAM1_MEM_STOP, 1, 0x0, SRAM1_MEM_LENGTH } }, { { 5, 0, {0, 0}, {0, 0}, 0, SRAM2_MEM_START, SRAM2_MEM_STOP, 1, 0x0, SRAM2_MEM_LENGTH } }, { { 5, 0, {0, 0}, {0, 0}, 0, SRAM3_MEM_START, SRAM3_MEM_STOP, 1, 0x0, SRAM3_MEM_LENGTH } } };#endif /* INCLUDE_SRAM */#ifdef INCLUDE_TFFSTFFS_RESOURCE tffsResources[] = { { { 5 /* vcc */, 0 /* vpp */, {0, 0}, {0, 0}, 0, TFFS0_MEM_START, TFFS0_MEM_STOP, 2 /* extra wait state */, 0x0 /* offset card address */, 0x0 /* size of the memory */ } }, { { 5 /* vcc */, 0 /* vpp */, {0, 0}, {0, 0}, 0, TFFS1_MEM_START, TFFS1_MEM_STOP, 2 /* extra wait state */, 0x0 /* offset card address */, 0x0 /* size of the memory */ } } };#endif /* INCLUDE_TFFS */PCCARD_ENABLER pccardEnabler [] = {#ifdef INCLUDE_ELT { PCCARD_LAN_ELT, (void *)eltResources, NELEMENTS(eltResources), (FUNCPTR)pccardEltEnabler, NULL },#endif /* INCLUDE_ELT */#ifdef INCLUDE_ATA { PCCARD_ATA, (void *)ataResources, NELEMENTS(ataResources), (FUNCPTR)pccardAtaEnabler, NULL },#endif /* INCLUDE_ATA */#ifdef INCLUDE_TFFS { PCCARD_FLASH, (void *)tffsResources, NELEMENTS(tffsResources), (FUNCPTR)pccardTffsEnabler, NULL },#endif /* INCLUDE_TFFS */#ifdef INCLUDE_SRAM { PCCARD_SRAM, (void *)sramResources, NELEMENTS(sramResources), (FUNCPTR)pccardSramEnabler, NULL }#endif /* INCLUDE_SRAM */ };int pcmciaAdapterNumEnt = NELEMENTS (pcmciaAdapter);int pccardEnablerNumEnt = NELEMENTS (pccardEnabler);/* locals */#ifdef INCLUDE_SRAMLOCAL int sramSizeTable [] = {512, 2000, 8000, 32000, 128000, 512000, 2000000, 0};#endif /* INCLUDE_SRAM */#ifdef INCLUDE_DOSFS#define ATA_CACHE_SIZE (128*1024)#define SRAM_CACHE_SIZE (2*1024)#define TFFS_CACHE_SIZE (32*1024)CBIO_DEV_ID sockCbioDevs[ PCIC_MAX_SOCKS * NELEMENTS (pcmciaAdapter) ];char * sockDevNames[ PCIC_MAX_SOCKS * NELEMENTS (pcmciaAdapter) ] = { "/card0", "/card1", "/card2", "/card3", "/card4", "/card5", "/card6", "/card7", NULL };#endif /* INCLUDE_DOSFS *//********************************************************************************* pccardMount - mount a DOS file system** This routine mounts a DOS file system.** RETURNS: OK or ERROR.*/STATUS pccardMount ( int sock, /* socket number */ char *pName /* name of a device */ ) { printErr( "This function is discontinued\n" ); return ERROR;#if FALSE PCMCIA_CTRL *pCtrl = &pcmciaCtrl; PCMCIA_CHIP *pChip = &pCtrl->chip; PCMCIA_CARD *pCard = &pCtrl->card[sock]; DOS_VOL_DESC *pDos = pCard->pDos; if ((!pChip->installed) || (!pCard->installed) || (sock >= pChip->socks)) return (ERROR); if (pDos != NULL) { iosDevDelete (&pDos->dosvd_devHdr); free ((char *)pDos); return (ERROR); } pCard->pDos = dosFsDevInit (pName, pCard->pBlkDev, NULL); if (pCard->pDos == NULL) return (ERROR); return (OK);#endif /* FALSE */ }/********************************************************************************* pccardMkfs - initialize a device and mount a DOS file system** This routine initializes a device and mounts a DOS file system.** RETURNS: OK or ERROR.*/STATUS pccardMkfs ( int sock, /* socket number */ char *pName /* name of a device */ ) { printErr( "This function is discontinued. Use dosFsVolFormat()\n" ); return ERROR;#if FALSE PCMCIA_CTRL *pCtrl = &pcmciaCtrl; PCMCIA_CHIP *pChip = &pCtrl->chip; PCMCIA_CARD *pCard = &pCtrl->card[sock]; DOS_VOL_DESC *pDos = pCard->pDos; if ((!pChip->installed) || (!pCard->installed) || (sock >= pChip->socks)) return (ERROR); if (pDos != NULL) { iosDevDelete (&pDos->dosvd_devHdr); free ((char *)pDos); return (ERROR); } pCard->pDos = dosFsMkfs (pName, pCard->pBlkDev); if (pCard->pDos == NULL) return (ERROR); return (OK);#endif /* FALSE */ }#ifdef INCLUDE_DOSFS/********************************************************************************* pccardDosDevCreate - create DOSFS device for on PCMCIA socket.** This routine creates a DOS FS device for PCMCIA socket # <sock>* with predefined name based on socket number. The device will use* device driver pointed by <pBlkDev> to access device on the low level.** If DOS device already exists, only low level driver is changed to* reflect the new devices physical parameters.** RETURNS: STATUS.*/LOCAL STATUS pccardDosDevCreate ( int sock, void * pBlkDev, int cacheSize, BOOL partitions ) { void * subDev = NULL ; void * masterCbio ; IMPORT STATUS usrFdiskPartRead(); STATUS stat; /* create cache of appropriate size and DOS device on top of it */ if ( sockCbioDevs[ sock ] == NULL ) { sockCbioDevs[ sock ] = dcacheDevCreate(pBlkDev, 0, cacheSize, sockDevNames[ sock ] ); if( sockCbioDevs[ sock ] == NULL ) { printErr ("Error during dcacheDevCreate: %p\n", (void *)errno ); return (ERROR); } if ( partitions ) { masterCbio = dpartDevCreate(sockCbioDevs[ sock ] , 1, (FUNCPTR) usrFdiskPartRead ); if( masterCbio == NULL) { printErr ("Error creating partition manager: %x\n", errno); return (ERROR); } subDev = (void *) dpartPartGet(masterCbio,0); } else { subDev = sockCbioDevs[ sock ]; } return dosFsDevCreate( sockDevNames[ sock ], subDev, 0,0 ); } /* resize cache and RESET device */ dcacheDevMemResize (sockCbioDevs[ sock ], cacheSize); stat = cbioIoctl (sockCbioDevs[ sock ], CBIO_RESET, pBlkDev ); if( stat != OK )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -