X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=include%2Ffat.h;h=c8b94936209f1c204c20d0307875cd33836927a6;hb=fc4e188789b01dc9f18c80869c43fdd7d1a51378;hp=b56219ced8f3f3fa575afe9471e5b06df86c0024;hpb=71f9511803de65a3b98d2f592d418da1d1539f13;p=oweals%2Fu-boot.git diff --git a/include/fat.h b/include/fat.h index b56219ced8..c8b9493620 100644 --- a/include/fat.h +++ b/include/fat.h @@ -27,6 +27,8 @@ #ifndef _FAT_H_ #define _FAT_H_ +#include + #define CONFIG_SUPPORT_VFAT #define SECTOR_SIZE FS_BLOCK_SIZE @@ -43,7 +45,7 @@ #define FATBUFBLOCKS 6 #define FATBUFSIZE (FS_BLOCK_SIZE*FATBUFBLOCKS) -#define FAT12BUFSIZE ((FATBUFSIZE*3)/2) +#define FAT12BUFSIZE ((FATBUFSIZE*2)/3) #define FAT16BUFSIZE (FATBUFSIZE/2) #define FAT32BUFSIZE (FATBUFSIZE/4) @@ -65,8 +67,12 @@ #define ATTR_VFAT (ATTR_RO | ATTR_HIDDEN | ATTR_SYS | ATTR_VOLUME) #define DELETED_FLAG ((char)0xe5) /* Marks deleted files when in name[0] */ -#define aRING 0x05 /* Used to represent 'å' in name[0] */ +#define aRING 0x05 /* Used as special character in name[0] */ +/* Indicates that the entry is the last long entry in a set of long + * dir entries + */ +#define LAST_LONG_ENTRY_MASK 0x40 /* Flags telling whether we should read a file or list a directory */ #define LS_NO 0 @@ -89,13 +95,13 @@ #define FAT2CPU16 le16_to_cpu #define FAT2CPU32 le32_to_cpu #else -#if 1 +#if __LITTLE_ENDIAN #define FAT2CPU16(x) (x) #define FAT2CPU32(x) (x) #else #define FAT2CPU16(x) ((((x) & 0x00ff) << 8) | (((x) & 0xff00) >> 8)) #define FAT2CPU32(x) ((((x) & 0x000000ff) << 24) | \ - (((x) & 0x0000ff00) << 8) | \ + (((x) & 0x0000ff00) << 8) | \ (((x) & 0x00ff0000) >> 8) | \ (((x) & 0xff000000) >> 24)) #endif @@ -105,7 +111,8 @@ #define START(dent) (FAT2CPU16((dent)->start) \ + (mydata->fatsize != 32 ? 0 : \ (FAT2CPU16((dent)->starthi) << 16))) - +#define CHECK_CLUST(x, fatsize) ((x) <= 1 || \ + (x) >= ((fatsize) != 32 ? 0xfff0 : 0xffffff0)) typedef struct boot_sector { __u8 ignored[3]; /* Bootstrap code */ @@ -169,15 +176,19 @@ typedef struct dir_slot { __u8 name11_12[4]; /* Last 2 characters in name */ } dir_slot; -/* Private filesystem parameters */ +/* Private filesystem parameters + * + * Note: FAT buffer has to be 32 bit aligned + * (see FAT32 accesses) + */ typedef struct { + __u8 fatbuf[FATBUFSIZE]; /* Current FAT buffer */ int fatsize; /* Size of FAT in bits */ __u16 fatlength; /* Length of FAT in sectors */ __u16 fat_sect; /* Starting sector of the FAT */ __u16 rootdir_sect; /* Start sector of root directory */ __u16 clust_size; /* Size of clusters in sectors */ - __u16 data_begin; /* The sector of the first cluster */ - __u8 fatbuf[FATBUFSIZE]; /* Current FAT buffer */ + short data_begin; /* The sector of the first cluster, can be negative */ int fatbufnum; /* Used by get_fatent, init to -1 */ } fsdata; @@ -204,5 +215,6 @@ int file_fat_detectfs(void); int file_fat_ls(const char *dir); long file_fat_read(const char *filename, void *buffer, unsigned long maxsize); const char *file_getfsname(int idx); +int fat_register_device(block_dev_desc_t *dev_desc, int part_no); #endif /* _FAT_H_ */