Espresso 0.0.1b
This commit is contained in:
50
drivers/fs/duckfs_disk_io.c
Normal file
50
drivers/fs/duckfs_disk_io.c
Normal file
@ -0,0 +1,50 @@
|
||||
#include <fs/duckfs.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
extern int32_t ide_read48(uint8_t drive, uint64_t lba, uint8_t sector_count, void* buffer);
|
||||
extern int32_t ide_write48(uint8_t drive, uint64_t lba, uint8_t sector_count, const void* buffer);
|
||||
|
||||
static uint8_t duckfs_drive = 0;
|
||||
|
||||
void duckfs_set_drive(uint8_t drive)
|
||||
{
|
||||
duckfs_drive = drive;
|
||||
}
|
||||
|
||||
int32_t disk_read(uint64_t lba, void* buffer, uint32_t count)
|
||||
{
|
||||
/* IDE spec only allows up to 256 sectors in one call */
|
||||
while (count > 0)
|
||||
{
|
||||
uint8_t sectors = (count > 256) ? 256 : count;
|
||||
int32_t result = ide_read48(duckfs_drive, lba, sectors, buffer);
|
||||
if (result < 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
lba += sectors;
|
||||
count -= sectors;
|
||||
buffer = (void*)((uintptr_t)buffer + 512 * sectors);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32_t disk_write(uint64_t lba, const void* buffer, uint32_t count)
|
||||
{
|
||||
while (count > 0)
|
||||
{
|
||||
uint8_t sectors = (count > 256) ? 256 : count;
|
||||
int32_t result = ide_write48(duckfs_drive, lba, sectors, buffer);
|
||||
if (result < 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
lba += sectors;
|
||||
count -= sectors;
|
||||
buffer = (const void*)((uintptr_t)buffer + 512 * sectors);
|
||||
}
|
||||
return 0;
|
||||
}
|
Reference in New Issue
Block a user