1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2002 by Linus Nielsen Feltzing
*
* All files in this archive are subject to the GNU General Public License.
* See the file COPYING in the source tree root for full license agreement.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#ifndef FAT_H
#define FAT_H
#define FATTYPE_FAT12 0
#define FATTYPE_FAT16 1
#define FATTYPE_FAT32 2
#define BS_JMPBOOT 0
#define BS_OEMNAME 3
#define BPB_BYTSPERSEC 11
#define BPB_SECPERCLUS 13
#define BPB_RSVDSECCNT 14
#define BPB_NUMFATS 16
#define BPB_ROOTENTCNT 17
#define BPB_TOTSEC16 19
#define BPB_MEDIA 21
#define BPB_FATSZ16 22
#define BPB_SECPERTRK 24
#define BPB_NUMHEADS 26
#define BPB_HIDDSEC 28
#define BPB_TOTSEC32 32
#define BS_DRVNUM 36
#define BS_RESERVED1 37
#define BS_BOOTSIG 38
#define BS_VOLID 39
#define BS_VOLLAB 43
#define BS_FILSYSTYPE 54
#define BPB_FATSZ32 36
#define BPB_LAST_WORD 510
#define MIN(a,b) (((a) < (b))?(a):(b)))
struct bpb
{
char bs_oemname[9]; /* OEM string, ending with \0 */
int bpb_bytspersec; /* Bytes per sectory, typically 512 */
int bpb_secperclus; /* Sectors per cluster */
int bpb_rsvdseccnt; /* Number of reserved sectors */
int bpb_numfats; /* Number of FAT structures, typically 2 */
int bpb_rootentcnt; /* Number of dir entries in the root */
int bpb_totsec16; /* Number of sectors on the volume (old 16-bit) */
int bpb_media; /* Media type (typically 0xf0 or 0xf8) */
int bpb_fatsz16; /* Number of used sectors per FAT structure */
int bpb_secpertrk; /* Number of sectors per track */
int bpb_numheads; /* Number of heads */
int bpb_hiddsec; /* Hidden sectors before the volume */
unsigned int bpb_totsec32; /* Number of sectors on the volume
(new 32-bit) */
/**** FAT12/16 specific *****/
int bs_drvnum; /* Drive number */
int bs_bootsig; /* Is 0x29 if the following 3 fields are valid */
unsigned int bs_volid; /* Volume ID */
char bs_vollab[12]; /* Volume label, 11 chars plus \0 */
char bs_filsystype[9]; /* File system type, 8 chars plus \0 */
/**** FAT32 specific *****/
int bpb_fatsz32;
int last_word; /* Must be 0xaa55 */
int fat_type; /* What type of FAT is this? */
};
#define FAT_ATTR_READ_ONLY 0x01
#define FAT_ATTR_HIDDEN 0x02
#define FAT_ATTR_SYSTEM 0x04
#define FAT_ATTR_VOLUME_ID 0x08
#define FAT_ATTR_DIRECTORY 0x10
#define FAT_ATTR_ARCHIVE 0x20
#define FAT_ATTR_LONG_NAME (FAT_ATTR_READ_ONLY | FAT_ATTR_HIDDEN | \
FAT_ATTR_SYSTEM | FAT_ATTR_VOLUME_ID)
#define FATDIR_NAME 0
#define FATDIR_ATTR 11
#define FATDIR_NTRES 12
#define FATDIR_CRTTIMETENTH 13
#define FATDIR_CRTTIME 14
#define FATDIR_CRTDATE 16
#define FATDIR_LSTACCDATE 18
#define FATDIR_FSTCLUSHI 20
#define FATDIR_WRTTIME 22
#define FATDIR_WRTDATE 24
#define FATDIR_FSTCLUSLO 26
#define FATDIR_FILESIZE 28
struct fat_direntry
{
unsigned char name[12]; /* Name plus \0 */
unsigned short attr; /* Attributes */
unsigned char crttimetenth; /* Millisecond creation
time stamp (0-199) */
unsigned short crttime; /* Creation time */
unsigned short crtdate; /* Creation date */
unsigned short lstaccdate; /* Last access date */
unsigned short fstclushi; /* High word of first cluster
(0 for FAT12/16) */
unsigned short wrttime; /* Last write time */
unsigned short wrtdate; /* Last write date */
unsigned short fstcluslo; /* Low word of first cluster */
unsigned int filesize; /* File size in bytes */
};
struct fat_context
{
unsigned int curr_dir_sec; /* Current directory sector */
};
struct disk_info
{
int num_sectors;
int sec_per_track;
int num_heads;
unsigned int hidden_sectors;
};
struct fat_dirent
{
int entry;
unsigned int cached_sec;
unsigned int num_sec;
char cached_buf[BLOCK_SIZE];
};
int fat_format(struct disk_info *di, char *vol_name);
int fat_create_file(struct bpb *bpb, unsigned int currdir, char *name);
int fat_opendir(struct bpb *bpb, struct fat_dirent *ent, unsigned int currdir);
int fat_getnext(struct bpb *bpb, struct fat_dirent *ent,
struct fat_direntry *entry);
#endif
|