From c0a5a67387c4eec3db3bad4da77ba5126faf03c4 Mon Sep 17 00:00:00 2001 From: Frank Gevaerts Date: Fri, 17 Jul 2009 22:28:49 +0000 Subject: [PATCH] Commit FS#9545, storage cleanup and multi-driver support git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21933 a1c6a512-1295-4272-9138-f99709370657 --- firmware/SOURCES | 23 +- firmware/common/disk.c | 34 +- firmware/drivers/ata.c | 33 +- firmware/drivers/ata_flash.c | 14 +- firmware/drivers/ata_mmc.c | 40 +- firmware/drivers/fat.c | 6 +- firmware/drivers/ramdisk.c | 46 +- firmware/export/ata.h | 14 +- firmware/export/config-c200.h | 3 +- firmware/export/config-e200.h | 3 +- firmware/export/config-e200v2.h | 3 +- firmware/export/config-fuze.h | 3 +- firmware/export/config-ondavx747.h | 6 +- firmware/export/config-ondavx767.h | 3 +- firmware/export/config-ondiofm.h | 3 +- firmware/export/config-ondiosp.h | 3 +- firmware/export/config.h | 36 +- firmware/export/disk.h | 2 +- firmware/export/fat.h | 2 +- firmware/export/mmc.h | 17 +- firmware/export/mv.h | 18 +- firmware/export/nand.h | 18 +- firmware/export/ramdisk.h | 13 +- firmware/export/sd.h | 23 +- firmware/export/storage.h | 270 +++++---- firmware/storage.c | 545 ++++++++++++++++++ firmware/target/arm/as3525/ata_sd_as3525.c | 58 +- firmware/target/arm/ata-nand-telechips.c | 51 +- firmware/target/arm/ata-sd-pp.c | 36 +- .../target/arm/s5l8700/ata-nand-s5l8700.c | 15 +- .../creative-zvm/ata-creativezvm.c | 16 +- .../arm/tms320dm320/creative-zvm/ata-target.h | 4 +- .../mips/ingenic_jz47xx/ata-nand-jz4740.c | 25 + .../mips/ingenic_jz47xx/ata-sd-jz4740.c | 35 ++ firmware/test/fat/main.c | 4 +- firmware/test/i2c/main.c | 2 +- firmware/usbstack/usb_storage.c | 45 +- 37 files changed, 1157 insertions(+), 315 deletions(-) create mode 100644 firmware/storage.c 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; isector_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 -#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 -#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 -#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 -#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 -#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>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= 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= 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;ibRequest) { 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;ilun_list_length=htobe32(8*storage_num_drives()); + for(i=0;iluns[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));