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

📄 fat.h

📁 德国Hyperstone公司dsp的CF卡驱动程序
💻 H
字号:
/*
 **************************************************************
 *
 *  hyperstone MS-DOS FAT File System Drivers
 *
 *  FAT related definitions
 *
 *  Christoph Baumhof 2000-03-21
 *  Reinhard K乭ne 2000-03-21
 *  Mihajlo Varga 2000-03-21
 *
 *  Copyright (C) 1997-2000 hyperstone electronics GmbH Konstanz
 *
 *  2000-03-21 initial release
 *
 * $Id$
 *
 * $Log$
 *
 **************************************************************
 *
 * Changes:
 *
 **************************************************************
 */


#ifndef  __FAT_H
#define  __FAT_H


#define PACKED         __attribute__ ((packed))
#define UNUSED(x)    x __attribute__ ((unused));x
#define NORETURN       __attribute__ ((noreturn))

/* FAT file system attribute bits					*/


#if 1
#define	D_NORMAL	    0		/* normal			*/
#define	D_RDONLY	    0x01		/* read-only file		*/
#define	D_HIDDEN	    0x02		/* hidden			*/
#define	D_SYSTEM	    0x04		/* system			*/
#define	D_VOLID	            0x08		/* volume id			*/
#define	D_DIR		    0x10		/* subdir			*/
#define	D_ARCHIVE	    0x20		/* archive bit			*/
#define	D_LONG_FILENAME     0x0f		/* long filename		*/
#endif

/* FAT file name constants						*/
#define	FNAME_SIZE		8
#define	FEXT_SIZE		3


/* FAT cluster to physical conversion macros				*/
#define clus_add(cl_no)		((LONG) (((LONG) cl_no - 2L) \
					* (LONG) cluster_size \
					+ (LONG) data_start))

#define clus2phys(cl_no,cl_size,d_st)	((LONG) (((LONG) cl_no - 2L) \
					* (LONG) cl_size \
					+ (LONG) d_st))

/* Test for 16 bit or 12 bit FAT					*/
#define SIZEOF_CLST16	2
#define FAT_MAGIC	4086

#define ISFAT16(dpbp)	(((dpbp)->dpb_size)>FAT_MAGIC)
#define ISFAT12(dpbp)	(((dpbp)->dpb_size)<=FAT_MAGIC)

#define _WORD(x) ((unsigned char)(x)[0] + (((unsigned char)(x)[1]) << 8))
#define _DWORD(x) (_WORD(x) + (_WORD((x)+2) << 16))

#define DELMARK ((char) 0xe5)

/*
 *	    hi byte     |    low byte
 *	     |7|6|5|4|3|2|1|0|7|6|5|4|3|2|1|0|
 *     | | | | | | | | | | | | | | | | |
 *      \   7 bits    /\4 bits/\ 5 bits /
 *         year +80      month     day
 */
#define	DOS_YEAR(dir) (((dir)->date[1] >> 1) + 1980)
#define	DOS_MONTH(dir) (((((dir)->date[1] & 0x1) << 3) + ((dir)->date[0] >> 5)))
#define	DOS_DAY(dir) ((dir)->date[0] & 0x1f)

/*
 *	    hi byte     |    low byte
 *	|7|6|5|4|3|2|1|0|7|6|5|4|3|2|1|0|
 *      | | | | | | | | | | | | | | | | |
 *      \  5 bits /\  6 bits  /\ 5 bits /
 *         hour      minutes     sec*2
 */
#define	DOS_HOUR(dir) ((dir)->time[1] >> 3)
#define	DOS_MINUTE(dir) (((((dir)->time[1]&0x7) << 3) + ((dir)->time[0] >> 5)))
#define	DOS_SEC(dir) (((dir)->time[0] & 0x1f) * 2)

struct directory {
	char name[FNAME_SIZE];		/* file name */
	char ext[FEXT_SIZE];			/* file extension */
	unsigned char attr;		   /* attribute byte */
	unsigned char Case;		   /* case of short filename */
	unsigned char ctime_ms;		/* creation time, milliseconds (?) */
	unsigned char ctime[2];		/* creation time */
	unsigned char cdate[2];		/* creation date */
	unsigned char adate[2];		/* last access date */
	unsigned char startHi[2];	/* start cluster, Hi */
	unsigned char time[2];		/* time stamp */
	unsigned char date[2];		/* date stamp */
	unsigned short start;		/* starting cluster number */
	unsigned long size;		   /* size of the file */
};



#define EXTCASE 0x10
#define BASECASE 0x8

#define MAX32 0xffffffff
#define MAX_SIZE 0x7fffffff

#define FILE_SIZE(dir)  (_DWORD((dir)->size))
#define START(dir) (_WORD((dir)->start))
#define STARTHI(dir) (_WORD((dir)->startHi))

/*									*/
/* filesystem sizeof(dirent) - may be different from core		*/
/*									*/
#if 0
#define DIR_NAME	0
#define DIR_EXT		FNAME_SIZE
#define DIR_ATTRIB	FNAME_SIZE+FEXT_SIZE
#define DIR_RESERVED	FNAME_SIZE+FEXT_SIZE+1
#define DIR_TIME	FNAME_SIZE+FEXT_SIZE+11
#define DIR_DATE	FNAME_SIZE+FEXT_SIZE+13
#define DIR_START	FNAME_SIZE+FEXT_SIZE+15
#define DIR_SIZE	FNAME_SIZE+FEXT_SIZE+17
#endif
#define DIRENT_SIZE	32

struct _struct_handle {
   char *fname;
   long  handle;
   long  position;
   long  filesize;
   long  access;
   long  amode;
   long  drive;
   long  partnum;
   long  valid;
   long  clusterStart;
   char  *buffer;
   long  LastClusterOffset, LastClusterStart, LastPreviousCluster;
};

typedef struct _struct_handle STRUCT_H;
#define HANDLE_MAX 20

extern STRUCT_H   _handle[HANDLE_MAX];
int _ROOTEntrySize(int drive, int partnum);
int _readROOTEntry(int drive, int partnum, struct directory * dir);

#endif

⌨️ 快捷键说明

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