summaryrefslogtreecommitdiff
path: root/firmware/drivers/fat.h
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers/fat.h')
-rw-r--r--firmware/drivers/fat.h154
1 files changed, 154 insertions, 0 deletions
diff --git a/firmware/drivers/fat.h b/firmware/drivers/fat.h
new file mode 100644
index 0000000000..f1dc8dc5a0
--- /dev/null
+++ b/firmware/drivers/fat.h
@@ -0,0 +1,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