wip fat16/32
This commit is contained in:
parent
dff2cce035
commit
0d60bdeb7f
17
core/fs.h
17
core/fs.h
@ -1,4 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#include "ata.h"
|
||||||
#include "fsEntry.h"
|
#include "fsEntry.h"
|
||||||
#include "process.h"
|
#include "process.h"
|
||||||
#include "stdint.h"
|
#include "stdint.h"
|
||||||
@ -88,6 +89,8 @@ struct file_system_instance {
|
|||||||
struct file_system_instance *prev, *next;
|
struct file_system_instance *prev, *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef enum { SEEK_SET, SEEK_CUR, SEEK_END } seek_mode_t;
|
||||||
|
|
||||||
struct file_system {
|
struct file_system {
|
||||||
char name[FS_NAME_MAXLEN];
|
char name[FS_NAME_MAXLEN];
|
||||||
struct file_system_instance *instances;
|
struct file_system_instance *instances;
|
||||||
@ -98,11 +101,21 @@ struct file_system {
|
|||||||
|
|
||||||
int (*umount)(struct file_system *this, struct file_system_instance *mountedFs);
|
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;
|
struct file_system *prev, *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum { SEEK_SET, SEEK_CUR, SEEK_END } seek_mode_t;
|
|
||||||
|
|
||||||
struct file_operations {
|
struct file_operations {
|
||||||
loff_t (*llseek)(struct file *this, loff_t offset, seek_mode_t whence);
|
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);
|
ssize_t (*read)(struct file *this, char *buf, size_t size, loff_t *offset);
|
||||||
|
83
drivers/fat16.c
Normal file
83
drivers/fat16.c
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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));
|
||||||
|
|
Loading…
Reference in New Issue
Block a user