~ubuntu-branches/ubuntu/maverick/u-boot-omap3/maverick

« back to all changes in this revision

Viewing changes to include/fat.h

  • Committer: Bazaar Package Importer
  • Author(s): Oliver Grawert
  • Date: 2010-03-22 15:06:23 UTC
  • Revision ID: james.westby@ubuntu.com-20100322150623-i21g8rgiyl5dohag
Tags: upstream-2010.3git20100315
ImportĀ upstreamĀ versionĀ 2010.3git20100315

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * R/O (V)FAT 12/16/32 filesystem implementation by Marcus Sundberg
 
3
 *
 
4
 * 2002-07-28 - rjones@nexus-tech.net - ported to ppcboot v1.1.6
 
5
 * 2003-03-10 - kharris@nexus-tech.net - ported to u-boot
 
6
 *
 
7
 * See file CREDITS for list of people who contributed to this
 
8
 * project.
 
9
 *
 
10
 * This program is free software; you can redistribute it and/or
 
11
 * modify it under the terms of the GNU General Public License as
 
12
 * published by the Free Software Foundation; either version 2 of
 
13
 * the License, or (at your option) any later version.
 
14
 *
 
15
 * This program is distributed in the hope that it will be useful,
 
16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
18
 * GNU General Public License for more details.
 
19
 *
 
20
 * You should have received a copy of the GNU General Public License
 
21
 * along with this program; if not, write to the Free Software
 
22
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 
23
 * MA 02111-1307 USA
 
24
 *
 
25
 */
 
26
 
 
27
#ifndef _FAT_H_
 
28
#define _FAT_H_
 
29
 
 
30
#include <asm/byteorder.h>
 
31
 
 
32
#define CONFIG_SUPPORT_VFAT
 
33
 
 
34
#define SECTOR_SIZE FS_BLOCK_SIZE
 
35
 
 
36
#define FS_BLOCK_SIZE 512
 
37
 
 
38
#if FS_BLOCK_SIZE != SECTOR_SIZE
 
39
#error FS_BLOCK_SIZE != SECTOR_SIZE - This code needs to be fixed!
 
40
#endif
 
41
 
 
42
#define MAX_CLUSTSIZE   65536
 
43
#define DIRENTSPERBLOCK (FS_BLOCK_SIZE/sizeof(dir_entry))
 
44
#define DIRENTSPERCLUST ((mydata->clust_size*SECTOR_SIZE)/sizeof(dir_entry))
 
45
 
 
46
#define FATBUFBLOCKS    6
 
47
#define FATBUFSIZE      (FS_BLOCK_SIZE*FATBUFBLOCKS)
 
48
#define FAT12BUFSIZE    ((FATBUFSIZE*2)/3)
 
49
#define FAT16BUFSIZE    (FATBUFSIZE/2)
 
50
#define FAT32BUFSIZE    (FATBUFSIZE/4)
 
51
 
 
52
 
 
53
/* Filesystem identifiers */
 
54
#define FAT12_SIGN      "FAT12   "
 
55
#define FAT16_SIGN      "FAT16   "
 
56
#define FAT32_SIGN      "FAT32   "
 
57
#define SIGNLEN         8
 
58
 
 
59
/* File attributes */
 
60
#define ATTR_RO      1
 
61
#define ATTR_HIDDEN  2
 
62
#define ATTR_SYS     4
 
63
#define ATTR_VOLUME  8
 
64
#define ATTR_DIR     16
 
65
#define ATTR_ARCH    32
 
66
 
 
67
#define ATTR_VFAT     (ATTR_RO | ATTR_HIDDEN | ATTR_SYS | ATTR_VOLUME)
 
68
 
 
69
#define DELETED_FLAG    ((char)0xe5) /* Marks deleted files when in name[0] */
 
70
#define aRING           0x05         /* Used as special character in name[0] */
 
71
 
 
72
/* Indicates that the entry is the last long entry in a set of long
 
73
 * dir entries
 
74
 */
 
75
#define LAST_LONG_ENTRY_MASK    0x40
 
76
 
 
77
/* Flags telling whether we should read a file or list a directory */
 
78
#define LS_NO   0
 
79
#define LS_YES  1
 
80
#define LS_DIR  1
 
81
#define LS_ROOT 2
 
82
 
 
83
#ifdef DEBUG
 
84
#define FAT_DPRINT(args...)     printf(args)
 
85
#else
 
86
#define FAT_DPRINT(args...)
 
87
#endif
 
88
#define FAT_ERROR(arg)          printf(arg)
 
89
 
 
90
#define ISDIRDELIM(c)   ((c) == '/' || (c) == '\\')
 
91
 
 
92
#define FSTYPE_NONE     (-1)
 
93
 
 
94
#if defined(__linux__) && defined(__KERNEL__)
 
95
#define FAT2CPU16       le16_to_cpu
 
96
#define FAT2CPU32       le32_to_cpu
 
97
#else
 
98
#if __LITTLE_ENDIAN
 
99
#define FAT2CPU16(x)    (x)
 
100
#define FAT2CPU32(x)    (x)
 
101
#else
 
102
#define FAT2CPU16(x)    ((((x) & 0x00ff) << 8) | (((x) & 0xff00) >> 8))
 
103
#define FAT2CPU32(x)    ((((x) & 0x000000ff) << 24)  |  \
 
104
                         (((x) & 0x0000ff00) << 8)  |   \
 
105
                         (((x) & 0x00ff0000) >> 8)  |   \
 
106
                         (((x) & 0xff000000) >> 24))
 
107
#endif
 
108
#endif
 
109
 
 
110
#define TOLOWER(c)      if((c) >= 'A' && (c) <= 'Z'){(c)+=('a' - 'A');}
 
111
#define START(dent)     (FAT2CPU16((dent)->start) \
 
112
                        + (mydata->fatsize != 32 ? 0 : \
 
113
                          (FAT2CPU16((dent)->starthi) << 16)))
 
114
#define CHECK_CLUST(x, fatsize) ((x) <= 1 || \
 
115
                                (x) >= ((fatsize) != 32 ? 0xfff0 : 0xffffff0))
 
116
 
 
117
typedef struct boot_sector {
 
118
        __u8    ignored[3];     /* Bootstrap code */
 
119
        char    system_id[8];   /* Name of fs */
 
120
        __u8    sector_size[2]; /* Bytes/sector */
 
121
        __u8    cluster_size;   /* Sectors/cluster */
 
122
        __u16   reserved;       /* Number of reserved sectors */
 
123
        __u8    fats;           /* Number of FATs */
 
124
        __u8    dir_entries[2]; /* Number of root directory entries */
 
125
        __u8    sectors[2];     /* Number of sectors */
 
126
        __u8    media;          /* Media code */
 
127
        __u16   fat_length;     /* Sectors/FAT */
 
128
        __u16   secs_track;     /* Sectors/track */
 
129
        __u16   heads;          /* Number of heads */
 
130
        __u32   hidden;         /* Number of hidden sectors */
 
131
        __u32   total_sect;     /* Number of sectors (if sectors == 0) */
 
132
 
 
133
        /* FAT32 only */
 
134
        __u32   fat32_length;   /* Sectors/FAT */
 
135
        __u16   flags;          /* Bit 8: fat mirroring, low 4: active fat */
 
136
        __u8    version[2];     /* Filesystem version */
 
137
        __u32   root_cluster;   /* First cluster in root directory */
 
138
        __u16   info_sector;    /* Filesystem info sector */
 
139
        __u16   backup_boot;    /* Backup boot sector */
 
140
        __u16   reserved2[6];   /* Unused */
 
141
} boot_sector;
 
142
 
 
143
typedef struct volume_info
 
144
{
 
145
        __u8 drive_number;      /* BIOS drive number */
 
146
        __u8 reserved;          /* Unused */
 
147
        __u8 ext_boot_sign;     /* 0x29 if fields below exist (DOS 3.3+) */
 
148
        __u8 volume_id[4];      /* Volume ID number */
 
149
        char volume_label[11];  /* Volume label */
 
150
        char fs_type[8];        /* Typically FAT12, FAT16, or FAT32 */
 
151
        /* Boot code comes next, all but 2 bytes to fill up sector */
 
152
        /* Boot sign comes last, 2 bytes */
 
153
} volume_info;
 
154
 
 
155
typedef struct dir_entry {
 
156
        char    name[8],ext[3]; /* Name and extension */
 
157
        __u8    attr;           /* Attribute bits */
 
158
        __u8    lcase;          /* Case for base and extension */
 
159
        __u8    ctime_ms;       /* Creation time, milliseconds */
 
160
        __u16   ctime;          /* Creation time */
 
161
        __u16   cdate;          /* Creation date */
 
162
        __u16   adate;          /* Last access date */
 
163
        __u16   starthi;        /* High 16 bits of cluster in FAT32 */
 
164
        __u16   time,date,start;/* Time, date and first cluster */
 
165
        __u32   size;           /* File size in bytes */
 
166
} dir_entry;
 
167
 
 
168
typedef struct dir_slot {
 
169
        __u8    id;             /* Sequence number for slot */
 
170
        __u8    name0_4[10];    /* First 5 characters in name */
 
171
        __u8    attr;           /* Attribute byte */
 
172
        __u8    reserved;       /* Unused */
 
173
        __u8    alias_checksum;/* Checksum for 8.3 alias */
 
174
        __u8    name5_10[12];   /* 6 more characters in name */
 
175
        __u16   start;          /* Unused */
 
176
        __u8    name11_12[4];   /* Last 2 characters in name */
 
177
} dir_slot;
 
178
 
 
179
/* Private filesystem parameters
 
180
 *
 
181
 * Note: FAT buffer has to be 32 bit aligned
 
182
 * (see FAT32 accesses)
 
183
 */
 
184
typedef struct {
 
185
        __u8    fatbuf[FATBUFSIZE]; /* Current FAT buffer */
 
186
        int     fatsize;        /* Size of FAT in bits */
 
187
        __u16   fatlength;      /* Length of FAT in sectors */
 
188
        __u16   fat_sect;       /* Starting sector of the FAT */
 
189
        __u16   rootdir_sect;   /* Start sector of root directory */
 
190
        __u16   clust_size;     /* Size of clusters in sectors */
 
191
        short   data_begin;     /* The sector of the first cluster, can be negative */
 
192
        int     fatbufnum;      /* Used by get_fatent, init to -1 */
 
193
} fsdata;
 
194
 
 
195
typedef int     (file_detectfs_func)(void);
 
196
typedef int     (file_ls_func)(const char *dir);
 
197
typedef long    (file_read_func)(const char *filename, void *buffer,
 
198
                                 unsigned long maxsize);
 
199
 
 
200
struct filesystem {
 
201
        file_detectfs_func *detect;
 
202
        file_ls_func       *ls;
 
203
        file_read_func     *read;
 
204
        const char          name[12];
 
205
};
 
206
 
 
207
/* FAT tables */
 
208
file_detectfs_func      file_fat_detectfs;
 
209
file_ls_func            file_fat_ls;
 
210
file_read_func          file_fat_read;
 
211
 
 
212
/* Currently this doesn't check if the dir exists or is valid... */
 
213
int file_cd(const char *path);
 
214
int file_fat_detectfs(void);
 
215
int file_fat_ls(const char *dir);
 
216
long file_fat_read(const char *filename, void *buffer, unsigned long maxsize);
 
217
const char *file_getfsname(int idx);
 
218
int fat_register_device(block_dev_desc_t *dev_desc, int part_no);
 
219
 
 
220
#endif /* _FAT_H_ */