+ /** Bit-rotates a given 8-bit value once to the right.
+ *
+ * \param[in] x Value to rotate right once
+ *
+ * \return Bit-rotated input value, rotated once to the right.
+ */
+ #define ROT8(x) ((((x) & 0xFE) >> 1) | (((x) & 1) ? 0x80 : 0x00))
+
+ /** Computes the LFN entry checksum of a MSDOS 8.3 format file entry,
+ * to associate a LFN entry with its short file entry.
+ *
+ * \param[in] n0 MSDOS Filename character 1
+ * \param[in] n1 MSDOS Filename character 2
+ * \param[in] n2 MSDOS Filename character 3
+ * \param[in] n3 MSDOS Filename character 4
+ * \param[in] n4 MSDOS Filename character 5
+ * \param[in] n5 MSDOS Filename character 6
+ * \param[in] n6 MSDOS Filename character 7
+ * \param[in] n7 MSDOS Filename character 8
+ * \param[in] e0 MSDOS Extension character 1
+ * \param[in] e1 MSDOS Extension character 2
+ * \param[in] e2 MSDOS Extension character 3
+ *
+ * \return LFN checksum of the given MSDOS 8.3 filename.
+ */
+ #define FAT_CHECKSUM(n0, n1, n2, n3, n4, n5, n6, n7, e0, e1, e2) \
+ (uint8_t)(ROT8(ROT8(ROT8(ROT8(ROT8(ROT8(ROT8(ROT8(ROT8(ROT8(n0)+n1)+n2)+n3)+n4)+n5)+n6)+n7)+e0)+e1)+e2)
+
+ /** \name FAT Filesystem Flags */
+ //@{
+ /** FAT attribute flag to indicate a read-only file. */
+ #define FAT_FLAG_READONLY (1 << 0)
+
+ /** FAT attribute flag to indicate a hidden file. */
+ #define FAT_FLAG_HIDDEN (1 << 1)
+
+ /** FAT attribute flag to indicate a system file. */
+ #define FAT_FLAG_SYSTEM (1 << 2)
+
+ /** FAT attribute flag to indicate a Volume name entry. */
+ #define FAT_FLAG_VOLUME_NAME (1 << 3)
+
+ /** FAT attribute flag to indicate a directory entry. */
+ #define FAT_FLAG_DIRECTORY (1 << 4)
+
+ /** FAT attribute flag to indicate a file ready for archiving. */
+ #define FAT_FLAG_ARCHIVE (1 << 5)
+
+ /** FAT pseudo-attribute flag to indicate a Long File Name entry. */
+ #define FAT_FLAG_LONG_FILE_NAME 0x0F
+
+ /** Ordinal flag marker for FAT Long File Name entries to mark the last entry. */
+ #define FAT_ORDINAL_LAST_ENTRY (1 << 6)
+ //@}
+
+ /* Enums: */
+ /** Enum for the Root FAT file entry indexes on the disk. This can be used
+ * to retrieve the current contents of a known directory entry.
+ */
+ enum
+ {
+ /** Volume ID directory entry, giving the name of the virtual disk. */
+ DISK_FILE_ENTRY_VolumeID = 0,
+ /** Long File Name FAT file entry of the virtual FLASH.BIN image file. */
+ DISK_FILE_ENTRY_FLASH_LFN = 1,
+ /** Legacy MSDOS FAT file entry of the virtual FLASH.BIN image file. */
+ DISK_FILE_ENTRY_FLASH_MSDOS = 2,
+ /** Long File Name FAT file entry of the virtual EEPROM.BIN image file. */
+ DISK_FILE_ENTRY_EEPROM_LFN = 3,
+ /** Legacy MSDOS FAT file entry of the virtual EEPROM.BIN image file. */
+ DISK_FILE_ENTRY_EEPROM_MSDOS = 4,
+ };
+
+ /** Enum for the physical disk blocks of the virtual disk. */
+ enum
+ {
+ /** Boot sector disk block. */
+ DISK_BLOCK_BootBlock = 0,
+ /** First copy of the FAT table block. */
+ DISK_BLOCK_FATBlock1 = 1,
+ /** Second copy of the FAT table block. */
+ DISK_BLOCK_FATBlock2 = 2,
+ /** Root file and directory entries block. */
+ DISK_BLOCK_RootFilesBlock = 3,
+ /** Start block of the disk data section. */
+ DISK_BLOCK_DataStartBlock = 4,
+ };
+