* Fix the breakage I commited. Hopefully.

svn path=/trunk/; revision=69132
This commit is contained in:
David Quintana 2015-09-08 22:20:37 +00:00
parent 9a82c8549f
commit 51731534a2
3 changed files with 66 additions and 47 deletions

View file

@ -9,14 +9,55 @@
#include "diskio.h" #include "diskio.h"
#include <stdio.h> #include <stdio.h>
extern char* g_imageFileName;
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
/* Correspondence between physical drive number and image file handles. */ /* Correspondence between physical drive number and image file handles. */
UINT sectorCount[1] = { 0 };
FILE* driveHandle[1] = { NULL }; FILE* driveHandle[1] = { NULL };
const int driveHandleCount = sizeof(driveHandle) / sizeof(FILE*); const int driveHandleCount = sizeof(driveHandle) / sizeof(FILE*);
/*-----------------------------------------------------------------------*/
/* Open an image file a Drive */
/*-----------------------------------------------------------------------*/
DSTATUS disk_openimage(BYTE pdrv, const char* imageFileName)
{
if (pdrv < driveHandleCount)
{
if (driveHandle[0] != NULL)
return 0;
driveHandle[0] = fopen(imageFileName, "r+b");
if (!driveHandle[0])
{
driveHandle[0] = fopen(imageFileName, "w+");
}
if (driveHandle[0] != NULL)
return 0;
}
return STA_NOINIT;
}
/*-----------------------------------------------------------------------*/
/* Cleanup a Drive */
/*-----------------------------------------------------------------------*/
VOID disk_cleanup(
BYTE pdrv /* Physical drive nmuber (0..) */
)
{
if (pdrv < driveHandleCount)
{
if (driveHandle[pdrv] != NULL)
{
fclose(driveHandle[pdrv]);
driveHandle[pdrv] = NULL;
}
}
}
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
/* Inidialize a Drive */ /* Inidialize a Drive */
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
@ -27,16 +68,6 @@ DSTATUS disk_initialize(
{ {
if (pdrv == 0) /* only one drive (image file) supported atm. */ if (pdrv == 0) /* only one drive (image file) supported atm. */
{ {
if (driveHandle[0] != NULL)
return 0;
driveHandle[0] = fopen(g_imageFileName, "r+b");
if(!driveHandle[0])
{
driveHandle[0] = fopen(g_imageFileName, "w+");
}
if (driveHandle[0] != NULL)
return 0; return 0;
} }
return STA_NOINIT; return STA_NOINIT;
@ -60,26 +91,6 @@ DSTATUS disk_status(
return STA_NOINIT; return STA_NOINIT;
} }
/*-----------------------------------------------------------------------*/
/* Cleanup a Drive */
/*-----------------------------------------------------------------------*/
VOID disk_cleanup(
BYTE pdrv /* Physical drive nmuber (0..) */
)
{
if (pdrv < driveHandleCount)
{
if (driveHandle[pdrv] != NULL)
{
fclose(driveHandle[pdrv]);
driveHandle[pdrv] = NULL;
}
}
}
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
/* Read Sector(s) */ /* Read Sector(s) */
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
@ -177,12 +188,15 @@ DRESULT disk_ioctl(
return RES_OK; return RES_OK;
case GET_SECTOR_COUNT: case GET_SECTOR_COUNT:
{ {
int temp = 0; if (sectorCount[pdrv] <= 0)
if(fseek(driveHandle[pdrv], 0, SEEK_END)) {
if (fseek(driveHandle[pdrv], 0, SEEK_END))
printf("fseek failed!\n"); printf("fseek failed!\n");
else else
temp = ftell(driveHandle[pdrv]); sectorCount[pdrv] = ftell(driveHandle[pdrv]) / 512;
*(DWORD*)buff = temp/512; }
*(DWORD*)buff = sectorCount[pdrv];
return RES_OK; return RES_OK;
} }
case SET_SECTOR_COUNT: case SET_SECTOR_COUNT:
@ -190,6 +204,8 @@ DRESULT disk_ioctl(
int count = *(DWORD*)buff; int count = *(DWORD*)buff;
long size; long size;
sectorCount[pdrv] = count;
fseek(driveHandle[pdrv], 0, SEEK_END); fseek(driveHandle[pdrv], 0, SEEK_END);
size = ftell(driveHandle[pdrv]) / 512; size = ftell(driveHandle[pdrv]) / 512;

View file

@ -31,10 +31,11 @@ typedef enum {
/*---------------------------------------*/ /*---------------------------------------*/
/* Prototypes for disk control functions */ /* Prototypes for disk control functions */
DSTATUS disk_openimage(BYTE pdrv, const char* imageFileName);
VOID disk_cleanup(BYTE pdrv);
DSTATUS disk_initialize (BYTE pdrv); DSTATUS disk_initialize (BYTE pdrv);
DSTATUS disk_status (BYTE pdrv); DSTATUS disk_status (BYTE pdrv);
VOID disk_cleanup (BYTE pdrv);
DRESULT disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count); DRESULT disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count);
DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count); DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count);
DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff); DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff);
@ -57,7 +58,7 @@ DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff);
#define CTRL_ERASE_SECTOR 4 /* Force erased a block of sectors (for only _USE_ERASE) */ #define CTRL_ERASE_SECTOR 4 /* Force erased a block of sectors (for only _USE_ERASE) */
/* Custom command for image file resizing */ /* Custom command for image file resizing */
#define SET_SECTOR_COUNT 253 #define SET_SECTOR_COUNT 126
#ifdef __cplusplus #ifdef __cplusplus
} }

View file

@ -11,8 +11,6 @@
#include "fatfs/ff.h" #include "fatfs/ff.h"
#include "fatfs/diskio.h" #include "fatfs/diskio.h"
char* g_imageFileName;
FATFS g_Filesystem; FATFS g_Filesystem;
static int isMounted = 0; static int isMounted = 0;
@ -89,7 +87,7 @@ int need_mount()
#define NEED_MOUNT() \ #define NEED_MOUNT() \
do { ret = need_mount(); if(ret) \ do { ret = need_mount(); if(ret) \
{\ {\
printf("Error: could not mount image file '%s' (%d). \n", g_imageFileName, ret); \ printf("Error: could not mount disk (%d). \n", ret); \
PRINT_HELP_AND_QUIT(); \ PRINT_HELP_AND_QUIT(); \
} } while(0) } } while(0)
@ -136,7 +134,11 @@ int main(int oargc, char* oargv[])
PRINT_HELP_AND_QUIT(); PRINT_HELP_AND_QUIT();
} }
g_imageFileName = argv[0]; if (disk_openimage(0, argv[0]))
{
printf("Error: could not open image file '%s'. \n", argv[0]);
PRINT_HELP_AND_QUIT();
}
argc--; argc--;
argv++; argv++;
@ -168,8 +170,6 @@ int main(int oargc, char* oargv[])
NEED_PARAMS(1, 1); NEED_PARAMS(1, 1);
NEED_MOUNT();
// Arg 1: number of sectors // Arg 1: number of sectors
sectors = atoi(argv[0]); sectors = atoi(argv[0]);
@ -182,6 +182,8 @@ int main(int oargc, char* oargv[])
disk_ioctl(0, SET_SECTOR_COUNT, &sectors); disk_ioctl(0, SET_SECTOR_COUNT, &sectors);
NEED_MOUNT();
ret = f_mkfs("0:", 1, sectors < 4096 ? 1 : 8); ret = f_mkfs("0:", 1, sectors < 4096 ? 1 : 8);
if (ret) if (ret)
{ {