Commit FS#9545, storage cleanup and multi-driver support

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21933 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Frank Gevaerts 2009-07-17 22:28:49 +00:00
parent bb3b57f645
commit c0a5a67387
37 changed files with 1157 additions and 315 deletions

View file

@ -126,19 +126,28 @@ drivers/touchscreen.c
#ifndef SIMULATOR #ifndef SIMULATOR
#if (CONFIG_STORAGE & STORAGE_MMC) #if (CONFIG_STORAGE & STORAGE_MMC)
drivers/ata_mmc.c drivers/ata_mmc.c
#elif (CONFIG_STORAGE & STORAGE_NAND) && (CONFIG_NAND == NAND_IFP7XX) #endif
#if (CONFIG_STORAGE & STORAGE_NAND) && (CONFIG_NAND == NAND_IFP7XX)
drivers/ata_flash.c drivers/ata_flash.c
#elif (CONFIG_STORAGE & STORAGE_NAND) && (CONFIG_NAND == NAND_TCC) #endif
#if (CONFIG_STORAGE & STORAGE_NAND) && (CONFIG_NAND == NAND_TCC)
target/arm/ata-nand-telechips.c target/arm/ata-nand-telechips.c
#elif (CONFIG_STORAGE & STORAGE_NAND) && (CONFIG_NAND == NAND_SAMSUNG) #endif
#if (CONFIG_STORAGE & STORAGE_NAND) && (CONFIG_NAND == NAND_SAMSUNG)
target/arm/s5l8700/ata-nand-s5l8700.c target/arm/s5l8700/ata-nand-s5l8700.c
#elif (CONFIG_STORAGE & STORAGE_ATA) #endif
#if (CONFIG_STORAGE & STORAGE_ATA)
drivers/ata.c drivers/ata.c
#elif (CONFIG_STORAGE & STORAGE_SD) #endif
#if (CONFIG_STORAGE & STORAGE_SD)
drivers/sd.c drivers/sd.c
#elif (CONFIG_STORAGE & STORAGE_RAMDISK) #endif
#if (CONFIG_STORAGE & STORAGE_RAMDISK)
drivers/ramdisk.c drivers/ramdisk.c
#endif /* CONFIG_STORAGE */ #endif
#ifdef CONFIG_STORAGE_MULTI
storage.c
#endif
drivers/fat.c drivers/fat.c
#if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD) #if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
hotswap.c hotswap.c

View file

@ -44,8 +44,8 @@
12-15: nr of sectors in partition 12-15: nr of sectors in partition
*/ */
#define BYTES2INT32(array,pos) \ #define BYTES2INT32(array,pos) \
((long)array[pos] | ((long)array[pos+1] << 8 ) | \ ((long)array[pos] | ((long)array[pos+1] << 8 ) | \
((long)array[pos+2] << 16 ) | ((long)array[pos+3] << 24 )) ((long)array[pos+2] << 16 ) | ((long)array[pos+3] << 24 ))
static const unsigned char fat_partition_types[] = { static const unsigned char fat_partition_types[] = {
@ -58,18 +58,18 @@ static const unsigned char fat_partition_types[] = {
#endif #endif
}; };
static struct partinfo part[8]; /* space for 4 partitions on 2 drives */ static struct partinfo part[NUM_DRIVES*4]; /* space for 4 partitions on 2 drives */
static int vol_drive[NUM_VOLUMES]; /* mounted to which drive (-1 if none) */ static int vol_drive[NUM_VOLUMES]; /* mounted to which drive (-1 if none) */
#ifdef MAX_LOG_SECTOR_SIZE #ifdef MAX_LOG_SECTOR_SIZE
int disk_sector_multiplier = 1; int disk_sector_multiplier = 1;
#endif #endif
struct partinfo* disk_init(IF_MV_NONVOID(int drive)) struct partinfo* disk_init(IF_MD_NONVOID(int drive))
{ {
int i; int i;
unsigned char sector[512]; unsigned char sector[512];
#ifdef HAVE_MULTIVOLUME #ifdef HAVE_MULTIDRIVE
/* For each drive, start at a different position, in order not to destroy /* For each drive, start at a different position, in order not to destroy
the first entry of drive 0. the first entry of drive 0.
That one is needed to calculate config sector position. */ That one is needed to calculate config sector position. */
@ -115,7 +115,7 @@ struct partinfo* disk_partinfo(int partition)
int disk_mount_all(void) int disk_mount_all(void)
{ {
int mounted; int mounted=0;
int i; int i;
#ifdef HAVE_HOTSWAP #ifdef HAVE_HOTSWAP
@ -126,13 +126,19 @@ int disk_mount_all(void)
for (i=0; i<NUM_VOLUMES; i++) for (i=0; i<NUM_VOLUMES; i++)
vol_drive[i] = -1; /* mark all as unassigned */ vol_drive[i] = -1; /* mark all as unassigned */
#ifndef HAVE_MULTIDRIVE
mounted = disk_mount(0); mounted = disk_mount(0);
#ifdef HAVE_HOTSWAP #else
if (card_detect()) for(i=0;i<NUM_DRIVES;i++)
{ {
mounted += disk_mount(1); /* try 2nd "drive", too */ #ifdef HAVE_HOTSWAP
if (storage_present(i))
#endif
mounted += disk_mount(i);
} }
#endif
#ifdef HAVE_HOTSWAP
card_enable_monitoring(true); card_enable_monitoring(true);
#endif #endif
@ -155,7 +161,7 @@ int disk_mount(int drive)
{ {
int mounted = 0; /* reset partition-on-drive flag */ int mounted = 0; /* reset partition-on-drive flag */
int volume = get_free_volume(); int volume = get_free_volume();
struct partinfo* pinfo = disk_init(IF_MV(drive)); struct partinfo* pinfo = disk_init(IF_MD(drive));
if (pinfo == NULL) if (pinfo == NULL)
{ {
@ -166,7 +172,7 @@ int disk_mount(int drive)
#else #else
int i = 0; int i = 0;
#endif #endif
for (; volume != -1 && i<4; i++) for (; volume != -1 && i<4 && mounted<NUM_VOLUMES_PER_DRIVE; i++)
{ {
if (memchr(fat_partition_types, pinfo[i].type, if (memchr(fat_partition_types, pinfo[i].type,
sizeof(fat_partition_types)) == NULL) sizeof(fat_partition_types)) == NULL)
@ -177,7 +183,7 @@ int disk_mount(int drive)
for (j = 1; j <= (MAX_LOG_SECTOR_SIZE/SECTOR_SIZE); j <<= 1) for (j = 1; j <= (MAX_LOG_SECTOR_SIZE/SECTOR_SIZE); j <<= 1)
{ {
if (!fat_mount(IF_MV2(volume,) IF_MV2(drive,) pinfo[i].start * j)) if (!fat_mount(IF_MV2(volume,) IF_MD2(drive,) pinfo[i].start * j))
{ {
pinfo[i].start *= j; pinfo[i].start *= j;
pinfo[i].size *= j; pinfo[i].size *= j;
@ -190,7 +196,7 @@ int disk_mount(int drive)
} }
} }
#else #else
if (!fat_mount(IF_MV2(volume,) IF_MV2(drive,) pinfo[i].start)) if (!fat_mount(IF_MV2(volume,) IF_MD2(drive,) pinfo[i].start))
{ {
mounted++; mounted++;
vol_drive[volume] = drive; /* remember the drive for this volume */ vol_drive[volume] = drive; /* remember the drive for this volume */
@ -202,7 +208,7 @@ int disk_mount(int drive)
if (mounted == 0 && volume != -1) /* none of the 4 entries worked? */ if (mounted == 0 && volume != -1) /* none of the 4 entries worked? */
{ /* try "superfloppy" mode */ { /* try "superfloppy" mode */
DEBUGF("No partition found, trying to mount sector 0.\n"); DEBUGF("No partition found, trying to mount sector 0.\n");
if (!fat_mount(IF_MV2(volume,) IF_MV2(drive,) 0)) if (!fat_mount(IF_MV2(volume,) IF_MD2(drive,) 0))
{ {
mounted = 1; mounted = 1;
vol_drive[volume] = drive; /* remember the drive for this volume */ vol_drive[volume] = drive; /* remember the drive for this volume */

View file

@ -307,7 +307,7 @@ static int _read_sectors(unsigned long start,
int incount, int incount,
void* inbuf) void* inbuf)
#else #else
int ata_read_sectors(IF_MV2(int drive,) int ata_read_sectors(IF_MD2(int drive,)
unsigned long start, unsigned long start,
int incount, int incount,
void* inbuf) void* inbuf)
@ -323,7 +323,7 @@ int ata_read_sectors(IF_MV2(int drive,)
#endif #endif
#ifndef MAX_PHYS_SECTOR_SIZE #ifndef MAX_PHYS_SECTOR_SIZE
#ifdef HAVE_MULTIVOLUME #ifdef HAVE_MULTIDRIVE
(void)drive; /* unused for now */ (void)drive; /* unused for now */
#endif #endif
mutex_lock(&ata_mtx); mutex_lock(&ata_mtx);
@ -555,7 +555,7 @@ static int _write_sectors(unsigned long start,
int count, int count,
const void* buf) const void* buf)
#else #else
int ata_write_sectors(IF_MV2(int drive,) int ata_write_sectors(IF_MD2(int drive,)
unsigned long start, unsigned long start,
int count, int count,
const void* buf) const void* buf)
@ -569,7 +569,7 @@ int ata_write_sectors(IF_MV2(int drive,)
#endif #endif
#ifndef MAX_PHYS_SECTOR_SIZE #ifndef MAX_PHYS_SECTOR_SIZE
#ifdef HAVE_MULTIVOLUME #ifdef HAVE_MULTIDRIVE
(void)drive; /* unused for now */ (void)drive; /* unused for now */
#endif #endif
mutex_lock(&ata_mtx); mutex_lock(&ata_mtx);
@ -728,7 +728,7 @@ static inline int flush_current_sector(void)
sector_cache.data); sector_cache.data);
} }
int ata_read_sectors(IF_MV2(int drive,) int ata_read_sectors(IF_MD2(int drive,)
unsigned long start, unsigned long start,
int incount, int incount,
void* inbuf) void* inbuf)
@ -736,7 +736,7 @@ int ata_read_sectors(IF_MV2(int drive,)
int rc = 0; int rc = 0;
int offset; int offset;
#ifdef HAVE_MULTIVOLUME #ifdef HAVE_MULTIDRIVE
(void)drive; /* unused for now */ (void)drive; /* unused for now */
#endif #endif
mutex_lock(&ata_mtx); mutex_lock(&ata_mtx);
@ -794,7 +794,7 @@ int ata_read_sectors(IF_MV2(int drive,)
return rc; return rc;
} }
int ata_write_sectors(IF_MV2(int drive,) int ata_write_sectors(IF_MD2(int drive,)
unsigned long start, unsigned long start,
int count, int count,
const void* buf) const void* buf)
@ -802,7 +802,7 @@ int ata_write_sectors(IF_MV2(int drive,)
int rc = 0; int rc = 0;
int offset; int offset;
#ifdef HAVE_MULTIVOLUME #ifdef HAVE_MULTIDRIVE
(void)drive; /* unused for now */ (void)drive; /* unused for now */
#endif #endif
mutex_lock(&ata_mtx); mutex_lock(&ata_mtx);
@ -1503,7 +1503,7 @@ int ata_init(void)
create_thread(ata_thread, ata_stack, create_thread(ata_thread, ata_stack,
sizeof(ata_stack), 0, ata_thread_name sizeof(ata_stack), 0, ata_thread_name
IF_PRIO(, PRIORITY_USER_INTERFACE) IF_PRIO(, PRIORITY_USER_INTERFACE)
IF_COP(, CPU)); IF_COP(, CPU));
initialized = true; initialized = true;
} }
@ -1552,12 +1552,15 @@ int ata_spinup_time(void)
} }
#ifdef STORAGE_GET_INFO #ifdef STORAGE_GET_INFO
void ata_get_info(struct storage_info *info) void ata_get_info(IF_MD2(int drive,)struct storage_info *info)
{ {
unsigned short *src,*dest; unsigned short *src,*dest;
static char vendor[8]; static char vendor[8];
static char product[16]; static char product[16];
static char revision[4]; static char revision[4];
#ifdef HAVE_MULTIDRIVE
(void)drive; /* unused for now */
#endif
int i; int i;
info->sector_size = SECTOR_SIZE; info->sector_size = SECTOR_SIZE;
info->num_sectors= total_sectors; info->num_sectors= total_sectors;
@ -1595,3 +1598,13 @@ void ata_keep_active(void)
last_disk_activity = current_tick; last_disk_activity = current_tick;
} }
#endif #endif
#ifdef CONFIG_STORAGE_MULTI
int ata_num_drives(int first_drive)
{
/* We don't care which logical drive number(s) we have been assigned */
(void)first_drive;
return 1;
}
#endif

View file

@ -384,7 +384,7 @@ int flash_disk_read_sectors(unsigned long start,
return done; return done;
} }
int nand_read_sectors(IF_MV2(int drive,) int nand_read_sectors(IF_MD2(int drive,)
unsigned long start, unsigned long start,
int incount, int incount,
void* inbuf) void* inbuf)
@ -401,7 +401,7 @@ int nand_read_sectors(IF_MV2(int drive,)
return 0; return 0;
} }
int nand_write_sectors(IF_MV2(int drive,) int nand_write_sectors(IF_MD2(int drive,)
unsigned long start, unsigned long start,
int count, int count,
const void* buf) const void* buf)
@ -472,3 +472,13 @@ void nand_get_info(struct storage_info *info)
} }
#endif #endif
#ifdef CONFIG_STORAGE_MULTI
int nand_num_drives(int first_drive)
{
/* We don't care which logical drive number(s) we have been assigned */
(void)first_drive;
return 1;
}
#endif

View file

@ -126,7 +126,7 @@ static int current_buffer = 0;
static const unsigned char *send_block_addr = NULL; static const unsigned char *send_block_addr = NULL;
static tCardInfo card_info[2]; static tCardInfo card_info[2];
#ifndef HAVE_MULTIVOLUME #ifndef HAVE_MULTIDRIVE
static int current_card = 0; static int current_card = 0;
#endif #endif
static bool last_mmc_status = false; static bool last_mmc_status = false;
@ -602,7 +602,7 @@ static int send_block_send(unsigned char start_token, long timeout,
return rc; return rc;
} }
int mmc_read_sectors(IF_MV2(int drive,) int mmc_read_sectors(IF_MD2(int drive,)
unsigned long start, unsigned long start,
int incount, int incount,
void* inbuf) void* inbuf)
@ -611,7 +611,7 @@ int mmc_read_sectors(IF_MV2(int drive,)
int lastblock = 0; int lastblock = 0;
unsigned long end_block; unsigned long end_block;
tCardInfo *card; tCardInfo *card;
#ifndef HAVE_MULTIVOLUME #ifndef HAVE_MULTIDRIVE
int drive = current_card; int drive = current_card;
#endif #endif
@ -688,7 +688,7 @@ int mmc_read_sectors(IF_MV2(int drive,)
return rc; return rc;
} }
int mmc_write_sectors(IF_MV2(int drive,) int mmc_write_sectors(IF_MD2(int drive,)
unsigned long start, unsigned long start,
int count, int count,
const void* buf) const void* buf)
@ -697,7 +697,7 @@ int mmc_write_sectors(IF_MV2(int drive,)
int write_cmd; int write_cmd;
unsigned char start_token; unsigned char start_token;
tCardInfo *card; tCardInfo *card;
#ifndef HAVE_MULTIVOLUME #ifndef HAVE_MULTIDRIVE
int drive = current_card; int drive = current_card;
#endif #endif
@ -920,7 +920,7 @@ int mmc_init(void)
led(false); led(false);
last_mmc_status = mmc_detect(); last_mmc_status = mmc_detect();
#ifndef HAVE_MULTIVOLUME #ifndef HAVE_MULTIDRIVE
/* Use MMC if inserted, internal flash otherwise */ /* Use MMC if inserted, internal flash otherwise */
current_card = last_mmc_status ? 1 : 0; current_card = last_mmc_status ? 1 : 0;
#endif #endif
@ -949,7 +949,7 @@ int mmc_init(void)
create_thread(mmc_thread, mmc_stack, create_thread(mmc_thread, mmc_stack,
sizeof(mmc_stack), 0, mmc_thread_name sizeof(mmc_stack), 0, mmc_thread_name
IF_PRIO(, PRIORITY_SYSTEM) IF_PRIO(, PRIORITY_SYSTEM)
IF_COP(, CPU)); IF_COP(, CPU));
tick_add_task(mmc_tick); tick_add_task(mmc_tick);
initialized = true; initialized = true;
} }
@ -965,9 +965,9 @@ long mmc_last_disk_activity(void)
} }
#ifdef STORAGE_GET_INFO #ifdef STORAGE_GET_INFO
void mmc_get_info(IF_MV2(int drive,) struct storage_info *info) void mmc_get_info(IF_MD2(int drive,) struct storage_info *info)
{ {
#ifndef HAVE_MULTIVOLUME #ifndef HAVE_MULTIDRIVE
const int drive=0; const int drive=0;
#endif #endif
info->sector_size=card_info[drive].blocksize; info->sector_size=card_info[drive].blocksize;
@ -986,17 +986,17 @@ void mmc_get_info(IF_MV2(int drive,) struct storage_info *info)
#endif #endif
#ifdef HAVE_HOTSWAP #ifdef HAVE_HOTSWAP
bool mmc_removable(IF_MV_NONVOID(int drive)) bool mmc_removable(IF_MD_NONVOID(int drive))
{ {
#ifndef HAVE_MULTIVOLUME #ifndef HAVE_MULTIDRIVE
const int drive=0; const int drive=0;
#endif #endif
return (drive==1); return (drive==1);
} }
bool mmc_present(IF_MV_NONVOID(int drive)) bool mmc_present(IF_MD_NONVOID(int drive))
{ {
#ifndef HAVE_MULTIVOLUME #ifndef HAVE_MULTIDRIVE
const int drive=0; const int drive=0;
#endif #endif
return (card_info[drive].initialized && card_info[drive].numblocks > 0); return (card_info[drive].initialized && card_info[drive].numblocks > 0);
@ -1016,3 +1016,17 @@ void mmc_spindown(int seconds)
{ {
(void)seconds; (void)seconds;
} }
#ifdef CONFIG_STORAGE_MULTI
int mmc_num_drives(int first_drive)
{
/* We don't care which logical drive number(s) we have been assigned */
(void)first_drive;
#ifdef HAVE_MULTIDRIVE
return 2;
#else
return 1;
#endif
}
#endif

View file

@ -167,7 +167,9 @@ struct bpb
* of first pseudo cluster */ * of first pseudo cluster */
#endif /* #ifdef HAVE_FAT16SUPPORT */ #endif /* #ifdef HAVE_FAT16SUPPORT */
#ifdef HAVE_MULTIVOLUME #ifdef HAVE_MULTIVOLUME
#ifdef HAVE_MULTIDRIVE
int drive; /* on which physical device is this located */ int drive; /* on which physical device is this located */
#endif
bool mounted; /* flag if this volume is mounted */ bool mounted; /* flag if this volume is mounted */
#endif #endif
}; };
@ -285,7 +287,7 @@ void fat_init(void)
#endif #endif
} }
int fat_mount(IF_MV2(int volume,) IF_MV2(int drive,) long startsector) int fat_mount(IF_MV2(int volume,) IF_MD2(int drive,) long startsector)
{ {
#ifndef HAVE_MULTIVOLUME #ifndef HAVE_MULTIVOLUME
const int volume = 0; const int volume = 0;
@ -309,7 +311,7 @@ int fat_mount(IF_MV2(int volume,) IF_MV2(int drive,) long startsector)
memset(fat_bpb, 0, sizeof(struct bpb)); memset(fat_bpb, 0, sizeof(struct bpb));
fat_bpb->startsector = startsector; fat_bpb->startsector = startsector;
#ifdef HAVE_MULTIVOLUME #ifdef HAVE_MULTIDRIVE
fat_bpb->drive = drive; fat_bpb->drive = drive;
#endif #endif

View file

@ -31,11 +31,14 @@ unsigned char ramdisk[SECTOR_SIZE * NUM_SECTORS];
long last_disk_activity = -1; long last_disk_activity = -1;
int ramdisk_read_sectors(IF_MV2(int drive,) int ramdisk_read_sectors(IF_MD2(int drive,)
unsigned long start, unsigned long start,
int count, int count,
void* buf) void* buf)
{ {
#ifdef HAVE_MULTIDRIVE
(void)drive; /* unused for now */
#endif
if(start+count>NUM_SECTORS) if(start+count>NUM_SECTORS)
{ {
return -1; return -1;
@ -44,11 +47,14 @@ int ramdisk_read_sectors(IF_MV2(int drive,)
return 0; return 0;
} }
int ramdisk_write_sectors(IF_MV2(int drive,) int ramdisk_write_sectors(IF_MD2(int drive,)
unsigned long start, unsigned long start,
int count, int count,
const void* buf) const void* buf)
{ {
#ifdef HAVE_MULTIDRIVE
(void)drive; /* unused for now */
#endif
if(start+count>NUM_SECTORS) if(start+count>NUM_SECTORS)
{ {
return -1; return -1;
@ -79,13 +85,36 @@ void ramdisk_sleepnow(void)
{ {
} }
void ramdisk_enable(bool on)
{
(void)on;
}
bool ramdisk_disk_is_active(void)
{
return true;
}
int ramdisk_soft_reset(void)
{
return 0;
}
int ramdisk_spinup_time(void)
{
return 0;
}
void ramdisk_spindown(int seconds) void ramdisk_spindown(int seconds)
{ {
(void)seconds; (void)seconds;
} }
#ifdef STORAGE_GET_INFO #ifdef STORAGE_GET_INFO
void ramdisk_get_info(IF_MV2(int drive,) struct storage_info *info) void ramdisk_get_info(IF_MD2(int drive,) struct storage_info *info)
{ {
#ifdef HAVE_MULTIDRIVE
(void)drive; /* unused for now */
#endif
/* firmware version */ /* firmware version */
info->revision="0.00"; info->revision="0.00";
@ -100,3 +129,14 @@ void ramdisk_get_info(IF_MV2(int drive,) struct storage_info *info)
} }
#endif #endif
#ifdef CONFIG_STORAGE_MULTI
int ramdisk_num_drives(int first_drive)
{
/* We don't care which logical drive number(s) we have been assigned */
(void)first_drive;
return 1;
}
#endif

View file

@ -39,8 +39,8 @@ bool ata_disk_is_active(void);
int ata_soft_reset(void); int ata_soft_reset(void);
int ata_init(void); int ata_init(void);
void ata_close(void); void ata_close(void);
int ata_read_sectors(IF_MV2(int drive,) unsigned long start, int count, void* buf); int ata_read_sectors(IF_MD2(int drive,) unsigned long start, int count, void* buf);
int ata_write_sectors(IF_MV2(int drive,) unsigned long start, int count, const void* buf); int ata_write_sectors(IF_MD2(int drive,) unsigned long start, int count, const void* buf);
void ata_spin(void); void ata_spin(void);
#if (CONFIG_LED == LED_REAL) #if (CONFIG_LED == LED_REAL)
void ata_set_led_enabled(bool enabled); void ata_set_led_enabled(bool enabled);
@ -48,14 +48,18 @@ void ata_set_led_enabled(bool enabled);
unsigned short* ata_get_identify(void); unsigned short* ata_get_identify(void);
#ifdef STORAGE_GET_INFO #ifdef STORAGE_GET_INFO
void ata_get_info(IF_MV2(int drive,) struct storage_info *info); void ata_get_info(IF_MD2(int drive,) struct storage_info *info);
#endif #endif
#ifdef HAVE_HOTSWAP #ifdef HAVE_HOTSWAP
bool ata_removable(IF_MV_NONVOID(int drive)); bool ata_removable(IF_MD_NONVOID(int drive));
bool ata_present(IF_MV_NONVOID(int drive)); bool ata_present(IF_MD_NONVOID(int drive));
#endif #endif
#ifdef CONFIG_STORAGE_MULTI
int ata_num_drives(int first_drive);
#endif
long ata_last_disk_activity(void); long ata_last_disk_activity(void);
int ata_spinup_time(void); /* ticks */ int ata_spinup_time(void); /* ticks */

View file

@ -177,7 +177,8 @@
#define FIRMWARE_OFFSET_FILE_DATA 0x8 #define FIRMWARE_OFFSET_FILE_DATA 0x8
#ifndef BOOTLOADER #ifndef BOOTLOADER
#define HAVE_MULTIVOLUME #define HAVE_MULTIDRIVE
#define NUM_DRIVES 2
#define HAVE_HOTSWAP #define HAVE_HOTSWAP
#endif #endif

View file

@ -171,7 +171,8 @@
#define FIRMWARE_OFFSET_FILE_DATA 0x8 #define FIRMWARE_OFFSET_FILE_DATA 0x8
#ifndef BOOTLOADER #ifndef BOOTLOADER
#define HAVE_MULTIVOLUME #define HAVE_MULTIDRIVE
#define NUM_DRIVES 2
#define HAVE_HOTSWAP #define HAVE_HOTSWAP
#endif #endif

View file

@ -180,7 +180,8 @@
#define FIRMWARE_OFFSET_FILE_DATA 0x8 #define FIRMWARE_OFFSET_FILE_DATA 0x8
#ifndef BOOTLOADER #ifndef BOOTLOADER
#define HAVE_MULTIVOLUME #define HAVE_MULTIDRIVE
#define NUM_DRIVES 2
#define HAVE_HOTSWAP #define HAVE_HOTSWAP
#endif #endif

View file

@ -178,7 +178,8 @@
#define FIRMWARE_OFFSET_FILE_DATA 0x8 #define FIRMWARE_OFFSET_FILE_DATA 0x8
#ifndef BOOTLOADER #ifndef BOOTLOADER
#define HAVE_MULTIVOLUME #define HAVE_MULTIDRIVE
#define NUM_DRIVES 2
#define HAVE_HOTSWAP #define HAVE_HOTSWAP
#endif #endif

View file

@ -42,8 +42,7 @@
//#define HAVE_ATA_SD //#define HAVE_ATA_SD
//#define HAVE_HOTSWAP //#define HAVE_HOTSWAP
//#define CONFIG_STORAGE (STORAGE_NAND | STORAGE_SD) #define CONFIG_STORAGE (STORAGE_NAND | STORAGE_SD)
#define CONFIG_STORAGE STORAGE_SD
/* Support FAT16 for SD cards <= 2GB */ /* Support FAT16 for SD cards <= 2GB */
#define HAVE_FAT16SUPPORT #define HAVE_FAT16SUPPORT
@ -51,6 +50,9 @@
/* ChinaChip NAND FTL */ /* ChinaChip NAND FTL */
#define CONFIG_NAND NAND_CC #define CONFIG_NAND NAND_CC
#define HAVE_MULTIDRIVE
#define NUM_DRIVES 2
/* define this if you have a bitmap LCD display */ /* define this if you have a bitmap LCD display */
#define HAVE_LCD_BITMAP #define HAVE_LCD_BITMAP

View file

@ -41,7 +41,8 @@
#define CONFIG_NAND NAND_CC #define CONFIG_NAND NAND_CC
#define HAVE_MULTIVOLUME #define HAVE_MULTIDRIVE
#define NUM_DRIVES 2
/* define this if you have a bitmap LCD display */ /* define this if you have a bitmap LCD display */
#define HAVE_LCD_BITMAP #define HAVE_LCD_BITMAP

View file

@ -125,7 +125,8 @@
#define HAVE_MAS_SIBI_CONTROL #define HAVE_MAS_SIBI_CONTROL
/* define this if more than one device/partition can be used */ /* define this if more than one device/partition can be used */
#define HAVE_MULTIVOLUME #define HAVE_MULTIDRIVE
#define NUM_DRIVES 2
/* define this if media can be exchanged on the fly */ /* define this if media can be exchanged on the fly */
#define HAVE_HOTSWAP #define HAVE_HOTSWAP

View file

@ -106,7 +106,8 @@
#define HAVE_MAS_SIBI_CONTROL #define HAVE_MAS_SIBI_CONTROL
/* define this if more than one device/partition can be used */ /* define this if more than one device/partition can be used */
#define HAVE_MULTIVOLUME #define HAVE_MULTIDRIVE
#define NUM_DRIVES 2
/* define this if media can be exchanged on the fly */ /* define this if media can be exchanged on the fly */
#define HAVE_HOTSWAP #define HAVE_HOTSWAP

View file

@ -539,11 +539,6 @@ Lyre prototype 1*/
#define CONFIG_TUNER_MULTI #define CONFIG_TUNER_MULTI
#endif #endif
#if (CONFIG_STORAGE & (CONFIG_STORAGE - 1)) != 0
/* Multiple storage drivers */
#define CONFIG_STORAGE_MULTI
#endif
/* deactivate fading in bootloader/sim */ /* deactivate fading in bootloader/sim */
#if defined(BOOTLOADER) || defined(SIMULATOR) #if defined(BOOTLOADER) || defined(SIMULATOR)
#undef CONFIG_BACKLIGHT_FADING #undef CONFIG_BACKLIGHT_FADING
@ -571,6 +566,37 @@ Lyre prototype 1*/
#endif /* CONFIG_BACKLIGHT_FADING */ #endif /* CONFIG_BACKLIGHT_FADING */
/* Storage related config handling */
#if (CONFIG_STORAGE & (CONFIG_STORAGE - 1)) != 0
/* Multiple storage drivers */
#define CONFIG_STORAGE_MULTI
#endif
/* Explicit HAVE_MULTIVOLUME in the config file. Allow the maximum number */
#ifdef HAVE_MULTIVOLUME
#define NUM_VOLUMES_PER_DRIVE 4
#else
#define NUM_VOLUMES_PER_DRIVE 1
#endif
#if defined(CONFIG_STORAGE_MULTI) && !defined(HAVE_MULTIDRIVE)
#define HAVE_MULTIDRIVE
#endif
#if defined(HAVE_MULTIDRIVE) && !defined(HAVE_MULTIVOLUME)
#define HAVE_MULTIVOLUME
#endif
#if defined(HAVE_MULTIDRIVE) && !defined(NUM_DRIVES)
#error HAVE_MULTIDRIVE needs to have an explicit NUM_DRIVES
#endif
#ifndef NUM_DRIVES
#define NUM_DRIVES 1
#endif
#define NUM_VOLUMES (NUM_DRIVES * NUM_VOLUMES_PER_DRIVE)
#if defined(BOOTLOADER) && defined(HAVE_ADJUSTABLE_CPU_FREQ) #if defined(BOOTLOADER) && defined(HAVE_ADJUSTABLE_CPU_FREQ)
/* Bootloaders don't use CPU frequency adjustment */ /* Bootloaders don't use CPU frequency adjustment */
#undef HAVE_ADJUSTABLE_CPU_FREQ #undef HAVE_ADJUSTABLE_CPU_FREQ

View file

@ -35,7 +35,7 @@ struct partinfo {
#define PARTITION_TYPE_OS2_HIDDEN_C_DRIVE 0x84 #define PARTITION_TYPE_OS2_HIDDEN_C_DRIVE 0x84
/* returns a pointer to an array of 8 partinfo structs */ /* returns a pointer to an array of 8 partinfo structs */
struct partinfo* disk_init(IF_MV_NONVOID(int volume)); struct partinfo* disk_init(IF_MD_NONVOID(int drive));
struct partinfo* disk_partinfo(int partition); struct partinfo* disk_partinfo(int partition);
int disk_mount_all(void); /* returns the # of successful mounts */ int disk_mount_all(void); /* returns the # of successful mounts */
int disk_mount(int drive); int disk_mount(int drive);

View file

@ -90,7 +90,7 @@ extern void fat_unlock(void);
#endif #endif
extern void fat_init(void); extern void fat_init(void);
extern int fat_mount(IF_MV2(int volume,) IF_MV2(int drive,) long startsector); extern int fat_mount(IF_MV2(int volume,) IF_MD2(int drive,) long startsector);
extern int fat_unmount(int volume, bool flush); extern int fat_unmount(int volume, bool flush);
extern void fat_size(IF_MV2(int volume,) /* public for info */ extern void fat_size(IF_MV2(int volume,) /* public for info */
unsigned long* size, unsigned long* size,

View file

@ -23,7 +23,7 @@
#define __MMC_H__ #define __MMC_H__
#include <stdbool.h> #include <stdbool.h>
#include "mv.h" /* for HAVE_MULTIVOLUME or not */ #include "mv.h" /* for HAVE_MULTIDRIVE or not */
struct storage_info; struct storage_info;
@ -35,19 +35,24 @@ bool mmc_disk_is_active(void);
int mmc_soft_reset(void); int mmc_soft_reset(void);
int mmc_init(void); int mmc_init(void);
void mmc_close(void); void mmc_close(void);
int mmc_read_sectors(IF_MV2(int drive,) unsigned long start, int count, void* buf); int mmc_read_sectors(IF_MD2(int drive,) unsigned long start, int count, void* buf);
int mmc_write_sectors(IF_MV2(int drive,) unsigned long start, int count, const void* buf); int mmc_write_sectors(IF_MD2(int drive,) unsigned long start, int count, const void* buf);
void mmc_spin(void); void mmc_spin(void);
int mmc_spinup_time(void); int mmc_spinup_time(void);
#ifdef STORAGE_GET_INFO #ifdef STORAGE_GET_INFO
void mmc_get_info(IF_MV2(int drive,) struct storage_info *info); void mmc_get_info(IF_MD2(int drive,) struct storage_info *info);
#endif #endif
#ifdef HAVE_HOTSWAP #ifdef HAVE_HOTSWAP
bool mmc_removable(IF_MV_NONVOID(int drive)); bool mmc_removable(IF_MD_NONVOID(int drive));
bool mmc_present(IF_MV_NONVOID(int drive)); bool mmc_present(IF_MD_NONVOID(int drive));
#endif #endif
long mmc_last_disk_activity(void); long mmc_last_disk_activity(void);
#ifdef CONFIG_STORAGE_MULTI
int mmc_num_drives(int first_drive);
#endif
#endif #endif

View file

@ -26,16 +26,28 @@
/* FixMe: These macros are a bit nasty and perhaps misplaced here. /* FixMe: These macros are a bit nasty and perhaps misplaced here.
We'll get rid of them once decided on how to proceed with multivolume. */ We'll get rid of them once decided on how to proceed with multivolume. */
/* Drives are things like a disk, a card, a flash chip. They can have volumes on them */
#ifdef HAVE_MULTIDRIVE
#define IF_MD(x) x /* optional drive parameter */
#define IF_MD2(x,y) x,y /* same, for a list of arguments */
#define IF_MD_NONVOID(x) x /* for prototype with sole volume parameter */
#else /* empty definitions if no multi-drive */
#define IF_MD(x)
#define IF_MD2(x,y)
#define IF_MD_NONVOID(x) void
#endif
/* Volumes mean things that have filesystems on them, like partitions */
#ifdef HAVE_MULTIVOLUME #ifdef HAVE_MULTIVOLUME
#define IF_MV(x) x /* optional volume/drive parameter */ #define IF_MV(x) x /* optional volume parameter */
#define IF_MV2(x,y) x,y /* same, for a list of arguments */ #define IF_MV2(x,y) x,y /* same, for a list of arguments */
#define IF_MV_NONVOID(x) x /* for prototype with sole volume parameter */ #define IF_MV_NONVOID(x) x /* for prototype with sole volume parameter */
#define NUM_VOLUMES 2
#else /* empty definitions if no multi-volume */ #else /* empty definitions if no multi-volume */
#define IF_MV(x) #define IF_MV(x)
#define IF_MV2(x,y) #define IF_MV2(x,y)
#define IF_MV_NONVOID(x) void #define IF_MV_NONVOID(x) void
#define NUM_VOLUMES 1
#endif #endif
#endif #endif

View file

@ -23,25 +23,31 @@
#define __NAND_H__ #define __NAND_H__
#include <stdbool.h> #include <stdbool.h>
#include "mv.h" /* for HAVE_MULTIVOLUME or not */ #include "mv.h" /* for HAVE_MULTIDRIVE or not */
struct storage_info; struct storage_info;
void nand_enable(bool on); void nand_enable(bool on);
void nand_spindown(int seconds); void nand_spindown(int seconds);
void nand_sleep(void); void nand_sleep(void);
void nand_sleepnow(void);
bool nand_disk_is_active(void); bool nand_disk_is_active(void);
int nand_soft_reset(void); int nand_soft_reset(void);
int nand_init(void); int nand_init(void);
void nand_close(void); void nand_close(void);
int nand_read_sectors(IF_MV2(int drive,) unsigned long start, int count, void* buf); int nand_read_sectors(IF_MD2(int drive,) unsigned long start, int count, void* buf);
int nand_write_sectors(IF_MV2(int drive,) unsigned long start, int count, const void* buf); int nand_write_sectors(IF_MD2(int drive,) unsigned long start, int count, const void* buf);
void nand_spin(void); void nand_spin(void);
int nand_spinup_time(void); /* ticks */
#ifdef STORAGE_GET_INFO #ifdef STORAGE_GET_INFO
void nand_get_info(IF_MV2(int drive,) struct storage_info *info); void nand_get_info(IF_MD2(int drive,) struct storage_info *info);
#endif #endif
long nand_last_disk_activity(void); long nand_last_disk_activity(void);
#ifdef CONFIG_STORAGE_MULTI
int nand_num_drives(int first_drive);
#endif
#endif #endif

View file

@ -23,7 +23,7 @@
#define __RAMDISK_H__ #define __RAMDISK_H__
#include <stdbool.h> #include <stdbool.h>
#include "mv.h" /* for HAVE_MULTIVOLUME or not */ #include "mv.h" /* for HAVE_MULTIDRIVE or not */
struct storage_info; struct storage_info;
@ -34,15 +34,20 @@ bool ramdisk_disk_is_active(void);
int ramdisk_soft_reset(void); int ramdisk_soft_reset(void);
int ramdisk_init(void); int ramdisk_init(void);
void ramdisk_close(void); void ramdisk_close(void);
int ramdisk_read_sectors(IF_MV2(int drive,) unsigned long start, int count, void* buf); int ramdisk_read_sectors(IF_MD2(int drive,) unsigned long start, int count, void* buf);
int ramdisk_write_sectors(IF_MV2(int drive,) unsigned long start, int count, const void* buf); int ramdisk_write_sectors(IF_MD2(int drive,) unsigned long start, int count, const void* buf);
void ramdisk_spin(void); void ramdisk_spin(void);
void ramdisk_sleepnow(void); void ramdisk_sleepnow(void);
int ramdisk_spinup_time(void);
#ifdef STORAGE_GET_INFO #ifdef STORAGE_GET_INFO
void ramdisk_get_info(IF_MV2(int drive,) struct storage_info *info); void ramdisk_get_info(IF_MD2(int drive,) struct storage_info *info);
#endif #endif
long ramdisk_last_disk_activity(void); long ramdisk_last_disk_activity(void);
#ifdef CONFIG_STORAGE_MULTI
int ramdisk_num_drives(int first_drive);
#endif
#endif #endif

View file

@ -23,7 +23,7 @@
#define __SD_H__ #define __SD_H__
#include <stdbool.h> #include <stdbool.h>
#include "mv.h" /* for HAVE_MULTIVOLUME or not */ #include "mv.h" /* for HAVE_MULTIDRIVE or not */
#define SD_BLOCK_SIZE 512 /* XXX : support other sizes ? */ #define SD_BLOCK_SIZE 512 /* XXX : support other sizes ? */
@ -32,27 +32,34 @@ struct storage_info;
void sd_enable(bool on); void sd_enable(bool on);
void sd_spindown(int seconds); void sd_spindown(int seconds);
void sd_sleep(void); void sd_sleep(void);
void sd_sleepnow(void);
bool sd_disk_is_active(void); bool sd_disk_is_active(void);
int sd_soft_reset(void); int sd_soft_reset(void);
int sd_init(void); int sd_init(void);
void sd_close(void); void sd_close(void);
int sd_read_sectors(IF_MV2(int drive,) unsigned long start, int count, void* buf); int sd_read_sectors(IF_MD2(int drive,) unsigned long start, int count, void* buf);
int sd_write_sectors(IF_MV2(int drive,) unsigned long start, int count, const void* buf); int sd_write_sectors(IF_MD2(int drive,) unsigned long start, int count, const void* buf);
void sd_spin(void); void sd_spin(void);
int sd_spinup_time(void); /* ticks */
#ifdef STORAGE_GET_INFO #ifdef STORAGE_GET_INFO
void sd_get_info(IF_MV2(int drive,) struct storage_info *info); void sd_get_info(IF_MD2(int drive,) struct storage_info *info);
#endif #endif
#ifdef HAVE_HOTSWAP #ifdef HAVE_HOTSWAP
bool sd_removable(IF_MV_NONVOID(int drive)); bool sd_removable(IF_MV_NONVOID(int drive));
bool sd_present(IF_MV_NONVOID(int drive)); bool sd_present(IF_MV_NONVOID(int drive));
void card_enable_monitoring_target(bool on); void card_enable_monitoring_target(bool on);
#endif #endif
bool card_detect_target(void); bool card_detect_target(void);
long sd_last_disk_activity(void); long sd_last_disk_activity(void);
#ifdef CONFIG_STORAGE_MULTI
int sd_num_drives(int first_drive);
#endif
/* SD States */ /* SD States */
#define SD_IDLE 0 #define SD_IDLE 0
#define SD_READY 1 #define SD_READY 1

View file

@ -23,7 +23,7 @@
#define __STORAGE_H__ #define __STORAGE_H__
#include <stdbool.h> #include <stdbool.h>
#include "config.h" /* for HAVE_MULTIVOLUME or not */ #include "config.h" /* for HAVE_MULTIDRIVE or not */
#include "mv.h" #include "mv.h"
#if (CONFIG_STORAGE & STORAGE_SD) #if (CONFIG_STORAGE & STORAGE_SD)
@ -51,154 +51,147 @@ struct storage_info
char *revision; char *revision;
}; };
#ifndef SIMULATOR #if !defined(SIMULATOR) && !defined(CONFIG_STORAGE_MULTI)
#ifndef CONFIG_STORAGE_MULTI /* storage_spindown, storage_sleep and storage_spin are passed as
/* storage_spindown, storage_sleep and storage_spin are passed as * pointers, which doesn't work with argument-macros.
* pointers, which doesn't work with argument-macros. */
*/ #define storage_num_drives() NUM_DRIVES
#if (CONFIG_STORAGE & STORAGE_ATA) #if (CONFIG_STORAGE & STORAGE_ATA)
#define storage_spindown ata_spindown #define storage_spindown ata_spindown
#define storage_sleep ata_sleep #define storage_sleep ata_sleep
#define storage_spin ata_spin #define storage_spin ata_spin
#define storage_enable(on) ata_enable(on) #define storage_enable(on) ata_enable(on)
#define storage_sleepnow() ata_sleepnow() #define storage_sleepnow() ata_sleepnow()
#define storage_disk_is_active() ata_disk_is_active() #define storage_disk_is_active() ata_disk_is_active()
#define storage_soft_reset() ata_soft_reset() #define storage_soft_reset() ata_soft_reset()
#define storage_init() ata_init() #define storage_init() ata_init()
#define storage_close() ata_close() #define storage_close() ata_close()
#define storage_read_sectors(drive, start, count, buf) ata_read_sectors(IF_MV2(drive,) start, count, buf) #define storage_read_sectors(drive, start, count, buf) ata_read_sectors(IF_MD2(drive,) start, count, buf)
#define storage_write_sectors(drive, start, count, buf) ata_write_sectors(IF_MV2(drive,) start, count, buf) #define storage_write_sectors(drive, start, count, buf) ata_write_sectors(IF_MD2(drive,) start, count, buf)
#define storage_last_disk_activity() ata_last_disk_activity() #define storage_last_disk_activity() ata_last_disk_activity()
#define storage_spinup_time() ata_spinup_time() #define storage_spinup_time() ata_spinup_time()
#define storage_get_identify() ata_get_identify() #define storage_get_identify() ata_get_identify()
#ifdef STORAGE_GET_INFO #ifdef STORAGE_GET_INFO
#define storage_get_info(drive, info) ata_get_info(IF_MV2(drive,) info) #define storage_get_info(drive, info) ata_get_info(IF_MD2(drive,) info)
#endif #endif
#ifdef HAVE_HOTSWAP #ifdef HAVE_HOTSWAP
#define storage_removable(drive) ata_removable(IF_MV(drive)) #define storage_removable(drive) ata_removable(IF_MD(drive))
#define storage_present(drive) ata_present(IF_MV(drive)) #define storage_present(drive) ata_present(IF_MD(drive))
#endif #endif
#elif (CONFIG_STORAGE & STORAGE_SD) #elif (CONFIG_STORAGE & STORAGE_SD)
#define storage_spindown sd_spindown #define storage_spindown sd_spindown
#define storage_sleep sd_sleep #define storage_sleep sd_sleep
#define storage_spin sd_spin #define storage_spin sd_spin
#define storage_enable(on) sd_enable(on) #define storage_enable(on) sd_enable(on)
#define storage_sleepnow() sd_sleepnow() #define storage_sleepnow() sd_sleepnow()
#define storage_disk_is_active() 0 #define storage_disk_is_active() 0
#define storage_soft_reset() (void)0 #define storage_soft_reset() (void)0
#define storage_init() sd_init() #define storage_init() sd_init()
#define storage_close() sd_close() #define storage_read_sectors(drive, start, count, buf) sd_read_sectors(IF_MD2(drive,) start, count, buf)
#define storage_read_sectors(drive, start, count, buf) sd_read_sectors(IF_MV2(drive,) start, count, buf) #define storage_write_sectors(drive, start, count, buf) sd_write_sectors(IF_MD2(drive,) start, count, buf)
#define storage_write_sectors(drive, start, count, buf) sd_write_sectors(IF_MV2(drive,) start, count, buf) #define storage_last_disk_activity() sd_last_disk_activity()
#define storage_last_disk_activity() sd_last_disk_activity() #define storage_spinup_time() 0
#define storage_spinup_time() 0 #define storage_get_identify() sd_get_identify()
#define storage_get_identify() sd_get_identify()
#ifdef STORAGE_GET_INFO
#ifdef STORAGE_GET_INFO #define storage_get_info(drive, info) sd_get_info(IF_MD2(drive,) info)
#define storage_get_info(drive, info) sd_get_info(IF_MV2(drive,) info) #endif
#endif #ifdef HAVE_HOTSWAP
#ifdef HAVE_HOTSWAP #define storage_removable(drive) sd_removable(IF_MD(drive))
#define storage_removable(drive) sd_removable(IF_MV(drive)) #define storage_present(drive) sd_present(IF_MD(drive))
#define storage_present(drive) sd_present(IF_MV(drive)) #endif
#endif #elif (CONFIG_STORAGE & STORAGE_MMC)
#elif (CONFIG_STORAGE & STORAGE_MMC) #define storage_spindown mmc_spindown
#define storage_spindown mmc_spindown #define storage_sleep mmc_sleep
#define storage_sleep mmc_sleep #define storage_spin mmc_spin
#define storage_spin mmc_spin
#define storage_enable(on) mmc_enable(on)
#define storage_enable(on) mmc_enable(on) #define storage_sleepnow() mmc_sleepnow()
#define storage_sleepnow() mmc_sleepnow() #define storage_disk_is_active() mmc_disk_is_active()
#define storage_disk_is_active() mmc_disk_is_active() #define storage_soft_reset() (void)0
#define storage_soft_reset() (void)0 #define storage_init() mmc_init()
#define storage_init() mmc_init() #define storage_read_sectors(drive, start, count, buf) mmc_read_sectors(IF_MD2(drive,) start, count, buf)
#define storage_close() mmc_close() #define storage_write_sectors(drive, start, count, buf) mmc_write_sectors(IF_MD2(drive,) start, count, buf)
#define storage_read_sectors(drive, start, count, buf) mmc_read_sectors(IF_MV2(drive,) start, count, buf) #define storage_last_disk_activity() mmc_last_disk_activity()
#define storage_write_sectors(drive, start, count, buf) mmc_write_sectors(IF_MV2(drive,) start, count, buf) #define storage_spinup_time() 0
#define storage_last_disk_activity() mmc_last_disk_activity() #define storage_get_identify() mmc_get_identify()
#define storage_spinup_time() 0
#define storage_get_identify() mmc_get_identify() #ifdef STORAGE_GET_INFO
#define storage_get_info(drive, info) mmc_get_info(IF_MD2(drive,) info)
#ifdef STORAGE_GET_INFO #endif
#define storage_get_info(drive, info) mmc_get_info(IF_MV2(drive,) info) #ifdef HAVE_HOTSWAP
#endif #define storage_removable(drive) mmc_removable(IF_MD(drive))
#ifdef HAVE_HOTSWAP #define storage_present(drive) mmc_present(IF_MD(drive))
#define storage_removable(drive) mmc_removable(IF_MV(drive)) #endif
#define storage_present(drive) mmc_present(IF_MV(drive)) #elif (CONFIG_STORAGE & STORAGE_NAND)
#endif #define storage_spindown nand_spindown
#elif (CONFIG_STORAGE & STORAGE_NAND) #define storage_sleep nand_sleep
#define storage_spindown nand_spindown #define storage_spin nand_spin
#define storage_sleep nand_sleep
#define storage_spin nand_spin #define storage_enable(on) (void)0
#define storage_sleepnow() nand_sleepnow()
#define storage_enable(on) (void)0 #define storage_disk_is_active() 0
#define storage_sleepnow() nand_sleepnow() #define storage_soft_reset() (void)0
#define storage_disk_is_active() 0 #define storage_init() nand_init()
#define storage_soft_reset() (void)0 #define storage_read_sectors(drive, start, count, buf) nand_read_sectors(IF_MD2(drive,) start, count, buf)
#define storage_init() nand_init() #define storage_write_sectors(drive, start, count, buf) nand_write_sectors(IF_MD2(drive,) start, count, buf)
#define storage_close() nand_close() #define storage_last_disk_activity() nand_last_disk_activity()
#define storage_read_sectors(drive, start, count, buf) nand_read_sectors(IF_MV2(drive,) start, count, buf) #define storage_spinup_time() 0
#define storage_write_sectors(drive, start, count, buf) nand_write_sectors(IF_MV2(drive,) start, count, buf) #define storage_get_identify() nand_get_identify()
#define storage_last_disk_activity() nand_last_disk_activity()
#define storage_spinup_time() 0 #ifdef STORAGE_GET_INFO
#define storage_get_identify() nand_get_identify() #define storage_get_info(drive, info) nand_get_info(IF_MD2(drive,) info)
#endif
#ifdef STORAGE_GET_INFO #ifdef HAVE_HOTSWAP
#define storage_get_info(drive, info) nand_get_info(IF_MV2(drive,) info) #define storage_removable(drive) nand_removable(IF_MD(drive))
#endif #define storage_present(drive) nand_present(IF_MD(drive))
#ifdef HAVE_HOTSWAP #endif
#define storage_removable(drive) nand_removable(IF_MV(drive)) #elif (CONFIG_STORAGE & STORAGE_RAMDISK)
#define storage_present(drive) nand_present(IF_MV(drive)) #define storage_spindown ramdisk_spindown
#endif #define storage_sleep ramdisk_sleep
#elif (CONFIG_STORAGE & STORAGE_RAMDISK) #define storage_spin ramdisk_spin
#define storage_spindown ramdisk_spindown
#define storage_sleep ramdisk_sleep #define storage_enable(on) (void)0
#define storage_spin ramdisk_spin #define storage_sleepnow() ramdisk_sleepnow()
#define storage_disk_is_active() 0
#define storage_enable(on) (void)0 #define storage_soft_reset() (void)0
#define storage_sleepnow() ramdisk_sleepnow() #define storage_init() ramdisk_init()
#define storage_disk_is_active() 0 #define storage_read_sectors(drive, start, count, buf) ramdisk_read_sectors(IF_MD2(drive,) start, count, buf)
#define storage_soft_reset() (void)0 #define storage_write_sectors(drive, start, count, buf) ramdisk_write_sectors(IF_MD2(drive,) start, count, buf)
#define storage_init() ramdisk_init() #define storage_last_disk_activity() ramdisk_last_disk_activity()
#define storage_close() ramdisk_close() #define storage_spinup_time() 0
#define storage_read_sectors(drive, start, count, buf) ramdisk_read_sectors(IF_MV2(drive,) start, count, buf) #define storage_get_identify() ramdisk_get_identify()
#define storage_write_sectors(drive, start, count, buf) ramdisk_write_sectors(IF_MV2(drive,) start, count, buf)
#define storage_last_disk_activity() ramdisk_last_disk_activity() #ifdef STORAGE_GET_INFO
#define storage_spinup_time() 0 #define storage_get_info(drive, info) ramdisk_get_info(IF_MD2(drive,) info)
#define storage_get_identify() ramdisk_get_identify() #endif
#ifdef HAVE_HOTSWAP
#ifdef STORAGE_GET_INFO #define storage_removable(drive) ramdisk_removable(IF_MD(drive))
#define storage_get_info(drive, info) ramdisk_get_info(IF_MV2(drive,) info) #define storage_present(drive) ramdisk_present(IF_MD(drive))
#endif #endif
#ifdef HAVE_HOTSWAP #else
#define storage_removable(drive) ramdisk_removable(IF_MV(drive)) //#error No storage driver!
#define storage_present(drive) ramdisk_present(IF_MV(drive)) #endif
#endif #else /* NOT CONFIG_STORAGE_MULTI and NOT SIMULATOR*/
#else
//#error No storage driver! /* Simulator and multi-driver use normal functions */
#endif
#else /* NOT CONFIG_STORAGE_MULTI */
/* TODO : implement multi-driver here */
#error Multi-driver storage not implemented yet
#endif /* NOT CONFIG_STORAGE_MULTI */
#else /*NOT SIMULATOR */
void storage_enable(bool on); void storage_enable(bool on);
void storage_sleep(void); void storage_sleep(void);
void storage_sleepnow(void); void storage_sleepnow(void);
bool storage_disk_is_active(void); bool storage_disk_is_active(void);
int storage_soft_reset(void); int storage_soft_reset(void);
int storage_init(void); int storage_init(void);
void storage_close(void);
int storage_read_sectors(int drive, unsigned long start, int count, void* buf); int storage_read_sectors(int drive, unsigned long start, int count, void* buf);
int storage_write_sectors(int drive, unsigned long start, int count, const void* buf); int storage_write_sectors(int drive, unsigned long start, int count, const void* buf);
void storage_spin(void); void storage_spin(void);
void storage_spindown(int seconds); void storage_spindown(int seconds);
long storage_last_disk_activity(void); long storage_last_disk_activity(void);
int storage_spinup_time(void); int storage_spinup_time(void);
int storage_num_drives(void);
#ifdef STORAGE_GET_INFO #ifdef STORAGE_GET_INFO
void storage_get_info(int drive, struct storage_info *info); void storage_get_info(int drive, struct storage_info *info);
#endif #endif
@ -206,5 +199,6 @@ void storage_get_info(int drive, struct storage_info *info);
bool storage_removable(int drive); bool storage_removable(int drive);
bool storage_present(int drive); bool storage_present(int drive);
#endif #endif
#endif/*NOT SIMULATOR */
#endif /* NOT CONFIG_STORAGE_MULTI and NOT SIMULATOR*/
#endif #endif

545
firmware/storage.c Normal file
View file

@ -0,0 +1,545 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id: buffer.c 17847 2008-06-28 18:10:04Z bagder $
*
* Copyright (C) 2008 by Frank Gevaerts
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include "storage.h"
#define DRIVER_MASK 0xff000000
#define DRIVER_OFFSET 24
#define DRIVE_MASK 0x00ff0000
#define DRIVE_OFFSET 16
#define PARTITION_MASK 0x0000ff00
static unsigned int storage_drivers[NUM_DRIVES];
static unsigned int num_drives;
int storage_num_drives(void)
{
return num_drives;
}
int storage_init(void)
{
int rc=0;
int i;
num_drives=0;
#if (CONFIG_STORAGE & STORAGE_ATA)
if ((rc=ata_init())) return rc;
int ata_drives = ata_num_drives(num_drives);
for (i=0; i<ata_drives; i++)
{
storage_drivers[num_drives++] =
(STORAGE_ATA<<DRIVER_OFFSET) | (i << DRIVE_OFFSET);
}
#endif
#if (CONFIG_STORAGE & STORAGE_MMC)
if ((rc=mmc_init())) return rc;
int mmc_drives = mmc_num_drives(num_drives);
for (i=0; i<mmc_drives ;i++)
{
storage_drivers[num_drives++] =
(STORAGE_MMC<<DRIVER_OFFSET) | (i << DRIVE_OFFSET);
}
#endif
#if (CONFIG_STORAGE & STORAGE_SD)
if ((rc=sd_init())) return rc;
int sd_drives = sd_num_drives(num_drives);
for (i=0; i<sd_drives; i++)
{
storage_drivers[num_drives++] =
(STORAGE_SD<<DRIVER_OFFSET) | (i << DRIVE_OFFSET);
}
#endif
#if (CONFIG_STORAGE & STORAGE_NAND)
if ((rc=nand_init())) return rc;
int nand_drives = nand_num_drives(num_drives);
for (i=0; i<nand_drives; i++)
{
storage_drivers[num_drives++] =
(STORAGE_NAND<<DRIVER_OFFSET) | (i << DRIVE_OFFSET);
}
#endif
#if (CONFIG_STORAGE & STORAGE_RAMDISK)
if ((rc=ramdisk_init())) return rc;
int ramdisk_drives = ramdisk_num_drives(num_drives);
for (i=0; i<ramdisk_drives; i++)
{
storage_drivers[num_drives++] =
(STORAGE_RAMDISK<<DRIVER_OFFSET) | (i << DRIVE_OFFSET);
}
#endif
return 0;
}
int storage_read_sectors(int drive, unsigned long start, int count,
void* buf)
{
int driver=(storage_drivers[drive] & DRIVER_MASK)>>DRIVER_OFFSET;
int ldrive=(storage_drivers[drive] & DRIVE_MASK)>>DRIVE_OFFSET;
switch (driver)
{
#if (CONFIG_STORAGE & STORAGE_ATA)
case STORAGE_ATA:
return ata_read_sectors(ldrive,start,count,buf);
#endif
#if (CONFIG_STORAGE & STORAGE_MMC)
case STORAGE_MMC:
return mmc_read_sectors(ldrive,start,count,buf);
#endif
#if (CONFIG_STORAGE & STORAGE_SD)
case STORAGE_SD:
return sd_read_sectors(ldrive,start,count,buf);
#endif
#if (CONFIG_STORAGE & STORAGE_NAND)
case STORAGE_NAND:
return nand_read_sectors(ldrive,start,count,buf);
#endif
#if (CONFIG_STORAGE & STORAGE_RAMDISK)
case STORAGE_RAMDISK:
return ramdisk_read_sectors(ldrive,start,count,buf);
#endif
}
return -1;
}
int storage_write_sectors(int drive, unsigned long start, int count,
const void* buf)
{
int driver=(storage_drivers[drive] & DRIVER_MASK)>>DRIVER_OFFSET;
int ldrive=(storage_drivers[drive] & DRIVE_MASK)>>DRIVE_OFFSET;
switch (driver)
{
#if (CONFIG_STORAGE & STORAGE_ATA)
case STORAGE_ATA:
return ata_write_sectors(ldrive,start,count,buf);
#endif
#if (CONFIG_STORAGE & STORAGE_MMC)
case STORAGE_MMC:
return mmc_write_sectors(ldrive,start,count,buf);
#endif
#if (CONFIG_STORAGE & STORAGE_SD)
case STORAGE_SD:
return sd_write_sectors(ldrive,start,count,buf);
#endif
#if (CONFIG_STORAGE & STORAGE_NAND)
case STORAGE_NAND:
return nand_write_sectors(ldrive,start,count,buf);
#endif
#if (CONFIG_STORAGE & STORAGE_RAMDISK)
case STORAGE_RAMDISK:
return ramdisk_write_sectors(ldrive,start,count,buf);
#endif
}
return -1;
}
void storage_enable(bool on)
{
#if (CONFIG_STORAGE & STORAGE_ATA)
ata_enable(on);
#endif
#if (CONFIG_STORAGE & STORAGE_MMC)
mmc_enable(on);
#endif
#if (CONFIG_STORAGE & STORAGE_SD)
sd_enable(on);
#endif
#if (CONFIG_STORAGE & STORAGE_NAND)
nand_enable(on);
#endif
#if (CONFIG_STORAGE & STORAGE_RAMDISK)
ramdisk_enable(on);
#endif
}
void storage_sleep(void)
{
#if (CONFIG_STORAGE & STORAGE_ATA)
ata_sleep();
#endif
#if (CONFIG_STORAGE & STORAGE_MMC)
mmc_sleep();
#endif
#if (CONFIG_STORAGE & STORAGE_SD)
sd_sleep();
#endif
#if (CONFIG_STORAGE & STORAGE_NAND)
nand_sleep();
#endif
#if (CONFIG_STORAGE & STORAGE_RAMDISK)
ramdisk_sleep();
#endif
}
void storage_sleepnow(void)
{
#if (CONFIG_STORAGE & STORAGE_ATA)
ata_sleepnow();
#endif
#if (CONFIG_STORAGE & STORAGE_MMC)
mmc_sleepnow();
#endif
#if (CONFIG_STORAGE & STORAGE_SD)
//sd_sleepnow();
#endif
#if (CONFIG_STORAGE & STORAGE_NAND)
nand_sleepnow();
#endif
#if (CONFIG_STORAGE & STORAGE_RAMDISK)
ramdisk_sleepnow();
#endif
}
bool storage_disk_is_active(void)
{
#if (CONFIG_STORAGE & STORAGE_ATA)
if (ata_disk_is_active()) return true;
#endif
#if (CONFIG_STORAGE & STORAGE_MMC)
if (mmc_disk_is_active()) return true;
#endif
#if (CONFIG_STORAGE & STORAGE_SD)
//if (sd_disk_is_active()) return true;
#endif
#if (CONFIG_STORAGE & STORAGE_NAND)
if (nand_disk_is_active()) return true;
#endif
#if (CONFIG_STORAGE & STORAGE_RAMDISK)
if (ramdisk_disk_is_active()) return true;
#endif
return false;
}
int storage_soft_reset(void)
{
int rc=0;
#if (CONFIG_STORAGE & STORAGE_ATA)
if ((rc=ata_soft_reset())) return rc;
#endif
#if (CONFIG_STORAGE & STORAGE_MMC)
if ((rc=mmc_soft_reset())) return rc;
#endif
#if (CONFIG_STORAGE & STORAGE_SD)
//if ((rc=sd_soft_reset())) return rc;
#endif
#if (CONFIG_STORAGE & STORAGE_NAND)
if ((rc=nand_soft_reset())) return rc;
#endif
#if (CONFIG_STORAGE & STORAGE_RAMDISK)
if ((rc=ramdisk_soft_reset())) return rc;
#endif
return 0;
}
void storage_spin(void)
{
#if (CONFIG_STORAGE & STORAGE_ATA)
ata_spin();
#endif
#if (CONFIG_STORAGE & STORAGE_MMC)
mmc_spin();
#endif
#if (CONFIG_STORAGE & STORAGE_SD)
sd_spin();
#endif
#if (CONFIG_STORAGE & STORAGE_NAND)
nand_spin();
#endif
#if (CONFIG_STORAGE & STORAGE_RAMDISK)
ramdisk_spin();
#endif
}
void storage_spindown(int seconds)
{
#if (CONFIG_STORAGE & STORAGE_ATA)
ata_spindown(seconds);
#endif
#if (CONFIG_STORAGE & STORAGE_MMC)
mmc_spindown(seconds);
#endif
#if (CONFIG_STORAGE & STORAGE_SD)
sd_spindown(seconds);
#endif
#if (CONFIG_STORAGE & STORAGE_NAND)
nand_spindown(seconds);
#endif
#if (CONFIG_STORAGE & STORAGE_RAMDISK)
ramdisk_spindown(seconds);
#endif
}
#if (CONFIG_LED == LED_REAL)
void storage_set_led_enabled(bool enabled)
{
#if (CONFIG_STORAGE & STORAGE_ATA)
ata_set_led_enabled(enabled);
#endif
#if (CONFIG_STORAGE & STORAGE_MMC)
mmc_set_led_enabled(enabled);
#endif
#if (CONFIG_STORAGE & STORAGE_SD)
sd_set_led_enabled(enabled);
#endif
#if (CONFIG_STORAGE & STORAGE_NAND)
nand_set_led_enabled(enabled);
#endif
#if (CONFIG_STORAGE & STORAGE_RAMDISK)
ramdisk_set_led_enabled(enabled);
#endif
}
#endif /* CONFIG_LED == LED_REAL */
long storage_last_disk_activity(void)
{
long max=0;
long t;
#if (CONFIG_STORAGE & STORAGE_ATA)
t=ata_last_disk_activity();
if (t>max) max=t;
#endif
#if (CONFIG_STORAGE & STORAGE_MMC)
t=mmc_last_disk_activity();
if (t>max) max=t;
#endif
#if (CONFIG_STORAGE & STORAGE_SD)
t=sd_last_disk_activity();
if (t>max) max=t;
#endif
#if (CONFIG_STORAGE & STORAGE_NAND)
t=nand_last_disk_activity();
if (t>max) max=t;
#endif
#if (CONFIG_STORAGE & STORAGE_RAMDISK)
t=ramdisk_last_disk_activity();
if (t>max) max=t;
#endif
return max;
}
int storage_spinup_time(void)
{
int max=0;
int t;
#if (CONFIG_STORAGE & STORAGE_ATA)
t=ata_spinup_time();
if (t>max) max=t;
#endif
#if (CONFIG_STORAGE & STORAGE_MMC)
t=mmc_spinup_time();
if (t>max) max=t;
#endif
#if (CONFIG_STORAGE & STORAGE_SD)
//t=sd_spinup_time();
//if (t>max) max=t;
#endif
#if (CONFIG_STORAGE & STORAGE_NAND)
t=nand_spinup_time();
if (t>max) max=t;
#endif
#if (CONFIG_STORAGE & STORAGE_RAMDISK)
t=ramdisk_spinup_time();
if (t>max) max=t;
#endif
return max;
}
#ifdef STORAGE_GET_INFO
void storage_get_info(int drive, struct storage_info *info)
{
int driver=(storage_drivers[drive] & DRIVER_MASK)>>DRIVER_OFFSET;
int ldrive=(storage_drivers[drive] & DRIVE_MASK)>>DRIVE_OFFSET;
switch(driver)
{
#if (CONFIG_STORAGE & STORAGE_ATA)
case STORAGE_ATA:
return ata_get_info(ldrive,info);
#endif
#if (CONFIG_STORAGE & STORAGE_MMC)
case STORAGE_MMC:
return mmc_get_info(ldrive,info);
#endif
#if (CONFIG_STORAGE & STORAGE_SD)
case STORAGE_SD:
return sd_get_info(ldrive,info);
#endif
#if (CONFIG_STORAGE & STORAGE_NAND)
case STORAGE_NAND:
return nand_get_info(ldrive,info);
#endif
#if (CONFIG_STORAGE & STORAGE_RAMDISK)
case STORAGE_RAMDISK:
return ramdisk_get_info(ldrive,info);
#endif
}
}
#endif /* STORAGE_GET_INFO */
#ifdef HAVE_HOTSWAP
bool storage_removable(int drive)
{
bool ret = false;
int driver=(storage_drivers[drive] & DRIVER_MASK)>>DRIVER_OFFSET;
int ldrive=(storage_drivers[drive] & DRIVE_MASK)>>DRIVE_OFFSET;
switch(driver)
{
#if (CONFIG_STORAGE & STORAGE_ATA)
case STORAGE_ATA:
ret = ata_removable(ldrive);
#endif
#if (CONFIG_STORAGE & STORAGE_MMC)
case STORAGE_MMC:
ret = mmc_removable(ldrive);
#endif
#if (CONFIG_STORAGE & STORAGE_SD)
case STORAGE_SD:
ret = sd_removable(ldrive);
#endif
#if (CONFIG_STORAGE & STORAGE_NAND)
case STORAGE_NAND:
ret = false;
#endif
#if (CONFIG_STORAGE & STORAGE_RAMDISK)
case STORAGE_RAMDISK:
ret = false;
#endif
}
return ret;
}
bool storage_present(int drive)
{
bool ret = false;
int driver=(storage_drivers[drive] & DRIVER_MASK)>>DRIVER_OFFSET;
int ldrive=(storage_drivers[drive] & DRIVE_MASK)>>DRIVE_OFFSET;
switch(driver)
{
#if (CONFIG_STORAGE & STORAGE_ATA)
case STORAGE_ATA:
ret = ata_present(ldrive);
#endif
#if (CONFIG_STORAGE & STORAGE_MMC)
case STORAGE_MMC:
ret = mmc_present(ldrive);
#endif
#if (CONFIG_STORAGE & STORAGE_SD)
case STORAGE_SD:
ret = sd_present(ldrive);
#endif
#if (CONFIG_STORAGE & STORAGE_NAND)
case STORAGE_NAND:
ret = true;
#endif
#if (CONFIG_STORAGE & STORAGE_RAMDISK)
case STORAGE_RAMDISK:
ret = true;
#endif
}
return ret;
}
#endif

View file

@ -24,7 +24,7 @@
/* TODO: Find the real capacity of >2GB models (will be useful for USB) */ /* TODO: Find the real capacity of >2GB models (will be useful for USB) */
#include "config.h" /* for HAVE_MULTIVOLUME & AMS_OF_SIZE */ #include "config.h" /* for HAVE_MULTIDRIVE & AMS_OF_SIZE */
#include "fat.h" #include "fat.h"
#include "thread.h" #include "thread.h"
#include "led.h" #include "led.h"
@ -88,9 +88,9 @@
#define INTERNAL_AS3525 0 /* embedded SD card */ #define INTERNAL_AS3525 0 /* embedded SD card */
#define SD_SLOT_AS3525 1 /* SD slot if present */ #define SD_SLOT_AS3525 1 /* SD slot if present */
static const int pl180_base[NUM_VOLUMES] = { static const int pl180_base[NUM_DRIVES] = {
NAND_FLASH_BASE NAND_FLASH_BASE
#ifdef HAVE_MULTIVOLUME #ifdef HAVE_MULTIDRIVE
, SD_MCI_BASE , SD_MCI_BASE
#endif #endif
}; };
@ -101,7 +101,7 @@ static void init_pl180_controller(const int drive);
#define SECTOR_SIZE 512 /* XXX: different sector sizes ? */ #define SECTOR_SIZE 512 /* XXX: different sector sizes ? */
#define BLOCKS_PER_BANK 0x7a7800 #define BLOCKS_PER_BANK 0x7a7800
static tCardInfo card_info[NUM_VOLUMES]; static tCardInfo card_info[NUM_DRIVES];
/* maximum timeouts recommanded in the SD Specification v2.00 */ /* maximum timeouts recommanded in the SD Specification v2.00 */
#define SD_MAX_READ_TIMEOUT ((AS3525_PCLK_FREQ) / 1000 * 100) /* 100 ms */ #define SD_MAX_READ_TIMEOUT ((AS3525_PCLK_FREQ) / 1000 * 100) /* 100 ms */
@ -169,7 +169,7 @@ void INT_NAND(void)
MCI_CLEAR(INTERNAL_AS3525) = status; MCI_CLEAR(INTERNAL_AS3525) = status;
} }
#ifdef HAVE_MULTIVOLUME #ifdef HAVE_MULTIDRIVE
void INT_MCI0(void) void INT_MCI0(void)
{ {
const int status = MCI_STATUS(SD_SLOT_AS3525); const int status = MCI_STATUS(SD_SLOT_AS3525);
@ -436,7 +436,7 @@ static void init_pl180_controller(const int drive)
MCI_MASK0(drive) = MCI_MASK1(drive) = MCI_ERROR | MCI_DATA_END; MCI_MASK0(drive) = MCI_MASK1(drive) = MCI_ERROR | MCI_DATA_END;
#ifdef HAVE_MULTIVOLUME #ifdef HAVE_MULTIDRIVE
VIC_INT_ENABLE |= VIC_INT_ENABLE |=
(drive == INTERNAL_AS3525) ? INTERRUPT_NAND : INTERRUPT_MCI0; (drive == INTERNAL_AS3525) ? INTERRUPT_NAND : INTERRUPT_MCI0;
@ -478,7 +478,7 @@ int sd_init(void)
CGU_PERI |= CGU_NAF_CLOCK_ENABLE; CGU_PERI |= CGU_NAF_CLOCK_ENABLE;
#ifdef HAVE_MULTIVOLUME #ifdef HAVE_MULTIDRIVE
CGU_PERI |= CGU_MCI_CLOCK_ENABLE; CGU_PERI |= CGU_MCI_CLOCK_ENABLE;
CCU_IO &= ~(1<<3); /* bits 3:2 = 01, xpd is SD interface */ CCU_IO &= ~(1<<3); /* bits 3:2 = 01, xpd is SD interface */
CCU_IO |= (1<<2); CCU_IO |= (1<<2);
@ -490,7 +490,7 @@ int sd_init(void)
ret = sd_init_card(INTERNAL_AS3525); ret = sd_init_card(INTERNAL_AS3525);
if(ret < 0) if(ret < 0)
return ret; return ret;
#ifdef HAVE_MULTIVOLUME #ifdef HAVE_MULTIDRIVE
init_pl180_controller(SD_SLOT_AS3525); init_pl180_controller(SD_SLOT_AS3525);
#endif #endif
@ -509,17 +509,17 @@ int sd_init(void)
} }
#ifdef HAVE_HOTSWAP #ifdef HAVE_HOTSWAP
bool sd_removable(IF_MV_NONVOID(int drive)) bool sd_removable(IF_MD_NONVOID(int drive))
{ {
#ifndef HAVE_MULTIVOLUME #ifndef HAVE_MULTIDRIVE
const int drive=0; const int drive=0;
#endif #endif
return (drive==1); return (drive==1);
} }
bool sd_present(IF_MV_NONVOID(int drive)) bool sd_present(IF_MD_NONVOID(int drive))
{ {
#ifndef HAVE_MULTIVOLUME #ifndef HAVE_MULTIDRIVE
const int drive=0; const int drive=0;
#endif #endif
return (card_info[drive].initialized && card_info[drive].numblocks > 0); return (card_info[drive].initialized && card_info[drive].numblocks > 0);
@ -619,10 +619,10 @@ static int sd_select_bank(signed char bank)
return 0; return 0;
} }
static int sd_transfer_sectors(IF_MV2(int drive,) unsigned long start, static int sd_transfer_sectors(IF_MD2(int drive,) unsigned long start,
int count, void* buf, const bool write) int count, void* buf, const bool write)
{ {
#ifndef HAVE_MULTIVOLUME #ifndef HAVE_MULTIDRIVE
const int drive = 0; const int drive = 0;
#endif #endif
int ret = 0; int ret = 0;
@ -774,18 +774,18 @@ sd_transfer_error:
return ret; return ret;
} }
int sd_read_sectors(IF_MV2(int drive,) unsigned long start, int count, int sd_read_sectors(IF_MD2(int drive,) unsigned long start, int count,
void* buf) void* buf)
{ {
return sd_transfer_sectors(IF_MV2(drive,) start, count, buf, false); return sd_transfer_sectors(IF_MD2(drive,) start, count, buf, false);
} }
int sd_write_sectors(IF_MV2(int drive,) unsigned long start, int count, int sd_write_sectors(IF_MD2(int drive,) unsigned long start, int count,
const void* buf) const void* buf)
{ {
#ifdef BOOTLOADER /* we don't need write support in bootloader */ #ifdef BOOTLOADER /* we don't need write support in bootloader */
#ifdef HAVE_MULTIVOLUME #ifdef HAVE_MULTIDRIVE
(void) drive; (void) drive;
#endif #endif
(void) start; (void) start;
@ -793,7 +793,7 @@ int sd_write_sectors(IF_MV2(int drive,) unsigned long start, int count,
(void) buf; (void) buf;
return -1; return -1;
#else #else
return sd_transfer_sectors(IF_MV2(drive,) start, count, (void*)buf, true); return sd_transfer_sectors(IF_MD2(drive,) start, count, (void*)buf, true);
#endif #endif
} }
@ -807,7 +807,7 @@ void sd_enable(bool on)
{ {
/* buttonlight AMSes need a bit of special handling for the buttonlight here, /* buttonlight AMSes need a bit of special handling for the buttonlight here,
* due to the dual mapping of GPIOD and XPD */ * due to the dual mapping of GPIOD and XPD */
#if defined(HAVE_BUTTON_LIGHT) && defined(HAVE_MULTIVOLUME) #if defined(HAVE_BUTTON_LIGHT) && defined(HAVE_MULTIDRIVE)
extern int buttonlight_is_on; extern int buttonlight_is_on;
#endif #endif
if (sd_enabled == on) if (sd_enabled == on)
@ -815,7 +815,7 @@ void sd_enable(bool on)
if(on) if(on)
{ {
CGU_PERI |= CGU_NAF_CLOCK_ENABLE; CGU_PERI |= CGU_NAF_CLOCK_ENABLE;
#ifdef HAVE_MULTIVOLUME #ifdef HAVE_MULTIDRIVE
CGU_PERI |= CGU_MCI_CLOCK_ENABLE; CGU_PERI |= CGU_MCI_CLOCK_ENABLE;
#ifdef HAVE_BUTTON_LIGHT #ifdef HAVE_BUTTON_LIGHT
CCU_IO |= (1<<2); CCU_IO |= (1<<2);
@ -832,7 +832,7 @@ void sd_enable(bool on)
else else
{ {
CGU_PERI &= ~CGU_NAF_CLOCK_ENABLE; CGU_PERI &= ~CGU_NAF_CLOCK_ENABLE;
#ifdef HAVE_MULTIVOLUME #ifdef HAVE_MULTIDRIVE
#ifdef HAVE_BUTTON_LIGHT #ifdef HAVE_BUTTON_LIGHT
CCU_IO &= ~(1<<2); CCU_IO &= ~(1<<2);
if (buttonlight_is_on) if (buttonlight_is_on)
@ -882,3 +882,17 @@ void card_enable_monitoring_target(bool on)
#endif #endif
#endif /* BOOTLOADER */ #endif /* BOOTLOADER */
#ifdef CONFIG_STORAGE_MULTI
int sd_num_drives(int first_drive)
{
/* We don't care which logical drive number(s) we have been assigned */
(void)first_drive;
#ifdef HAVE_MULTIDRIVE
return 2;
#else
return 1;
#endif
}
#endif

View file

@ -696,10 +696,10 @@ static void read_inplace_writes_cache(int bank, int phys_segment)
} }
int nand_read_sectors(IF_MV2(int drive,) unsigned long start, int incount, int nand_read_sectors(IF_MD2(int drive,) unsigned long start, int incount,
void* inbuf) void* inbuf)
{ {
#ifdef HAVE_MULTIVOLUME #ifdef HAVE_MULTIDRIVE
(void)drive; /* unused for now */ (void)drive; /* unused for now */
#endif #endif
@ -753,11 +753,10 @@ nand_read_error:
return ret; return ret;
} }
int nand_write_sectors(IF_MD2(int drive,) unsigned long start, int count,
int nand_write_sectors(IF_MV2(int drive,) unsigned long start, int count,
const void* outbuf) const void* outbuf)
{ {
#ifdef HAVE_MULTIVOLUME #ifdef HAVE_MULTIDRIVE
(void)drive; /* unused for now */ (void)drive; /* unused for now */
#endif #endif
@ -770,8 +769,12 @@ int nand_write_sectors(IF_MV2(int drive,) unsigned long start, int count,
#ifdef STORAGE_GET_INFO #ifdef STORAGE_GET_INFO
void nand_get_info(struct storage_info *info) void nand_get_info(IF_MD2(int drive,) struct storage_info *info)
{ {
#ifdef HAVE_MULTIDRIVE
(void)drive; /* unused for now */
#endif
/* firmware version */ /* firmware version */
info->revision="0.00"; info->revision="0.00";
@ -913,3 +916,39 @@ void nand_spindown(int seconds)
{ {
(void)seconds; (void)seconds;
} }
#ifdef CONFIG_STORAGE_MULTI
int nand_num_drives(int first_drive)
{
/* We don't care which logical drive number we have been assigned */
(void)first_drive;
return 1;
}
void nand_sleepnow(void)
{
}
bool nand_disk_is_active(void)
{
return false;
}
int nand_soft_reset(void)
{
return 0;
}
int nand_spinup_time(void)
{
return 0;
}
void nand_enable(bool onoff)
{
(void)onoff;
}
#endif /* CONFIG_STORAGE_MULTI */

View file

@ -18,7 +18,7 @@
* KIND, either express or implied. * KIND, either express or implied.
* *
****************************************************************************/ ****************************************************************************/
#include "config.h" /* for HAVE_MULTIVOLUME */ #include "config.h" /* for HAVE_MULTIDRIVE */
#include "fat.h" #include "fat.h"
#include "hotswap.h" #include "hotswap.h"
#ifdef HAVE_HOTSWAP #ifdef HAVE_HOTSWAP
@ -166,10 +166,10 @@ struct sd_card_status
int retry_max; int retry_max;
}; };
static struct sd_card_status sd_status[NUM_VOLUMES] = static struct sd_card_status sd_status[NUM_DRIVES] =
{ {
{ 0, 1 }, { 0, 1 },
#ifdef HAVE_MULTIVOLUME #ifdef HAVE_MULTIDRIVE
{ 0, 10 } { 0, 10 }
#endif #endif
}; };
@ -839,10 +839,10 @@ static void sd_select_device(int card_no)
/* API Functions */ /* API Functions */
int sd_read_sectors(IF_MV2(int drive,) unsigned long start, int incount, int sd_read_sectors(IF_MD2(int drive,) unsigned long start, int incount,
void* inbuf) void* inbuf)
{ {
#ifndef HAVE_MULTIVOLUME #ifndef HAVE_MULTIDRIVE
const int drive = 0; const int drive = 0;
#endif #endif
int ret; int ret;
@ -956,13 +956,13 @@ sd_read_error:
} }
} }
int sd_write_sectors(IF_MV2(int drive,) unsigned long start, int count, int sd_write_sectors(IF_MD2(int drive,) unsigned long start, int count,
const void* outbuf) const void* outbuf)
{ {
/* Write support is not finished yet */ /* Write support is not finished yet */
/* TODO: The standard suggests using ACMD23 prior to writing multiple blocks /* TODO: The standard suggests using ACMD23 prior to writing multiple blocks
to improve performance */ to improve performance */
#ifndef HAVE_MULTIVOLUME #ifndef HAVE_MULTIDRIVE
const int drive = 0; const int drive = 0;
#endif #endif
int ret; int ret;
@ -1330,19 +1330,33 @@ long sd_last_disk_activity(void)
} }
#ifdef HAVE_HOTSWAP #ifdef HAVE_HOTSWAP
bool sd_removable(IF_MV_NONVOID(int drive)) bool sd_removable(IF_MD_NONVOID(int drive))
{ {
#ifndef HAVE_MULTIVOLUME #ifndef HAVE_MULTIDRIVE
const int drive=0; const int drive=0;
#endif #endif
return (drive==1); return (drive==1);
} }
bool sd_present(IF_MV_NONVOID(int drive)) bool sd_present(IF_MD_NONVOID(int drive))
{ {
#ifndef HAVE_MULTIVOLUME #ifndef HAVE_MULTIDRIVE
const int drive=0; const int drive=0;
#endif #endif
return (card_info[drive].initialized && card_info[drive].numblocks > 0); return (card_info[drive].initialized && card_info[drive].numblocks > 0);
} }
#endif #endif
#ifdef CONFIG_STORAGE_MULTI
int sd_num_drives(int first_drive)
{
/* We don't care which logical drive number(s) we have been assigned */
(void)first_drive;
#ifdef HAVE_MULTIDRIVE
return 2;
#else
return 1;
#endif
}
#endif

View file

@ -46,7 +46,7 @@ void nand_led(bool onoff)
led(onoff); led(onoff);
} }
int nand_read_sectors(IF_MV2(int drive,) unsigned long start, int incount, int nand_read_sectors(IF_MD2(int drive,) unsigned long start, int incount,
void* inbuf) void* inbuf)
{ {
(void)start; (void)start;
@ -55,7 +55,7 @@ int nand_read_sectors(IF_MV2(int drive,) unsigned long start, int incount,
return 0; return 0;
} }
int nand_write_sectors(IF_MV2(int drive,) unsigned long start, int count, int nand_write_sectors(IF_MD2(int drive,) unsigned long start, int count,
const void* outbuf) const void* outbuf)
{ {
(void)start; (void)start;
@ -82,7 +82,7 @@ void nand_enable(bool on)
(void)on; (void)on;
} }
void nand_get_info(IF_MV2(int drive,) struct storage_info *info) void nand_get_info(IF_MD2(int drive,) struct storage_info *info)
{ {
(void)info; (void)info;
} }
@ -98,3 +98,12 @@ int nand_init(void)
return 0; return 0;
} }
#ifdef CONFIG_STORAGE_MULTI
int nand_num_drives(int first_drive)
{
/* We don't care which logical drive number(s) we have been assigned */
(void)first_drive;
return 1;
}
#endif

View file

@ -125,8 +125,8 @@ void GIO2(void)
#define VFAT_SECTOR_SIZE(x) ( (x)/0x8000 ) /* 1GB array requires 80kB of RAM */ #define VFAT_SECTOR_SIZE(x) ( (x)/0x8000 ) /* 1GB array requires 80kB of RAM */
extern int ata_read_sectors(IF_MV2(int drive,) unsigned long start, int count, void* buf); extern int ata_read_sectors(IF_MD2(int drive,) unsigned long start, int count, void* buf);
extern int ata_write_sectors(IF_MV2(int drive,) unsigned long start, int count, const void* buf); extern int ata_write_sectors(IF_MD2(int drive,) unsigned long start, int count, const void* buf);
struct main_header struct main_header
{ {
@ -378,14 +378,14 @@ static inline unsigned long map_sector(unsigned long sector)
return cfs_start+sectors[sector/64]*64+sector%64; return cfs_start+sectors[sector/64]*64+sector%64;
} }
int ata_read_sectors(IF_MV2(int drive,) unsigned long start, int count, void* buf) int ata_read_sectors(IF_MD2(int drive,) unsigned long start, int count, void* buf)
{ {
if(!cfs_inited) if(!cfs_inited)
cfs_init(); cfs_init();
/* Check if count is lesser than or equal to 1 native CFS sector */ /* Check if count is lesser than or equal to 1 native CFS sector */
if(count <= 64) if(count <= 64)
return _ata_read_sectors(IF_MV2(drive,) map_sector(start), count, buf); return _ata_read_sectors(IF_MD2(drive,) map_sector(start), count, buf);
else else
{ {
int i, ret; int i, ret;
@ -394,7 +394,7 @@ int ata_read_sectors(IF_MV2(int drive,) unsigned long start, int count, void* bu
/* Read sectors in parts of 0x8000 */ /* Read sectors in parts of 0x8000 */
for(i=0; i<count; i+=64) for(i=0; i<count; i+=64)
{ {
ret = _ata_read_sectors(IF_MV2(drive,) map_sector(start+i), (count-i >= 64 ? 64 : count-i), (void*)dest); ret = _ata_read_sectors(IF_MD2(drive,) map_sector(start+i), (count-i >= 64 ? 64 : count-i), (void*)dest);
if(ret != 0) if(ret != 0)
return ret; return ret;
@ -405,7 +405,7 @@ int ata_read_sectors(IF_MV2(int drive,) unsigned long start, int count, void* bu
} }
} }
int ata_write_sectors(IF_MV2(int drive,) unsigned long start, int count, const void* buf) int ata_write_sectors(IF_MD2(int drive,) unsigned long start, int count, const void* buf)
{ {
if(!cfs_inited) if(!cfs_inited)
cfs_init(); cfs_init();
@ -413,7 +413,7 @@ int ata_write_sectors(IF_MV2(int drive,) unsigned long start, int count, const v
#if 0 /* Disabled for now */ #if 0 /* Disabled for now */
/* Check if count is lesser than or equal to 1 native CFS sector */ /* Check if count is lesser than or equal to 1 native CFS sector */
if(count <= 64) if(count <= 64)
return _ata_write_sectors(IF_MV2(drive,) map_sector(start), count, buf); return _ata_write_sectors(IF_MD2(drive,) map_sector(start), count, buf);
else else
{ {
int i, ret; int i, ret;
@ -422,7 +422,7 @@ int ata_write_sectors(IF_MV2(int drive,) unsigned long start, int count, const v
/* Read sectors in parts of 0x8000 */ /* Read sectors in parts of 0x8000 */
for(i=0; i<count; i+=64) for(i=0; i<count; i+=64)
{ {
ret = _ata_write_sectors(IF_MV2(drive,) map_sector(start+i), (count-i >= 64 ? 64 : count-i), (const void*)dest); ret = _ata_write_sectors(IF_MD2(drive,) map_sector(start+i), (count-i >= 64 ? 64 : count-i), (const void*)dest);
if(ret != 0) if(ret != 0)
return ret; return ret;

View file

@ -38,8 +38,8 @@ void copy_write_sectors(const unsigned char* buf, int wordcount);
/* Nasty hack, but Creative is nasty... */ /* Nasty hack, but Creative is nasty... */
#define ata_read_sectors _ata_read_sectors #define ata_read_sectors _ata_read_sectors
#define ata_write_sectors _ata_write_sectors #define ata_write_sectors _ata_write_sectors
extern int _ata_read_sectors(IF_MV2(int drive,) unsigned long start, int count, void* buf); extern int _ata_read_sectors(IF_MD2(int drive,) unsigned long start, int count, void* buf);
extern int _ata_write_sectors(IF_MV2(int drive,) unsigned long start, int count, const void* buf); extern int _ata_write_sectors(IF_MD2(int drive,) unsigned long start, int count, const void* buf);
/* General purpose memory region #1 */ /* General purpose memory region #1 */
#define ATA_IOBASE 0x50FEE000 #define ATA_IOBASE 0x50FEE000

View file

@ -707,6 +707,21 @@ void nand_enable(bool on)
(void)on; (void)on;
} }
/* TODO */
long nand_last_disk_activity(void)
{
return 0;
}
int nand_spinup_time(void)
{
return 0;
}
void nand_sleepnow(void)
{
}
#ifdef STORAGE_GET_INFO #ifdef STORAGE_GET_INFO
void nand_get_info(IF_MV2(int drive,) struct storage_info *info) void nand_get_info(IF_MV2(int drive,) struct storage_info *info)
{ {
@ -725,3 +740,13 @@ void nand_get_info(IF_MV2(int drive,) struct storage_info *info)
info->sector_size = 512; info->sector_size = 512;
} }
#endif #endif
#ifdef CONFIG_STORAGE_MULTI
int nand_num_drives(int first_drive)
{
/* We don't care which logical drive number(s) we have been assigned */
(void)first_drive;
return 1;
}
#endif

View file

@ -1328,6 +1328,31 @@ long sd_last_disk_activity(void)
return last_disk_activity; return last_disk_activity;
} }
int sd_spinup_time(void)
{
return 0;
}
void sd_enable(bool on)
{
(void)on;
}
void sd_sleepnow(void)
{
}
/* TODO */
bool sd_disk_is_active(void)
{
return false;
}
int sd_soft_reset(void)
{
return 0;
}
#ifdef HAVE_HOTSWAP #ifdef HAVE_HOTSWAP
bool sd_removable(IF_MV_NONVOID(int drive)) bool sd_removable(IF_MV_NONVOID(int drive))
{ {
@ -1346,3 +1371,13 @@ bool sd_present(IF_MV_NONVOID(int drive))
#endif #endif
return (card.numblocks > 0 && card_detect_target()); return (card.numblocks > 0 && card_detect_target());
} }
#ifdef CONFIG_STORAGE_MULTI
int sd_num_drives(int first_drive)
{
/* We don't care which logical drive number(s) we have been assigned */
(void)first_drive;
return 1;
}
#endif

View file

@ -696,7 +696,7 @@ int main(int argc, char *argv[])
#endif #endif
) { ) {
DEBUGF("*** Mounting at block %ld\n",pinfo[i].start); DEBUGF("*** Mounting at block %ld\n",pinfo[i].start);
rc = fat_mount(IF_MV2(0,) IF_MV2(0,) pinfo[i].start); rc = fat_mount(IF_MV2(0,) IF_MD2(0,) pinfo[i].start);
if(rc) { if(rc) {
DEBUGF("mount: %d",rc); DEBUGF("mount: %d",rc);
return -1; return -1;
@ -705,7 +705,7 @@ int main(int argc, char *argv[])
} }
} }
if ( i==4 ) { if ( i==4 ) {
if(fat_mount(IF_MV2(0,) IF_MV2(0,) 0)) { if(fat_mount(IF_MV2(0,) IF_MD2(0,) 0)) {
DEBUGF("No FAT32 partition!"); DEBUGF("No FAT32 partition!");
return -1; return -1;
} }

View file

@ -642,7 +642,7 @@ int main(void)
i = fat_mount(IF_MV2(0,) IF_MV2(0,) part[0].start); i = fat_mount(IF_MV2(0,) IF_MD2(0,) part[0].start);
debugf("fat_mount() returned %d\n", i); debugf("fat_mount() returned %d\n", i);

View file

@ -153,8 +153,7 @@ struct inquiry_data {
struct report_lun_data { struct report_lun_data {
unsigned int lun_list_length; unsigned int lun_list_length;
unsigned int reserved1; unsigned int reserved1;
// TODO this should be cleaned up with the VOLUMES vs DRIVES mess unsigned char luns[NUM_DRIVES][8];
unsigned char luns[NUM_VOLUMES][8];
} __attribute__ ((packed)); } __attribute__ ((packed));
struct sense_data { struct sense_data {
@ -271,10 +270,10 @@ static void send_command_result(void *data,int size);
static void send_command_failed_result(void); static void send_command_failed_result(void);
static void send_block_data(void *data,int size); static void send_block_data(void *data,int size);
static void receive_block_data(void *data,int size); static void receive_block_data(void *data,int size);
static void fill_inquiry(IF_MV_NONVOID(int lun)); static void fill_inquiry(IF_MD_NONVOID(int lun));
static void send_and_read_next(void); static void send_and_read_next(void);
static bool ejected[NUM_VOLUMES]; static bool ejected[NUM_DRIVES];
static bool locked[NUM_VOLUMES]; static bool locked[NUM_DRIVES];
static int usb_interface; static int usb_interface;
static int ep_in, ep_out; static int ep_in, ep_out;
@ -309,7 +308,7 @@ static void fix_mbr(unsigned char* mbr)
} }
#endif #endif
static bool check_disk_present(IF_MV_NONVOID(int volume)) static bool check_disk_present(IF_MD_NONVOID(int volume))
{ {
#ifdef USB_USE_RAMDISK #ifdef USB_USE_RAMDISK
return true; return true;
@ -325,7 +324,7 @@ void usb_storage_try_release_storage(void)
release excusive access */ release excusive access */
bool canrelease=true; bool canrelease=true;
int i; int i;
for(i=0;i<NUM_VOLUMES;i++) { for(i=0;i<storage_num_drives();i++) {
if(ejected[i]==false && locked[i]==true) { if(ejected[i]==false && locked[i]==true) {
canrelease=false; canrelease=false;
break; break;
@ -341,7 +340,7 @@ void usb_storage_try_release_storage(void)
void usb_storage_notify_hotswap(int volume,bool inserted) void usb_storage_notify_hotswap(int volume,bool inserted)
{ {
logf("notify %d",inserted); logf("notify %d",inserted);
if(inserted && check_disk_present(IF_MV(volume))) { if(inserted && check_disk_present(IF_MD(volume))) {
ejected[volume] = false; ejected[volume] = false;
} }
else { else {
@ -436,7 +435,7 @@ void usb_storage_init_connection(void)
usb_drv_recv(ep_out, cbw_buffer, 1024); usb_drv_recv(ep_out, cbw_buffer, 1024);
int i; int i;
for(i=0;i<NUM_VOLUMES;i++) { for(i=0;i<storage_num_drives();i++) {
#ifdef TOSHIBA_GIGABEAT_S #ifdef TOSHIBA_GIGABEAT_S
/* As long as the Gigabeat S is a non-removable device, we need /* As long as the Gigabeat S is a non-removable device, we need
to mark the device as locked to avoid usb_storage_try_release_ata() to mark the device as locked to avoid usb_storage_try_release_ata()
@ -445,7 +444,7 @@ void usb_storage_init_connection(void)
#else #else
locked[i] = false; locked[i] = false;
#endif #endif
ejected[i] = !check_disk_present(IF_MV(i)); ejected[i] = !check_disk_present(IF_MD(i));
queue_broadcast(SYS_USB_LUN_LOCKED, (i<<16)+0); queue_broadcast(SYS_USB_LUN_LOCKED, (i<<16)+0);
} }
} }
@ -614,10 +613,9 @@ bool usb_storage_control_request(struct usb_ctrlrequest* req, unsigned char* des
(void)dest; (void)dest;
switch (req->bRequest) { switch (req->bRequest) {
case USB_BULK_GET_MAX_LUN: { case USB_BULK_GET_MAX_LUN: {
#ifdef ONLY_EXPOSE_CARD_SLOT *tb.max_lun = storage_num_drives() - 1;
*tb.max_lun = 0; #ifdef HIDE_FIRST_DRIVE
#else *tb.max_lun --;
*tb.max_lun = NUM_VOLUMES - 1;
#endif #endif
logf("ums: getmaxlun"); logf("ums: getmaxlun");
usb_drv_send(EP_CONTROL, tb.max_lun, 1); usb_drv_send(EP_CONTROL, tb.max_lun, 1);
@ -690,12 +688,12 @@ static void handle_scsi(struct command_block_wrapper* cbw)
unsigned int block_size = 0; unsigned int block_size = 0;
unsigned int block_count = 0; unsigned int block_count = 0;
bool lun_present=true; bool lun_present=true;
#ifdef ONLY_EXPOSE_CARD_SLOT
unsigned char lun = cbw->lun+1;
#else
unsigned char lun = cbw->lun; unsigned char lun = cbw->lun;
#endif
unsigned int block_size_mult = 1; unsigned int block_size_mult = 1;
#ifdef HIDE_FIRST_DRIVE
lun++;
#endif
storage_get_info(lun,&info); storage_get_info(lun,&info);
#ifdef USB_USE_RAMDISK #ifdef USB_USE_RAMDISK
block_size = SECTOR_SIZE; block_size = SECTOR_SIZE;
@ -747,13 +745,14 @@ static void handle_scsi(struct command_block_wrapper* cbw)
logf("scsi report luns %d",lun); logf("scsi report luns %d",lun);
int allocation_length=0; int allocation_length=0;
int i; int i;
unsigned int response_length = 8+8*storage_num_drives();
allocation_length|=(cbw->command_block[6]<<24); allocation_length|=(cbw->command_block[6]<<24);
allocation_length|=(cbw->command_block[7]<<16); allocation_length|=(cbw->command_block[7]<<16);
allocation_length|=(cbw->command_block[8]<<8); allocation_length|=(cbw->command_block[8]<<8);
allocation_length|=(cbw->command_block[9]); allocation_length|=(cbw->command_block[9]);
memset(tb.lun_data,0,sizeof(struct report_lun_data)); memset(tb.lun_data,0,sizeof(struct report_lun_data));
tb.lun_data->lun_list_length=htobe32(8*NUM_VOLUMES); tb.lun_data->lun_list_length=htobe32(8*storage_num_drives());
for(i=0;i<NUM_VOLUMES;i++) for(i=0;i<storage_num_drives();i++)
{ {
#ifdef HAVE_HOTSWAP #ifdef HAVE_HOTSWAP
if(storage_removable(i)) if(storage_removable(i))
@ -763,13 +762,13 @@ static void handle_scsi(struct command_block_wrapper* cbw)
tb.lun_data->luns[i][1]=0; tb.lun_data->luns[i][1]=0;
} }
send_command_result(tb.lun_data, send_command_result(tb.lun_data,
MIN(sizeof(struct report_lun_data), length)); MIN(response_length, length));
break; break;
} }
case SCSI_INQUIRY: case SCSI_INQUIRY:
logf("scsi inquiry %d",lun); logf("scsi inquiry %d",lun);
fill_inquiry(IF_MV(lun)); fill_inquiry(IF_MD(lun));
length = MIN(length, cbw->command_block[4]); length = MIN(length, cbw->command_block[4]);
send_command_result(tb.inquiry, send_command_result(tb.inquiry,
MIN(sizeof(struct inquiry_data), length)); MIN(sizeof(struct inquiry_data), length));
@ -1136,7 +1135,7 @@ static void copy_padded(char *dest, char *src, int len)
} }
/* build SCSI INQUIRY */ /* build SCSI INQUIRY */
static void fill_inquiry(IF_MV_NONVOID(int lun)) static void fill_inquiry(IF_MD_NONVOID(int lun))
{ {
struct storage_info info; struct storage_info info;
memset(tb.inquiry, 0, sizeof(struct inquiry_data)); memset(tb.inquiry, 0, sizeof(struct inquiry_data));