📄 pccardlib.c
字号:
/* pccardLib.c - PC CARD enabler library *//* Copyright 1984-1996 Wind River Systems, Inc. */#include "copyright_wrs.h"/*modification history--------------------01k,21jun00,rsh upgrade to dosFs 2.001o,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 */#ifdef INCLUDE_ATA#endif#ifdef INCLUDE_SRAM#endif#ifdef INCLUDE_ELT#endif#ifdef INCLUDE_TFFS#endif/********************************************************************************* 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 );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -