| /* |
| * Copyright (C) 2010 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef FAT_H |
| #define FAT_H |
| |
| #include <stdint.h> |
| |
| #include "fatblock.h" |
| |
| typedef uint32_t cluster_t; |
| typedef uint64_t sector_t; |
| typedef cluster_t fat_entry_t; |
| |
| struct fat_boot_sector { |
| uint8_t jump[3]; |
| char name[8]; |
| uint16_t sector_size; |
| uint8_t sectors_per_cluster; |
| uint16_t reserved_sectors; |
| uint8_t fats; |
| uint16_t rootdir_size; |
| uint16_t sectors16; |
| uint8_t media_desc; |
| uint16_t fat_sectors16; |
| uint16_t sectors_per_track; |
| uint16_t heads; |
| uint32_t hidden_sectors; |
| uint32_t sectors32; |
| uint32_t fat_sectors32; |
| uint16_t fat_flags; |
| uint16_t version; |
| cluster_t rootdir_start; |
| uint16_t fs_info_sector; |
| uint16_t backup_boot_sector; |
| uint8_t reserved1[12]; |
| uint8_t phys_drive; |
| uint8_t reserved2; |
| uint8_t ext_boot_sig; |
| uint32_t serial; |
| char vol_label[11]; |
| char type[8]; |
| char boot_code[420]; |
| uint8_t boot_sig[2]; |
| } __attribute__((__packed__)); |
| |
| #define FAT_MEDIA_DESC_FIXED 0xF8 |
| |
| #define FAT_PHYS_DRIVE_REMOVABLE 0x00 |
| #define FAT_PHYS_DRIVE_FIXED 0x80 |
| |
| #define FAT_EXT_BOOT_SIG 0x29 |
| |
| extern const char FAT_BOOT_SIG[2]; |
| |
| extern const char FAT_INFO_SIG1[4]; |
| extern const char FAT_INFO_SIG2[4]; |
| #define FAT_INFO_SIG3 FAT_BOOT_SIG |
| |
| struct fat_info_sector { |
| char info_sig1[4]; |
| char reserved1[480]; |
| char info_sig2[4]; |
| cluster_t free_clusters; |
| cluster_t last_cluster; |
| char reserved2[14]; |
| char info_sig3[2]; |
| } __attribute__((__packed__)); |
| |
| struct fat_bootinfo { |
| struct fat_boot_sector boot; |
| struct fat_info_sector info; |
| } __attribute__((__packed__)); |
| |
| struct fat_dirent { |
| char name[11]; |
| uint8_t attr; |
| uint8_t reserved; |
| uint8_t ctime_ms; |
| uint16_t ctime; |
| uint16_t cdate; |
| uint16_t adate; |
| uint16_t first_cluster_hi; |
| uint16_t mtime; |
| uint16_t mdate; |
| uint16_t first_cluster_lo; |
| uint32_t size; |
| } __attribute__((__packed__)); |
| |
| #define FAT_ATTR_READONLY 0x01 |
| #define FAT_ATTR_HIDDEN 0x02 |
| #define FAT_ATTR_SYSTEM 0x04 |
| #define FAT_ATTR_VOLLABEL 0x08 |
| #define FAT_ATTR_SUBDIR 0x10 |
| #define FAT_ATTR_ARCHIVE 0x20 |
| #define FAT_ATTR_DEVICE 0x40 |
| |
| #define FAT_ENTRY_FREE 0x00000000 |
| #define FAT_ENTRY_BAD 0x0FFFFFF7 |
| #define FAT_ENTRY_EOC 0x0FFFFFF8 |
| |
| #define FAT_SECTOR_SIZE 512 |
| #define FAT_CLUSTER_ZERO 2 |
| #define FAT_ENTRIES_PER_SECTOR ((SECTOR_SIZE) / (sizeof(fat_entry_t))) |
| |
| void fat_dirent_set_first_cluster(struct fat_dirent *de, cluster_t cluster); |
| void fat_dirent_set(struct fat_dirent *de, |
| char *name, uint8_t attr, |
| cluster_t first_cluster, uint32_t size); |
| |
| #endif |