Espresso 0.0.2a
This commit is contained in:
117
drivers/fs/ssfs.c
Normal file
117
drivers/fs/ssfs.c
Normal file
@ -0,0 +1,117 @@
|
||||
#include <types.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <drivers/ide.h>
|
||||
|
||||
#include <fs/ssfs.h>
|
||||
|
||||
|
||||
|
||||
#define SSFS_START_LBA 16
|
||||
#define SSFS_FILE_HEADER_SIZE_BYTES 32
|
||||
|
||||
|
||||
int ssfs_read_file(const char* name, void* buffer, int size)
|
||||
{
|
||||
if (strlen(name) > 15)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
uint8_t header_buf[512];
|
||||
int r = read_sector(16, header_buf);
|
||||
|
||||
if (r != 0)
|
||||
{
|
||||
return -2;
|
||||
}
|
||||
|
||||
ssfs_file_header_t f;
|
||||
memcpy(&f, header_buf, sizeof(f));
|
||||
|
||||
if (strncmp(f.filename, name, 15) != 0)
|
||||
{
|
||||
return -3;
|
||||
}
|
||||
|
||||
/* Clamp read size to actual file size */
|
||||
if (size > (int)f.num_bytes)
|
||||
size = (int)f.num_bytes;
|
||||
|
||||
int total_read = 0;
|
||||
int sector_count = div_round_up(size, 512);
|
||||
uint8_t sector_data[512];
|
||||
|
||||
for (int k = 0; k < sector_count; k++)
|
||||
{
|
||||
r = read_sector(f.start_sector + k, sector_data);
|
||||
|
||||
if (r != 0)
|
||||
{
|
||||
return -4; /* I/O error */
|
||||
}
|
||||
|
||||
int to_copy = size - total_read;
|
||||
|
||||
if (to_copy > 512)
|
||||
{
|
||||
to_copy = 512;
|
||||
}
|
||||
|
||||
memcpy((uint8_t*)buffer + total_read, sector_data, to_copy);
|
||||
total_read += to_copy;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* size is number of bytes */
|
||||
int ssfs_write_file(const char* name, void* data, int size)
|
||||
{
|
||||
ssfs_file_header_t* f = (ssfs_file_header_t*) malloc(sizeof(ssfs_file_header_t));
|
||||
memset(f, 0, sizeof(ssfs_file_header_t));
|
||||
|
||||
if (strlen(name) > 15)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
strcpy(f->filename, name);
|
||||
f->num_sectors = 0;
|
||||
|
||||
int sector_count = div_round_up(size, 512);
|
||||
|
||||
uint8_t* buffer = (uint8_t*) malloc(sector_count * 512);
|
||||
|
||||
memset(buffer, 0, sector_count * 512);
|
||||
memcpy(buffer, data, (size_t) size);
|
||||
|
||||
int r = 0;
|
||||
|
||||
f->start_sector = 32;
|
||||
|
||||
for (int k = 0; k < sector_count; k++)
|
||||
{
|
||||
r = write_sector(f->start_sector + k, buffer + (k * 512));
|
||||
|
||||
if (r != 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
f->num_sectors = sector_count;
|
||||
f->num_bytes = (uint32_t) size;
|
||||
|
||||
uint8_t header_buf[512];
|
||||
memset(header_buf, 0, 512);
|
||||
memcpy(header_buf, f, sizeof(*f));
|
||||
write_sector(16, header_buf);
|
||||
|
||||
free(buffer);
|
||||
free(f);
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user