summaryrefslogtreecommitdiff
path: root/src/kernel/fat.h
blob: 73eaaaefa03c298bf9546cca4f790b96466a2a08 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <stdint.h>
#include <stdbool.h>

#define FAT_INFO ((struct fat_info *)0x7c03)

struct fat_info {
  uint8_t  oem[8];
  uint16_t bytes_per_sector;//Assumed to be 512
  uint8_t  sectors_per_cluster;//Assumed to be 1
  uint16_t reserved_sectors;
  uint8_t  fats;//Assumed to be 1
  uint16_t root_entries;
  uint16_t sectors;//Assumed not to be 0
  uint8_t  media_type;
  uint16_t sectors_per_fat;
  uint16_t sectors_per_track;
  uint16_t heads;
  uint32_t hidden_sectors;
  uint32_t sectors_long;
  uint8_t  drive_number;
  uint8_t  reserved;
  uint8_t  ext_boot_marker;
  uint32_t volume_id;
  uint8_t  label[11];
  uint8_t  fs_type[8];
} __attribute__ ((packed));

enum {
  FA_READ_ONLY = 0x01,
  FA_HIDDEN    = 0x02,
  FA_SYSTEM    = 0x04,
  FA_LABEL     = 0x08,
  FA_DIRECTORY = 0x10,
  FA_ARCHIVE   = 0x20,

  FA_LFN       = 0x0f
};

struct directory_entry {
  uint8_t name[11];
  uint8_t attrib;
  uint8_t name_case;
  uint8_t created_decimal;
  uint16_t created_time;
  uint16_t created_date;
  uint16_t accessed_date;
  uint16_t ignore;
  uint16_t modified_time;
  uint16_t modified_date;
  uint16_t first_cluster;
  uint32_t length;
} __attribute__ ((packed));

#define FAT ((uint16_t *)0x00020000)
void load_fat();

#define CTOS(c) (FAT_INFO->reserved_sectors + FAT_INFO->sectors_per_fat + (FAT_INFO->root_entries >> 4) + (c) - 2)

bool get_entry(uint8_t *path, struct directory_entry *at);
bool update_entry(uint8_t *path, struct directory_entry *value);
bool create_entry(uint8_t *path, struct directory_entry *value);