summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--firmware/SOURCES23
-rw-r--r--firmware/common/disk.c34
-rw-r--r--firmware/drivers/ata.c33
-rw-r--r--firmware/drivers/ata_flash.c14
-rw-r--r--firmware/drivers/ata_mmc.c40
-rw-r--r--firmware/drivers/fat.c6
-rw-r--r--firmware/drivers/ramdisk.c46
-rw-r--r--firmware/export/ata.h14
-rw-r--r--firmware/export/config-c200.h3
-rw-r--r--firmware/export/config-e200.h3
-rw-r--r--firmware/export/config-e200v2.h3
-rw-r--r--firmware/export/config-fuze.h3
-rw-r--r--firmware/export/config-ondavx747.h6
-rw-r--r--firmware/export/config-ondavx767.h3
-rw-r--r--firmware/export/config-ondiofm.h3
-rw-r--r--firmware/export/config-ondiosp.h3
-rw-r--r--firmware/export/config.h36
-rw-r--r--firmware/export/disk.h2
-rw-r--r--firmware/export/fat.h2
-rw-r--r--firmware/export/mmc.h17
-rw-r--r--firmware/export/mv.h18
-rw-r--r--firmware/export/nand.h18
-rw-r--r--firmware/export/ramdisk.h13
-rw-r--r--firmware/export/sd.h23
-rw-r--r--firmware/export/storage.h270
-rw-r--r--firmware/storage.c545
-rw-r--r--firmware/target/arm/as3525/ata_sd_as3525.c58
-rw-r--r--firmware/target/arm/ata-nand-telechips.c51
-rw-r--r--firmware/target/arm/ata-sd-pp.c36
-rw-r--r--firmware/target/arm/s5l8700/ata-nand-s5l8700.c15
-rw-r--r--firmware/target/arm/tms320dm320/creative-zvm/ata-creativezvm.c16
-rw-r--r--firmware/target/arm/tms320dm320/creative-zvm/ata-target.h4
-rw-r--r--firmware/target/mips/ingenic_jz47xx/ata-nand-jz4740.c25
-rw-r--r--firmware/target/mips/ingenic_jz47xx/ata-sd-jz4740.c35
-rw-r--r--firmware/test/fat/main.c4
-rw-r--r--firmware/test/i2c/main.c2
-rw-r--r--firmware/usbstack/usb_storage.c45
37 files changed, 1157 insertions, 315 deletions
diff --git a/firmware/SOURCES b/firmware/SOURCES
index bfb31e1b43..add88848dc 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -126,19 +126,28 @@ drivers/touchscreen.c
#ifndef SIMULATOR
#if (CONFIG_STORAGE & STORAGE_MMC)
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
-#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
-#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
-#elif (CONFIG_STORAGE & STORAGE_ATA)
+#endif
+#if (CONFIG_STORAGE & STORAGE_ATA)
drivers/ata.c
-#elif (CONFIG_STORAGE & STORAGE_SD)
+#endif
+#if (CONFIG_STORAGE & STORAGE_SD)
drivers/sd.c
-#elif (CONFIG_STORAGE & STORAGE_RAMDISK)
+#endif
+#if (CONFIG_STORAGE & STORAGE_RAMDISK)
drivers/ramdisk.c
-#endif /* CONFIG_STORAGE */
+#endif
+#ifdef CONFIG_STORAGE_MULTI
+storage.c
+#endif
drivers/fat.c
#if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
hotswap.c
diff --git a/firmware/common/disk.c b/firmware/common/disk.c
index cc0f0d657d..abeadb5c23 100644
--- a/firmware/common/disk.c
+++ b/firmware/common/disk.c
@@ -44,8 +44,8 @@
12-15: nr of sectors in partition
*/
-#define BYTES2INT32(array,pos) \
- ((long)array[pos] | ((long)array[pos+1] << 8 ) | \
+#define BYTES2INT32(array,pos) \
+ ((long)array[pos] | ((long)array[pos+1] << 8 ) | \
((long)array[pos+2] << 16 ) | ((long)array[pos+3] << 24 ))
static const unsigned char fat_partition_types[] = {
@@ -58,18 +58,18 @@ static const unsigned char fat_partition_types[] = {
#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) */
#ifdef MAX_LOG_SECTOR_SIZE
int disk_sector_multiplier = 1;
#endif
-struct partinfo* disk_init(IF_MV_NONVOID(int drive))
+struct partinfo* disk_init(IF_MD_NONVOID(int drive))
{
int i;
unsigned char sector[512];
-#ifdef HAVE_MULTIVOLUME
+#ifdef HAVE_MULTIDRIVE
/* For each drive, start at a different position, in order not to destroy
the first entry of drive 0.
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 mounted;
+ int mounted=0;
int i;
#ifdef HAVE_HOTSWAP
@@ -126,13 +126,19 @@ int disk_mount_all(void)
for (i=0; i<NUM_VOLUMES; i++)
vol_drive[i] = -1; /* mark all as unassigned */
+#ifndef HAVE_MULTIDRIVE
mounted = disk_mount(0);
-#ifdef HAVE_HOTSWAP
- if (card_detect())
+#else
+ 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);
#endif
@@ -155,7 +161,7 @@ int disk_mount(int drive)
{
int mounted = 0; /* reset partition-on-drive flag */
int volume = get_free_volume();
- struct partinfo* pinfo = disk_init(IF_MV(drive));
+ struct partinfo* pinfo = disk_init(IF_MD(drive));
if (pinfo == NULL)
{
@@ -166,7 +172,7 @@ int disk_mount(int drive)
#else
int i = 0;
#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,
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)
{
- 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].size *= j;
@@ -190,7 +196,7 @@ int disk_mount(int drive)
}
}
#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++;
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? */
{ /* try "superfloppy" mode */
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;
vol_drive[volume] = drive; /* remember the drive for this volume */
diff --git a/firmware/drivers/ata.c b/firmware/drivers/ata.c
index adc720eaf8..3c37077fd3 100644
--- a/firmware/drivers/ata.c
+++ b/firmware/drivers/ata.c
@@ -307,7 +307,7 @@ static int _read_sectors(unsigned long start,
int incount,
void* inbuf)
#else
-int ata_read_sectors(IF_MV2(int drive,)
+int ata_read_sectors(IF_MD2(int drive,)
unsigned long start,
int incount,
void* inbuf)
@@ -323,7 +323,7 @@ int ata_read_sectors(IF_MV2(int drive,)
#endif
#ifndef MAX_PHYS_SECTOR_SIZE
-#ifdef HAVE_MULTIVOLUME
+#ifdef HAVE_MULTIDRIVE
(void)drive; /* unused for now */
#endif
mutex_lock(&ata_mtx);
@@ -555,7 +555,7 @@ static int _write_sectors(unsigned long start,
int count,
const void* buf)
#else
-int ata_write_sectors(IF_MV2(int drive,)
+int ata_write_sectors(IF_MD2(int drive,)
unsigned long start,
int count,
const void* buf)
@@ -569,7 +569,7 @@ int ata_write_sectors(IF_MV2(int drive,)
#endif
#ifndef MAX_PHYS_SECTOR_SIZE
-#ifdef HAVE_MULTIVOLUME
+#ifdef HAVE_MULTIDRIVE
(void)drive; /* unused for now */
#endif
mutex_lock(&ata_mtx);
@@ -728,7 +728,7 @@ static inline int flush_current_sector(void)
sector_cache.data);
}
-int ata_read_sectors(IF_MV2(int drive,)
+int ata_read_sectors(IF_MD2(int drive,)
unsigned long start,
int incount,
void* inbuf)
@@ -736,7 +736,7 @@ int ata_read_sectors(IF_MV2(int drive,)
int rc = 0;
int offset;
-#ifdef HAVE_MULTIVOLUME
+#ifdef HAVE_MULTIDRIVE
(void)drive; /* unused for now */
#endif
mutex_lock(&ata_mtx);
@@ -794,7 +794,7 @@ int ata_read_sectors(IF_MV2(int drive,)
return rc;
}
-int ata_write_sectors(IF_MV2(int drive,)
+int ata_write_sectors(IF_MD2(int drive,)
unsigned long start,
int count,
const void* buf)
@@ -802,7 +802,7 @@ int ata_write_sectors(IF_MV2(int drive,)
int rc = 0;
int offset;
-#ifdef HAVE_MULTIVOLUME
+#ifdef HAVE_MULTIDRIVE
(void)drive; /* unused for now */
#endif
mutex_lock(&ata_mtx);
@@ -1503,7 +1503,7 @@ int ata_init(void)
create_thread(ata_thread, ata_stack,
sizeof(ata_stack), 0, ata_thread_name
IF_PRIO(, PRIORITY_USER_INTERFACE)
- IF_COP(, CPU));
+ IF_COP(, CPU));
initialized = true;
}
@@ -1552,12 +1552,15 @@ int ata_spinup_time(void)
}
#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;
static char vendor[8];
static char product[16];
static char revision[4];
+#ifdef HAVE_MULTIDRIVE
+ (void)drive; /* unused for now */
+#endif
int i;
info->sector_size = SECTOR_SIZE;
info->num_sectors= total_sectors;
@@ -1595,3 +1598,13 @@ void ata_keep_active(void)
last_disk_activity = current_tick;
}
#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
diff --git a/firmware/drivers/ata_flash.c b/firmware/drivers/ata_flash.c
index ba96ea0f7d..2d31b413ac 100644
--- a/firmware/drivers/ata_flash.c
+++ b/firmware/drivers/ata_flash.c
@@ -384,7 +384,7 @@ int flash_disk_read_sectors(unsigned long start,
return done;
}
-int nand_read_sectors(IF_MV2(int drive,)
+int nand_read_sectors(IF_MD2(int drive,)
unsigned long start,
int incount,
void* inbuf)
@@ -401,7 +401,7 @@ int nand_read_sectors(IF_MV2(int drive,)
return 0;
}
-int nand_write_sectors(IF_MV2(int drive,)
+int nand_write_sectors(IF_MD2(int drive,)
unsigned long start,
int count,
const void* buf)
@@ -472,3 +472,13 @@ void nand_get_info(struct storage_info *info)
}
#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
+
diff --git a/firmware/drivers/ata_mmc.c b/firmware/drivers/ata_mmc.c
index 0fe89c5be8..239778577d 100644
--- a/firmware/drivers/ata_mmc.c
+++ b/firmware/drivers/ata_mmc.c
@@ -126,7 +126,7 @@ static int current_buffer = 0;
static const unsigned char *send_block_addr = NULL;
static tCardInfo card_info[2];
-#ifndef HAVE_MULTIVOLUME
+#ifndef HAVE_MULTIDRIVE
static int current_card = 0;
#endif
static bool last_mmc_status = false;
@@ -602,7 +602,7 @@ static int send_block_send(unsigned char start_token, long timeout,
return rc;
}
-int mmc_read_sectors(IF_MV2(int drive,)
+int mmc_read_sectors(IF_MD2(int drive,)
unsigned long start,
int incount,
void* inbuf)
@@ -611,7 +611,7 @@ int mmc_read_sectors(IF_MV2(int drive,)
int lastblock = 0;
unsigned long end_block;
tCardInfo *card;
-#ifndef HAVE_MULTIVOLUME
+#ifndef HAVE_MULTIDRIVE
int drive = current_card;
#endif
@@ -688,7 +688,7 @@ int mmc_read_sectors(IF_MV2(int drive,)
return rc;
}
-int mmc_write_sectors(IF_MV2(int drive,)
+int mmc_write_sectors(IF_MD2(int drive,)
unsigned long start,
int count,
const void* buf)
@@ -697,7 +697,7 @@ int mmc_write_sectors(IF_MV2(int drive,)
int write_cmd;
unsigned char start_token;
tCardInfo *card;
-#ifndef HAVE_MULTIVOLUME
+#ifndef HAVE_MULTIDRIVE
int drive = current_card;
#endif
@@ -920,7 +920,7 @@ int mmc_init(void)
led(false);
last_mmc_status = mmc_detect();
-#ifndef HAVE_MULTIVOLUME
+#ifndef HAVE_MULTIDRIVE
/* Use MMC if inserted, internal flash otherwise */
current_card = last_mmc_status ? 1 : 0;
#endif
@@ -949,7 +949,7 @@ int mmc_init(void)
create_thread(mmc_thread, mmc_stack,
sizeof(mmc_stack), 0, mmc_thread_name
IF_PRIO(, PRIORITY_SYSTEM)
- IF_COP(, CPU));
+ IF_COP(, CPU));
tick_add_task(mmc_tick);
initialized = true;
}
@@ -965,9 +965,9 @@ long mmc_last_disk_activity(void)
}
#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;
#endif
info->sector_size=card_info[drive].blocksize;
@@ -986,17 +986,17 @@ void mmc_get_info(IF_MV2(int drive,) struct storage_info *info)
#endif
#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;
#endif
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;
#endif
return (card_info[drive].initialized && card_info[drive].numblocks > 0);
@@ -1016,3 +1016,17 @@ void mmc_spindown(int 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
diff --git a/firmware/drivers/fat.c b/firmware/drivers/fat.c
index a710593a69..e319669e97 100644
--- a/firmware/drivers/fat.c
+++ b/firmware/drivers/fat.c
@@ -167,7 +167,9 @@ struct bpb
* of first pseudo cluster */
#endif /* #ifdef HAVE_FAT16SUPPORT */
#ifdef HAVE_MULTIVOLUME
+#ifdef HAVE_MULTIDRIVE
int drive; /* on which physical device is this located */
+#endif
bool mounted; /* flag if this volume is mounted */
#endif
};
@@ -285,7 +287,7 @@ void fat_init(void)
#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
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));
fat_bpb->startsector = startsector;
-#ifdef HAVE_MULTIVOLUME
+#ifdef HAVE_MULTIDRIVE
fat_bpb->drive = drive;
#endif
diff --git a/firmware/drivers/ramdisk.c b/firmware/drivers/ramdisk.c
index 0ea4012ef1..661aa39695 100644
--- a/firmware/drivers/ramdisk.c
+++ b/firmware/drivers/ramdisk.c
@@ -31,11 +31,14 @@ unsigned char ramdisk[SECTOR_SIZE * NUM_SECTORS];
long last_disk_activity = -1;
-int ramdisk_read_sectors(IF_MV2(int drive,)
+int ramdisk_read_sectors(IF_MD2(int drive,)
unsigned long start,
int count,
void* buf)
{
+#ifdef HAVE_MULTIDRIVE
+ (void)drive; /* unused for now */
+#endif
if(start+count>NUM_SECTORS)
{
return -1;
@@ -44,11 +47,14 @@ int ramdisk_read_sectors(IF_MV2(int drive,)
return 0;
}
-int ramdisk_write_sectors(IF_MV2(int drive,)
+int ramdisk_write_sectors(IF_MD2(int drive,)
unsigned long start,
int count,
const void* buf)
{
+#ifdef HAVE_MULTIDRIVE
+ (void)drive; /* unused for now */
+#endif
if(start+count>NUM_SECTORS)
{
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)seconds;
}
#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 */
info->revision="0.00";
@@ -100,3 +129,14 @@ void ramdisk_get_info(IF_MV2(int drive,) struct storage_info *info)
}
#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
+
+
diff --git a/firmware/export/ata.h b/firmware/export/ata.h
index b5e39de3aa..5be32da231 100644
--- a/firmware/export/ata.h
+++ b/firmware/export/ata.h
@@ -39,8 +39,8 @@ bool ata_disk_is_active(void);
int ata_soft_reset(void);
int ata_init(void);
void ata_close(void);
-int ata_read_sectors(IF_MV2(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_read_sectors(IF_MD2(int drive,) unsigned long start, int count, void* buf);
+int ata_write_sectors(IF_MD2(int drive,) unsigned long start, int count, const void* buf);
void ata_spin(void);
#if (CONFIG_LED == LED_REAL)
void ata_set_led_enabled(bool enabled);
@@ -48,14 +48,18 @@ void ata_set_led_enabled(bool enabled);
unsigned short* ata_get_identify(void);
#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
#ifdef HAVE_HOTSWAP
-bool ata_removable(IF_MV_NONVOID(int drive));
-bool ata_present(IF_MV_NONVOID(int drive));
+bool ata_removable(IF_MD_NONVOID(int drive));
+bool ata_present(IF_MD_NONVOID(int drive));
#endif
+#ifdef CONFIG_STORAGE_MULTI
+int ata_num_drives(int first_drive);
+#endif
+
long ata_last_disk_activity(void);
int ata_spinup_time(void); /* ticks */
diff --git a/firmware/export/config-c200.h b/firmware/export/config-c200.h
index 9bb8ead4a8..db64e5cacc 100644
--- a/firmware/export/config-c200.h
+++ b/firmware/export/config-c200.h
@@ -177,7 +177,8 @@
#define FIRMWARE_OFFSET_FILE_DATA 0x8
#ifndef BOOTLOADER
-#define HAVE_MULTIVOLUME
+#define HAVE_MULTIDRIVE
+#define NUM_DRIVES 2
#define HAVE_HOTSWAP
#endif
diff --git a/firmware/export/config-e200.h b/firmware/export/config-e200.h
index 59ac564c01..adae8a211d 100644
--- a/firmware/export/config-e200.h
+++ b/firmware/export/config-e200.h
@@ -171,7 +171,8 @@
#define FIRMWARE_OFFSET_FILE_DATA 0x8
#ifndef BOOTLOADER
-#define HAVE_MULTIVOLUME
+#define HAVE_MULTIDRIVE
+#define NUM_DRIVES 2
#define HAVE_HOTSWAP
#endif
diff --git a/firmware/export/config-e200v2.h b/firmware/export/config-e200v2.h
index a1c41fbe7d..d66bde4943 100644
--- a/firmware/export/config-e200v2.h
+++ b/firmware/export/config-e200v2.h
@@ -180,7 +180,8 @@
#define FIRMWARE_OFFSET_FILE_DATA 0x8
#ifndef BOOTLOADER
-#define HAVE_MULTIVOLUME
+#define HAVE_MULTIDRIVE
+#define NUM_DRIVES 2
#define HAVE_HOTSWAP
#endif
diff --git a/firmware/export/config-fuze.h b/firmware/export/config-fuze.h
index b9c5acb9b1..c8d7e2fba9 100644
--- a/firmware/export/config-fuze.h
+++ b/firmware/export/config-fuze.h
@@ -178,7 +178,8 @@
#define FIRMWARE_OFFSET_FILE_DATA 0x8
#ifndef BOOTLOADER
-#define HAVE_MULTIVOLUME
+#define HAVE_MULTIDRIVE
+#define NUM_DRIVES 2
#define HAVE_HOTSWAP
#endif
diff --git a/firmware/export/config-ondavx747.h b/firmware/export/config-ondavx747.h
index 1d9a7a8883..dbb37c972d 100644
--- a/firmware/export/config-ondavx747.h
+++ b/firmware/export/config-ondavx747.h
@@ -42,8 +42,7 @@
//#define HAVE_ATA_SD
//#define HAVE_HOTSWAP
-//#define CONFIG_STORAGE (STORAGE_NAND | STORAGE_SD)
-#define CONFIG_STORAGE STORAGE_SD
+#define CONFIG_STORAGE (STORAGE_NAND | STORAGE_SD)
/* Support FAT16 for SD cards <= 2GB */
#define HAVE_FAT16SUPPORT
@@ -51,6 +50,9 @@
/* ChinaChip NAND FTL */
#define CONFIG_NAND NAND_CC
+#define HAVE_MULTIDRIVE
+#define NUM_DRIVES 2
+
/* define this if you have a bitmap LCD display */
#define HAVE_LCD_BITMAP
diff --git a/firmware/export/config-ondavx767.h b/firmware/export/config-ondavx767.h
index a662fc0da9..d4873370dd 100644
--- a/firmware/export/config-ondavx767.h
+++ b/firmware/export/config-ondavx767.h
@@ -41,7 +41,8 @@
#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 HAVE_LCD_BITMAP
diff --git a/firmware/export/config-ondiofm.h b/firmware/export/config-ondiofm.h
index a43810e3ff..a8802dcea8 100644
--- a/firmware/export/config-ondiofm.h
+++ b/firmware/export/config-ondiofm.h
@@ -125,7 +125,8 @@
#define HAVE_MAS_SIBI_CONTROL
/* 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 HAVE_HOTSWAP
diff --git a/firmware/export/config-ondiosp.h b/firmware/export/config-ondiosp.h
index 1fcf45b200..ba26713612 100644
--- a/firmware/export/config-ondiosp.h
+++ b/firmware/export/config-ondiosp.h
@@ -106,7 +106,8 @@
#define HAVE_MAS_SIBI_CONTROL
/* 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 HAVE_HOTSWAP
diff --git a/firmware/export/config.h b/firmware/export/config.h
index 406ef509c8..092e02f458 100644
--- a/firmware/export/config.h
+++ b/firmware/export/config.h
@@ -539,11 +539,6 @@ Lyre prototype 1*/
#define CONFIG_TUNER_MULTI
#endif
-#if (CONFIG_STORAGE & (CONFIG_STORAGE - 1)) != 0
-/* Multiple storage drivers */
-#define CONFIG_STORAGE_MULTI
-#endif
-
/* deactivate fading in bootloader/sim */
#if defined(BOOTLOADER) || defined(SIMULATOR)
#undef CONFIG_BACKLIGHT_FADING
@@ -571,6 +566,37 @@ Lyre prototype 1*/
#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)
/* Bootloaders don't use CPU frequency adjustment */
#undef HAVE_ADJUSTABLE_CPU_FREQ
diff --git a/firmware/export/disk.h b/firmware/export/disk.h
index cec9bfa3fc..cd937fdf66 100644
--- a/firmware/export/disk.h
+++ b/firmware/export/disk.h
@@ -35,7 +35,7 @@ struct partinfo {
#define PARTITION_TYPE_OS2_HIDDEN_C_DRIVE 0x84
/* 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);
int disk_mount_all(void); /* returns the # of successful mounts */
int disk_mount(int drive);
diff --git a/firmware/export/fat.h b/firmware/export/fat.h
index c99a1a75f8..d6e753f9cb 100644
--- a/firmware/export/fat.h
+++ b/firmware/export/fat.h
@@ -90,7 +90,7 @@ extern void fat_unlock(void);
#endif
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 void fat_size(IF_MV2(int volume,) /* public for info */
unsigned long* size,
diff --git a/firmware/export/mmc.h b/firmware/export/mmc.h
index 06d99d219e..f2b0ad3509 100644
--- a/firmware/export/mmc.h
+++ b/firmware/export/mmc.h
@@ -23,7 +23,7 @@
#define __MMC_H__
#include <stdbool.h>
-#include "mv.h" /* for HAVE_MULTIVOLUME or not */
+#include "mv.h" /* for HAVE_MULTIDRIVE or not */
struct storage_info;
@@ -35,19 +35,24 @@ bool mmc_disk_is_active(void);
int mmc_soft_reset(void);
int mmc_init(void);
void mmc_close(void);
-int mmc_read_sectors(IF_MV2(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_read_sectors(IF_MD2(int drive,) unsigned long start, int count, void* buf);
+int mmc_write_sectors(IF_MD2(int drive,) unsigned long start, int count, const void* buf);
void mmc_spin(void);
int mmc_spinup_time(void);
#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
#ifdef HAVE_HOTSWAP
-bool mmc_removable(IF_MV_NONVOID(int drive));
-bool mmc_present(IF_MV_NONVOID(int drive));
+bool mmc_removable(IF_MD_NONVOID(int drive));
+bool mmc_present(IF_MD_NONVOID(int drive));
#endif
long mmc_last_disk_activity(void);
+#ifdef CONFIG_STORAGE_MULTI
+int mmc_num_drives(int first_drive);
+#endif
+
+
#endif
diff --git a/firmware/export/mv.h b/firmware/export/mv.h
index fda650c7e9..b1d16a7267 100644
--- a/firmware/export/mv.h
+++ b/firmware/export/mv.h
@@ -26,16 +26,28 @@
/* 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. */
+
+/* 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
-#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_MV_NONVOID(x) x /* for prototype with sole volume parameter */
-#define NUM_VOLUMES 2
#else /* empty definitions if no multi-volume */
#define IF_MV(x)
#define IF_MV2(x,y)
#define IF_MV_NONVOID(x) void
-#define NUM_VOLUMES 1
#endif
+
#endif
diff --git a/firmware/export/nand.h b/firmware/export/nand.h
index a5b0a1ceee..67ebe73ddf 100644
--- a/firmware/export/nand.h
+++ b/firmware/export/nand.h
@@ -23,25 +23,31 @@
#define __NAND_H__
#include <stdbool.h>
-#include "mv.h" /* for HAVE_MULTIVOLUME or not */
+#include "mv.h" /* for HAVE_MULTIDRIVE or not */
struct storage_info;
void nand_enable(bool on);
void nand_spindown(int seconds);
void nand_sleep(void);
+void nand_sleepnow(void);
bool nand_disk_is_active(void);
-int nand_soft_reset(void);
-int nand_init(void);
+int nand_soft_reset(void);
+int nand_init(void);
void nand_close(void);
-int nand_read_sectors(IF_MV2(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_read_sectors(IF_MD2(int drive,) unsigned long start, int count, void* buf);
+int nand_write_sectors(IF_MD2(int drive,) unsigned long start, int count, const void* buf);
void nand_spin(void);
+int nand_spinup_time(void); /* ticks */
#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
long nand_last_disk_activity(void);
+#ifdef CONFIG_STORAGE_MULTI
+int nand_num_drives(int first_drive);
+#endif
+
#endif
diff --git a/firmware/export/ramdisk.h b/firmware/export/ramdisk.h
index a0c011fadd..79551ca287 100644
--- a/firmware/export/ramdisk.h
+++ b/firmware/export/ramdisk.h
@@ -23,7 +23,7 @@
#define __RAMDISK_H__
#include <stdbool.h>
-#include "mv.h" /* for HAVE_MULTIVOLUME or not */
+#include "mv.h" /* for HAVE_MULTIDRIVE or not */
struct storage_info;
@@ -34,15 +34,20 @@ bool ramdisk_disk_is_active(void);
int ramdisk_soft_reset(void);
int ramdisk_init(void);
void ramdisk_close(void);
-int ramdisk_read_sectors(IF_MV2(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_read_sectors(IF_MD2(int drive,) unsigned long start, int count, void* buf);
+int ramdisk_write_sectors(IF_MD2(int drive,) unsigned long start, int count, const void* buf);
void ramdisk_spin(void);
void ramdisk_sleepnow(void);
+int ramdisk_spinup_time(void);
#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
long ramdisk_last_disk_activity(void);
+#ifdef CONFIG_STORAGE_MULTI
+int ramdisk_num_drives(int first_drive);
+#endif
+
#endif
diff --git a/firmware/export/sd.h b/firmware/export/sd.h
index d313a4c2e1..0b64bd768d 100644
--- a/firmware/export/sd.h
+++ b/firmware/export/sd.h
@@ -23,7 +23,7 @@
#define __SD_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 ? */
@@ -32,27 +32,34 @@ struct storage_info;
void sd_enable(bool on);
void sd_spindown(int seconds);
void sd_sleep(void);
+void sd_sleepnow(void);
bool sd_disk_is_active(void);
-int sd_soft_reset(void);
-int sd_init(void);
+int sd_soft_reset(void);
+int sd_init(void);
void sd_close(void);
-int sd_read_sectors(IF_MV2(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_read_sectors(IF_MD2(int drive,) unsigned long start, int count, void* buf);
+int sd_write_sectors(IF_MD2(int drive,) unsigned long start, int count, const void* buf);
void sd_spin(void);
+int sd_spinup_time(void); /* ticks */
#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
#ifdef HAVE_HOTSWAP
bool sd_removable(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
-bool card_detect_target(void);
+bool card_detect_target(void);
long sd_last_disk_activity(void);
+#ifdef CONFIG_STORAGE_MULTI
+int sd_num_drives(int first_drive);
+#endif
+
+
/* SD States */
#define SD_IDLE 0
#define SD_READY 1
diff --git a/firmware/export/storage.h b/firmware/export/storage.h
index 47d8abda52..dbcc7a69ab 100644
--- a/firmware/export/storage.h
+++ b/firmware/export/storage.h
@@ -23,7 +23,7 @@
#define __STORAGE_H__
#include <stdbool.h>
-#include "config.h" /* for HAVE_MULTIVOLUME or not */
+#include "config.h" /* for HAVE_MULTIDRIVE or not */
#include "mv.h"
#if (CONFIG_STORAGE & STORAGE_SD)
@@ -51,154 +51,147 @@ struct storage_info
char *revision;
};
-#ifndef SIMULATOR
- #ifndef CONFIG_STORAGE_MULTI
- /* storage_spindown, storage_sleep and storage_spin are passed as
- * pointers, which doesn't work with argument-macros.
- */
- #if (CONFIG_STORAGE & STORAGE_ATA)
- #define storage_spindown ata_spindown
- #define storage_sleep ata_sleep
- #define storage_spin ata_spin
-
- #define storage_enable(on) ata_enable(on)
- #define storage_sleepnow() ata_sleepnow()
- #define storage_disk_is_active() ata_disk_is_active()
- #define storage_soft_reset() ata_soft_reset()
- #define storage_init() ata_init()
- #define storage_close() ata_close()
- #define storage_read_sectors(drive, start, count, buf) ata_read_sectors(IF_MV2(drive,) start, count, buf)
- #define storage_write_sectors(drive, start, count, buf) ata_write_sectors(IF_MV2(drive,) start, count, buf)
- #define storage_last_disk_activity() ata_last_disk_activity()
- #define storage_spinup_time() ata_spinup_time()
- #define storage_get_identify() ata_get_identify()
-
- #ifdef STORAGE_GET_INFO
- #define storage_get_info(drive, info) ata_get_info(IF_MV2(drive,) info)
- #endif
- #ifdef HAVE_HOTSWAP
- #define storage_removable(drive) ata_removable(IF_MV(drive))
- #define storage_present(drive) ata_present(IF_MV(drive))
- #endif
- #elif (CONFIG_STORAGE & STORAGE_SD)
- #define storage_spindown sd_spindown
- #define storage_sleep sd_sleep
- #define storage_spin sd_spin
-
- #define storage_enable(on) sd_enable(on)
- #define storage_sleepnow() sd_sleepnow()
- #define storage_disk_is_active() 0
- #define storage_soft_reset() (void)0
- #define storage_init() sd_init()
- #define storage_close() sd_close()
- #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_MV2(drive,) start, count, buf)
- #define storage_last_disk_activity() sd_last_disk_activity()
- #define storage_spinup_time() 0
- #define storage_get_identify() sd_get_identify()
-
- #ifdef STORAGE_GET_INFO
- #define storage_get_info(drive, info) sd_get_info(IF_MV2(drive,) info)
- #endif
- #ifdef HAVE_HOTSWAP
- #define storage_removable(drive) sd_removable(IF_MV(drive))
- #define storage_present(drive) sd_present(IF_MV(drive))
- #endif
- #elif (CONFIG_STORAGE & STORAGE_MMC)
- #define storage_spindown mmc_spindown
- #define storage_sleep mmc_sleep
- #define storage_spin mmc_spin
-
- #define storage_enable(on) mmc_enable(on)
- #define storage_sleepnow() mmc_sleepnow()
- #define storage_disk_is_active() mmc_disk_is_active()
- #define storage_soft_reset() (void)0
- #define storage_init() mmc_init()
- #define storage_close() mmc_close()
- #define storage_read_sectors(drive, start, count, buf) mmc_read_sectors(IF_MV2(drive,) start, count, buf)
- #define storage_write_sectors(drive, start, count, buf) mmc_write_sectors(IF_MV2(drive,) start, count, buf)
- #define storage_last_disk_activity() mmc_last_disk_activity()
- #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_MV2(drive,) info)
- #endif
- #ifdef HAVE_HOTSWAP
- #define storage_removable(drive) mmc_removable(IF_MV(drive))
- #define storage_present(drive) mmc_present(IF_MV(drive))
- #endif
- #elif (CONFIG_STORAGE & STORAGE_NAND)
- #define storage_spindown nand_spindown
- #define storage_sleep nand_sleep
- #define storage_spin nand_spin
-
- #define storage_enable(on) (void)0
- #define storage_sleepnow() nand_sleepnow()
- #define storage_disk_is_active() 0
- #define storage_soft_reset() (void)0
- #define storage_init() nand_init()
- #define storage_close() nand_close()
- #define storage_read_sectors(drive, start, count, buf) nand_read_sectors(IF_MV2(drive,) start, count, buf)
- #define storage_write_sectors(drive, start, count, buf) nand_write_sectors(IF_MV2(drive,) start, count, buf)
- #define storage_last_disk_activity() nand_last_disk_activity()
- #define storage_spinup_time() 0
- #define storage_get_identify() nand_get_identify()
-
- #ifdef STORAGE_GET_INFO
- #define storage_get_info(drive, info) nand_get_info(IF_MV2(drive,) info)
- #endif
- #ifdef HAVE_HOTSWAP
- #define storage_removable(drive) nand_removable(IF_MV(drive))
- #define storage_present(drive) nand_present(IF_MV(drive))
- #endif
- #elif (CONFIG_STORAGE & STORAGE_RAMDISK)
- #define storage_spindown ramdisk_spindown
- #define storage_sleep ramdisk_sleep
- #define storage_spin ramdisk_spin
-
- #define storage_enable(on) (void)0
- #define storage_sleepnow() ramdisk_sleepnow()
- #define storage_disk_is_active() 0
- #define storage_soft_reset() (void)0
- #define storage_init() ramdisk_init()
- #define storage_close() ramdisk_close()
- #define storage_read_sectors(drive, start, count, buf) ramdisk_read_sectors(IF_MV2(drive,) start, count, buf)
- #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()
- #define storage_spinup_time() 0
- #define storage_get_identify() ramdisk_get_identify()
-
- #ifdef STORAGE_GET_INFO
- #define storage_get_info(drive, info) ramdisk_get_info(IF_MV2(drive,) info)
- #endif
- #ifdef HAVE_HOTSWAP
- #define storage_removable(drive) ramdisk_removable(IF_MV(drive))
- #define storage_present(drive) ramdisk_present(IF_MV(drive))
- #endif
- #else
- //#error No storage driver!
- #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 */
+#if !defined(SIMULATOR) && !defined(CONFIG_STORAGE_MULTI)
+/* storage_spindown, storage_sleep and storage_spin are passed as
+ * pointers, which doesn't work with argument-macros.
+ */
+ #define storage_num_drives() NUM_DRIVES
+ #if (CONFIG_STORAGE & STORAGE_ATA)
+ #define storage_spindown ata_spindown
+ #define storage_sleep ata_sleep
+ #define storage_spin ata_spin
+
+ #define storage_enable(on) ata_enable(on)
+ #define storage_sleepnow() ata_sleepnow()
+ #define storage_disk_is_active() ata_disk_is_active()
+ #define storage_soft_reset() ata_soft_reset()
+ #define storage_init() ata_init()
+ #define storage_close() ata_close()
+ #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_MD2(drive,) start, count, buf)
+ #define storage_last_disk_activity() ata_last_disk_activity()
+ #define storage_spinup_time() ata_spinup_time()
+ #define storage_get_identify() ata_get_identify()
+
+ #ifdef STORAGE_GET_INFO
+ #define storage_get_info(drive, info) ata_get_info(IF_MD2(drive,) info)
+ #endif
+ #ifdef HAVE_HOTSWAP
+ #define storage_removable(drive) ata_removable(IF_MD(drive))
+ #define storage_present(drive) ata_present(IF_MD(drive))
+ #endif
+ #elif (CONFIG_STORAGE & STORAGE_SD)
+ #define storage_spindown sd_spindown
+ #define storage_sleep sd_sleep
+ #define storage_spin sd_spin
+
+ #define storage_enable(on) sd_enable(on)
+ #define storage_sleepnow() sd_sleepnow()
+ #define storage_disk_is_active() 0
+ #define storage_soft_reset() (void)0
+ #define storage_init() sd_init()
+ #define storage_read_sectors(drive, start, count, buf) sd_read_sectors(IF_MD2(drive,) start, count, buf)
+ #define storage_write_sectors(drive, start, count, buf) sd_write_sectors(IF_MD2(drive,) start, count, buf)
+ #define storage_last_disk_activity() sd_last_disk_activity()
+ #define storage_spinup_time() 0
+ #define storage_get_identify() sd_get_identify()
+
+ #ifdef STORAGE_GET_INFO
+ #define storage_get_info(drive, info) sd_get_info(IF_MD2(drive,) info)
+ #endif
+ #ifdef HAVE_HOTSWAP
+ #define storage_removable(drive) sd_removable(IF_MD(drive))
+ #define storage_present(drive) sd_present(IF_MD(drive))
+ #endif
+ #elif (CONFIG_STORAGE & STORAGE_MMC)
+ #define storage_spindown mmc_spindown
+ #define storage_sleep mmc_sleep
+ #define storage_spin mmc_spin
+
+ #define storage_enable(on) mmc_enable(on)
+ #define storage_sleepnow() mmc_sleepnow()
+ #define storage_disk_is_active() mmc_disk_is_active()
+ #define storage_soft_reset() (void)0
+ #define storage_init() mmc_init()
+ #define storage_read_sectors(drive, start, count, buf) mmc_read_sectors(IF_MD2(drive,) start, count, buf)
+ #define storage_write_sectors(drive, start, count, buf) mmc_write_sectors(IF_MD2(drive,) start, count, buf)
+ #define storage_last_disk_activity() mmc_last_disk_activity()
+ #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)
+ #endif
+ #ifdef HAVE_HOTSWAP
+ #define storage_removable(drive) mmc_removable(IF_MD(drive))
+ #define storage_present(drive) mmc_present(IF_MD(drive))
+ #endif
+ #elif (CONFIG_STORAGE & STORAGE_NAND)
+ #define storage_spindown nand_spindown
+ #define storage_sleep nand_sleep
+ #define storage_spin nand_spin
+
+ #define storage_enable(on) (void)0
+ #define storage_sleepnow() nand_sleepnow()
+ #define storage_disk_is_active() 0
+ #define storage_soft_reset() (void)0
+ #define storage_init() nand_init()
+ #define storage_read_sectors(drive, start, count, buf) nand_read_sectors(IF_MD2(drive,) start, count, buf)
+ #define storage_write_sectors(drive, start, count, buf) nand_write_sectors(IF_MD2(drive,) start, count, buf)
+ #define storage_last_disk_activity() nand_last_disk_activity()
+ #define storage_spinup_time() 0
+ #define storage_get_identify() nand_get_identify()
+
+ #ifdef STORAGE_GET_INFO
+ #define storage_get_info(drive, info) nand_get_info(IF_MD2(drive,) info)
+ #endif
+ #ifdef HAVE_HOTSWAP
+ #define storage_removable(drive) nand_removable(IF_MD(drive))
+ #define storage_present(drive) nand_present(IF_MD(drive))
+ #endif
+ #elif (CONFIG_STORAGE & STORAGE_RAMDISK)
+ #define storage_spindown ramdisk_spindown
+ #define storage_sleep ramdisk_sleep
+ #define storage_spin ramdisk_spin
+
+ #define storage_enable(on) (void)0
+ #define storage_sleepnow() ramdisk_sleepnow()
+ #define storage_disk_is_active() 0
+ #define storage_soft_reset() (void)0
+ #define storage_init() ramdisk_init()
+ #define storage_read_sectors(drive, start, count, buf) ramdisk_read_sectors(IF_MD2(drive,) start, count, buf)
+ #define storage_write_sectors(drive, start, count, buf) ramdisk_write_sectors(IF_MD2(drive,) start, count, buf)
+ #define storage_last_disk_activity() ramdisk_last_disk_activity()
+ #define storage_spinup_time() 0
+ #define storage_get_identify() ramdisk_get_identify()
+
+ #ifdef STORAGE_GET_INFO
+ #define storage_get_info(drive, info) ramdisk_get_info(IF_MD2(drive,) info)
+ #endif
+ #ifdef HAVE_HOTSWAP
+ #define storage_removable(drive) ramdisk_removable(IF_MD(drive))
+ #define storage_present(drive) ramdisk_present(IF_MD(drive))
+ #endif
+ #else
+ //#error No storage driver!
+ #endif
+#else /* NOT CONFIG_STORAGE_MULTI and NOT SIMULATOR*/
+
+/* Simulator and multi-driver use normal functions */
+
void storage_enable(bool on);
void storage_sleep(void);
void storage_sleepnow(void);
bool storage_disk_is_active(void);
int storage_soft_reset(void);
int storage_init(void);
-void storage_close(void);
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);
void storage_spin(void);
void storage_spindown(int seconds);
long storage_last_disk_activity(void);
int storage_spinup_time(void);
+int storage_num_drives(void);
#ifdef STORAGE_GET_INFO
void storage_get_info(int drive, struct storage_info *info);
#endif
@@ -206,5 +199,6 @@ void storage_get_info(int drive, struct storage_info *info);
bool storage_removable(int drive);
bool storage_present(int drive);
#endif
-#endif/*NOT SIMULATOR */
+
+#endif /* NOT CONFIG_STORAGE_MULTI and NOT SIMULATOR*/
#endif
diff --git a/firmware/storage.c b/firmware/storage.c
new file mode 100644
index 0000000000..1528d03919
--- /dev/null
+++ b/firmware/storage.c
@@ -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
diff --git a/firmware/target/arm/as3525/ata_sd_as3525.c b/firmware/target/arm/as3525/ata_sd_as3525.c
index 8a18a70826..bca52a09f1 100644
--- a/firmware/target/arm/as3525/ata_sd_as3525.c
+++ b/firmware/target/arm/as3525/ata_sd_as3525.c
@@ -24,7 +24,7 @@
/* 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 "thread.h"
#include "led.h"
@@ -88,9 +88,9 @@
#define INTERNAL_AS3525 0 /* embedded SD card */
#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
-#ifdef HAVE_MULTIVOLUME
+#ifdef HAVE_MULTIDRIVE
, SD_MCI_BASE
#endif
};
@@ -101,7 +101,7 @@ static void init_pl180_controller(const int drive);
#define SECTOR_SIZE 512 /* XXX: different sector sizes ? */
#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 */
#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;
}
-#ifdef HAVE_MULTIVOLUME
+#ifdef HAVE_MULTIDRIVE
void INT_MCI0(void)
{
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;
-#ifdef HAVE_MULTIVOLUME
+#ifdef HAVE_MULTIDRIVE
VIC_INT_ENABLE |=
(drive == INTERNAL_AS3525) ? INTERRUPT_NAND : INTERRUPT_MCI0;
@@ -478,7 +478,7 @@ int sd_init(void)
CGU_PERI |= CGU_NAF_CLOCK_ENABLE;
-#ifdef HAVE_MULTIVOLUME
+#ifdef HAVE_MULTIDRIVE
CGU_PERI |= CGU_MCI_CLOCK_ENABLE;
CCU_IO &= ~(1<<3); /* bits 3:2 = 01, xpd is SD interface */
CCU_IO |= (1<<2);
@@ -490,7 +490,7 @@ int sd_init(void)
ret = sd_init_card(INTERNAL_AS3525);
if(ret < 0)
return ret;
-#ifdef HAVE_MULTIVOLUME
+#ifdef HAVE_MULTIDRIVE
init_pl180_controller(SD_SLOT_AS3525);
#endif
@@ -509,17 +509,17 @@ int sd_init(void)
}
#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;
#endif
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;
#endif
return (card_info[drive].initialized && card_info[drive].numblocks > 0);
@@ -619,10 +619,10 @@ static int sd_select_bank(signed char bank)
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)
{
-#ifndef HAVE_MULTIVOLUME
+#ifndef HAVE_MULTIDRIVE
const int drive = 0;
#endif
int ret = 0;
@@ -774,18 +774,18 @@ sd_transfer_error:
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)
{
- 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)
{
#ifdef BOOTLOADER /* we don't need write support in bootloader */
-#ifdef HAVE_MULTIVOLUME
+#ifdef HAVE_MULTIDRIVE
(void) drive;
#endif
(void) start;
@@ -793,7 +793,7 @@ int sd_write_sectors(IF_MV2(int drive,) unsigned long start, int count,
(void) buf;
return -1;
#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
}
@@ -807,7 +807,7 @@ void sd_enable(bool on)
{
/* buttonlight AMSes need a bit of special handling for the buttonlight here,
* 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;
#endif
if (sd_enabled == on)
@@ -815,7 +815,7 @@ void sd_enable(bool on)
if(on)
{
CGU_PERI |= CGU_NAF_CLOCK_ENABLE;
-#ifdef HAVE_MULTIVOLUME
+#ifdef HAVE_MULTIDRIVE
CGU_PERI |= CGU_MCI_CLOCK_ENABLE;
#ifdef HAVE_BUTTON_LIGHT
CCU_IO |= (1<<2);
@@ -832,7 +832,7 @@ void sd_enable(bool on)
else
{
CGU_PERI &= ~CGU_NAF_CLOCK_ENABLE;
-#ifdef HAVE_MULTIVOLUME
+#ifdef HAVE_MULTIDRIVE
#ifdef HAVE_BUTTON_LIGHT
CCU_IO &= ~(1<<2);
if (buttonlight_is_on)
@@ -882,3 +882,17 @@ void card_enable_monitoring_target(bool on)
#endif
#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
diff --git a/firmware/target/arm/ata-nand-telechips.c b/firmware/target/arm/ata-nand-telechips.c
index 8bef57ee21..ffe6de897e 100644
--- a/firmware/target/arm/ata-nand-telechips.c
+++ b/firmware/target/arm/ata-nand-telechips.c
@@ -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)
{
-#ifdef HAVE_MULTIVOLUME
+#ifdef HAVE_MULTIDRIVE
(void)drive; /* unused for now */
#endif
@@ -753,11 +753,10 @@ nand_read_error:
return ret;
}
-
-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)
{
-#ifdef HAVE_MULTIVOLUME
+#ifdef HAVE_MULTIDRIVE
(void)drive; /* unused for now */
#endif
@@ -770,8 +769,12 @@ int nand_write_sectors(IF_MV2(int drive,) unsigned long start, int count,
#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 */
info->revision="0.00";
@@ -913,3 +916,39 @@ void nand_spindown(int 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 */
diff --git a/firmware/target/arm/ata-sd-pp.c b/firmware/target/arm/ata-sd-pp.c
index 1a76eeeba2..77d3c3dc31 100644
--- a/firmware/target/arm/ata-sd-pp.c
+++ b/firmware/target/arm/ata-sd-pp.c
@@ -18,7 +18,7 @@
* KIND, either express or implied.
*
****************************************************************************/
-#include "config.h" /* for HAVE_MULTIVOLUME */
+#include "config.h" /* for HAVE_MULTIDRIVE */
#include "fat.h"
#include "hotswap.h"
#ifdef HAVE_HOTSWAP
@@ -166,10 +166,10 @@ struct sd_card_status
int retry_max;
};
-static struct sd_card_status sd_status[NUM_VOLUMES] =
+static struct sd_card_status sd_status[NUM_DRIVES] =
{
{ 0, 1 },
-#ifdef HAVE_MULTIVOLUME
+#ifdef HAVE_MULTIDRIVE
{ 0, 10 }
#endif
};
@@ -839,10 +839,10 @@ static void sd_select_device(int card_no)
/* 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)
{
-#ifndef HAVE_MULTIVOLUME
+#ifndef HAVE_MULTIDRIVE
const int drive = 0;
#endif
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)
{
/* Write support is not finished yet */
/* TODO: The standard suggests using ACMD23 prior to writing multiple blocks
to improve performance */
-#ifndef HAVE_MULTIVOLUME
+#ifndef HAVE_MULTIDRIVE
const int drive = 0;
#endif
int ret;
@@ -1330,19 +1330,33 @@ long sd_last_disk_activity(void)
}
#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;
#endif
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;
#endif
return (card_info[drive].initialized && card_info[drive].numblocks > 0);
}
#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
diff --git a/firmware/target/arm/s5l8700/ata-nand-s5l8700.c b/firmware/target/arm/s5l8700/ata-nand-s5l8700.c
index 3fc3c0efea..f268558128 100644
--- a/firmware/target/arm/s5l8700/ata-nand-s5l8700.c
+++ b/firmware/target/arm/s5l8700/ata-nand-s5l8700.c
@@ -46,7 +46,7 @@ void nand_led(bool 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)start;
@@ -55,7 +55,7 @@ int nand_read_sectors(IF_MV2(int drive,) unsigned long start, int incount,
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)
{
(void)start;
@@ -82,7 +82,7 @@ void nand_enable(bool 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;
}
@@ -98,3 +98,12 @@ int nand_init(void)
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
diff --git a/firmware/target/arm/tms320dm320/creative-zvm/ata-creativezvm.c b/firmware/target/arm/tms320dm320/creative-zvm/ata-creativezvm.c
index f9acdf5eb2..f84d904205 100644
--- a/firmware/target/arm/tms320dm320/creative-zvm/ata-creativezvm.c
+++ b/firmware/target/arm/tms320dm320/creative-zvm/ata-creativezvm.c
@@ -125,8 +125,8 @@ void GIO2(void)
#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_write_sectors(IF_MV2(int drive,) unsigned long start, int count, const void* buf);
+extern int ata_read_sectors(IF_MD2(int drive,) unsigned long start, int count, void* buf);
+extern int ata_write_sectors(IF_MD2(int drive,) unsigned long start, int count, const void* buf);
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;
}
-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)
cfs_init();
/* Check if count is lesser than or equal to 1 native CFS sector */
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
{
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 */
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)
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)
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 */
/* Check if count is lesser than or equal to 1 native CFS sector */
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
{
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 */
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)
return ret;
diff --git a/firmware/target/arm/tms320dm320/creative-zvm/ata-target.h b/firmware/target/arm/tms320dm320/creative-zvm/ata-target.h
index 64c49fe68e..a1d4a90cb8 100644
--- a/firmware/target/arm/tms320dm320/creative-zvm/ata-target.h
+++ b/firmware/target/arm/tms320dm320/creative-zvm/ata-target.h
@@ -38,8 +38,8 @@ void copy_write_sectors(const unsigned char* buf, int wordcount);
/* Nasty hack, but Creative is nasty... */
#define ata_read_sectors _ata_read_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_write_sectors(IF_MV2(int drive,) unsigned long start, int count, const void* buf);
+extern int _ata_read_sectors(IF_MD2(int drive,) unsigned long start, int count, void* buf);
+extern int _ata_write_sectors(IF_MD2(int drive,) unsigned long start, int count, const void* buf);
/* General purpose memory region #1 */
#define ATA_IOBASE 0x50FEE000
diff --git a/firmware/target/mips/ingenic_jz47xx/ata-nand-jz4740.c b/firmware/target/mips/ingenic_jz47xx/ata-nand-jz4740.c
index 8bd7d42e1f..a51dc5e882 100644
--- a/firmware/target/mips/ingenic_jz47xx/ata-nand-jz4740.c
+++ b/firmware/target/mips/ingenic_jz47xx/ata-nand-jz4740.c
@@ -707,6 +707,21 @@ void nand_enable(bool 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
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;
}
#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
diff --git a/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4740.c b/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4740.c
index 5de40c99dc..b1a9d599d9 100644
--- a/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4740.c
+++ b/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4740.c
@@ -1328,6 +1328,31 @@ long sd_last_disk_activity(void)
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
bool sd_removable(IF_MV_NONVOID(int drive))
{
@@ -1346,3 +1371,13 @@ bool sd_present(IF_MV_NONVOID(int drive))
#endif
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
diff --git a/firmware/test/fat/main.c b/firmware/test/fat/main.c
index 9fd150429f..e190d81045 100644
--- a/firmware/test/fat/main.c
+++ b/firmware/test/fat/main.c
@@ -696,7 +696,7 @@ int main(int argc, char *argv[])
#endif
) {
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) {
DEBUGF("mount: %d",rc);
return -1;
@@ -705,7 +705,7 @@ int main(int argc, char *argv[])
}
}
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!");
return -1;
}
diff --git a/firmware/test/i2c/main.c b/firmware/test/i2c/main.c
index f4540e4959..ad0f8efcbd 100644
--- a/firmware/test/i2c/main.c
+++ b/firmware/test/i2c/main.c
@@ -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);
diff --git a/firmware/usbstack/usb_storage.c b/firmware/usbstack/usb_storage.c
index 28510089f1..d29e731d5a 100644
--- a/firmware/usbstack/usb_storage.c
+++ b/firmware/usbstack/usb_storage.c
@@ -153,8 +153,7 @@ struct inquiry_data {
struct report_lun_data {
unsigned int lun_list_length;
unsigned int reserved1;
- // TODO this should be cleaned up with the VOLUMES vs DRIVES mess
- unsigned char luns[NUM_VOLUMES][8];
+ unsigned char luns[NUM_DRIVES][8];
} __attribute__ ((packed));
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_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 bool ejected[NUM_VOLUMES];
-static bool locked[NUM_VOLUMES];
+static bool ejected[NUM_DRIVES];
+static bool locked[NUM_DRIVES];
static int usb_interface;
static int ep_in, ep_out;
@@ -309,7 +308,7 @@ static void fix_mbr(unsigned char* mbr)
}
#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
return true;
@@ -325,7 +324,7 @@ void usb_storage_try_release_storage(void)
release excusive access */
bool canrelease=true;
int i;
- for(i=0;i<NUM_VOLUMES;i++) {
+ for(i=0;i<storage_num_drives();i++) {
if(ejected[i]==false && locked[i]==true) {
canrelease=false;
break;
@@ -341,7 +340,7 @@ void usb_storage_try_release_storage(void)
void usb_storage_notify_hotswap(int volume,bool inserted)
{
logf("notify %d",inserted);
- if(inserted && check_disk_present(IF_MV(volume))) {
+ if(inserted && check_disk_present(IF_MD(volume))) {
ejected[volume] = false;
}
else {
@@ -436,7 +435,7 @@ void usb_storage_init_connection(void)
usb_drv_recv(ep_out, cbw_buffer, 1024);
int i;
- for(i=0;i<NUM_VOLUMES;i++) {
+ for(i=0;i<storage_num_drives();i++) {
#ifdef TOSHIBA_GIGABEAT_S
/* 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()
@@ -445,7 +444,7 @@ void usb_storage_init_connection(void)
#else
locked[i] = false;
#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);
}
}
@@ -614,10 +613,9 @@ bool usb_storage_control_request(struct usb_ctrlrequest* req, unsigned char* des
(void)dest;
switch (req->bRequest) {
case USB_BULK_GET_MAX_LUN: {
-#ifdef ONLY_EXPOSE_CARD_SLOT
- *tb.max_lun = 0;
-#else
- *tb.max_lun = NUM_VOLUMES - 1;
+ *tb.max_lun = storage_num_drives() - 1;
+#ifdef HIDE_FIRST_DRIVE
+ *tb.max_lun --;
#endif
logf("ums: getmaxlun");
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_count = 0;
bool lun_present=true;
-#ifdef ONLY_EXPOSE_CARD_SLOT
- unsigned char lun = cbw->lun+1;
-#else
unsigned char lun = cbw->lun;
-#endif
unsigned int block_size_mult = 1;
+#ifdef HIDE_FIRST_DRIVE
+ lun++;
+#endif
+
storage_get_info(lun,&info);
#ifdef USB_USE_RAMDISK
block_size = SECTOR_SIZE;
@@ -747,13 +745,14 @@ static void handle_scsi(struct command_block_wrapper* cbw)
logf("scsi report luns %d",lun);
int allocation_length=0;
int i;
+ unsigned int response_length = 8+8*storage_num_drives();
allocation_length|=(cbw->command_block[6]<<24);
allocation_length|=(cbw->command_block[7]<<16);
allocation_length|=(cbw->command_block[8]<<8);
allocation_length|=(cbw->command_block[9]);
memset(tb.lun_data,0,sizeof(struct report_lun_data));
- tb.lun_data->lun_list_length=htobe32(8*NUM_VOLUMES);
- for(i=0;i<NUM_VOLUMES;i++)
+ tb.lun_data->lun_list_length=htobe32(8*storage_num_drives());
+ for(i=0;i<storage_num_drives();i++)
{
#ifdef HAVE_HOTSWAP
if(storage_removable(i))
@@ -763,13 +762,13 @@ static void handle_scsi(struct command_block_wrapper* cbw)
tb.lun_data->luns[i][1]=0;
}
send_command_result(tb.lun_data,
- MIN(sizeof(struct report_lun_data), length));
+ MIN(response_length, length));
break;
}
case SCSI_INQUIRY:
logf("scsi inquiry %d",lun);
- fill_inquiry(IF_MV(lun));
+ fill_inquiry(IF_MD(lun));
length = MIN(length, cbw->command_block[4]);
send_command_result(tb.inquiry,
MIN(sizeof(struct inquiry_data), length));
@@ -1136,7 +1135,7 @@ static void copy_padded(char *dest, char *src, int len)
}
/* 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;
memset(tb.inquiry, 0, sizeof(struct inquiry_data));