Started FAT32 driver
This commit is contained in:
parent
16af4746ae
commit
78bea1f8bb
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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){
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
Loading…
Reference in New Issue