Blame view
include/fat.h
6.86 KB
83d290c56
|
1 |
/* SPDX-License-Identifier: GPL-2.0+ */ |
71f951180
|
2 3 4 5 6 |
/* * R/O (V)FAT 12/16/32 filesystem implementation by Marcus Sundberg * * 2002-07-28 - rjones@nexus-tech.net - ported to ppcboot v1.1.6 * 2003-03-10 - kharris@nexus-tech.net - ported to u-boot |
71f951180
|
7 8 9 10 |
*/ #ifndef _FAT_H_ #define _FAT_H_ |
5cf91d6bd
|
11 |
#include <asm/byteorder.h> |
89191d626
|
12 |
#include <fs.h> |
5cf91d6bd
|
13 |
|
3831530dc
|
14 15 16 |
/* Maximum Long File Name length supported here is 128 UTF-16 code units */ #define VFAT_MAXLEN_BYTES 256 /* Maximum LFN buffer in bytes */ #define VFAT_MAXSEQ 9 /* Up to 9 of 13 2-byte UTF-16 entries */ |
025421eab
|
17 |
#define PREFETCH_BLOCKS 2 |
71f951180
|
18 |
|
4f0d1a2ae
|
19 |
#define MAX_CLUSTSIZE CONFIG_FS_FAT_MAX_CLUSTSIZE |
ac4977719
|
20 21 22 |
#define DIRENTSPERBLOCK (mydata->sect_size / sizeof(dir_entry)) #define DIRENTSPERCLUST ((mydata->clust_size * mydata->sect_size) / \ sizeof(dir_entry)) |
71f951180
|
23 24 |
#define FATBUFBLOCKS 6 |
ac4977719
|
25 |
#define FATBUFSIZE (mydata->sect_size * FATBUFBLOCKS) |
cd37d9e6e
|
26 |
#define FAT12BUFSIZE ((FATBUFSIZE*2)/3) |
71f951180
|
27 28 |
#define FAT16BUFSIZE (FATBUFSIZE/2) #define FAT32BUFSIZE (FATBUFSIZE/4) |
7aa1a6b71
|
29 30 |
/* Maximum number of entry for long file name according to spec */ #define MAX_LFN_SLOT 20 |
71f951180
|
31 32 33 34 35 36 37 38 |
/* Filesystem identifiers */ #define FAT12_SIGN "FAT12 " #define FAT16_SIGN "FAT16 " #define FAT32_SIGN "FAT32 " #define SIGNLEN 8 /* File attributes */ |
7385c28e9
|
39 40 41 42 43 44 |
#define ATTR_RO 1 #define ATTR_HIDDEN 2 #define ATTR_SYS 4 #define ATTR_VOLUME 8 #define ATTR_DIR 16 #define ATTR_ARCH 32 |
71f951180
|
45 |
|
7385c28e9
|
46 |
#define ATTR_VFAT (ATTR_RO | ATTR_HIDDEN | ATTR_SYS | ATTR_VOLUME) |
71f951180
|
47 48 |
#define DELETED_FLAG ((char)0xe5) /* Marks deleted files when in name[0] */ |
3c2c2f427
|
49 |
#define aRING 0x05 /* Used as special character in name[0] */ |
71f951180
|
50 |
|
7385c28e9
|
51 52 |
/* * Indicates that the entry is the last long entry in a set of long |
2d1a537d8
|
53 54 55 |
* dir entries */ #define LAST_LONG_ENTRY_MASK 0x40 |
71f951180
|
56 |
|
7385c28e9
|
57 |
#define ISDIRDELIM(c) ((c) == '/' || (c) == '\\') |
71f951180
|
58 59 60 61 62 63 64 |
#define FSTYPE_NONE (-1) #if defined(__linux__) && defined(__KERNEL__) #define FAT2CPU16 le16_to_cpu #define FAT2CPU32 le32_to_cpu #else |
9fd5e31fe
|
65 |
#if __LITTLE_ENDIAN |
71f951180
|
66 67 68 69 70 |
#define FAT2CPU16(x) (x) #define FAT2CPU32(x) (x) #else #define FAT2CPU16(x) ((((x) & 0x00ff) << 8) | (((x) & 0xff00) >> 8)) #define FAT2CPU32(x) ((((x) & 0x000000ff) << 24) | \ |
53677ef18
|
71 |
(((x) & 0x0000ff00) << 8) | \ |
71f951180
|
72 73 74 75 |
(((x) & 0x00ff0000) >> 8) | \ (((x) & 0xff000000) >> 24)) #endif #endif |
71f951180
|
76 77 78 |
#define START(dent) (FAT2CPU16((dent)->start) \ + (mydata->fatsize != 32 ? 0 : \ (FAT2CPU16((dent)->starthi) << 16))) |
2e98f7088
|
79 80 81 |
#define IS_LAST_CLUST(x, fatsize) ((x) >= ((fatsize) != 32 ? \ ((fatsize) != 16 ? 0xff8 : 0xfff8) : \ 0xffffff8)) |
8ce4e5c2c
|
82 |
#define CHECK_CLUST(x, fatsize) ((x) <= 1 || \ |
06118973e
|
83 84 85 |
(x) >= ((fatsize) != 32 ? \ ((fatsize) != 16 ? 0xff0 : 0xfff0) : \ 0xffffff0)) |
71f951180
|
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 |
typedef struct boot_sector { __u8 ignored[3]; /* Bootstrap code */ char system_id[8]; /* Name of fs */ __u8 sector_size[2]; /* Bytes/sector */ __u8 cluster_size; /* Sectors/cluster */ __u16 reserved; /* Number of reserved sectors */ __u8 fats; /* Number of FATs */ __u8 dir_entries[2]; /* Number of root directory entries */ __u8 sectors[2]; /* Number of sectors */ __u8 media; /* Media code */ __u16 fat_length; /* Sectors/FAT */ __u16 secs_track; /* Sectors/track */ __u16 heads; /* Number of heads */ __u32 hidden; /* Number of hidden sectors */ __u32 total_sect; /* Number of sectors (if sectors == 0) */ /* FAT32 only */ __u32 fat32_length; /* Sectors/FAT */ __u16 flags; /* Bit 8: fat mirroring, low 4: active fat */ __u8 version[2]; /* Filesystem version */ __u32 root_cluster; /* First cluster in root directory */ __u16 info_sector; /* Filesystem info sector */ __u16 backup_boot; /* Backup boot sector */ __u16 reserved2[6]; /* Unused */ } boot_sector; typedef struct volume_info { __u8 drive_number; /* BIOS drive number */ __u8 reserved; /* Unused */ __u8 ext_boot_sign; /* 0x29 if fields below exist (DOS 3.3+) */ __u8 volume_id[4]; /* Volume ID number */ char volume_label[11]; /* Volume label */ char fs_type[8]; /* Typically FAT12, FAT16, or FAT32 */ /* Boot code comes next, all but 2 bytes to fill up sector */ /* Boot sign comes last, 2 bytes */ } volume_info; |
21a24c3bf
|
124 125 126 |
/* see dir_entry::lcase: */ #define CASE_LOWER_BASE 8 /* base (name) is lower case */ #define CASE_LOWER_EXT 16 /* extension is lower case */ |
71f951180
|
127 128 129 |
typedef struct dir_entry { char name[8],ext[3]; /* Name and extension */ __u8 attr; /* Attribute bits */ |
21a24c3bf
|
130 |
__u8 lcase; /* Case for name and ext (CASE_LOWER_x) */ |
71f951180
|
131 132 133 134 135 136 137 138 139 140 |
__u8 ctime_ms; /* Creation time, milliseconds */ __u16 ctime; /* Creation time */ __u16 cdate; /* Creation date */ __u16 adate; /* Last access date */ __u16 starthi; /* High 16 bits of cluster in FAT32 */ __u16 time,date,start;/* Time, date and first cluster */ __u32 size; /* File size in bytes */ } dir_entry; typedef struct dir_slot { |
7385c28e9
|
141 142 143 144 145 146 147 148 |
__u8 id; /* Sequence number for slot */ __u8 name0_4[10]; /* First 5 characters in name */ __u8 attr; /* Attribute byte */ __u8 reserved; /* Unused */ __u8 alias_checksum;/* Checksum for 8.3 alias */ __u8 name5_10[12]; /* 6 more characters in name */ __u16 start; /* Unused */ __u8 name11_12[4]; /* Last 2 characters in name */ |
71f951180
|
149 |
} dir_slot; |
7385c28e9
|
150 151 |
/* * Private filesystem parameters |
80f0c0f58
|
152 153 154 155 |
* * Note: FAT buffer has to be 32 bit aligned * (see FAT32 accesses) */ |
71f951180
|
156 |
typedef struct { |
ac4977719
|
157 |
__u8 *fatbuf; /* Current FAT buffer */ |
71f951180
|
158 |
int fatsize; /* Size of FAT in bits */ |
1d90c3b45
|
159 |
__u32 fatlength; /* Length of FAT in sectors */ |
71f951180
|
160 |
__u16 fat_sect; /* Starting sector of the FAT */ |
3c0ed9c3a
|
161 |
__u8 fat_dirty; /* Set if fatbuf has been modified */ |
1d90c3b45
|
162 |
__u32 rootdir_sect; /* Start sector of root directory */ |
ac4977719
|
163 |
__u16 sect_size; /* Size of sectors in bytes */ |
71f951180
|
164 |
__u16 clust_size; /* Size of clusters in sectors */ |
1d90c3b45
|
165 |
int data_begin; /* The sector of the first cluster, can be negative */ |
71f951180
|
166 |
int fatbufnum; /* Used by get_fatent, init to -1 */ |
45449980f
|
167 |
int rootdir_size; /* Size of root dir for non-FAT32 */ |
c6e3baa56
|
168 |
__u32 root_cluster; /* First cluster of root dir for FAT32 */ |
f23101f95
|
169 170 |
u32 total_sect; /* Number of sectors */ int fats; /* Number of FATs */ |
71f951180
|
171 |
} fsdata; |
c6e3baa56
|
172 173 174 175 |
static inline u32 clust_to_sect(fsdata *fsdata, u32 clust) { return fsdata->data_begin + clust * fsdata->clust_size; } |
6e2151c72
|
176 |
static inline u32 sect_to_clust(fsdata *fsdata, int sect) |
265edc03d
|
177 178 179 |
{ return (sect - fsdata->data_begin) / fsdata->clust_size; } |
71f951180
|
180 |
int file_fat_detectfs(void); |
b7b5f3195
|
181 |
int fat_exists(const char *filename); |
d455d8789
|
182 |
int fat_size(const char *filename, loff_t *size); |
1ad0b98a0
|
183 184 185 |
int file_fat_read_at(const char *filename, loff_t pos, void *buffer, loff_t maxsize, loff_t *actread); int file_fat_read(const char *filename, void *buffer, int maxsize); |
4101f6879
|
186 187 |
int fat_set_blk_dev(struct blk_desc *rbdd, disk_partition_t *info); int fat_register_device(struct blk_desc *dev_desc, int part_no); |
71f951180
|
188 |
|
1ad0b98a0
|
189 190 |
int file_fat_write(const char *filename, void *buf, loff_t offset, loff_t len, loff_t *actwrite); |
d455d8789
|
191 192 |
int fat_read_file(const char *filename, void *buf, loff_t offset, loff_t len, loff_t *actread); |
89191d626
|
193 194 195 |
int fat_opendir(const char *filename, struct fs_dir_stream **dirsp); int fat_readdir(struct fs_dir_stream *dirs, struct fs_dirent **dentp); void fat_closedir(struct fs_dir_stream *dirs); |
f8240ce95
|
196 |
int fat_unlink(const char *filename); |
31a18d570
|
197 |
int fat_mkdir(const char *dirname); |
e6d524153
|
198 |
void fat_close(void); |
71f951180
|
199 |
#endif /* _FAT_H_ */ |