mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
355 lines
16 KiB
355 lines
16 KiB
/*
|
|
* $Log: V:/Flite/archives/TrueFFS5/Src/DOCSOC.C_V $
|
|
*
|
|
* Rev 1.5 Jan 17 2002 22:59:06 oris
|
|
* mtdVars for DiskOnChip MTD were moved from diskonc.c and mdocplus.c to save RAM.
|
|
* Added include for NANDDEFS.H
|
|
*
|
|
* Rev 1.4 Jun 17 2001 16:39:10 oris
|
|
* Improved documentation and remove warnings.
|
|
*
|
|
* Rev 1.3 Apr 10 2001 16:41:46 oris
|
|
* Restored all DiskOnChip socket routines from flsocket.c
|
|
*
|
|
* Rev 1.2 Apr 09 2001 14:59:50 oris
|
|
* Added an empty routine to avoid warnings.
|
|
*
|
|
* Rev 1.1 Apr 01 2001 07:44:38 oris
|
|
* Updated copywrite notice
|
|
*
|
|
* Rev 1.0 Feb 02 2001 13:26:30 oris
|
|
* Initial revision.
|
|
*
|
|
*/
|
|
|
|
/***********************************************************************************/
|
|
/* M-Systems Confidential */
|
|
/* Copyright (C) M-Systems Flash Disk Pioneers Ltd. 1995-2001 */
|
|
/* All Rights Reserved */
|
|
/***********************************************************************************/
|
|
/* NOTICE OF M-SYSTEMS OEM */
|
|
/* SOFTWARE LICENSE AGREEMENT */
|
|
/* */
|
|
/* THE USE OF THIS SOFTWARE IS GOVERNED BY A SEPARATE LICENSE */
|
|
/* AGREEMENT BETWEEN THE OEM AND M-SYSTEMS. REFER TO THAT AGREEMENT */
|
|
/* FOR THE SPECIFIC TERMS AND CONDITIONS OF USE, */
|
|
/* OR CONTACT M-SYSTEMS FOR LICENSE ASSISTANCE: */
|
|
/* E-MAIL = [email protected] */
|
|
/***********************************************************************************/
|
|
|
|
#include "flsocket.h"
|
|
#include "nanddefs.h"
|
|
|
|
#ifdef NT5PORT
|
|
#include "scsi.h"
|
|
#include "tffsport.h"
|
|
|
|
extern NTsocketParams driveInfo[SOCKETS];
|
|
NTSTATUS updateDocSocketParams(PDEVICE_EXTENSION fdoExtension)
|
|
{
|
|
NTSTATUS status;
|
|
ULONG device;
|
|
|
|
device = (fdoExtension->UnitNumber &0x0f);
|
|
driveInfo[device].windowSize = fdoExtension->pcmciaParams.windowSize;
|
|
driveInfo[device].physWindow = fdoExtension->pcmciaParams.physWindow;
|
|
driveInfo[device].winBase = fdoExtension->pcmciaParams.windowBase;
|
|
driveInfo[device].fdoExtension = (PVOID) fdoExtension;
|
|
driveInfo[device].interfAlive = 1;
|
|
return STATUS_SUCCESS;
|
|
}
|
|
#endif /* NT5PORT */
|
|
|
|
NFDC21Vars docMtdVars[SOCKETS];
|
|
|
|
/************************************************************************/
|
|
/* */
|
|
/* Beginning of controller-customizable code */
|
|
/* */
|
|
/* The function prototypes and interfaces in this section are standard */
|
|
/* and are used in this form by the non-customizable code. However, the */
|
|
/* function implementations are specific to the 82365SL controller. */
|
|
/* */
|
|
/* You should replace the function bodies here with the implementation */
|
|
/* that is appropriate for your controller. */
|
|
/* */
|
|
/* All the functions in this section have no parameters. This is */
|
|
/* because the parameters needed for an operation may be themselves */
|
|
/* dependent on the controller. Instead, you should use the value in */
|
|
/* the 'vol' structure as parameters. */
|
|
/* If you need socket-state variables specific to your implementation, */
|
|
/* it is recommended to add them to the 'vol' structure rather than */
|
|
/* define them as separate static variables. */
|
|
/* */
|
|
/************************************************************************/
|
|
|
|
|
|
/************************************************************************/
|
|
/* c a r d D e t e c t e d */
|
|
/* */
|
|
/* Detect if a card is present (inserted) */
|
|
/* */
|
|
/* Parameters: */
|
|
/* vol : Pointer identifying drive */
|
|
/* */
|
|
/* Returns: */
|
|
/* 0 = card not present, other = card present */
|
|
/************************************************************************/
|
|
|
|
static FLBoolean cardDetected(FLSocket vol)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/************************************************************************/
|
|
/* V c c O n */
|
|
/* */
|
|
/* Turns on Vcc (3.3/5 Volts). Vcc must be known to be good on exit. */
|
|
/* */
|
|
/* Parameters: */
|
|
/* vol : Pointer identifying drive */
|
|
/* */
|
|
/************************************************************************/
|
|
|
|
static void VccOn(FLSocket vol)
|
|
{
|
|
}
|
|
|
|
|
|
/************************************************************************/
|
|
/* V c c O f f */
|
|
/* */
|
|
/* Turns off Vcc. */
|
|
/* */
|
|
/* Parameters: */
|
|
/* vol : Pointer identifying drive */
|
|
/* */
|
|
/************************************************************************/
|
|
|
|
static void VccOff(FLSocket vol)
|
|
{
|
|
}
|
|
|
|
|
|
#ifdef SOCKET_12_VOLTS
|
|
|
|
/************************************************************************/
|
|
/* V p p O n */
|
|
/* */
|
|
/* Turns on Vpp (12 Volts. Vpp must be known to be good on exit.) */
|
|
/* */
|
|
/* Parameters: */
|
|
/* vol : Pointer identifying drive */
|
|
/* */
|
|
/* Returns: */
|
|
/* FLStatus : 0 on success, failed otherwise */
|
|
/************************************************************************/
|
|
|
|
static FLStatus VppOn(FLSocket vol)
|
|
{
|
|
return flOK;
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* V p p O f f */
|
|
/* */
|
|
/* Turns off Vpp. */
|
|
/* */
|
|
/* Parameters: */
|
|
/* vol : Pointer identifying drive */
|
|
/* */
|
|
/************************************************************************/
|
|
|
|
static void VppOff(FLSocket vol)
|
|
{
|
|
}
|
|
|
|
#endif /* SOCKET_12_VOLTS */
|
|
|
|
/************************************************************************/
|
|
/* i n i t S o c k e t */
|
|
/* */
|
|
/* Perform all necessary initializations of the socket or controller */
|
|
/* */
|
|
/* Parameters: */
|
|
/* vol : Pointer identifying drive */
|
|
/* */
|
|
/* Returns: */
|
|
/* FLStatus : 0 on success, failed otherwise */
|
|
/************************************************************************/
|
|
|
|
static FLStatus initSocket(FLSocket vol)
|
|
{
|
|
return flOK;
|
|
}
|
|
|
|
|
|
/************************************************************************/
|
|
/* s e t W i n d o w */
|
|
/* */
|
|
/* Sets in hardware all current window parameters: 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. */
|
|
/* */
|
|
/* Parameters: */
|
|
/* vol : Pointer identifying drive */
|
|
/* */
|
|
/************************************************************************/
|
|
|
|
static void setWindow(FLSocket vol)
|
|
{
|
|
#ifdef NT5PORT
|
|
vol.window.size = driveInfo[vol.volNo].windowSize;
|
|
vol.window.base = driveInfo[vol.volNo].winBase;
|
|
#endif/*NT5PORT*/
|
|
|
|
}
|
|
|
|
|
|
/************************************************************************/
|
|
/* s e t M a p p i n g C o n t e x t */
|
|
/* */
|
|
/* 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 128KB, */
|
|
/* (page over 32K) specifies an attribute-space address. */
|
|
/* */
|
|
/* The page to map is guaranteed to be on a full window-size boundary. */
|
|
/* */
|
|
/* Parameters: */
|
|
/* vol : Pointer identifying drive */
|
|
/* page : page to map */
|
|
/* */
|
|
/************************************************************************/
|
|
|
|
static void setMappingContext(FLSocket vol, unsigned page)
|
|
{
|
|
}
|
|
|
|
|
|
/************************************************************************/
|
|
/* g e t A n d C l e a r C a r d C h a n g e I n d i c a t o r */
|
|
/* */
|
|
/* Returns the hardware card-change indicator and clears it if set. */
|
|
/* */
|
|
/* Parameters: */
|
|
/* vol : Pointer identifying drive */
|
|
/* */
|
|
/* Returns: */
|
|
/* 0 = Card not changed, other = card changed */
|
|
/************************************************************************/
|
|
|
|
static FLBoolean getAndClearCardChangeIndicator(FLSocket vol)
|
|
{
|
|
/* Note: On the 365, the indicator is turned off by the act of reading */
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
/************************************************************************/
|
|
/* w r i t e P r o t e c t e d */
|
|
/* */
|
|
/* Returns the write-protect state of the media */
|
|
/* */
|
|
/* Parameters: */
|
|
/* vol : Pointer identifying drive */
|
|
/* */
|
|
/* Returns: */
|
|
/* 0 = not write-protected, other = write-protected */
|
|
/************************************************************************/
|
|
|
|
static FLBoolean writeProtected(FLSocket vol)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
#ifdef EXIT
|
|
/************************************************************************/
|
|
/* f r e e S o c k e t */
|
|
/* */
|
|
/* Free resources that were allocated for this socket. */
|
|
/* This function is called when TrueFFS exits. */
|
|
/* */
|
|
/* Parameters: */
|
|
/* vol : Pointer identifying drive */
|
|
/* */
|
|
/************************************************************************/
|
|
|
|
static void freeSocket(FLSocket vol)
|
|
{
|
|
freePointer(vol.window.base,vol.window.size);
|
|
}
|
|
#endif /* EXIT */
|
|
|
|
void docSocketInit(FLSocket vol)
|
|
{
|
|
vol.cardDetected = cardDetected;
|
|
vol.VccOn = VccOn;
|
|
vol.VccOff = VccOff;
|
|
#ifdef SOCKET_12_VOLTS
|
|
vol.VppOn = VppOn;
|
|
vol.VppOff = VppOff;
|
|
#endif
|
|
vol.initSocket = initSocket;
|
|
vol.setWindow = setWindow;
|
|
vol.setMappingContext = setMappingContext;
|
|
vol.getAndClearCardChangeIndicator = getAndClearCardChangeIndicator;
|
|
vol.writeProtected = writeProtected;
|
|
vol.updateSocketParams = NULL /* updateSocketParameters */;
|
|
#ifdef EXIT
|
|
vol.freeSocket = freeSocket;
|
|
#endif
|
|
}
|
|
|
|
|
|
#ifdef NT5PORT
|
|
/*----------------------------------------------------------------------*/
|
|
/* f l R e g i s t e r D O C S O C */
|
|
/* */
|
|
/* Installs routines for DiskOnChip. */
|
|
/* */
|
|
/* Parameters: */
|
|
/* None */
|
|
/* */
|
|
/* Returns: */
|
|
/* FLStatus : 0 on success, otherwise failure */
|
|
/*----------------------------------------------------------------------*/
|
|
ULONG windowBaseAddress(ULONG driveNo)
|
|
{
|
|
return (ULONG) (driveInfo[driveNo].physWindow >> 12);
|
|
}
|
|
FLStatus flRegisterDOCSOC(ULONG startAddr,ULONG stopAddr)
|
|
{
|
|
if (noOfSockets >= DOC_DRIVES)
|
|
return flTooManyComponents;
|
|
|
|
for (; noOfSockets < DOC_DRIVES; noOfSockets++) {
|
|
|
|
FLSocket vol = flSocketOf(noOfSockets);
|
|
vol.volNo = noOfSockets;
|
|
docSocketInit(&vol);
|
|
flSetWindowSize(&vol, 2); /* 4 KBytes */
|
|
|
|
//vol.window.baseAddress = flDocWindowBaseAddress(vol.volNo, 0, 0, NULL);
|
|
vol.window.baseAddress = windowBaseAddress(vol.volNo);
|
|
vol.window.base = pdriveInfo[vol.volNo & 0x0f].winBase;
|
|
// if(((void *)vol.window.baseAddress) == NULL){
|
|
// }
|
|
|
|
}
|
|
if (noOfSockets == 0)
|
|
return flAdapterNotFound;
|
|
|
|
return flOK;
|
|
}
|
|
#endif /*NT5PORT*/
|
|
|
|
|