?? systffs.c
字號:
/* sysTffs.c - PC Pentium/Pentium2/Pentium3 system-dependent TrueFFS library *//* Copyright 1984-1997 Wind River Systems, Inc. */#include "copyright_wrs.h"/* FAT-FTL Lite Software Development Kit * Copyright (C) M-Systems Ltd. 1995-1997 *//*modification history--------------------01t,30apr01,yp removing assumption that Disk On Chip support will always be present01s,14dec00,mks removed references to pc386 and pc486. SPR 63032.01r,29nov00,yp cleaning up so we can build as BSP stub01q,31may99,yp Added comments suggested in SPR #2531901p,21apr98,yp added tffs to files included from there01o,26mar98,hdn added DOC2_XXX macros along with windowBaseAddress().01n,11mar98,yp made including tffsConfig.c conditional so man page generation does not include it.01m,09mar98,kbw made man page edits to fix problems found by QE01l,04mar98,kbw made man page edits01k,13feb98,hdn commented out pcVccOff() to fix multi drive testing.01j,19jan98,hdn fixed pcVccXX, pcVppXX. added timeout in while loop.01i,18dec97,hdn added comment. cleaned up.01h,11dec97,hdn added our PCMCIA library support.01g,05dec97,hdn added flDelayMsecs(), socketTable[]. cleanup.01f,25nov97,hdn made each interface functions configurable.01e,24nov97,hdn made each socket interface configurable.01d,11nov97,hdn made flDelayLoop() dummy function.01c,11nov97,hdn fixed comments, copyright.01b,05nov97,hdn cleaned up.01a,09oct97,and written by Andray in M-Systems*//*DESCRIPTIONThis library provides board-specific hardware access routines for TrueFFS. In effect, these routines comprise the socket component driver (or drivers)for your flash device hardware. At socket registration time, TrueFFS stores pointers to the functions of this socket component driver in an 'FLSocket' structure. When TrueFFS needs to access the flash device, it uses these functions. Because this file is, for the most part, a device driver that exports its functionality by registering function pointers with TrueFFS, very few of the functions defined here are externally callable. For the record, these external functions are flFitInSocketWindow() and flDelayLoop(). You should never have any need to call these functions. However, one of the most import functions defined in this file is neitherreferenced in an 'FLSocket' structure, nor is it externally callable. Thisfunction is sysTffsInit(). TrueFFS calls this function at initialization time to register socket component drivers for all the flash devices attached to your target. It is this call to sysTffs() that results in assigning drive numbers to the flash devices on your target hardware. Drive numbers are assigned by the order in which the socket component drivers are registered.The first to be registered is drive 0, the second is drive 1, and so on up to 4. As shipped, TrueFFS supports up to five flash drives. After registering socket component drivers for a flash device, you may format the flash medium even though there is not yet a block device driverassociated with the flash (see the reference entry for the tffsDevCreate() routine). To format the flash medium for use with TrueFFS, call tffsDevFormat() or, for some BSPs, sysTffsFormat(). The sysTffsFormat() routine is an optional but BSP-specific externally callable helper function. Internally, it calls tffsDevFormat() with a pointer to a 'FormatParams' structure initialized to values that leave a space on the flash device for a boot image. This space is outside the region managed by TrueFFS. This special region is necessary for boot images because the normal translation and wear-leveling services of TrueFFS are incompatible with the needs of the boot program and the boot image it relies upon. To write a boot image (or any other data) into this area, use tffsBootImagePut(). INCLUDE FILES: flsocket.hSEE ALSO : tffsDevFormat tffsRawio*//* includes */#include "vxWorks.h"#include "config.h"#include "tffs/flsocket.h"#include "tffs/pcic.h"/* defines */#define INCLUDE_MTD_I28F016#define INCLUDE_MTD_I28F008#define INCLUDE_MTD_AMD#undef INCLUDE_MTD_CFISCS#undef INCLUDE_MTD_WAMD#define INCLUDE_TL_FTL#undef INCLUDE_TL_SSFDC #undef INCLUDE_SOCKET_DOC /* DOC socket interface */#define INCLUDE_SOCKET_PCIC0 /* PCIC socket interface 0 */#define INCLUDE_SOCKET_PCIC1 /* PCIC socket interface 1 */#define INCLUDE_TFFS_BOOT_IMAGE /* include tffsBootImagePut() */#define WINDOW_ID 0 /* PCIC window used (0-4) */#define VPP_DELAY_MSEC 100 /* Millisecs to wait for Vpp ramp up */#define DOC2_SCAN_ADRS_0 0xc8000 /* start of mem range to scan for DOC2 */#define DOC2_SCAN_ADRS_1 0xf0000 /* end of mem range to scan for DOC2 */#define PC_BASE_ADRS_0 0xd8000 /* base addr for socket 0 */#define PC_BASE_ADRS_1 0xda000 /* base addr for socket 1 */#define KILL_TIME_FUNC ((iz * iz) / (iz + iz)) / ((iy + iz) / (iy * iz))#define PC_WINDOW 1 /* PCIC window no. used by TFFS */#define PC_EXTRAWS 1 /* PCIC wait state used by TFFS */#define PC_SOCKET_NAME_DOC "DOC" /* DOC socket name for DOC */#define PC_SOCKET_NAME_0 "PCMCIA-0" /* PCIC socket name for socket 0 */#define PC_SOCKET_NAME_1 "PCMCIA-1" /* PCIC socket name for socket 1 *//* externs */#ifdef INCLUDE_SOCKET_DOCIMPORT unsigned windowBaseAddress (unsigned driveNo, unsigned long startAddr, unsigned long endAddr); /* nfdc2148.c */#endif /* INCLUDE_SOCKET_DOC */IMPORT PCMCIA_CTRL pcmciaCtrl;/* globals */char pcDriveNo[2] = {NONE, NONE}; /* drive number of the sockets *//* locals */LOCAL UINT32 sysTffsMsecLoopCount = 0; /* loop count to consume milli sec */#ifndef INCLUDE_PCMCIALOCAL FLMutex flPcicMutex = NULL; /* protects PCIC register access */ /* in multi-threaded environments */#endif /* INCLUDE_PCMCIA *//* forward declarations */#ifdef INCLUDE_SOCKET_DOCLOCAL FLStatus docRegister (void);LOCAL unsigned docWindowBaseAddress (unsigned driveNo);LOCAL FLBoolean docCardDetected (FLSocket vol);LOCAL void docVccOn (FLSocket vol);LOCAL void docVccOff (FLSocket vol);#ifdef SOCKET_12_VOLTSLOCAL FLStatus docVppOn (FLSocket vol);LOCAL void docVppOff (FLSocket vol);#endif /* SOCKET_12_VOLTS */LOCAL FLStatus docInitSocket (FLSocket vol);LOCAL void docSetWindow (FLSocket vol);LOCAL void docSetMappingContext (FLSocket vol, unsigned page);LOCAL FLBoolean docGetAndClearCardChangeIndicator (FLSocket vol);LOCAL FLBoolean docWriteProtected (FLSocket vol);#ifdef EXITLOCAL void docFreeSocket (FLSocket vol);#endif /* EXIT */#endif /* INCLUDE_SOCKET_DOC */#if defined (INCLUDE_SOCKET_PCIC0) || defined (INCLUDE_SOCKET_PCIC1)LOCAL FLStatus pcRegister (int socketNo, unsigned int baseAddress);#ifndef INCLUDE_PCMCIALOCAL unsigned char flInportb (unsigned portId);LOCAL void flOutportb (unsigned portId, unsigned char value);LOCAL unsigned char get365 (FLSocket vol, unsigned char reg);LOCAL void set365 (FLSocket vol, unsigned char reg, unsigned char value);#endif /* INCLUDE_PCMCIA */LOCAL FLBoolean pcCardDetected (FLSocket vol);LOCAL void pcVccOn (FLSocket vol);LOCAL void pcVccOff (FLSocket vol);#ifdef SOCKET_12_VOLTSLOCAL FLStatus pcVppOn (FLSocket vol);LOCAL void pcVppOff (FLSocket vol);#endif /* SOCKET_12_VOLTS */LOCAL FLStatus pcInitSocket (FLSocket vol);LOCAL void pcSetWindow (FLSocket vol);LOCAL void pcSetMappingContext (FLSocket vol, unsigned page);LOCAL FLBoolean pcGetAndClearCardChangeIndicator (FLSocket vol);LOCAL FLBoolean pcWriteProtected (FLSocket vol);#ifdef EXITLOCAL void pcFreeSocket (FLSocket vol);#endif /* EXIT */#endif /* defined (INCLUDE_SOCKET_PCIC0) || defined (INCLUDE_SOCKET_PCIC1) */#ifndef DOC#include "tffs/tffsConfig.c"#endif /* DOC *//********************************************************************************* sysTffsInit - board level initialization for TFFS** This routine calls the socket registration routines for the socket component* drivers that will be used with this BSP. The order of registration signifies* the logical drive number given to the drive associated with the socket.** RETURNS: N/A*/LOCAL void sysTffsInit (void) { UINT32 ix = 0; UINT32 iy = 1; UINT32 iz = 2; int oldTick; /* we assume followings: * - no interrupts except timer is happening. * - the loop count that consumes 1 msec is in 32 bit. * it should be done in the early stage of usrRoot() in tffsDrv(). */ oldTick = tickGet(); while (oldTick == tickGet()) /* wait for next clock interrupt */ ; oldTick = tickGet(); while (oldTick == tickGet()) /* loop one clock tick */ { iy = KILL_TIME_FUNC; /* consume time */ ix++; /* increment the counter */ } sysTffsMsecLoopCount = ix * sysClkRateGet() / 1000;#ifdef INCLUDE_SOCKET_DOC (void) docRegister (); /* Disk On Chip */#endif /* INCLUDE_SOCKET_DOC */#ifdef INCLUDE_SOCKET_PCIC0 (void) pcRegister (0, PC_BASE_ADRS_0); /* flash card on socket 0 */#endif /* INCLUDE_SOCKET_PCIC0 */#ifdef INCLUDE_SOCKET_PCIC1 (void) pcRegister (1, PC_BASE_ADRS_1); /* flash card on socket 1 */#endif /* INCLUDE_SOCKET_PCIC1 */ }#ifdef INCLUDE_SOCKET_DOC/********************************************************************************* docRegister - registration routine for M-Systems Disk On Chip (DOC) * socket component driver** This routine populates the 'vol' structure for a logical drive with the* socket component driver routines for the M-System DOC. All socket routines* are referanced through the 'vol' structure and never from here directly** RETURNS: flOK, or flTooManyComponents if there're too many drives,* or flAdapterNotFound if there's no controller.*/LOCAL FLStatus docRegister (void) { FLSocket vol; if (noOfDrives >= DRIVES) return (flTooManyComponents); pVol = flSocketOf (noOfDrives); vol.window.baseAddress = docWindowBaseAddress (vol.volNo); if (vol.window.baseAddress == 0) return (flAdapterNotFound); vol.cardDetected = docCardDetected; vol.VccOn = docVccOn; vol.VccOff = docVccOff;#ifdef SOCKET_12_VOLTS vol.VppOn = docVppOn; vol.VppOff = docVppOff;#endif vol.initSocket = docInitSocket; vol.setWindow = docSetWindow; vol.setMappingContext = docSetMappingContext; vol.getAndClearCardChangeIndicator = docGetAndClearCardChangeIndicator; vol.writeProtected = docWriteProtected;#ifdef EXIT vol.freeSocket = docFreeSocket;#endif tffsSocket[noOfDrives] = PC_SOCKET_NAME_DOC; noOfDrives++; return (flOK); } /********************************************************************************* docWindowBaseAddress - Return the host base address of the DOC2 window** This routine Return the host base address of the window.* It scans the host address range from DOC2_SCAN_ADRS_0 to DOC2_SCAN_ADRS_1* (inclusive) attempting to identify DiskOnChip 2000 memory window.** RETURNS: Host physical address of window divided by 4 KB*/LOCAL unsigned docWindowBaseAddress ( unsigned driveNo /* drive number */ ) { return (windowBaseAddress (driveNo, DOC2_SCAN_ADRS_0, DOC2_SCAN_ADRS_1)); }/********************************************************************************* docCardDetected - detect if a card is present (inserted)** This routine detects if a card is present (inserted).** RETURNS: TRUE, or FALSE if the card is not present.*/LOCAL FLBoolean docCardDetected ( FLSocket vol /* pointer identifying drive */ ) { return (TRUE); }/********************************************************************************* docVccOn - turn on Vcc (3.3/5 Volts)** This routine turns on Vcc (3.3/5 Volts). Vcc must be known to be good* on exit.** RETURNS: N/A*/LOCAL void docVccOn ( FLSocket vol /* pointer identifying drive */ ) { }/********************************************************************************* docVccOff - turn off Vcc (3.3/5 Volts)** This routine turns off Vcc (3.3/5 Volts). ** RETURNS: N/A*/LOCAL void docVccOff ( FLSocket vol /* pointer identifying drive */ ) { }#ifdef SOCKET_12_VOLTS/********************************************************************************* docVppOn - turns on Vpp (12 Volts)** This routine turns on Vpp (12 Volts). Vpp must be known to be good on exit.** RETURNS: flOK always*/LOCAL FLStatus docVppOn ( FLSocket vol /* pointer identifying drive */ ) { return (flOK); }/********************************************************************************* docVppOff - turns off Vpp (12 Volts)** This routine turns off Vpp (12 Volts).** RETURNS: N/A*/LOCAL void docVppOff ( FLSocket vol /* pointer identifying drive */ ) { }#endif /* SOCKET_12_VOLTS *//********************************************************************************* docInitSocket - perform all necessary initializations of the socket** This routine performs all necessary initializations of the socket.** RETURNS: flOK always*/LOCAL FLStatus docInitSocket ( FLSocket vol /* pointer identifying drive */ ) { return (flOK); }/********************************************************************************* docSetWindow - set current window attributes, Base address, size, etc** This routine sets current window hardware attributes: Base address, size,* speed and bus width. The requested settings are given in the 'vol.window' * structure. If it is not possible to set the window size requested in* 'vol.window.size', the window size should be set to a larger value, * if possible. In any case, 'vol.window.size' should contain the * actual window size (in 4 KB units) on exit.** RETURNS: N/A*/LOCAL void docSetWindow ( FLSocket vol /* pointer identifying drive */ ) { }/********************************************************************************* docSetMappingContext - sets the window mapping register to a card address** This routine sets the window mapping register to a card address.* The window should be set to the value of 'vol.window.currentPage',* which is the card address divided by 4 KB. An address over 128MB,* (page over 32K) specifies an attribute-space address. On entry to this * routine vol.window.currentPage is the page already mapped into the window.* (In otherwords the page that was mapped by the last call to this routine.)** The page to map is guaranteed to be on a full window-size boundary.** RETURNS: N/A*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -