wolfssh/ide/Linux-FATFS/fatfs_example.c

116 lines
3.4 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "ff.h"
#include "diskio.h"
#define STORAGE_FILE_PATH "fatfs_image.img"
static FILE *storage_file = NULL;
// Initialize the storage file
DSTATUS disk_initialize(BYTE pdrv) {
if (pdrv != 0) return STA_NOINIT; // Only support one drive (0)
// Open the storage file in read/write binary mode
storage_file = fopen(STORAGE_FILE_PATH, "r+b");
if (!storage_file) {
perror("Failed to open storage file");
return STA_NODISK | STA_NOINIT;
}
return 0; // Initialization successful
}
// Get the status of the storage file
DSTATUS disk_status(BYTE pdrv) {
if (pdrv != 0) return STA_NOINIT; // Only support one drive (0)
if (!storage_file) return STA_NODISK;
return 0;
}
// Read sectors from the storage file
DRESULT disk_read(BYTE pdrv, BYTE* buff, LBA_t sector, UINT count) {
if (pdrv != 0) return RES_PARERR; // Only support one drive (0)
if (!storage_file) return RES_NOTRDY;
off_t offset = sector * FF_MIN_SS; // Calculate the byte offset
if (fseek(storage_file, offset, SEEK_SET) != 0) {
perror("Failed to seek in storage file");
return RES_ERROR;
}
size_t bytes_read = fread(buff, FF_MIN_SS, count, storage_file);
if (bytes_read != count) {
perror("Failed to read from storage file");
return RES_ERROR;
}
return RES_OK;
}
// Write sectors to the storage file
DRESULT disk_write(BYTE pdrv, const BYTE* buff, LBA_t sector, UINT count) {
if (pdrv != 0) return RES_PARERR; // Only support one drive (0)
if (!storage_file) return RES_NOTRDY;
off_t offset = sector * FF_MIN_SS; // Calculate the byte offset
if (fseek(storage_file, offset, SEEK_SET) != 0) {
perror("Failed to seek in storage file");
return RES_ERROR;
}
size_t bytes_written = fwrite(buff, FF_MIN_SS, count, storage_file);
if (bytes_written != count) {
perror("Failed to write to storage file");
return RES_ERROR;
}
fflush(storage_file); // Ensure data is written to disk
return RES_OK;
}
// Control the device
DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void* buff) {
if (pdrv != 0) return RES_PARERR; // Only support one drive (0)
switch (cmd) {
case CTRL_SYNC:
// Ensure all data is written to disk
fflush(storage_file);
break;
case GET_SECTOR_SIZE:
*(WORD*)buff = FF_MIN_SS;
break;
case GET_BLOCK_SIZE:
*(DWORD*)buff = 1; // One sector per block (minimum)
break;
default:
return RES_PARERR;
}
return RES_OK;
}
// Function to deinitialize the storage file
DSTATUS disk_deinitialize(BYTE pdrv) {
if (pdrv != 0) return STA_NOINIT; // Only support one drive (0)
if (storage_file) {
fclose(storage_file);
storage_file = NULL;
}
return 0; // Deinitialization successful
}
// FatFs disk I/O driver interface
DSTATUS disk_status_(BYTE pdrv) { return disk_status(pdrv); }
DRESULT disk_read_(BYTE pdrv, BYTE* buff, LBA_t sector, UINT count) { return disk_read(pdrv, buff, sector, count); }
DRESULT disk_write_(BYTE pdrv, const BYTE* buff, LBA_t sector, UINT count) { return disk_write(pdrv, buff, sector, count); }
DRESULT disk_ioctl_(BYTE pdrv, BYTE cmd, void* buff) { return disk_ioctl(pdrv, cmd, buff); }