307 lines
9.1 KiB
C
307 lines
9.1 KiB
C
/*
|
|
* $Log: P:/user/amir/lite/vcs/flsystem.h_v $
|
|
|
|
Rev 1.4 11 Sep 1997 14:14:22 danig
|
|
physicalToPointer receives drive no. when FAR == 0
|
|
|
|
Rev 1.3 04 Sep 1997 13:58:30 danig
|
|
DEBUG_PRINT
|
|
|
|
Rev 1.2 28 Aug 1997 16:39:32 danig
|
|
include stdlib.h instead of malloc.h
|
|
|
|
Rev 1.1 19 Aug 1997 20:05:06 danig
|
|
Andray's changes
|
|
|
|
Rev 1.0 24 Jul 1997 18:13:06 amirban
|
|
Initial revision.
|
|
*/
|
|
|
|
/************************************************************************/
|
|
/* */
|
|
/* FAT-FTL Lite Software Development Kit */
|
|
/* Copyright (C) M-Systems Ltd. 1995-1996 */
|
|
/* */
|
|
/************************************************************************/
|
|
|
|
|
|
#ifndef FLSYSTEM_H
|
|
#define FLSYSTEM_H
|
|
#include <ntddk.h>
|
|
#include "flcustom.h"
|
|
|
|
|
|
/* DiskOnChip bus configuration
|
|
*
|
|
* When FL_NO_USE_FUNC is defined use the defintion bellow to set DiskOnChip
|
|
* bus width access (either 8/16/32).
|
|
* Please check the manula before deciding to use the FL_NO_USE_FUNC mode.
|
|
*/
|
|
|
|
#define DOC_ACCESS_TYPE 8
|
|
|
|
/*moti
|
|
* delay With Yeald CPU disable
|
|
*
|
|
* Osak utiliezes the flSleep customized routine to yeald the CPU while
|
|
* waiting for time consumming operations like flash erase. If the routine
|
|
* is not implemented the uncomment the define bellow
|
|
*/
|
|
|
|
#define DO_NOT_YEAL_CPU
|
|
|
|
/*
|
|
* signed/unsigned char
|
|
*
|
|
* It is assumed that 'char' is signed. If this is not your compiler
|
|
* default, use compiler switches, or insert a #pragma here to define this.
|
|
*
|
|
*/
|
|
|
|
/*#pragma option -K-*/ /* default char is signed */
|
|
|
|
|
|
/* CPU target
|
|
*
|
|
* Use compiler switches or insert a #pragma here to select the CPU type
|
|
* you are targeting.
|
|
*
|
|
* If the target is an Intel 80386 or above, also uncomment the CPU_i386
|
|
* definition.
|
|
*/
|
|
|
|
/*#pragma option -3*/ /* Select 80386 CPU */
|
|
#define CPU_i386
|
|
|
|
|
|
/* NULL constant
|
|
*
|
|
* Some compilers require a different definition for the NULL pointer
|
|
*/
|
|
|
|
/*#include <_null.h>*/
|
|
|
|
|
|
/* Little-endian/big-endian
|
|
*
|
|
* FAT and translation layers structures use the little-endian (Intel)
|
|
* format for integers.
|
|
* If your machine uses the big-endian (Motorola) format, uncomment the
|
|
* following line.
|
|
* Note that even on big-endian machines you may omit the BIG_ENDIAN
|
|
* definition for smaller code size and better performance, but your media
|
|
* will not be compatible with standard FAT and FTL.
|
|
*/
|
|
|
|
/* #define BIG_ENDIAN */
|
|
|
|
|
|
/* Far pointers
|
|
*
|
|
* Specify here which pointers may be far, if any.
|
|
* Far pointers are usually relevant only to 80x86 architectures.
|
|
*
|
|
* Specify FAR_LEVEL:
|
|
* 0 - if using a flat memory model or having no far pointers.
|
|
* 1 - if only the socket window may be far
|
|
* 2 - if only the socket window and caller's read/write buffers
|
|
* may be far.
|
|
* 3 - if socket window, caller's read/write buffers and the
|
|
* caller's I/O request packet may be far
|
|
*/
|
|
|
|
#define FAR_LEVEL 0
|
|
|
|
|
|
/* Memory routines
|
|
*
|
|
* You need to supply library routines to copy, set and compare blocks of
|
|
* memory, internally and to/from callers. The code uses the names 'tffscpy',
|
|
* 'tffsset' and 'tffscmp' with parameters as in the standard 'memcpy',
|
|
* 'memset' and 'memcmp' C library routines.
|
|
*/
|
|
|
|
#include <string.h>
|
|
|
|
#ifndef ENVIRONMENT_VARS
|
|
#if FAR_LEVEL > 0
|
|
#define tffscpy _fmemcpy
|
|
#define tffscmp _fmemcmp
|
|
#define tffsset _fmemset
|
|
#else
|
|
#define tffscpy memcpy
|
|
#define tffscmp memcmp
|
|
#define tffsset memset
|
|
#endif
|
|
#else
|
|
#if FAR_LEVEL > 0
|
|
#define flcpy _fmemcpy
|
|
#define flcmp _fmemcmp
|
|
#define flset _fmemset
|
|
#else
|
|
#define flcmp flmemcmp
|
|
#define flset flmemset
|
|
#define flcpy flmemcpy
|
|
#endif
|
|
#endif
|
|
|
|
|
|
/* Pointer arithmetic
|
|
*
|
|
* The following macros define machine- and compiler-dependent macros for
|
|
* handling pointers to physical window addresses. The definitions below are
|
|
* for PC real-mode Borland-C.
|
|
*
|
|
* 'physicalToPointer' translates a physical flat address to a (far) pointer.
|
|
* Note that if when your processor uses virtual memory, the code should
|
|
* map the physical address to virtual memory, and return a pointer to that
|
|
* memory (the size parameter tells how much memory should be mapped).
|
|
*
|
|
* 'addToFarPointer' adds an increment to a pointer and returns a new
|
|
* pointer. The increment may be as large as your window size. The code
|
|
* below assumes that the increment may be larger than 64 KB and so performs
|
|
* huge pointer arithmetic.
|
|
*/
|
|
|
|
#if FAR_LEVEL > 0
|
|
#include <dos.h>
|
|
|
|
#define physicalToPointer(physical,size,drive) \
|
|
MK_FP((LONG) ((physical) >> 4),(LONG) (physical) & 0xF)
|
|
|
|
#define addToFarPointer(base,increment) \
|
|
MK_FP(FP_SEG(base) + \
|
|
((USHORT) ((FP_OFF(base) + (increment)) >> 16) << 12), \
|
|
FP_OFF(base) + (LONG) (increment))
|
|
#else
|
|
|
|
#include <ntddk.h>
|
|
#define freePointer(ptr,size) 1
|
|
typedef struct {
|
|
ULONG windowSize;
|
|
ULONGLONG physWindow;
|
|
PVOID winBase;
|
|
ULONG interfAlive;
|
|
PVOID fdoExtension;
|
|
UCHAR nextPartitionNumber;
|
|
} NTsocketParams;
|
|
|
|
//moti extern NTsocketParams *pdriveInfo;
|
|
extern NTsocketParams *pdriveInfo;
|
|
|
|
#define physicalToPointer(physical,size,drive) pdriveInfo[drive & 0x0f].winBase
|
|
|
|
#define pointerToPhysical(ptr) ((ULONG_PTR)(ptr))
|
|
|
|
#define addToFarPointer(base,increment) \
|
|
((VOID *) ((UCHAR *) (base) + (increment)))
|
|
#endif
|
|
|
|
|
|
/* Default calling convention
|
|
*
|
|
* C compilers usually use the C calling convention to routines (cdecl), but
|
|
* often can also use the pascal calling convention, which is somewhat more
|
|
* economical in code size. Some compilers also have specialized calling
|
|
* conventions which may be suitable. Use compiler switches or insert a
|
|
* #pragma here to select your favorite calling convention.
|
|
*/
|
|
|
|
/*#pragma option -p*/ /* Default pascal calling convention */
|
|
/* Naming convention for functions that uses non-default convention. */
|
|
#define NAMING_CONVENTION /*cdecl*/
|
|
|
|
#define FL_IOCTL_START 0
|
|
|
|
|
|
/* Mutex type
|
|
*
|
|
* If you intend to access the FLite API in a multi-tasking environment,
|
|
* you may need to implement some resource management and mutual-exclusion
|
|
* of FLite with mutex & semaphore services that are available to you. In
|
|
* this case, define here the Mutex type you will use, and provide your own
|
|
* implementation of the Mutex functions incustom.c
|
|
*
|
|
* By default, a Mutex is defined as a simple counter, and the Mutex
|
|
* functions in custom.c implement locking and unlocking by incrementing
|
|
* and decrementing the counter. This will work well on all single-tasking
|
|
* environment, as well as on many multi-tasking environments.
|
|
*/
|
|
|
|
//typedef LONG FLMutex;
|
|
typedef struct _SpinLockMutex{
|
|
KSPIN_LOCK Mutex;
|
|
KIRQL cIrql;
|
|
}SpinLockMutex;
|
|
|
|
typedef SpinLockMutex FLMutex;
|
|
/*#include <dos.h>
|
|
|
|
#define flStartCriticalSection(FLMutex) disable()
|
|
#define flEndCriticalSection(FLMutex) enable()*/
|
|
|
|
/* Memory allocation
|
|
*
|
|
* The translation layers (e.g. FTL) need to allocate memory to handle
|
|
* Flash media. The size needed depends on the media being handled.
|
|
*
|
|
* You may choose to use the standard 'malloc' and 'free' to handle such
|
|
* memory allocations, provide your own equivalent routines, or you may
|
|
* choose not to define any memory allocation routine. In this case, the
|
|
* memory will be allocated statically at compile-time on the assumption of
|
|
* the largest media configuration you need to support. This is the simplest
|
|
* choice, but may cause your RAM requirements to be larger than you
|
|
* actually need.
|
|
*
|
|
* If you define routines other than malloc & free, they should have the
|
|
* same parameters and return types as malloc & free. You should either code
|
|
* these routines in flcustom.c or include them when you link your application.
|
|
*/
|
|
|
|
#ifdef NT5PORT
|
|
|
|
|
|
|
|
VOID * myMalloc(ULONG numberOfBytes);
|
|
|
|
#define MALLOC myMalloc
|
|
#define FREE ExFreePool
|
|
|
|
|
|
/* Debug mode
|
|
*
|
|
* Uncomment the following lines if you want debug messages to be printed
|
|
* out. Messages will be printed at initialization key points, and when
|
|
* low-level errors occure.
|
|
* You may choose to use 'printf' or provide your own routine.
|
|
*/
|
|
|
|
#if DBG
|
|
#define DEBUG_PRINT(str) DbgPrint(str)
|
|
#else
|
|
#define DEBUG_PRINT(str)
|
|
#endif
|
|
|
|
VOID startIntervalTimer(VOID);
|
|
|
|
#define tffsReadByteFlash(r) READ_REGISTER_UCHAR((PUCHAR)r)
|
|
#define tffsWriteByteFlash(r,b) WRITE_REGISTER_UCHAR((PUCHAR)r,(UCHAR)b)
|
|
#define tffsReadWordFlash(r) READ_REGISTER_USHORT((PUSHORT)r)
|
|
#define tffsWriteWordFlash(r,b) WRITE_REGISTER_USHORT((PUSHORT)r,(USHORT)b)
|
|
#define tffsReadDwordFlash(r) READ_REGISTER_ULONG((PULONG)r)
|
|
#define tffsWriteDwordFlash(r,b) WRITE_REGISTER_ULONG((PULONG)r,(ULONG)b)
|
|
|
|
#define tffsReadByte(r) READ_REGISTER_UCHAR((PUCHAR)&(r))
|
|
#define tffsWriteByte(r,b) WRITE_REGISTER_UCHAR((PUCHAR)&(r),b)
|
|
#define tffsReadBuf(d,s,c) READ_REGISTER_BUFFER_UCHAR((PUCHAR)s,d,c)
|
|
#define tffsWriteBuf(d,s,c) WRITE_REGISTER_BUFFER_UCHAR((PUCHAR)d,s,c)
|
|
|
|
extern void PRINTF(
|
|
char * Message,
|
|
...
|
|
);
|
|
#endif /* NT5PORT */
|
|
|
|
|
|
#endif
|