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
155
156
157
|
/***************************************************************************
* Copyright (C) 2002 by Linus Nielsen Feltzing
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************
* Source file dumped from rockbox-3.1 distribution.
* $Id: fat.h 18960 2008-11-01 16:14:28Z gevaerts $
* Copyright (C) 2002 by Linus Nielsen Feltzing
****************************************************************************
* See file CREDITS for list of people who contributed to the U-boot
* project.
*
* 01/17/2006 Keith Outwater (outwater4@comcast.net) - port to U-Boot using
* CVS version 1.13 of 'firmware/export/fat.h' from rockbox CVS server.
* 09-jan-2008 etienne.carriere@stnwireless.com - update from rockbox-3.1
****************************************************************************
*/
#ifndef ROCKBOX_FAT_H
#define ROCKBOX_FAT_H
#include <stdbool.h>
#include "rockbox_mv.h" /* for volume definitions */
/* Check that sector size is 512 bytes */
#ifndef SECTOR_SIZE
#define SECTOR_SIZE 512
#elif (SECTOR_SIZE != 512)
#error "SECTOR_SIZE expected to be 512"
#endif
/*
* The max length of the current working dorectory.
*/
#define ROCKBOX_CWD_LEN 512
/* Number of bytes reserved for a file name (including the trailing \0).
Since names are stored in the entry as UTF-8, we won't be able to
store all names allowed by FAT. In FAT, a name can have max 255
characters (not bytes!). Since the UTF-8 encoding of a char may take
up to 4 bytes, there will be names that we won't be able to store
completely. For such names, the short DOS name is used. */
#define FAT_FILENAME_BYTES 256
struct fat_direntry
{
unsigned char name[FAT_FILENAME_BYTES]; /* UTF-8 encoded 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 wrttime; /* Last write time */
unsigned short wrtdate; /* Last write date */
unsigned long filesize; /* File size in bytes */
long firstcluster; /* fstclusterhi<<16 + fstcluslo */
};
#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_VOLUME 0x40 /* this is a volume, not a real directory */
struct fat_file
{
long firstcluster; /* first cluster in file */
long lastcluster; /* cluster of last access */
long lastsector; /* sector of last access */
long clusternum; /* current clusternum */
long sectornum; /* sector number in this cluster */
unsigned int direntry; /* short dir entry index from start of dir */
unsigned int direntries; /* number of dir entries used by this file */
long dircluster; /* first cluster of dir */
bool eof;
#ifdef HAVE_MULTIVOLUME
int volume; /* file resides on which volume */
#endif
};
struct fat_dir
{
unsigned int entry;
unsigned int entrycount;
long sector;
struct fat_file file;
unsigned char sectorcache[3][SECTOR_SIZE];
};
#ifdef HAVE_HOTSWAP
extern void fat_lock(void);
extern void fat_unlock(void);
#endif
extern void fat_init(void);
extern int fat_mount(IF_MV2(int volume,) IF_MV2(int drive,) long startsector);
extern int fat_unmount(int volume, bool flush);
extern void fat_size(IF_MV2(int volume,) /* public for info */
unsigned long* size,
unsigned long* free);
extern int fat_check_free(IF_MV2(int volume,) unsigned long size);
extern void fat_recalc_free(IF_MV_NONVOID(int volume)); /* public for debug info screen */
extern int fat_create_dir(const char *name,
struct fat_dir* newdir,
struct fat_dir* dir);
extern int fat_open(IF_MV2(int volume,)
long cluster,
struct fat_file* ent,
const struct fat_dir* dir);
extern int fat_create_file(const char *name,
struct fat_file* ent,
struct fat_dir* dir);
extern long fat_readwrite(struct fat_file *ent, long sectorcount,
void *buf, bool write);
extern int fat_closewrite(struct fat_file *ent, long size, int attr);
extern int fat_seek(struct fat_file *ent, unsigned long sector);
extern int fat_remove(struct fat_file *ent);
extern int fat_truncate(const struct fat_file *ent);
extern int fat_rename(struct fat_file *file,
struct fat_dir *dir,
const unsigned char* newname,
long size, int attr);
extern int fat_opendir(IF_MV2(int volume,)
struct fat_dir *ent, unsigned long currdir,
const struct fat_dir *parent_dir);
extern int fat_getnext(struct fat_dir *ent, struct fat_direntry *entry);
extern unsigned int fat_get_cluster_size(IF_MV_NONVOID(int volume)); /* public for debug info screen */
extern bool fat_ismounted(int volume);
#ifndef _ROCKBOX_FILE_H_
#include <rockbox_file.h>
#endif
#ifndef _ROCKBOX_DIR_H
#include <rockbox_dir.h>
#endif
/* Added to rockbox_wrapper.c */
unsigned int rockbox_fat_size(void);
unsigned int rockbox_fat_free(unsigned long size);
#endif /* #ifndef ROCKBOX_FAT_H */
|