Blame view

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

4f0d1a2ae   Siva Durga Prasad Paladugu   fat: Define MAX_C...
19
20
21
22
  #ifndef CONFIG_FS_FAT_MAX_CLUSTSIZE
  #define CONFIG_FS_FAT_MAX_CLUSTSIZE 65536
  #endif
  #define MAX_CLUSTSIZE	CONFIG_FS_FAT_MAX_CLUSTSIZE
ac4977719   Sergei Shtylyov   fat: fix crash wi...
23
24
25
  #define DIRENTSPERBLOCK	(mydata->sect_size / sizeof(dir_entry))
  #define DIRENTSPERCLUST	((mydata->clust_size * mydata->sect_size) / \
  			 sizeof(dir_entry))
71f951180   wdenk   * Fix CONFIG_NET_...
26
27
  
  #define FATBUFBLOCKS	6
ac4977719   Sergei Shtylyov   fat: fix crash wi...
28
  #define FATBUFSIZE	(mydata->sect_size * FATBUFBLOCKS)
cd37d9e6e   wdenk   * Patch by Jian Z...
29
  #define FAT12BUFSIZE	((FATBUFSIZE*2)/3)
71f951180   wdenk   * Fix CONFIG_NET_...
30
31
32
33
34
35
36
37
38
39
40
  #define FAT16BUFSIZE	(FATBUFSIZE/2)
  #define FAT32BUFSIZE	(FATBUFSIZE/4)
  
  
  /* 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 ...
41
42
43
44
45
46
  #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_...
47

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

7385c28e9   Wolfgang Denk   fs/fat: Big code ...
53
54
  /*
   * Indicates that the entry is the last long entry in a set of long
2d1a537d8   wdenk   * Patch by Thomas...
55
56
57
   * dir entries
   */
  #define LAST_LONG_ENTRY_MASK	0x40
71f951180   wdenk   * Fix CONFIG_NET_...
58
59
  
  /* Flags telling whether we should read a file or list a directory */
7385c28e9   Wolfgang Denk   fs/fat: Big code ...
60
61
62
63
  #define LS_NO		0
  #define LS_YES		1
  #define LS_DIR		1
  #define LS_ROOT		2
71f951180   wdenk   * Fix CONFIG_NET_...
64

7385c28e9   Wolfgang Denk   fs/fat: Big code ...
65
  #define ISDIRDELIM(c)	((c) == '/' || (c) == '\\')
71f951180   wdenk   * Fix CONFIG_NET_...
66
67
68
69
70
71
72
  
  #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...
73
  #if __LITTLE_ENDIAN
71f951180   wdenk   * Fix CONFIG_NET_...
74
75
76
77
78
  #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...
79
  			 (((x) & 0x0000ff00) << 8)  |	\
71f951180   wdenk   * Fix CONFIG_NET_...
80
81
82
83
  			 (((x) & 0x00ff0000) >> 8)  |	\
  			 (((x) & 0xff000000) >> 24))
  #endif
  #endif
71f951180   wdenk   * Fix CONFIG_NET_...
84
85
86
  #define START(dent)	(FAT2CPU16((dent)->start) \
  			+ (mydata->fatsize != 32 ? 0 : \
  			  (FAT2CPU16((dent)->starthi) << 16)))
2e98f7088   Wu, Josh   fs: fat_write: fi...
87
88
89
  #define IS_LAST_CLUST(x, fatsize) ((x) >= ((fatsize) != 32 ? \
  					((fatsize) != 16 ? 0xff8 : 0xfff8) : \
  					0xffffff8))
8ce4e5c2c   michael   Fix checking fat3...
90
  #define CHECK_CLUST(x, fatsize) ((x) <= 1 || \
06118973e   Wu, Josh   fs/fat: add fat12...
91
92
93
  				(x) >= ((fatsize) != 32 ? \
  					((fatsize) != 16 ? 0xff0 : 0xfff0) : \
  					0xffffff0))
71f951180   wdenk   * Fix CONFIG_NET_...
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
  
  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;
  
  typedef struct dir_entry {
  	char	name[8],ext[3];	/* Name and extension */
  	__u8	attr;		/* Attribute bits */
  	__u8	lcase;		/* Case for base and extension */
  	__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 ...
147
148
149
150
151
152
153
154
  	__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_...
155
  } dir_slot;
7385c28e9   Wolfgang Denk   fs/fat: Big code ...
156
157
  /*
   * Private filesystem parameters
80f0c0f58   Wolfgang Denk   Fix fatload comma...
158
159
160
161
   *
   * Note: FAT buffer has to be 32 bit aligned
   * (see FAT32 accesses)
   */
71f951180   wdenk   * Fix CONFIG_NET_...
162
  typedef struct {
ac4977719   Sergei Shtylyov   fat: fix crash wi...
163
  	__u8	*fatbuf;	/* Current FAT buffer */
71f951180   wdenk   * Fix CONFIG_NET_...
164
  	int	fatsize;	/* Size of FAT in bits */
1d90c3b45   Aaron Williams   fat: fix FAT sect...
165
  	__u32	fatlength;	/* Length of FAT in sectors */
71f951180   wdenk   * Fix CONFIG_NET_...
166
  	__u16	fat_sect;	/* Starting sector of the FAT */
3c0ed9c3a   Stefan BrĂ¼ns   fs/fat: Do not wr...
167
  	__u8	fat_dirty;      /* Set if fatbuf has been modified */
1d90c3b45   Aaron Williams   fat: fix FAT sect...
168
  	__u32	rootdir_sect;	/* Start sector of root directory */
ac4977719   Sergei Shtylyov   fat: fix crash wi...
169
  	__u16	sect_size;	/* Size of sectors in bytes */
71f951180   wdenk   * Fix CONFIG_NET_...
170
  	__u16	clust_size;	/* Size of clusters in sectors */
1d90c3b45   Aaron Williams   fat: fix FAT sect...
171
  	int	data_begin;	/* The sector of the first cluster, can be negative */
71f951180   wdenk   * Fix CONFIG_NET_...
172
173
174
175
176
  	int	fatbufnum;	/* Used by get_fatent, init to -1 */
  } fsdata;
  
  typedef int	(file_detectfs_func)(void);
  typedef int	(file_ls_func)(const char *dir);
1ad0b98a0   Suriyan Ramasami   fat: Prepare API ...
177
178
  typedef int	(file_read_func)(const char *filename, void *buffer,
  				 int maxsize);
71f951180   wdenk   * Fix CONFIG_NET_...
179
180
  
  struct filesystem {
7385c28e9   Wolfgang Denk   fs/fat: Big code ...
181
182
183
184
  	file_detectfs_func	*detect;
  	file_ls_func		*ls;
  	file_read_func		*read;
  	const char		name[12];
71f951180   wdenk   * Fix CONFIG_NET_...
185
186
187
188
189
190
191
192
193
194
195
  };
  
  /* FAT tables */
  file_detectfs_func	file_fat_detectfs;
  file_ls_func		file_fat_ls;
  file_read_func		file_fat_read;
  
  /* Currently this doesn't check if the dir exists or is valid... */
  int file_cd(const char *path);
  int file_fat_detectfs(void);
  int file_fat_ls(const char *dir);
b7b5f3195   Stephen Warren   fat: implement ex...
196
  int fat_exists(const char *filename);
d455d8789   Suriyan Ramasami   fs: API changes e...
197
  int fat_size(const char *filename, loff_t *size);
1ad0b98a0   Suriyan Ramasami   fat: Prepare API ...
198
199
200
  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);
71f951180   wdenk   * Fix CONFIG_NET_...
201
  const char *file_getfsname(int idx);
4101f6879   Simon Glass   dm: Drop the bloc...
202
203
  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_...
204

1ad0b98a0   Suriyan Ramasami   fat: Prepare API ...
205
206
  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...
207
208
  int fat_read_file(const char *filename, void *buf, loff_t offset, loff_t len,
  		  loff_t *actread);
e6d524153   Simon Glass   fs: Move ls and r...
209
  void fat_close(void);
71f951180   wdenk   * Fix CONFIG_NET_...
210
  #endif /* _FAT_H_ */