|
|
@ -22,6 +22,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef SdFatStructs_h
|
|
|
|
#ifndef SdFatStructs_h
|
|
|
|
#define SdFatStructs_h
|
|
|
|
#define SdFatStructs_h
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define PACKED __attribute__((__packed__))
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* \file
|
|
|
|
* \file
|
|
|
|
* \brief FAT file structures
|
|
|
|
* \brief FAT file structures
|
|
|
@ -95,7 +97,7 @@ struct partitionTable {
|
|
|
|
uint32_t firstSector;
|
|
|
|
uint32_t firstSector;
|
|
|
|
/** Length of the partition, in blocks. */
|
|
|
|
/** Length of the partition, in blocks. */
|
|
|
|
uint32_t totalSectors;
|
|
|
|
uint32_t totalSectors;
|
|
|
|
};
|
|
|
|
} PACKED;
|
|
|
|
/** Type name for partitionTable */
|
|
|
|
/** Type name for partitionTable */
|
|
|
|
typedef struct partitionTable part_t;
|
|
|
|
typedef struct partitionTable part_t;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
@ -119,7 +121,7 @@ struct masterBootRecord {
|
|
|
|
uint8_t mbrSig0;
|
|
|
|
uint8_t mbrSig0;
|
|
|
|
/** Second MBR signature byte. Must be 0XAA */
|
|
|
|
/** Second MBR signature byte. Must be 0XAA */
|
|
|
|
uint8_t mbrSig1;
|
|
|
|
uint8_t mbrSig1;
|
|
|
|
};
|
|
|
|
} PACKED;
|
|
|
|
/** Type name for masterBootRecord */
|
|
|
|
/** Type name for masterBootRecord */
|
|
|
|
typedef struct masterBootRecord mbr_t;
|
|
|
|
typedef struct masterBootRecord mbr_t;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
@ -247,7 +249,7 @@ struct fat_boot {
|
|
|
|
uint8_t bootSectorSig0;
|
|
|
|
uint8_t bootSectorSig0;
|
|
|
|
/** must be 0XAA */
|
|
|
|
/** must be 0XAA */
|
|
|
|
uint8_t bootSectorSig1;
|
|
|
|
uint8_t bootSectorSig1;
|
|
|
|
};
|
|
|
|
} PACKED;
|
|
|
|
/** Type name for FAT Boot Sector */
|
|
|
|
/** Type name for FAT Boot Sector */
|
|
|
|
typedef struct fat_boot fat_boot_t;
|
|
|
|
typedef struct fat_boot fat_boot_t;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
@ -401,7 +403,7 @@ struct fat32_boot {
|
|
|
|
uint8_t bootSectorSig0;
|
|
|
|
uint8_t bootSectorSig0;
|
|
|
|
/** must be 0XAA */
|
|
|
|
/** must be 0XAA */
|
|
|
|
uint8_t bootSectorSig1;
|
|
|
|
uint8_t bootSectorSig1;
|
|
|
|
};
|
|
|
|
} PACKED;
|
|
|
|
/** Type name for FAT32 Boot Sector */
|
|
|
|
/** Type name for FAT32 Boot Sector */
|
|
|
|
typedef struct fat32_boot fat32_boot_t;
|
|
|
|
typedef struct fat32_boot fat32_boot_t;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
@ -441,7 +443,7 @@ struct fat32_fsinfo {
|
|
|
|
uint8_t reserved2[12];
|
|
|
|
uint8_t reserved2[12];
|
|
|
|
/** must be 0X00, 0X00, 0X55, 0XAA */
|
|
|
|
/** must be 0X00, 0X00, 0X55, 0XAA */
|
|
|
|
uint8_t tailSignature[4];
|
|
|
|
uint8_t tailSignature[4];
|
|
|
|
};
|
|
|
|
} PACKED;
|
|
|
|
/** Type name for FAT32 FSINFO Sector */
|
|
|
|
/** Type name for FAT32 FSINFO Sector */
|
|
|
|
typedef struct fat32_fsinfo fat32_fsinfo_t;
|
|
|
|
typedef struct fat32_fsinfo fat32_fsinfo_t;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
@ -539,12 +541,46 @@ struct directoryEntry {
|
|
|
|
uint16_t firstClusterLow;
|
|
|
|
uint16_t firstClusterLow;
|
|
|
|
/** 32-bit unsigned holding this file's size in bytes. */
|
|
|
|
/** 32-bit unsigned holding this file's size in bytes. */
|
|
|
|
uint32_t fileSize;
|
|
|
|
uint32_t fileSize;
|
|
|
|
};
|
|
|
|
} PACKED;
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* \struct directoryVFATEntry
|
|
|
|
|
|
|
|
* \brief VFAT long filename directory entry
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* directoryVFATEntries are found in the same list as normal directoryEntry.
|
|
|
|
|
|
|
|
* But have the attribute field set to DIR_ATT_LONG_NAME.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* Long filenames are saved in multiple directoryVFATEntries.
|
|
|
|
|
|
|
|
* Each entry containing 13 UTF-16 characters.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
struct directoryVFATEntry {
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Sequence number. Consists of 2 parts:
|
|
|
|
|
|
|
|
* bit 6: indicates first long filename block for the next file
|
|
|
|
|
|
|
|
* bit 0-4: the position of this long filename block (first block is 1)
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
uint8_t sequenceNumber;
|
|
|
|
|
|
|
|
/** First set of UTF-16 characters */
|
|
|
|
|
|
|
|
uint16_t name1[5];//UTF-16
|
|
|
|
|
|
|
|
/** attributes (at the same location as in directoryEntry), always 0x0F */
|
|
|
|
|
|
|
|
uint8_t attributes;
|
|
|
|
|
|
|
|
/** Reserved for use by Windows NT. Always 0. */
|
|
|
|
|
|
|
|
uint8_t reservedNT;
|
|
|
|
|
|
|
|
/** Checksum of the short 8.3 filename, can be used to checked if the file system as modified by a not-long-filename aware implementation. */
|
|
|
|
|
|
|
|
uint8_t checksum;
|
|
|
|
|
|
|
|
/** Second set of UTF-16 characters */
|
|
|
|
|
|
|
|
uint16_t name2[6];//UTF-16
|
|
|
|
|
|
|
|
/** firstClusterLow is always zero for longFilenames */
|
|
|
|
|
|
|
|
uint16_t firstClusterLow;
|
|
|
|
|
|
|
|
/** Third set of UTF-16 characters */
|
|
|
|
|
|
|
|
uint16_t name3[2];//UTF-16
|
|
|
|
|
|
|
|
} PACKED;
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Definitions for directory entries
|
|
|
|
// Definitions for directory entries
|
|
|
|
//
|
|
|
|
//
|
|
|
|
/** Type name for directoryEntry */
|
|
|
|
/** Type name for directoryEntry */
|
|
|
|
typedef struct directoryEntry dir_t;
|
|
|
|
typedef struct directoryEntry dir_t;
|
|
|
|
|
|
|
|
/** Type name for directoryVFATEntry */
|
|
|
|
|
|
|
|
typedef struct directoryVFATEntry vfat_t;
|
|
|
|
/** escape for name[0] = 0XE5 */
|
|
|
|
/** escape for name[0] = 0XE5 */
|
|
|
|
uint8_t const DIR_NAME_0XE5 = 0X05;
|
|
|
|
uint8_t const DIR_NAME_0XE5 = 0X05;
|
|
|
|
/** name[0] value for entry that is free after being "deleted" */
|
|
|
|
/** name[0] value for entry that is free after being "deleted" */
|
|
|
|