⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ufat_types.h

📁 凌阳SPCE3200 系统开发板随机自带源程序。共安排了32个子目录
💻 H
📖 第 1 页 / 共 2 页
字号:
/*
 * UFAT3 Config File ufat.h
 * Copyright (C) 2005 Sunnorth
 *
 * First Built: Yongliang 2005-8-9
 */

#ifndef _UFAT3_HEADER_UFAT_TYPES_H_
#define _UFAT3_HEADER_UFAT_TYPES_H_

#include "ufat_config.h"
#include "ufat_fcntl.h"

/* basic variable types */
typedef unsigned long UINT32;
typedef unsigned short UINT16;
typedef unsigned char UINT8;
typedef long INT32;
typedef short INT16;
typedef char INT8;
/* default function return type */
typedef int RES;
typedef int BOOL;
typedef int MODE;
/* cluster index type */
typedef UINT32 CLUSTER;
/* sector index type */
typedef UINT32 SECTOR;
/* rw count type */
#define RWCOUNT int

#if DIRECT_DMA_MODE
#	define BUFTYPE(buf)		(UINT32)(buf)
typedef UINT32 buf_t;
extern UINT8 xfermode;				
#else
#	define BUFTYPE(buf)		(UINT8 *)(buf)
typedef void * buf_t;
#endif

/* FAT file name constants */
#define FNAME_SIZE              8
#define FEXT_SIZE               3
/* file time types */
typedef unsigned short dosdate;
typedef unsigned short dostime;
/* FAT file system directory entry */
APACKED struct ufat_dirent {
	UINT8 dir_name[FNAME_SIZE + FEXT_SIZE];	/* Filename + extension in FCB format */
	UINT8 dir_attrib;		/* File Attribute               */
	UINT8 dir_case;			/* File case                    */
	UINT8 dir_crtimems;		/* Milliseconds                 */
	UINT16 dir_crtime;		/* Creation time                */
	UINT16 dir_crdate;		/* Creation date                */
	UINT16 dir_accdate;		/* Last access date             */
	UINT16 dir_start_high;	/* High word of the cluster     */
	dostime dir_time;		/* Time file created/updated    */
	dosdate dir_date;		/* Date file created/updated    */
	UINT16 dir_start;		/* Starting cluster             */
							/* 1st available = 2            */
	UINT32 dir_size;		/* File size in bytes           */
} PACKED;
typedef struct ufat_dirent st_dirent;
typedef st_dirent *st_dirent_ptr;
/* Internal drive parameter block                               */
struct dpb {
	UINT8 dpb_unit;                /* unit for error reporting     */
	//BYTE dpb_subunit;             /* the sub-unit for driver      */
	UINT16 dpb_secsize;            /* sector size                  */
	UINT8 dpb_clsmask;            /* mask (sectors/cluster-1)     */
	UINT8 dpb_shftcnt;            /* log base 2 of cluster size   */
	UINT16 dpb_fatstrt;            /* FAT start sector             */
	UINT8 dpb_fats;               /* # of FAT copies              */
	UINT16 dpb_dirents;            /* # of dir entries             */
	UINT16 dpb_data;               /* start of data area           */
	UINT16 dpb_size;               /* # of clusters+1 on media     */
	UINT16 dpb_fatsize;            /* # of sectors / FAT           */
	UINT16 dpb_dirstrt;            /* start sec. of root dir       */

	// struct dpb FAR *              /* next dpb in chain            */
	//   dpb_next;                   /* -1 = end                     */
	UINT32 dpb_hidden;

	UINT16 dpb_cluster;            /* cluster # of first free      */
	/* -1 if not known              */
	#if WITHFAT32 == 0
	UINT16 dpb_nfreeclst;          /* number of free clusters      */
	/* -1 if not known              */
	#else
	union {
		struct {
			UINT16 dpb_nfreeclst_lo;
			UINT16 dpb_nfreeclst_hi;
		} dpb_nfreeclst_st;
		UINT32 _dpb_xnfreeclst;      /* number of free clusters      */
		/* -1 if not known              */
	} dpb_nfreeclst_un;
#define dpb_nfreeclst dpb_nfreeclst_un.dpb_nfreeclst_st.dpb_nfreeclst_lo
#define dpb_xnfreeclst dpb_nfreeclst_un._dpb_xnfreeclst

  UINT16 dpb_xflags;             /* extended flags, see bpb      */
  UINT16 dpb_xfsinfosec;         /* FS info sector number,       */
  /* 0xFFFF if unknown            */
  UINT16 dpb_xbackupsec;         /* backup boot sector number    */
  /* 0xFFFF if unknown            */
  UINT32 dpb_xdata;
  UINT32 dpb_xsize;              /* # of clusters+1 on media     */
  UINT32 dpb_xfatsize;           /* # of sectors / FAT           */
  UINT32 dpb_xrootclst;          /* starting cluster of root dir */
  UINT32 dpb_xcluster;           /* cluster # of first free      */
  /* -1 if not known              */
  UINT8 dpb_fsinfoflag;			/* change flag for fsinfo */
#endif
  UINT8 dpb_mounted;			/* the device has been mounted */
    struct
    {
          int write:1;
          int read:1; 
	      int active:1; 
    } Status;
};
typedef struct dpb st_dpb;
typedef st_dpb *st_dpb_ptr;

#define UNKNCLUSTER      0x0000 /* see RBIL INT 21/AH=52 entry */
#define XUNKNCLSTFREE    0xffffffffl    /* unknown for DOS */
#define UNKNCLSTFREE     0xffff /* unknown for DOS */

#define FSINFODIRTYFLAG	0x01	
#define FSINFOLOADED	0x02	
/* file node structure definition */
typedef struct f_node	{
	UINT16 f_count;				/* number of uses of this file  */
	UINT8 f_mode;				/* read, write, read-write, etc */
	UINT8 f_flags;				/* file flags                   */
	struct ufat_dirent f_dir;		/* this file's dir entry image  */
	UINT16 f_diroff;			/* offset/32 of the dir entry   */
	CLUSTER f_dirstart;			/* the starting cluster of dir  */
								/* when dir is not root         */
	struct dpb * f_dpb;			/* the block device for file    */
	UINT32 f_offset;			/* byte offset for next op      */
	CLUSTER f_cluster_offset;	/* relative cluster number within file */
	CLUSTER f_cluster;			/* the cluster we are at        */
} st_f_node;
/* bit value of f_mode field */
#define F_DMOD  (1)				/* directory has been modified  */
#define F_DDIR  (2)				/* fnode is assigned to dir     */
#define F_DDATE (4)				/* date set using setdate       */
/* pointer type to the file node structure */
typedef struct f_node * st_f_node_ptr;
/* struct of direntry */
typedef APACKED struct {
	INT8	Name[11];
	UINT8	Attr;
	UINT8	NTRes;
	UINT8	CrtTimeTenth;
	UINT16	CrtTime;
	UINT16	CrtDate;
	UINT16	LstAccDate;
	UINT16	FstClusHI;
	UINT16	WrtTime;
	UINT16	WrtDate;
	UINT16	FstClusLO;
	UINT32	FileSize;
} PACKED tDirEntry;

/* long file name dir entry struct */
typedef APACKED struct 
{
  INT8 Order;        /* Sequence number for slot        */
  INT16 Name0_4[5];   /* First 5 Unicode characters      */
  INT8 Attr;         /* Attributes, always 0x0F         */
  INT8 Reserved;     /* Reserved, always 0x00           */
  INT8 Checksum;     /* Checksum of 8.3 name            */
  INT16 Name5_10[6];  /* 6 more Unicode characters       */
  INT16 FstClus;      /* First cluster number, must be 0 */
  INT16 Name11_12[2]; /* Last 2 Unicode characters       */
} PACKED tLfnEntry;

/* struct used by fat_find and descend_path, etc */
typedef struct	{
	tDirEntry SfnEntry;
	UINT32 EntryOffset;
	int LfnEntries;
	char LongName[260];
	char ShortName[14];
} tFatFind;
/* driver list structure */
struct Drv_FileSystem	{
	UINT8 Name[8];
	RES (*Drv_Initial)(void);
	UINT32 (*Drv_GetMemSize)(void);
	RES (*Drv_ReadSector) (SECTOR, RWCOUNT, UINT8 *);
	RES (*Drv_WriteSector) (SECTOR, RWCOUNT, UINT8 *);
};
/* driver list structure for ecos*/
struct Drv_FileSystem_ECOS{
	UINT8 Name[8];
	RES (*Drv_ReadSector) (UINT8,SECTOR, RWCOUNT, UINT8 *);
	RES (*Drv_WriteSector) (UINT8,SECTOR, RWCOUNT, UINT8 *);
};

/* data buffer structure type */
#define BUFFERSIZE 512
#define BUFFERSEC	(BUFFERSIZE/512)
typedef struct buffer	{
	struct buffer *b_next;	/* next buffer in LRU list      */
	struct buffer *b_prev;	/* previous buffer in LRU list  */
	UINT8 b_unit;					/* disk for this buffer         */
	UINT8 b_flag;					/* buffer flags                 */
	UINT32 b_blkno;					/* block for this buffer        */
	UINT8 b_copies;					/* number of copies to write    */
	UINT16 b_offset;				/* offset in sectors between copies
									   to write for FAT sectors     */
	struct dpb * b_dpbp;		/* pointer to DPB               */
    /* Commented By Ahan on: 2005/09/28
     * To read more than 1 sector from HD, we modify this structure.  * */
	//UINT8 b_buffer[BUFFERSIZE];		/* 512 byte sectors for now     */
	UINT8* b_buffer; /* 512 byte sectors for now     */
} st_buffer;
/* pointer to data buffer structure data type */
typedef struct buffer XDATA * st_buffer_ptr;
#define BFR_DIRTY       0x40    /* buffer modified              */
#define BFR_VALID       0x20    /* buffer contains valid data   */
#define BFR_FSINFO      0x10    /* buffer is from file system sector, By Ahan on: 2005/10/07 */
#define BFR_DATA        0x08    /* buffer is from data area     */
#define BFR_DIR         0x04    /* buffer is from dir area      */
#define BFR_FAT         0x02    /* buffer is from fat area      */
#define BFR_UNCACHE     0x01    /* buffer to be released ASAP   */

#if UFAT_WITH_PREFETCH_BUFFER
typedef enum{
    UFAT_CACHE_START = 0,

    UFAT_CACHE_FAT_START = UFAT_CACHE_START,
    UFAT_CACHE_FAT_END   = UFAT_CACHE_START + UFAT_PREFETCH_FAT_NUM - 1,

    UFAT_CACHE_DIR_START = UFAT_CACHE_FAT_END + 1,
    UFAT_CACHE_DIR_END   = UFAT_CACHE_DIR_START + UFAT_PREFETCH_DIRENT_NUM - 1,

    UFAT_CACHE_FSINFO_START = UFAT_CACHE_DIR_END + 1,
    UFAT_CACHE_FSINFO_END   = UFAT_CACHE_FSINFO_START + UFAT_PREFETCH_FSINFO_NUM - 1,

    UFAT_CACHE_DATA_START = UFAT_CACHE_FSINFO_END + 1,
    UFAT_CACHE_DATA_END   = UFAT_CACHE_DATA_START + UFAT_PREFETCH_DATA_NUM - 1,

    UFAT_CACHE_END
}UFAT_CACHE_STRUCT;
#endif

/* dos time and dos date struct type*/
typedef struct s_dosdate
{
  unsigned short year;
  unsigned char monthday, month;
} st_dosdate;

typedef struct s_dostime
{
  unsigned char minute, hour, hundredth, second;
} st_dostime;

/*******************************************************************************/
/* FAT time notation in the form of hhhh hmmm mmmd dddd (d = double second) */
#define EPOCH_YEAR      1980    /* for Tues 1-1-80 epoch                */

#define DT_YEAR(d)      ((((d)>>9)&0x7f) + EPOCH_YEAR)
#define DT_MONTH(d)     (((d)>>5)&0x0f)
#define DT_DAY(d)       ((d)&0x1f)

#define TM_HOUR(t)	(((t)>>11)&0x1f)
#define TM_MIN(t)	(((t)>>5)&0x3f)
#define TM_DEC(t)	((t)&0x1f)


/*******************************************************************************/
/* FAT file date - takes the form of yyyy yyym mmmd dddd where physical */
/* year=1980+yyyyyy                                                     */
#define DT_ENCODE(m,d,y) ((((m)&0x0f)<<5)|((d)&0x1f)|(((y)&0x7f)<<9))
#define EPOCH_WEEKDAY   2       /* Tuesday (i. e.-  0 == Sunday)        */
#define EPOCH_MONTH     1       /* January                              */
#define EPOCH_DAY       1       /* 1 for January 1                      */
#define EPOCH_YEAR      1980    /* for Tues 1-1-80 epoch                */
/* FAT deleted flag                                                     */
#define DELETED         '\x5'    /* if first char, delete file   */
#define EXT_DELETED     '\xe5'   /* external deleted flag */
/*for link fat 2nd parameter*/
#define READ_CLUSTER (CLUSTER)(1)
/* magic constants: even though FF7 is BAD so FF6 could be a valid cluster
   no., MS docs specify that FF5 is the maximal possible cluster number

   for FAT12; similar for 16 and 32 */
#define FAT_MAGIC       4085
#define FAT_MAGIC16     65525U
#define FAT_MAGIC32     268435455UL
/* FAT cluster special flags                                            */
#define FREE                    0x000

#if WITHFAT32
#define LONG_LAST_CLUSTER       0x0FFFFFFFUL
#define LONG_BAD                0x0FFFFFF7UL
#else
#define LONG_LAST_CLUSTER       0xFFFF
#define LONG_BAD                0xFFF7
#endif

#define MASK16                  0xFFF8
#define BAD16                   0xFFF7
#define MASK12                  0xFF8
#define BAD12                   0xFF7
/* internal transfer direction flags for read and write*/
#define XFR_READ        1
#define XFR_WRITE       2
#define SEQ_MAP         0x80
#define WIPE_OUT        0x40

/* File system information structure */
struct fsinfo {
  UINT32 fi_signature;          /* must be 0x61417272 */
  INT32 fi_nfreeclst;           /* number of free clusters, -1 if unknown */
  INT32 fi_cluster;             /* most recently allocated cluster, -1 if unknown */
  UINT8 fi_reserved[12];
};

#ifndef FALSE
#define FALSE           (1==0)
#endif

#ifndef TRUE
#define TRUE            (1==1)
#endif
/*                                                              */
/* Common pointer types                                         */
/*                                                              */
#ifndef NULL
#define NULL  ((void *)0)
#endif

struct cds {
#if WITH_CDS_PATHSTR
  INT8 cdsCurrentPath[MAX_CDSPATH];    
#endif
  UINT16 cdsFlags;           /* see below */
  st_dpb_ptr cdsDpb;   /* if != 0, associated DPB */
  CLUSTER cdsStrtClst;           
};
typedef struct cds st_cds;
typedef st_cds *st_cds_ptr;

#define CDSPHYSDRV      0x4000
#define CDSVALID CDSPHYSDRV

/* Unicode typedefs */
/*define ufat unicode char type */
typedef UINT16 UNI_CHAR;
typedef INT8  UTF8;
typedef INT16  UTF16;
typedef INT32 UTF32;
/*directory entry size */
#define DIRENT_SIZE		32

/* read write mode define */
#define RDONLY          0
#define WRONLY          1
#define RDWR            2

/* ------------from fat32.h ------------*/

/* Access codes */
#define FD32_OACCESS  0x0007    /* Bit mask for access type       */
#define FD32_OREAD    0x0000    /* Allow only reads from file     */
#define FD32_OWRITE   0x0001    /* Allow only writes into file    */
#define FD32_ORDWR    0x0002    /* Allow both reads and writes    */
#define FD32_ORDNA    0x0004    /* Read only without updating the */
                                /* last access date               */
/* Sharing modes and inheritance */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -