From 0d60bdeb7fa50e68aa0576c6bd37f858562ab10f Mon Sep 17 00:00:00 2001 From: Mathieu Maret Date: Sat, 3 Aug 2024 11:19:28 +0200 Subject: [PATCH] wip fat16/32 --- core/fs.h | 17 ++++++++-- drivers/fat16.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 2 deletions(-) create mode 100644 drivers/fat16.c diff --git a/core/fs.h b/core/fs.h index dbf3fbd..712bcfe 100644 --- a/core/fs.h +++ b/core/fs.h @@ -1,4 +1,5 @@ #pragma once +#include "ata.h" #include "fsEntry.h" #include "process.h" #include "stdint.h" @@ -88,6 +89,8 @@ struct file_system_instance { struct file_system_instance *prev, *next; }; +typedef enum { SEEK_SET, SEEK_CUR, SEEK_END } seek_mode_t; + struct file_system { char name[FS_NAME_MAXLEN]; struct file_system_instance *instances; @@ -98,11 +101,21 @@ struct file_system { int (*umount)(struct file_system *this, struct file_system_instance *mountedFs); + + //tmp function to implement fs in kernel only as a firts step + void *(*open)(struct ata_device *disk, struct ata_partition *path, uint32_t mode); + int (*read)(struct ata_device *disk, void *private, uint32_t size, uint32_t nmemb, + char *out); + int (*resolve)(struct ata_device *disk); + + int (*close)(void *private); + + int (*seek)(void *private, uint32_t offset, seek_mode_t seek_mode); + // end tmp + struct file_system *prev, *next; }; -typedef enum { SEEK_SET, SEEK_CUR, SEEK_END } seek_mode_t; - struct file_operations { loff_t (*llseek)(struct file *this, loff_t offset, seek_mode_t whence); ssize_t (*read)(struct file *this, char *buf, size_t size, loff_t *offset); diff --git a/drivers/fat16.c b/drivers/fat16.c new file mode 100644 index 0000000..4127ccb --- /dev/null +++ b/drivers/fat16.c @@ -0,0 +1,83 @@ +#include + +/** + * media organization: + * * boot record (1 sector, so could be called boot sector): BPB + Extended Boot Record + * * File Allocation Table (FAT) + * * data area + */ + + +struct ebr_fat16 { // Extended Boot Record for FAT16 + uint8_t drive_number; + uint8_t flags; + uint8_t signature; // Must be 0x29 for FAT16 + uint8_t vol_id[4]; + uint8_t vol_label[11]; + uint8_t sys_id[8]; // Do not trust this! + uint8_t bootcode[448]; + uint16_t bootable_signature; // 0xAA55 +} __attribute__((packed)); + +struct ebr_fat32 { // Extended Boot Record for FAT32 + uint32_t fat_size; + uint16_t flags; + uint16_t fat_version_number; + uint32_t root_cluster_nb; + uint8_t reserved[12]; + uint8_t drive_number; + uint8_t flags_nt; + uint8_t signature; + uint8_t vol_id[4]; + uint8_t vol_label[11]; + uint8_t sys_id[8]; // Should be always "FAT32" + uint8_t bootcode[420]; + uint16_t bootable_signature; // 0xAA55 +} __attribute__((packed)); + +struct bpb { // Bios Param Block + uint8_t jump_ins[3]; + uint8_t oem_id[3]; + uint16_t bytes_per_sector; + uint8_t sector_per_cluster; + uint16_t reserved_sectors; // boot sectors included + uint8_t nb_fat; + uint16_t nb_root_dirs; + uint16_t nb_sectors; + uint8_t media_description_type; + uint16_t sectors_per_fat; + uint16_t sectors_per_track; + uint16_t number_of_heads; + uint32_t hidden_sectors; + uint32_t nb_large_sectors; + union { + struct ebr_fat32 fat32; + struct ebr_fat16 fat16; + }; +} __attribute__((packed)); + +typedef enum { + READ_ONLY = 0x01, + HIDDEN = 0x02, + SYSTEM = 0x04, + VOLUME_ID = 0x08, + DIRECTORY = 0x10, + ARCHIVE = 0x20, + LFN = READ_ONLY | HIDDEN | SYSTEM | VOLUME_ID, +} __attribute__((__packed__)) directory_entry_type_t; + +struct directory_entry { + uint8_t filename[11]; + directory_entry_type_t type; + uint8_t reserved; + uint8_t creation_time_hundredths_sec; + uint16_t creation_time; // hour[5] min[6] sec[5] + uint16_t creation_date; // year[7] month[4] day[5] + uint16_t last_access_date; // year[7] month[4] day[5] + uint16_t cluster_nb_high; + uint16_t modification_time; // hour[5] min[6] sec[5] + uint16_t modification_date; // year[7] month[4] day[5] + uint16_t cluster_nb_low; + uint32_t size; // in bytes +} __attribute__((packed)); +