mirror of
https://github.com/wiidev/usbloadergx.git
synced 2024-11-16 00:15:08 +01:00
*Revert of libfat it causes crashes for most people and doesn't really work. We will deal with it later. For now the old one is good.
*Removed a few compile flags which were duplicated. Changed to optimization Os.
This commit is contained in:
parent
787dd53a46
commit
0f945247dc
@ -2,8 +2,8 @@
|
|||||||
<app version="1">
|
<app version="1">
|
||||||
<name> USB Loader GX</name>
|
<name> USB Loader GX</name>
|
||||||
<coder>USB Loader GX Team</coder>
|
<coder>USB Loader GX Team</coder>
|
||||||
<version>1.0 r947</version>
|
<version>1.0 r948</version>
|
||||||
<release_date>201009171621</release_date>
|
<release_date>201009172243</release_date>
|
||||||
<short_description>Loads games from USB-devices</short_description>
|
<short_description>Loads games from USB-devices</short_description>
|
||||||
<long_description>USB Loader GX is a libwiigui based USB iso loader with a wii-like GUI. You can install games to your HDDs and boot them with shorter loading times.
|
<long_description>USB Loader GX is a libwiigui based USB iso loader with a wii-like GUI. You can install games to your HDDs and boot them with shorter loading times.
|
||||||
The interactive GUI is completely controllable with WiiMote, Classic Controller or GC Controller.
|
The interactive GUI is completely controllable with WiiMote, Classic Controller or GC Controller.
|
||||||
|
3
Makefile
3
Makefile
@ -55,8 +55,7 @@ INCLUDES := source
|
|||||||
# options for code generation
|
# options for code generation
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
|
|
||||||
CFLAGS = -ffast-math -g -O3 -pipe -mrvl -mcpu=750 -meabi -mhard-float -Wall $(MACHDEP) $(INCLUDE) -DHAVE_CONFIG_H -DGEKKO \
|
CFLAGS = -g -Os -Wall $(MACHDEP) $(INCLUDE) -DHAVE_CONFIG_H
|
||||||
-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
|
|
||||||
CXXFLAGS = -Xassembler -aln=$@.lst $(CFLAGS)
|
CXXFLAGS = -Xassembler -aln=$@.lst $(CFLAGS)
|
||||||
LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map,--section-start,.init=0x80B00000,-wrap,malloc,-wrap,free,-wrap,memalign,-wrap,calloc,-wrap,realloc,-wrap,malloc_usable_size
|
LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map,--section-start,.init=0x80B00000,-wrap,malloc,-wrap,free,-wrap,memalign,-wrap,calloc,-wrap,realloc,-wrap,malloc_usable_size
|
||||||
-include $(PROJECTDIR)/Make.config
|
-include $(PROJECTDIR)/Make.config
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
Functions for dealing with conversion of data between types
|
Functions for dealing with conversion of data between types
|
||||||
|
|
||||||
Copyright (c) 2006 Michael "Chishm" Chisholm
|
Copyright (c) 2006 Michael "Chishm" Chisholm
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without modification,
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
are permitted provided that the following conditions are met:
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
@ -26,8 +26,8 @@
|
|||||||
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _BIT_OPS_H
|
#ifndef __BIT_OPS_H
|
||||||
#define _BIT_OPS_H
|
#define __BIT_OPS_H
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
Common definitions and included files for the FATlib
|
Common definitions and included files for the FATlib
|
||||||
|
|
||||||
Copyright (c) 2006 Michael "Chishm" Chisholm
|
Copyright (c) 2006 Michael "Chishm" Chisholm
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without modification,
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
are permitted provided that the following conditions are met:
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
@ -26,54 +26,23 @@
|
|||||||
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _COMMON_H
|
#ifndef __COMMON_H
|
||||||
#define _COMMON_H
|
#define __COMMON_H
|
||||||
|
|
||||||
#define BYTES_PER_READ 512
|
#define BYTES_PER_READ 512
|
||||||
|
#include "fat.h"
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "libfat/fat.h"
|
|
||||||
|
|
||||||
// When compiling for NDS, make sure NDS is defined
|
|
||||||
#ifndef NDS
|
|
||||||
#if defined ARM9 || defined ARM7
|
|
||||||
#define NDS
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Platform specific includes
|
// Platform specific includes
|
||||||
#if defined(__gamecube__) || defined (__wii__)
|
#include <gctypes.h>
|
||||||
#include <gctypes.h>
|
#include <ogc/disc_io.h>
|
||||||
#include <ogc/disc_io.h>
|
#include <gccore.h>
|
||||||
#include <gccore.h>
|
|
||||||
#elif defined(NDS)
|
|
||||||
#include <nds/ndstypes.h>
|
|
||||||
#include <nds/system.h>
|
|
||||||
#include <nds/disc_io.h>
|
|
||||||
#elif defined(GBA)
|
|
||||||
#include <gba_types.h>
|
|
||||||
#include <disc_io.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Platform specific options
|
// Platform specific options
|
||||||
#if defined (__wii__)
|
#define DEFAULT_CACHE_PAGES 4
|
||||||
#define DEFAULT_CACHE_PAGES 4
|
#define DEFAULT_SECTORS_PAGE 64
|
||||||
#define DEFAULT_SECTORS_PAGE 64
|
#define USE_LWP_LOCK
|
||||||
#define USE_LWP_LOCK
|
#define USE_RTC_TIME
|
||||||
#define USE_RTC_TIME
|
|
||||||
#elif defined (__gamecube__)
|
|
||||||
#define DEFAULT_CACHE_PAGES 4
|
|
||||||
#define DEFAULT_SECTORS_PAGE 64
|
|
||||||
#define USE_LWP_LOCK
|
|
||||||
#define USE_RTC_TIME
|
|
||||||
#elif defined (NDS)
|
|
||||||
#define DEFAULT_CACHE_PAGES 4
|
|
||||||
#define DEFAULT_SECTORS_PAGE 8
|
|
||||||
#define USE_RTC_TIME
|
|
||||||
#elif defined (GBA)
|
|
||||||
#define DEFAULT_CACHE_PAGES 2
|
|
||||||
#define DEFAULT_SECTORS_PAGE 8
|
|
||||||
#define LIMIT_SECTORS 128
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // _COMMON_H
|
#endif // _COMMON_H
|
||||||
|
@ -329,8 +329,7 @@ bool _FAT_directory_getNextEntry (PARTITION* partition, DIR_ENTRY* entry) {
|
|||||||
}
|
}
|
||||||
lfn[lfnPos] = '\0'; // Set end of lfn to null character
|
lfn[lfnPos] = '\0'; // Set end of lfn to null character
|
||||||
lfnChkSum = entryData[LFN_offset_checkSum];
|
lfnChkSum = entryData[LFN_offset_checkSum];
|
||||||
}
|
} if (lfnChkSum != entryData[LFN_offset_checkSum]) {
|
||||||
if (lfnChkSum != entryData[LFN_offset_checkSum]) {
|
|
||||||
lfnExists = false;
|
lfnExists = false;
|
||||||
}
|
}
|
||||||
if (lfnExists) {
|
if (lfnExists) {
|
||||||
@ -418,49 +417,6 @@ bool _FAT_directory_getRootEntry (PARTITION* partition, DIR_ENTRY* entry) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool _FAT_directory_getVolumeLabel (PARTITION* partition, char *label) {
|
|
||||||
DIR_ENTRY entry;
|
|
||||||
DIR_ENTRY_POSITION entryEnd;
|
|
||||||
uint8_t entryData[DIR_ENTRY_DATA_SIZE];
|
|
||||||
int i;
|
|
||||||
bool end;
|
|
||||||
|
|
||||||
_FAT_directory_getRootEntry(partition, &entry);
|
|
||||||
|
|
||||||
entryEnd = entry.dataEnd;
|
|
||||||
|
|
||||||
// Make sure we are using the correct root directory, in case of FAT32
|
|
||||||
if (entryEnd.cluster == FAT16_ROOT_DIR_CLUSTER) {
|
|
||||||
entryEnd.cluster = partition->rootDirCluster;
|
|
||||||
}
|
|
||||||
|
|
||||||
label[0]='\0';
|
|
||||||
label[11]='\0';
|
|
||||||
end = false;
|
|
||||||
//this entry should be among the first 3 entries in the root directory table, if not, then system can have trouble displaying the right volume label
|
|
||||||
while(!end) {
|
|
||||||
if (_FAT_directory_incrementDirEntryPosition (partition, &entryEnd, false) == false) {
|
|
||||||
end = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!_FAT_cache_readPartialSector (partition->cache, entryData,
|
|
||||||
_FAT_fat_clusterToSector(partition, entryEnd.cluster) + entryEnd.sector,
|
|
||||||
entryEnd.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE))
|
|
||||||
{ //error reading
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (entryData[DIR_ENTRY_attributes] == ATTRIB_VOL && entryData[0] != DIR_ENTRY_FREE) {
|
|
||||||
for (i = 0; i < 11; i++) {
|
|
||||||
label[i] = entryData[DIR_ENTRY_name + i];
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
} else if (entryData[0] == DIR_ENTRY_LAST) {
|
|
||||||
end = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool _FAT_directory_entryFromPosition (PARTITION* partition, DIR_ENTRY* entry) {
|
bool _FAT_directory_entryFromPosition (PARTITION* partition, DIR_ENTRY* entry) {
|
||||||
DIR_ENTRY_POSITION entryStart = entry->dataStart;
|
DIR_ENTRY_POSITION entryStart = entry->dataStart;
|
||||||
DIR_ENTRY_POSITION entryEnd = entry->dataEnd;
|
DIR_ENTRY_POSITION entryEnd = entry->dataEnd;
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
a FAT partition
|
a FAT partition
|
||||||
|
|
||||||
Copyright (c) 2006 Michael "Chishm" Chisholm
|
Copyright (c) 2006 Michael "Chishm" Chisholm
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without modification,
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
are permitted provided that the following conditions are met:
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
@ -27,8 +27,8 @@
|
|||||||
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _DIRECTORY_H
|
#ifndef __DIRECTORY_H
|
||||||
#define _DIRECTORY_H
|
#define __DIRECTORY_H
|
||||||
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
||||||
@ -132,7 +132,7 @@ Returns true on success, false on failure
|
|||||||
*/
|
*/
|
||||||
bool _FAT_directory_entryFromPath (PARTITION* partition, DIR_ENTRY* entry, const char* path, const char* pathEnd);
|
bool _FAT_directory_entryFromPath (PARTITION* partition, DIR_ENTRY* entry, const char* path, const char* pathEnd);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Changes the current directory to the one specified by path
|
Changes the current directory to the one specified by path
|
||||||
Returns true on success, false on failure
|
Returns true on success, false on failure
|
||||||
*/
|
*/
|
||||||
@ -156,10 +156,10 @@ bool _FAT_directory_addEntry (PARTITION* partition, DIR_ENTRY* entry, uint32_t d
|
|||||||
/*
|
/*
|
||||||
Get the start cluster of a file from it's entry data
|
Get the start cluster of a file from it's entry data
|
||||||
*/
|
*/
|
||||||
uint32_t _FAT_directory_entryGetCluster (PARTITION* partition, const uint8_t* entryData);
|
uint32_t _FAT_directory_entryGetCluster (PARTITION* partition, const uint8_t* entryData);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Fill in the file name and entry data of DIR_ENTRY* entry.
|
Fill in the file name and entry data of DIR_ENTRY* entry.
|
||||||
Assumes that the entry's dataStart and dataEnd are correct
|
Assumes that the entry's dataStart and dataEnd are correct
|
||||||
Returns true on success, false on failure
|
Returns true on success, false on failure
|
||||||
*/
|
*/
|
||||||
@ -170,9 +170,4 @@ Fill in a stat struct based on a file entry
|
|||||||
*/
|
*/
|
||||||
void _FAT_directory_entryStat (PARTITION* partition, DIR_ENTRY* entry, struct stat *st);
|
void _FAT_directory_entryStat (PARTITION* partition, DIR_ENTRY* entry, struct stat *st);
|
||||||
|
|
||||||
/*
|
|
||||||
Get volume label
|
|
||||||
*/
|
|
||||||
bool _FAT_directory_getVolumeLabel (PARTITION* partition, char *label);
|
|
||||||
|
|
||||||
#endif // _DIRECTORY_H
|
#endif // _DIRECTORY_H
|
||||||
|
@ -2,9 +2,9 @@
|
|||||||
disc.c
|
disc.c
|
||||||
Interface to the low level disc functions. Used by the higher level
|
Interface to the low level disc functions. Used by the higher level
|
||||||
file system code.
|
file system code.
|
||||||
|
|
||||||
Copyright (c) 2008 Michael "Chishm" Chisholm
|
Copyright (c) 2008 Michael "Chishm" Chisholm
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without modification,
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
are permitted provided that the following conditions are met:
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
@ -27,7 +27,7 @@
|
|||||||
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "disc.h"
|
#include "disc_fat.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The list of interfaces consists of a series of name/interface pairs.
|
The list of interfaces consists of a series of name/interface pairs.
|
||||||
@ -39,16 +39,15 @@ The list is terminated by a NULL/NULL entry.
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* ====================== Wii ====================== */
|
/* ====================== Wii ====================== */
|
||||||
#if defined (__wii__)
|
|
||||||
#include <sdcard/wiisd_io.h>
|
#include <sdcard/wiisd_io.h>
|
||||||
#include <ogc/usbstorage.h>
|
#include "usbloader/usbstorage2.h"
|
||||||
#include <sdcard/gcsd.h>
|
#include <sdcard/gcsd.h>
|
||||||
|
|
||||||
static const DISC_INTERFACE* get_io_wiisd (void) {
|
static const DISC_INTERFACE* get_io_wiisd (void) {
|
||||||
return &__io_wiisd;
|
return &__io_wiisd;
|
||||||
}
|
}
|
||||||
static const DISC_INTERFACE* get_io_usbstorage (void) {
|
static const DISC_INTERFACE* get_io_usbstorage (void) {
|
||||||
return &__io_usbstorage;
|
return &__io_usbstorage2;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const DISC_INTERFACE* get_io_gcsda (void) {
|
static const DISC_INTERFACE* get_io_gcsda (void) {
|
||||||
@ -64,42 +63,5 @@ const INTERFACE_ID _FAT_disc_interfaces[] = {
|
|||||||
{"carda", get_io_gcsda},
|
{"carda", get_io_gcsda},
|
||||||
{"cardb", get_io_gcsdb},
|
{"cardb", get_io_gcsdb},
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ==================== Gamecube ==================== */
|
|
||||||
#elif defined (__gamecube__)
|
|
||||||
#include <sdcard/gcsd.h>
|
|
||||||
|
|
||||||
static const DISC_INTERFACE* get_io_gcsda (void) {
|
|
||||||
return &__io_gcsda;
|
|
||||||
}
|
|
||||||
static const DISC_INTERFACE* get_io_gcsdb (void) {
|
|
||||||
return &__io_gcsdb;
|
|
||||||
}
|
|
||||||
|
|
||||||
const INTERFACE_ID _FAT_disc_interfaces[] = {
|
|
||||||
{"carda", get_io_gcsda},
|
|
||||||
{"cardb", get_io_gcsdb},
|
|
||||||
{NULL, NULL}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* ====================== NDS ====================== */
|
|
||||||
#elif defined (NDS)
|
|
||||||
#include <nds/arm9/dldi.h>
|
|
||||||
|
|
||||||
const INTERFACE_ID _FAT_disc_interfaces[] = {
|
|
||||||
{"fat", dldiGetInternal},
|
|
||||||
{NULL, NULL}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* ====================== GBA ====================== */
|
|
||||||
#elif defined (GBA)
|
|
||||||
#include <disc.h>
|
|
||||||
|
|
||||||
const INTERFACE_ID _FAT_disc_interfaces[] = {
|
|
||||||
{"fat", discGetInterface},
|
|
||||||
{NULL, NULL}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,10 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
fat.h
|
fat.h
|
||||||
Simple functionality for startup, mounting and unmounting of FAT-based devices.
|
Simple functionality for startup, mounting and unmounting of FAT-based devices.
|
||||||
|
|
||||||
Copyright (c) 2006 - 2009
|
Copyright (c) 2006 Michael "Chishm" Chisholm
|
||||||
Michael "Chishm" Chisholm
|
|
||||||
Dave "WinterMute" Murphy
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without modification,
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
are permitted provided that the following conditions are met:
|
are permitted provided that the following conditions are met:
|
||||||
@ -36,24 +34,8 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// When compiling for NDS, make sure NDS is defined
|
|
||||||
#ifndef NDS
|
|
||||||
#if defined ARM9 || defined ARM7
|
|
||||||
#define NDS
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <ogc/disc_io.h>
|
||||||
#if defined(__gamecube__) || defined (__wii__)
|
|
||||||
# include <ogc/disc_io.h>
|
|
||||||
#else
|
|
||||||
# ifdef NDS
|
|
||||||
# include "nds/disc_io.h"
|
|
||||||
# else
|
|
||||||
# include "disc_io.h"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Initialise any inserted block-devices.
|
Initialise any inserted block-devices.
|
||||||
@ -71,7 +53,7 @@ extern bool fatInitDefault (void);
|
|||||||
/*
|
/*
|
||||||
Mount the device pointed to by interface, and set up a devoptab entry for it as "name:".
|
Mount the device pointed to by interface, and set up a devoptab entry for it as "name:".
|
||||||
You can then access the filesystem using "name:/".
|
You can then access the filesystem using "name:/".
|
||||||
This will mount the active partition or the first valid partition on the disc,
|
This will mount the active partition or the first valid partition on the disc,
|
||||||
and will use a cache size optimized for the host system.
|
and will use a cache size optimized for the host system.
|
||||||
*/
|
*/
|
||||||
extern bool fatMountSimple (const char* name, const DISC_INTERFACE* interface);
|
extern bool fatMountSimple (const char* name, const DISC_INTERFACE* interface);
|
||||||
@ -85,18 +67,12 @@ cacheSize specifies the number of pages to allocate for the cache.
|
|||||||
This will not startup the disc, so you need to call interface->startup(); first.
|
This will not startup the disc, so you need to call interface->startup(); first.
|
||||||
*/
|
*/
|
||||||
extern bool fatMount (const char* name, const DISC_INTERFACE* interface, sec_t startSector, uint32_t cacheSize, uint32_t SectorsPerPage);
|
extern bool fatMount (const char* name, const DISC_INTERFACE* interface, sec_t startSector, uint32_t cacheSize, uint32_t SectorsPerPage);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Unmount the partition specified by name.
|
Unmount the partition specified by name.
|
||||||
If there are open files, it will attempt to synchronise them to disc.
|
If there are open files, it will attempt to synchronise them to disc.
|
||||||
*/
|
*/
|
||||||
extern void fatUnmount (const char* name);
|
extern void fatUnmount (const char* name);
|
||||||
|
|
||||||
/*
|
|
||||||
Get Volume Label
|
|
||||||
*/
|
|
||||||
extern void fatGetVolumeLabel (const char* name, char *label);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -37,8 +37,8 @@
|
|||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "cache.h"
|
#include "fat_cache.h"
|
||||||
#include "disc.h"
|
#include "disc_fat.h"
|
||||||
|
|
||||||
#include "mem_allocate.h"
|
#include "mem_allocate.h"
|
||||||
#include "bit_ops.h"
|
#include "bit_ops.h"
|
||||||
@ -127,7 +127,7 @@ static CACHE_ENTRY* _FAT_cache_getPage(CACHE *cache,sec_t sector)
|
|||||||
cacheEntries[i].last_access = accessTime();
|
cacheEntries[i].last_access = accessTime();
|
||||||
return &(cacheEntries[i]);
|
return &(cacheEntries[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(foundFree==false && (cacheEntries[i].sector==CACHE_FREE || cacheEntries[i].last_access<oldAccess)) {
|
if(foundFree==false && (cacheEntries[i].sector==CACHE_FREE || cacheEntries[i].last_access<oldAccess)) {
|
||||||
if(cacheEntries[i].sector==CACHE_FREE) foundFree = true;
|
if(cacheEntries[i].sector==CACHE_FREE) foundFree = true;
|
||||||
oldUsed = i;
|
oldUsed = i;
|
||||||
@ -181,7 +181,7 @@ bool _FAT_cache_readSectors(CACHE *cache,sec_t sector,sec_t numSectors,void *buf
|
|||||||
/*
|
/*
|
||||||
Reads some data from a cache page, determined by the sector number
|
Reads some data from a cache page, determined by the sector number
|
||||||
*/
|
*/
|
||||||
bool _FAT_cache_readPartialSector (CACHE* cache, void* buffer, sec_t sector, unsigned int offset, size_t size)
|
bool _FAT_cache_readPartialSector (CACHE* cache, void* buffer, sec_t sector, unsigned int offset, size_t size)
|
||||||
{
|
{
|
||||||
sec_t sec;
|
sec_t sec;
|
||||||
CACHE_ENTRY *entry;
|
CACHE_ENTRY *entry;
|
||||||
@ -213,7 +213,7 @@ bool _FAT_cache_readLittleEndianValue (CACHE* cache, uint32_t *value, sec_t sect
|
|||||||
/*
|
/*
|
||||||
Writes some data to a cache page, making sure it is loaded into memory first.
|
Writes some data to a cache page, making sure it is loaded into memory first.
|
||||||
*/
|
*/
|
||||||
bool _FAT_cache_writePartialSector (CACHE* cache, const void* buffer, sec_t sector, unsigned int offset, size_t size)
|
bool _FAT_cache_writePartialSector (CACHE* cache, const void* buffer, sec_t sector, unsigned int offset, size_t size)
|
||||||
{
|
{
|
||||||
sec_t sec;
|
sec_t sec;
|
||||||
CACHE_ENTRY *entry;
|
CACHE_ENTRY *entry;
|
||||||
@ -246,7 +246,7 @@ bool _FAT_cache_writeLittleEndianValue (CACHE* cache, const uint32_t value, sec_
|
|||||||
/*
|
/*
|
||||||
Writes some data to a cache page, zeroing out the page first
|
Writes some data to a cache page, zeroing out the page first
|
||||||
*/
|
*/
|
||||||
bool _FAT_cache_eraseWritePartialSector (CACHE* cache, const void* buffer, sec_t sector, unsigned int offset, size_t size)
|
bool _FAT_cache_eraseWritePartialSector (CACHE* cache, const void* buffer, sec_t sector, unsigned int offset, size_t size)
|
||||||
{
|
{
|
||||||
sec_t sec;
|
sec_t sec;
|
||||||
CACHE_ENTRY *entry;
|
CACHE_ENTRY *entry;
|
||||||
@ -292,7 +292,7 @@ static CACHE_ENTRY* _FAT_cache_findPage(CACHE *cache, sec_t sector, sec_t count)
|
|||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool _FAT_cache_writeSectors (CACHE* cache, sec_t sector, sec_t numSectors, const void* buffer)
|
bool _FAT_cache_writeSectors (CACHE* cache, sec_t sector, sec_t numSectors, const void* buffer)
|
||||||
{
|
{
|
||||||
sec_t sec;
|
sec_t sec;
|
||||||
sec_t secs_to_write;
|
sec_t secs_to_write;
|
||||||
@ -306,15 +306,15 @@ bool _FAT_cache_writeSectors (CACHE* cache, sec_t sector, sec_t numSectors, cons
|
|||||||
if(entry!=NULL) {
|
if(entry!=NULL) {
|
||||||
|
|
||||||
if ( entry->sector > sector) {
|
if ( entry->sector > sector) {
|
||||||
|
|
||||||
secs_to_write = entry->sector - sector;
|
secs_to_write = entry->sector - sector;
|
||||||
|
|
||||||
_FAT_disc_writeSectors(cache->disc,sector,secs_to_write,src);
|
_FAT_disc_writeSectors(cache->disc,sector,secs_to_write,src);
|
||||||
src += (secs_to_write*BYTES_PER_READ);
|
src += (secs_to_write*BYTES_PER_READ);
|
||||||
sector += secs_to_write;
|
sector += secs_to_write;
|
||||||
numSectors -= secs_to_write;
|
numSectors -= secs_to_write;
|
||||||
}
|
}
|
||||||
|
|
||||||
sec = sector - entry->sector;
|
sec = sector - entry->sector;
|
||||||
secs_to_write = entry->count - sec;
|
secs_to_write = entry->count - sec;
|
||||||
|
|
||||||
@ -327,7 +327,7 @@ bool _FAT_cache_writeSectors (CACHE* cache, sec_t sector, sec_t numSectors, cons
|
|||||||
numSectors -= secs_to_write;
|
numSectors -= secs_to_write;
|
||||||
|
|
||||||
entry->dirty = true;
|
entry->dirty = true;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
_FAT_disc_writeSectors(cache->disc,sector,numSectors,src);
|
_FAT_disc_writeSectors(cache->disc,sector,numSectors,src);
|
||||||
numSectors=0;
|
numSectors=0;
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
|
|
||||||
#include "fatdir.h"
|
#include "fatdir.h"
|
||||||
|
|
||||||
#include "cache.h"
|
#include "fat_cache.h"
|
||||||
#include "file_allocation_table.h"
|
#include "file_allocation_table.h"
|
||||||
#include "partition.h"
|
#include "partition.h"
|
||||||
#include "directory.h"
|
#include "directory.h"
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
fatdir.h
|
fatdir.h
|
||||||
|
|
||||||
Functions used by the newlib disc stubs to interface with
|
Functions used by the newlib disc stubs to interface with
|
||||||
this library
|
this library
|
||||||
|
|
||||||
Copyright (c) 2006 Michael "Chishm" Chisholm
|
Copyright (c) 2006 Michael "Chishm" Chisholm
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without modification,
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
are permitted provided that the following conditions are met:
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
@ -29,8 +29,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef _FATDIR_H
|
#ifndef __FATDIR_H
|
||||||
#define _FATDIR_H
|
#define __FATDIR_H
|
||||||
|
|
||||||
#include <sys/reent.h>
|
#include <sys/reent.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
@ -39,7 +39,7 @@
|
|||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "cache.h"
|
#include "fat_cache.h"
|
||||||
#include "file_allocation_table.h"
|
#include "file_allocation_table.h"
|
||||||
#include "bit_ops.h"
|
#include "bit_ops.h"
|
||||||
#include "filetime.h"
|
#include "filetime.h"
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
a FAT partition
|
a FAT partition
|
||||||
|
|
||||||
Copyright (c) 2006 Michael "Chishm" Chisholm
|
Copyright (c) 2006 Michael "Chishm" Chisholm
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without modification,
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
are permitted provided that the following conditions are met:
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
@ -27,8 +27,8 @@
|
|||||||
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _FAT_H
|
#ifndef __FAT_H
|
||||||
#define _FAT_H
|
#define __FAT_H
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "partition.h"
|
#include "partition.h"
|
||||||
@ -36,7 +36,7 @@
|
|||||||
#define CLUSTER_EOF_16 0xFFFF
|
#define CLUSTER_EOF_16 0xFFFF
|
||||||
#define CLUSTER_EOF 0x0FFFFFFF
|
#define CLUSTER_EOF 0x0FFFFFFF
|
||||||
#define CLUSTER_FREE 0x00000000
|
#define CLUSTER_FREE 0x00000000
|
||||||
#define CLUSTER_ROOT 0x00000000
|
#define CLUSTER_ROOT 0x00000000
|
||||||
#define CLUSTER_FIRST 0x00000002
|
#define CLUSTER_FIRST 0x00000002
|
||||||
#define CLUSTER_ERROR 0xFFFFFFFF
|
#define CLUSTER_ERROR 0xFFFFFFFF
|
||||||
|
|
||||||
@ -58,8 +58,8 @@ uint32_t _FAT_fat_lastCluster (PARTITION* partition, uint32_t cluster);
|
|||||||
unsigned int _FAT_fat_freeClusterCount (PARTITION* partition);
|
unsigned int _FAT_fat_freeClusterCount (PARTITION* partition);
|
||||||
|
|
||||||
static inline sec_t _FAT_fat_clusterToSector (PARTITION* partition, uint32_t cluster) {
|
static inline sec_t _FAT_fat_clusterToSector (PARTITION* partition, uint32_t cluster) {
|
||||||
return (cluster >= CLUSTER_FIRST) ?
|
return (cluster >= CLUSTER_FIRST) ?
|
||||||
((cluster - CLUSTER_FIRST) * (sec_t)partition->sectorsPerCluster) + partition->dataStart :
|
((cluster - CLUSTER_FIRST) * (sec_t)partition->sectorsPerCluster) + partition->dataStart :
|
||||||
partition->rootDirStart;
|
partition->rootDirStart;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
Conversion of file time and date values to various other types
|
Conversion of file time and date values to various other types
|
||||||
|
|
||||||
Copyright (c) 2006 Michael "Chishm" Chisholm
|
Copyright (c) 2006 Michael "Chishm" Chisholm
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without modification,
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
are permitted provided that the following conditions are met:
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
@ -26,8 +26,8 @@
|
|||||||
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _FILETIME_H
|
#ifndef __FILETIME_H
|
||||||
#define _FILETIME_H
|
#define __FILETIME_H
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
#include "fatdir.h"
|
#include "fatdir.h"
|
||||||
#include "lock.h"
|
#include "lock.h"
|
||||||
#include "mem_allocate.h"
|
#include "mem_allocate.h"
|
||||||
#include "disc.h"
|
#include "disc_fat.h"
|
||||||
|
|
||||||
static const devoptab_t dotab_fat = {
|
static const devoptab_t dotab_fat = {
|
||||||
"fat",
|
"fat",
|
||||||
@ -69,17 +69,17 @@ bool fatMount (const char* name, const DISC_INTERFACE* interface, sec_t startSec
|
|||||||
devoptab_t* devops;
|
devoptab_t* devops;
|
||||||
char* nameCopy;
|
char* nameCopy;
|
||||||
|
|
||||||
if(!name || !interface)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if(!interface->startup())
|
if(!interface->startup())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if(!interface->isInserted())
|
if(!interface->isInserted()) {
|
||||||
|
interface->shutdown();
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
devops = _FAT_mem_allocate (sizeof(devoptab_t) + strlen(name) + 1);
|
devops = _FAT_mem_allocate (sizeof(devoptab_t) + strlen(name) + 1);
|
||||||
if (!devops) {
|
if (!devops) {
|
||||||
|
interface->shutdown();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// Use the space allocated at the end of the devoptab struct for storing the name
|
// Use the space allocated at the end of the devoptab struct for storing the name
|
||||||
@ -89,6 +89,7 @@ bool fatMount (const char* name, const DISC_INTERFACE* interface, sec_t startSec
|
|||||||
partition = _FAT_partition_constructor (interface, cacheSize, SectorsPerPage, startSector);
|
partition = _FAT_partition_constructor (interface, cacheSize, SectorsPerPage, startSector);
|
||||||
if (!partition) {
|
if (!partition) {
|
||||||
_FAT_mem_free (devops);
|
_FAT_mem_free (devops);
|
||||||
|
interface->shutdown();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,9 +111,7 @@ bool fatMountSimple (const char* name, const DISC_INTERFACE* interface) {
|
|||||||
void fatUnmount (const char* name) {
|
void fatUnmount (const char* name) {
|
||||||
devoptab_t *devops;
|
devoptab_t *devops;
|
||||||
PARTITION* partition;
|
PARTITION* partition;
|
||||||
|
const DISC_INTERFACE *disc;
|
||||||
if(!name)
|
|
||||||
return;
|
|
||||||
|
|
||||||
devops = (devoptab_t*)GetDeviceOpTab (name);
|
devops = (devoptab_t*)GetDeviceOpTab (name);
|
||||||
if (!devops) {
|
if (!devops) {
|
||||||
@ -129,8 +128,10 @@ void fatUnmount (const char* name) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
partition = (PARTITION*)devops->deviceData;
|
partition = (PARTITION*)devops->deviceData;
|
||||||
|
disc = partition->disc;
|
||||||
_FAT_partition_destructor (partition);
|
_FAT_partition_destructor (partition);
|
||||||
_FAT_mem_free (devops);
|
_FAT_mem_free (devops);
|
||||||
|
disc->shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool fatInit (uint32_t cacheSize, bool setAsDefaultDevice) {
|
bool fatInit (uint32_t cacheSize, bool setAsDefaultDevice) {
|
||||||
@ -193,49 +194,4 @@ bool fatInitDefault (void) {
|
|||||||
return fatInit (DEFAULT_CACHE_PAGES, true);
|
return fatInit (DEFAULT_CACHE_PAGES, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void fatGetVolumeLabel (const char* name, char *label) {
|
|
||||||
devoptab_t *devops;
|
|
||||||
PARTITION* partition;
|
|
||||||
char *buf;
|
|
||||||
int namelen,i;
|
|
||||||
|
|
||||||
if(!name || !label)
|
|
||||||
return;
|
|
||||||
|
|
||||||
namelen = strlen(name);
|
|
||||||
buf=(char*)_FAT_mem_allocate(sizeof(char)*namelen+2);
|
|
||||||
strcpy(buf,name);
|
|
||||||
|
|
||||||
if (name[namelen-1] == '/') {
|
|
||||||
buf[namelen-1]='\0';
|
|
||||||
namelen--;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name[namelen-1] != ':') {
|
|
||||||
buf[namelen]=':';
|
|
||||||
buf[namelen+1]='\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
devops = (devoptab_t*)GetDeviceOpTab(buf);
|
|
||||||
|
|
||||||
for(i=0;buf[i]!='\0' && buf[i]!=':';i++);
|
|
||||||
if (!devops || strncasecmp(buf,devops->name,i)) {
|
|
||||||
free(buf);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
free(buf);
|
|
||||||
|
|
||||||
// Perform a quick check to make sure we're dealing with a libfat controlled device
|
|
||||||
if (devops->open_r != dotab_fat.open_r) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
partition = (PARTITION*)devops->deviceData;
|
|
||||||
|
|
||||||
if(!_FAT_directory_getVolumeLabel(partition, label)) {
|
|
||||||
strncpy(label,partition->label,11);
|
|
||||||
label[11]='\0';
|
|
||||||
}
|
|
||||||
if(!strncmp(label, "NO NAME", 7)) label[0]='\0';
|
|
||||||
}
|
|
||||||
|
@ -26,8 +26,8 @@
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _LOCK_H
|
#ifndef __LOCK_H
|
||||||
#define _LOCK_H
|
#define __LOCK_H
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
malloc is unavailable
|
malloc is unavailable
|
||||||
|
|
||||||
Copyright (c) 2006 Michael "Chishm" Chisholm
|
Copyright (c) 2006 Michael "Chishm" Chisholm
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without modification,
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
are permitted provided that the following conditions are met:
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
@ -28,8 +28,8 @@
|
|||||||
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _MEM_ALLOCATE_H
|
#ifndef __MEM_ALLOCATE_H_
|
||||||
#define _MEM_ALLOCATE_H
|
#define __MEM_ALLOCATE_H_
|
||||||
|
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
|
|
||||||
@ -38,6 +38,7 @@ static inline void* _FAT_mem_allocate (size_t size) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static inline void* _FAT_mem_align (size_t size) {
|
static inline void* _FAT_mem_align (size_t size) {
|
||||||
|
|
||||||
return memalign (32, size);
|
return memalign (32, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -205,16 +205,10 @@ PARTITION* _FAT_partition_constructor (const DISC_INTERFACE* disc, uint32_t cach
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Init the partition lock
|
|
||||||
_FAT_lock_init(&partition->lock);
|
|
||||||
|
|
||||||
_FAT_startSector = startSector;
|
_FAT_startSector = startSector;
|
||||||
|
|
||||||
if (!memcmp(sectorBuffer + BPB_FAT16_fileSysType, FAT_SIG, sizeof(FAT_SIG)))
|
// Init the partition lock
|
||||||
strncpy(partition->label, (char*)(sectorBuffer + BPB_FAT16_volumeLabel), 11);
|
_FAT_lock_init(&partition->lock);
|
||||||
else
|
|
||||||
strncpy(partition->label, (char*)(sectorBuffer + BPB_FAT32_volumeLabel), 11);
|
|
||||||
partition->label[11] = '\0';
|
|
||||||
|
|
||||||
// Set partition's disc interface
|
// Set partition's disc interface
|
||||||
partition->disc = disc;
|
partition->disc = disc;
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
on various block devices.
|
on various block devices.
|
||||||
|
|
||||||
Copyright (c) 2006 Michael "Chishm" Chisholm
|
Copyright (c) 2006 Michael "Chishm" Chisholm
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without modification,
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
are permitted provided that the following conditions are met:
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
@ -27,11 +27,11 @@
|
|||||||
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _PARTITION_H
|
#ifndef __PARTITION_H
|
||||||
#define _PARTITION_H
|
#define __PARTITION_H
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "cache.h"
|
#include "fat_cache.h"
|
||||||
#include "lock.h"
|
#include "lock.h"
|
||||||
|
|
||||||
// Device name
|
// Device name
|
||||||
@ -67,7 +67,6 @@ typedef struct {
|
|||||||
struct _FILE_STRUCT* firstOpenFile; // The start of a linked list of files
|
struct _FILE_STRUCT* firstOpenFile; // The start of a linked list of files
|
||||||
mutex_t lock; // A lock for partition operations
|
mutex_t lock; // A lock for partition operations
|
||||||
bool readOnly; // If this is set, then do not try writing to the disc
|
bool readOnly; // If this is set, then do not try writing to the disc
|
||||||
char label[12]; // Volume label
|
|
||||||
} PARTITION;
|
} PARTITION;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -76,7 +75,7 @@ Mount the supplied device and return a pointer to the struct necessary to use it
|
|||||||
PARTITION* _FAT_partition_constructor (const DISC_INTERFACE* disc, uint32_t cacheSize, uint32_t SectorsPerPage, sec_t startSector);
|
PARTITION* _FAT_partition_constructor (const DISC_INTERFACE* disc, uint32_t cacheSize, uint32_t SectorsPerPage, sec_t startSector);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Dismount the device and free all structures used.
|
Dismount the device and free all structures used.
|
||||||
Will also attempt to synchronise all open files to disc.
|
Will also attempt to synchronise all open files to disc.
|
||||||
*/
|
*/
|
||||||
void _FAT_partition_destructor (PARTITION* partition);
|
void _FAT_partition_destructor (PARTITION* partition);
|
||||||
|
Loading…
Reference in New Issue
Block a user