1
2
3
4
5
6
7
8
9#ifndef _FAT_H_
10#define _FAT_H_
11
12#include <asm/byteorder.h>
13#include <fs.h>
14
15
16#define VFAT_MAXLEN_BYTES 256
17#define VFAT_MAXSEQ 9
18#define PREFETCH_BLOCKS 2
19
20#define MAX_CLUSTSIZE CONFIG_FS_FAT_MAX_CLUSTSIZE
21
22#define DIRENTSPERBLOCK (mydata->sect_size / sizeof(dir_entry))
23#define DIRENTSPERCLUST ((mydata->clust_size * mydata->sect_size) / \
24 sizeof(dir_entry))
25
26#define FATBUFBLOCKS 6
27#define FATBUFSIZE (mydata->sect_size * FATBUFBLOCKS)
28#define FAT12BUFSIZE ((FATBUFSIZE*2)/3)
29#define FAT16BUFSIZE (FATBUFSIZE/2)
30#define FAT32BUFSIZE (FATBUFSIZE/4)
31
32
33#define MAX_LFN_SLOT 20
34
35
36#define FAT12_SIGN "FAT12 "
37#define FAT16_SIGN "FAT16 "
38#define FAT32_SIGN "FAT32 "
39#define SIGNLEN 8
40
41
42#define ATTR_RO 1
43#define ATTR_HIDDEN 2
44#define ATTR_SYS 4
45#define ATTR_VOLUME 8
46#define ATTR_DIR 16
47#define ATTR_ARCH 32
48
49#define ATTR_VFAT (ATTR_RO | ATTR_HIDDEN | ATTR_SYS | ATTR_VOLUME)
50
51#define DELETED_FLAG ((char)0xe5)
52#define aRING 0x05
53
54
55
56
57
58#define LAST_LONG_ENTRY_MASK 0x40
59
60#define ISDIRDELIM(c) ((c) == '/' || (c) == '\\')
61
62#define FSTYPE_NONE (-1)
63
64#if defined(__linux__) && defined(__KERNEL__)
65#define FAT2CPU16 le16_to_cpu
66#define FAT2CPU32 le32_to_cpu
67#else
68#if __LITTLE_ENDIAN
69#define FAT2CPU16(x) (x)
70#define FAT2CPU32(x) (x)
71#else
72#define FAT2CPU16(x) ((((x) & 0x00ff) << 8) | (((x) & 0xff00) >> 8))
73#define FAT2CPU32(x) ((((x) & 0x000000ff) << 24) | \
74 (((x) & 0x0000ff00) << 8) | \
75 (((x) & 0x00ff0000) >> 8) | \
76 (((x) & 0xff000000) >> 24))
77#endif
78#endif
79
80#define START(dent) (FAT2CPU16((dent)->start) \
81 + (mydata->fatsize != 32 ? 0 : \
82 (FAT2CPU16((dent)->starthi) << 16)))
83#define IS_LAST_CLUST(x, fatsize) ((x) >= ((fatsize) != 32 ? \
84 ((fatsize) != 16 ? 0xff8 : 0xfff8) : \
85 0xffffff8))
86#define CHECK_CLUST(x, fatsize) ((x) <= 1 || \
87 (x) >= ((fatsize) != 32 ? \
88 ((fatsize) != 16 ? 0xff0 : 0xfff0) : \
89 0xffffff0))
90
91typedef struct boot_sector {
92 __u8 ignored[3];
93 char system_id[8];
94 __u8 sector_size[2];
95 __u8 cluster_size;
96 __u16 reserved;
97 __u8 fats;
98 __u8 dir_entries[2];
99 __u8 sectors[2];
100 __u8 media;
101 __u16 fat_length;
102 __u16 secs_track;
103 __u16 heads;
104 __u32 hidden;
105 __u32 total_sect;
106
107
108 __u32 fat32_length;
109 __u16 flags;
110 __u8 version[2];
111 __u32 root_cluster;
112 __u16 info_sector;
113 __u16 backup_boot;
114 __u16 reserved2[6];
115} boot_sector;
116
117typedef struct volume_info
118{
119 __u8 drive_number;
120 __u8 reserved;
121 __u8 ext_boot_sign;
122 __u8 volume_id[4];
123 char volume_label[11];
124 char fs_type[8];
125
126
127} volume_info;
128
129
130#define CASE_LOWER_BASE 8
131#define CASE_LOWER_EXT 16
132
133typedef struct dir_entry {
134 char name[8],ext[3];
135 __u8 attr;
136 __u8 lcase;
137 __u8 ctime_ms;
138 __u16 ctime;
139 __u16 cdate;
140 __u16 adate;
141 __u16 starthi;
142 __u16 time,date,start;
143 __u32 size;
144} dir_entry;
145
146typedef struct dir_slot {
147 __u8 id;
148 __u8 name0_4[10];
149 __u8 attr;
150 __u8 reserved;
151 __u8 alias_checksum;
152 __u8 name5_10[12];
153 __u16 start;
154 __u8 name11_12[4];
155} dir_slot;
156
157
158
159
160
161
162
163typedef struct {
164 __u8 *fatbuf;
165 int fatsize;
166 __u32 fatlength;
167 __u16 fat_sect;
168 __u8 fat_dirty;
169 __u32 rootdir_sect;
170 __u16 sect_size;
171 __u16 clust_size;
172 int data_begin;
173 int fatbufnum;
174 int rootdir_size;
175 __u32 root_cluster;
176 u32 total_sect;
177 int fats;
178} fsdata;
179
180static inline u32 clust_to_sect(fsdata *fsdata, u32 clust)
181{
182 return fsdata->data_begin + clust * fsdata->clust_size;
183}
184
185static inline u32 sect_to_clust(fsdata *fsdata, int sect)
186{
187 return (sect - fsdata->data_begin) / fsdata->clust_size;
188}
189
190int file_fat_detectfs(void);
191int fat_exists(const char *filename);
192int fat_size(const char *filename, loff_t *size);
193int file_fat_read_at(const char *filename, loff_t pos, void *buffer,
194 loff_t maxsize, loff_t *actread);
195int file_fat_read(const char *filename, void *buffer, int maxsize);
196int fat_set_blk_dev(struct blk_desc *rbdd, disk_partition_t *info);
197int fat_register_device(struct blk_desc *dev_desc, int part_no);
198
199int file_fat_write(const char *filename, void *buf, loff_t offset, loff_t len,
200 loff_t *actwrite);
201int fat_read_file(const char *filename, void *buf, loff_t offset, loff_t len,
202 loff_t *actread);
203int fat_opendir(const char *filename, struct fs_dir_stream **dirsp);
204int fat_readdir(struct fs_dir_stream *dirs, struct fs_dirent **dentp);
205void fat_closedir(struct fs_dir_stream *dirs);
206int fat_unlink(const char *filename);
207int fat_mkdir(const char *dirname);
208void fat_close(void);
209#endif
210