Blame view

include/fat.h 6.72 KB
71f951180   wdenk   * Fix CONFIG_NET_...
1
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
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
7
   * SPDX-License-Identifier:	GPL-2.0+
71f951180   wdenk   * Fix CONFIG_NET_...
8
9
10
11
   */
  
  #ifndef _FAT_H_
  #define _FAT_H_
5cf91d6bd   wdenk   * Modify KUP4X bo...
12
  #include <asm/byteorder.h>
89191d626   Rob Clark   fat/fs: move ls t...
13
  #include <fs.h>
5cf91d6bd   wdenk   * Modify KUP4X bo...
14

3831530dc   Mikhail Zolotaryov   VFAT: fix process...
15
16
17
  /* 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   Sergei Shtylyov   fat: replace LINE...
18
  #define PREFETCH_BLOCKS		2
71f951180   wdenk   * Fix CONFIG_NET_...
19

4f0d1a2ae   Siva Durga Prasad Paladugu   fat: Define MAX_C...
20
  #define MAX_CLUSTSIZE	CONFIG_FS_FAT_MAX_CLUSTSIZE
ac4977719   Sergei Shtylyov   fat: fix crash wi...
21
22
23
  #define DIRENTSPERBLOCK	(mydata->sect_size / sizeof(dir_entry))
  #define DIRENTSPERCLUST	((mydata->clust_size * mydata->sect_size) / \
  			 sizeof(dir_entry))
71f951180   wdenk   * Fix CONFIG_NET_...
24
25
  
  #define FATBUFBLOCKS	6
ac4977719   Sergei Shtylyov   fat: fix crash wi...
26
  #define FATBUFSIZE	(mydata->sect_size * FATBUFBLOCKS)
cd37d9e6e   wdenk   * Patch by Jian Z...
27
  #define FAT12BUFSIZE	((FATBUFSIZE*2)/3)
71f951180   wdenk   * Fix CONFIG_NET_...
28
29
  #define FAT16BUFSIZE	(FATBUFSIZE/2)
  #define FAT32BUFSIZE	(FATBUFSIZE/4)
7aa1a6b71   Tien Fong Chee   fs/fat/fatwrite: ...
30
31
  /* Maximum number of entry for long file name according to spec */
  #define MAX_LFN_SLOT	20
71f951180   wdenk   * Fix CONFIG_NET_...
32
33
34
35
36
37
38
39
  
  /* Filesystem identifiers */
  #define FAT12_SIGN	"FAT12   "
  #define FAT16_SIGN	"FAT16   "
  #define FAT32_SIGN	"FAT32   "
  #define SIGNLEN		8
  
  /* File attributes */
7385c28e9   Wolfgang Denk   fs/fat: Big code ...
40
41
42
43
44
45
  #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   wdenk   * Fix CONFIG_NET_...
46

7385c28e9   Wolfgang Denk   fs/fat: Big code ...
47
  #define ATTR_VFAT	(ATTR_RO | ATTR_HIDDEN | ATTR_SYS | ATTR_VOLUME)
71f951180   wdenk   * Fix CONFIG_NET_...
48
49
  
  #define DELETED_FLAG	((char)0xe5) /* Marks deleted files when in name[0] */
3c2c2f427   Remy Bohmer   Remove non-ascii ...
50
  #define aRING		0x05	     /* Used as special character in name[0] */
71f951180   wdenk   * Fix CONFIG_NET_...
51

7385c28e9   Wolfgang Denk   fs/fat: Big code ...
52
53
  /*
   * Indicates that the entry is the last long entry in a set of long
2d1a537d8   wdenk   * Patch by Thomas...
54
55
56
   * dir entries
   */
  #define LAST_LONG_ENTRY_MASK	0x40
71f951180   wdenk   * Fix CONFIG_NET_...
57

7385c28e9   Wolfgang Denk   fs/fat: Big code ...
58
  #define ISDIRDELIM(c)	((c) == '/' || (c) == '\\')
71f951180   wdenk   * Fix CONFIG_NET_...
59
60
61
62
63
64
65
  
  #define FSTYPE_NONE	(-1)
  
  #if defined(__linux__) && defined(__KERNEL__)
  #define FAT2CPU16	le16_to_cpu
  #define FAT2CPU32	le32_to_cpu
  #else
9fd5e31fe   wdenk   * Patch by Pierre...
66
  #if __LITTLE_ENDIAN
71f951180   wdenk   * Fix CONFIG_NET_...
67
68
69
70
71
  #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   Wolfgang Denk   Big white-space c...
72
  			 (((x) & 0x0000ff00) << 8)  |	\
71f951180   wdenk   * Fix CONFIG_NET_...
73
74
75
76
  			 (((x) & 0x00ff0000) >> 8)  |	\
  			 (((x) & 0xff000000) >> 24))
  #endif
  #endif
71f951180   wdenk   * Fix CONFIG_NET_...
77
78
79
  #define START(dent)	(FAT2CPU16((dent)->start) \
  			+ (mydata->fatsize != 32 ? 0 : \
  			  (FAT2CPU16((dent)->starthi) << 16)))
2e98f7088   Wu, Josh   fs: fat_write: fi...
80
81
82
  #define IS_LAST_CLUST(x, fatsize) ((x) >= ((fatsize) != 32 ? \
  					((fatsize) != 16 ? 0xff8 : 0xfff8) : \
  					0xffffff8))
8ce4e5c2c   michael   Fix checking fat3...
83
  #define CHECK_CLUST(x, fatsize) ((x) <= 1 || \
06118973e   Wu, Josh   fs/fat: add fat12...
84
85
86
  				(x) >= ((fatsize) != 32 ? \
  					((fatsize) != 16 ? 0xff0 : 0xfff0) : \
  					0xffffff0))
71f951180   wdenk   * Fix CONFIG_NET_...
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
  
  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   Rob Clark   fs/fat: fix case ...
125
126
127
  /* see dir_entry::lcase: */
  #define CASE_LOWER_BASE	8	/* base (name) is lower case */
  #define CASE_LOWER_EXT	16	/* extension is lower case */
71f951180   wdenk   * Fix CONFIG_NET_...
128
129
130
  typedef struct dir_entry {
  	char	name[8],ext[3];	/* Name and extension */
  	__u8	attr;		/* Attribute bits */
21a24c3bf   Rob Clark   fs/fat: fix case ...
131
  	__u8	lcase;		/* Case for name and ext (CASE_LOWER_x) */
71f951180   wdenk   * Fix CONFIG_NET_...
132
133
134
135
136
137
138
139
140
141
  	__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   Wolfgang Denk   fs/fat: Big code ...
142
143
144
145
146
147
148
149
  	__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   wdenk   * Fix CONFIG_NET_...
150
  } dir_slot;
7385c28e9   Wolfgang Denk   fs/fat: Big code ...
151
152
  /*
   * Private filesystem parameters
80f0c0f58   Wolfgang Denk   Fix fatload comma...
153
154
155
156
   *
   * Note: FAT buffer has to be 32 bit aligned
   * (see FAT32 accesses)
   */
71f951180   wdenk   * Fix CONFIG_NET_...
157
  typedef struct {
ac4977719   Sergei Shtylyov   fat: fix crash wi...
158
  	__u8	*fatbuf;	/* Current FAT buffer */
71f951180   wdenk   * Fix CONFIG_NET_...
159
  	int	fatsize;	/* Size of FAT in bits */
1d90c3b45   Aaron Williams   fat: fix FAT sect...
160
  	__u32	fatlength;	/* Length of FAT in sectors */
71f951180   wdenk   * Fix CONFIG_NET_...
161
  	__u16	fat_sect;	/* Starting sector of the FAT */
3c0ed9c3a   Stefan BrĂ¼ns   fs/fat: Do not wr...
162
  	__u8	fat_dirty;      /* Set if fatbuf has been modified */
1d90c3b45   Aaron Williams   fat: fix FAT sect...
163
  	__u32	rootdir_sect;	/* Start sector of root directory */
ac4977719   Sergei Shtylyov   fat: fix crash wi...
164
  	__u16	sect_size;	/* Size of sectors in bytes */
71f951180   wdenk   * Fix CONFIG_NET_...
165
  	__u16	clust_size;	/* Size of clusters in sectors */
1d90c3b45   Aaron Williams   fat: fix FAT sect...
166
  	int	data_begin;	/* The sector of the first cluster, can be negative */
71f951180   wdenk   * Fix CONFIG_NET_...
167
  	int	fatbufnum;	/* Used by get_fatent, init to -1 */
45449980f   Rob Clark   fs/fat: split out...
168
  	int	rootdir_size;	/* Size of root dir for non-FAT32 */
c6e3baa56   Rob Clark   fs/fat: introduce...
169
  	__u32	root_cluster;	/* First cluster of root dir for FAT32 */
71f951180   wdenk   * Fix CONFIG_NET_...
170
  } fsdata;
c6e3baa56   Rob Clark   fs/fat: introduce...
171
172
173
174
  static inline u32 clust_to_sect(fsdata *fsdata, u32 clust)
  {
  	return fsdata->data_begin + clust * fsdata->clust_size;
  }
615283d0e   Seung-Woo Kim   MLK-20668-1 fs: f...
175
  static inline u32 sect_to_clust(fsdata *fsdata, int sect)
265edc03d   Rob Clark   fs/fat: Clean up ...
176
177
178
  {
  	return (sect - fsdata->data_begin) / fsdata->clust_size;
  }
71f951180   wdenk   * Fix CONFIG_NET_...
179
  int file_fat_detectfs(void);
b7b5f3195   Stephen Warren   fat: implement ex...
180
  int fat_exists(const char *filename);
d455d8789   Suriyan Ramasami   fs: API changes e...
181
  int fat_size(const char *filename, loff_t *size);
1ad0b98a0   Suriyan Ramasami   fat: Prepare API ...
182
183
184
  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   Simon Glass   dm: Drop the bloc...
185
186
  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   wdenk   * Fix CONFIG_NET_...
187

1ad0b98a0   Suriyan Ramasami   fat: Prepare API ...
188
189
  int file_fat_write(const char *filename, void *buf, loff_t offset, loff_t len,
  		   loff_t *actwrite);
d455d8789   Suriyan Ramasami   fs: API changes e...
190
191
  int fat_read_file(const char *filename, void *buf, loff_t offset, loff_t len,
  		  loff_t *actread);
89191d626   Rob Clark   fat/fs: move ls t...
192
193
194
  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);
e6d524153   Simon Glass   fs: Move ls and r...
195
  void fat_close(void);
71f951180   wdenk   * Fix CONFIG_NET_...
196
  #endif /* _FAT_H_ */