Started FAT32 driver

This commit is contained in:
notsomeidiot123 2025-09-30 12:30:55 -04:00
parent 16af4746ae
commit 78bea1f8bb
5 changed files with 54 additions and 16 deletions

View File

@ -40,7 +40,6 @@ extern void kmain(kernel_info_t *kernel_info){
mlog("KERNEL", "Initializing IDT\n", MLOG_PRINT);
idt_load();
pic_init(0x20);
pic_disable();
pic_setmask(0x0, PIC1_DATA);
pic_setmask(0x0, PIC2_DATA);

View File

@ -67,7 +67,8 @@ uint32_t module_api(uint32_t func, ...){
case MODULE_API_READ:
vfile_t *file = va_arg(vars, vfile_t *);
char *buffer = va_arg(vars, char *);
uint32_t offset = va_arg(vars, uint32_t), count = va_arg(vars, uint32_t);
uint32_t offset = va_arg(vars, uint32_t);
uint32_t count = va_arg(vars, uint32_t);
return_value = fread(file, buffer, offset, count);
break;
case MODULE_API_WRITE:

View File

@ -201,17 +201,17 @@ int ata_write(vfile_t *file, void *ptr, uint32_t offset, uint32_t count){
uint32_t pages = (count + 4095) / 4096;
uint32_t sector_count = pages*8;
api(MODULE_API_PRINT, MODULE_NAME, "pages: %x, scount: %x\n", pages, sector_count);
// api(MODULE_API_PRINT, MODULE_NAME, "pages: %x, scount: %x\n", pages, sector_count);
if (sector_count == 0) return -1;
for (uint32_t i = 0; i < pages; i++) {
prdt[i].address = api(MODULE_API_PADDR, ptr + (i << 12));
// api(MODULE_API_PRINT, MODULE_NAME, "ADDR: %x, Count: %x", ptr + (i << 12), api(MODULE_API_PADDR, prdt));
prdt[i].byte_count = 4096;
api(MODULE_API_PRINT, MODULE_NAME, "ADDR: %x, Count: %x\n", prdt[i].address, prdt[i].byte_count);
// api(MODULE_API_PRINT, MODULE_NAME, "ADDR: %x, Count: %x\n", prdt[i].address, prdt[i].byte_count);
prdt[i].reserved = 0;
if(i == pages - 1){
prdt[i].reserved = 0x8000;
api(MODULE_API_PRINT, MODULE_NAME, "Reserved: %x\n", prdt[i].reserved);
// api(MODULE_API_PRINT, MODULE_NAME, "Reserved: %x\n", prdt[i].reserved);
}
}
@ -219,7 +219,7 @@ int ata_write(vfile_t *file, void *ptr, uint32_t offset, uint32_t count){
outb(bm_base + 2, 0x06);
outl(bm_base + 4, api(MODULE_API_PADDR, prdt));
uint32_t test = inl(bm_base + 4);
api(MODULE_API_PRINT, MODULE_NAME, "PRDT (Read back from busmaster): %x\n", test);
// api(MODULE_API_PRINT, MODULE_NAME, "PRDT (Read back from busmaster): %x\n", test);
outb(bm_base, 0x00);
while(!ata_ready(io_base, ctrl_base, drive.flags.slave << 4));
@ -260,7 +260,7 @@ int ata_write(vfile_t *file, void *ptr, uint32_t offset, uint32_t count){
uint8_t status = inb(ctrl_base);
uint8_t bm_status = inb(bm_base + 2);
api(MODULE_API_PRINT, MODULE_NAME, "Status: (ATA)%x, (Busmaster)%x\n", status, bm_status);
// api(MODULE_API_PRINT, MODULE_NAME, "Status: (ATA)%x, (Busmaster)%x\n", status, bm_status);
// if(ATA_ABRT(status)){
// puts(api, MODULE_NAME, "Command aborted\n");
// return -1;
@ -288,17 +288,17 @@ int ata_read(vfile_t *file, uint8_t *ptr, uint32_t offset, uint32_t count) {
uint32_t pages = (count + 4095) / 4096;
uint32_t sector_count = pages*8;
api(MODULE_API_PRINT, MODULE_NAME, "pages: %x, scount: %x\n", pages, sector_count);
// api(MODULE_API_PRINT, MODULE_NAME, "pages: %x, scount: %x\n", pages, sector_count);
if (sector_count == 0) return -1;
for (uint32_t i = 0; i < pages; i++) {
prdt[i].address = api(MODULE_API_PADDR, ptr + (i << 12));
// api(MODULE_API_PRINT, MODULE_NAME, "ADDR: %x, Count: %x", ptr + (i << 12), api(MODULE_API_PADDR, prdt));
prdt[i].byte_count = 4096;
api(MODULE_API_PRINT, MODULE_NAME, "ADDR: %x, Count: %x\n", prdt[i].address, prdt[i].byte_count);
// api(MODULE_API_PRINT, MODULE_NAME, "ADDR: %x, Count: %x\n", prdt[i].address, prdt[i].byte_count);
prdt[i].reserved = 0;
if(i == pages - 1){
prdt[i].reserved = 0x8000;
api(MODULE_API_PRINT, MODULE_NAME, "Reserved: %x\n", prdt[i].reserved);
// api(MODULE_API_PRINT, MODULE_NAME, "Reserved: %x\n", prdt[i].reserved);
}
}
@ -306,7 +306,7 @@ int ata_read(vfile_t *file, uint8_t *ptr, uint32_t offset, uint32_t count) {
outb(bm_base + 2, 0x06);
outl(bm_base + 4, api(MODULE_API_PADDR, prdt));
uint32_t test = inl(bm_base + 4);
api(MODULE_API_PRINT, MODULE_NAME, "PRDT (Read back from busmaster): %x\n", test);
// api(MODULE_API_PRINT, MODULE_NAME, "PRDT (Read back from busmaster): %x\n", test);
outb(bm_base, 0x08);
while(!ata_ready(io_base, ctrl_base, drive.flags.slave << 4));
@ -347,7 +347,7 @@ int ata_read(vfile_t *file, uint8_t *ptr, uint32_t offset, uint32_t count) {
uint8_t status = inb(ctrl_base);
uint8_t bm_status = inb(bm_base + 2);
api(MODULE_API_PRINT, MODULE_NAME, "Status: (ATA)%x, (Busmaster)%x\n", status, bm_status);
// api(MODULE_API_PRINT, MODULE_NAME, "Status: (ATA)%x, (Busmaster)%x\n", status, bm_status);
// if(ATA_ABRT(status)){
// puts(api, MODULE_NAME, "Command aborted\n");
// return -1;
@ -368,7 +368,7 @@ cpu_registers_t *int_handler(cpu_registers_t * regs){
uint32_t status = inb(dmabar + 2);
outb(dmabar + 2, 0x4);
recieved_ints++;
api(MODULE_API_PRINT, MODULE_NAME, "Interrupt called, %x\n", status);
// api(MODULE_API_PRINT, MODULE_NAME, "Interrupt called, %x\n", status);
if(status & 2){
api(MODULE_API_PRINT, MODULE_NAME, "Error\n");
@ -459,7 +459,7 @@ uint8_t ata_identify(uint32_t index, uint16_t disk){
}
uint16_t udma_mode = identify[88] & 0xff;
uint16_t mdma_mode = identify[63] & 0xff;
api(MODULE_API_PRINT, MODULE_NAME, "DMA Modes\nUDMA: %x\nMDMA: %x\n", udma_mode, mdma_mode);
// api(MODULE_API_PRINT, MODULE_NAME, "DMA Modes\nUDMA: %x\nMDMA: %x\n", udma_mode, mdma_mode);
int highest = 0;
uint8_t dma = udma_mode != 0 ? udma_mode : mdma_mode;
while(dma){

View File

@ -1,14 +1,31 @@
#include <stdint.h>
#include "modlib.h"
#include "fs_driver.h"
#define MODULE_NAME "KIFSM"
KOS_MAPI_FP api;
void detect_partitions(vfile_t *file){
char *buffer = malloc(api, 1);
// buffer[0] = 5;
fread(api, file, buffer, 0, 512);
mbr_t *mbr = buffer;
api(MODULE_API_PRINT, MODULE_NAME, "Magic: %x\n", mbr->magic);
return;
}
void init(KOS_MAPI_FP module_api, uint32_t api_version){
api = module_api;
api(MODULE_API_PRINT, MODULE_NAME, "KIFSM Filesystem Driver Module v0.1.0\nSupported Filesystems:\n");
vfile_t *disk_dir = fopen(api, "/dev/disk");
if(disk_dir == 0){
puts(api, MODULE_NAME, "Could not find /dev/disk\n");
}
vfile_t **dir_data = disk_dir->access.data.ptr;
for(uint32_t i = 0; dir_data[i]; i++){
detect_partitions(dir_data[i]);
}
return;
}

View File

@ -0,0 +1,21 @@
#pragma once
#include <stdint.h>
typedef struct partition{
uint8_t attributes;
uint8_t chs_start[3];
uint8_t type;
uint8_t chs_end[3];
uint32_t lba_start;
uint32_t lba_size;
}__attribute__((packed))partition_t;
#define MBR_MAGIC 0xaa55
typedef struct mbr{
char code[440];
char id[4];
char res[2];
partition_t partitions[4];
uint16_t magic;
}__attribute__((packed)) mbr_t;