summaryrefslogtreecommitdiff
path: root/firmware/drivers/fat.h
blob: f1dc8dc5a04c45398fe615a52b9f0776d46a47df (plain)
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