#ifndef EMBPART_FAT32_H #define EMBPART_FAT32_H #include typedef struct { uint8_t boot_jump[3]; // jump instruction used for bootable volume uint8_t formatter_name[8]; // identification of application or OS formatted this device uint16_t bytes_per_sector; // number of bytes per sector uint8_t sectors_per_cluster; // number of sectors per cluster uint16_t n_reserved_sectors; // number of reserved sectors uint8_t n_fats; // number of FAT copies uint8_t _unused0[2]; uint8_t _unused1[2]; uint8_t media_descriptor; // media descriptor differentiating between removable and non-removable devices uint8_t _unused2[2]; uint16_t sectors_per_track; // number of sectors per track uint16_t n_heads; // number of heads uint32_t n_hidden_sectors; // number of hidden sectors preceding this volume uint32_t n_total_sectors; // total number of sectors in this volume uint32_t n_sectors_per_fat; // number of sectors per FAT uint16_t flags; // flags, see docs. uint16_t version; // FAT version number uint32_t root_first_cluster; // first cluster of the root directory uint16_t fsinfo_sector; // sector of the FSINFO structure uint16_t boot_backup_sector; // sector of backup boot code in the reserved region uint8_t _reserved0[12]; uint8_t logical_driver_number; // logical drive number of the partition uint8_t _reserved1; uint8_t extended_boot_signature; // extended boot signature uint32_t volume_serial_number; // volume serial number uint8_t volume_label[11]; // volume label string uint8_t fs_type[8]; // file system type ("FAT32") } __attribute__((packed)) Bpb_Fat32; typedef struct { uint32_t bpb_s; // sector of bios parameter block uint32_t fat_s; // first sector of the FAT area uint32_t root_s; // first sector of root directory uint32_t data_s; // first sector of the data area (~volume) uint32_t serial_number; // serial number of the volume uint32_t sectors_per_fat; // sectors per FAT table uint16_t bytes_per_sector; // number of bytes creating a sector uint16_t sectors_per_cluster; // number of sectors creating a cluster uint8_t fat_copies; // number of FAT table copies uint8_t volume_label[11]; // pointer to volume label } Fat32_CtrlBlock; int fat32_load(Fat32_CtrlBlock *ctrl, const uint8_t *bpb, uint32_t bpb_s); #endif //EMBPART_FAT32_H