summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrank Gevaerts <frank@gevaerts.be>2008-11-02 01:14:46 +0000
committerFrank Gevaerts <frank@gevaerts.be>2008-11-02 01:14:46 +0000
commit430343bca7b2358b6862a096264fb2d16cbf0c58 (patch)
tree1de7114495004299314751d1e8701304c116579b
parent0b34b77e1388b956685a66b04865c598585057aa (diff)
downloadrockbox-430343bca7b2358b6862a096264fb2d16cbf0c58.tar.gz
rockbox-430343bca7b2358b6862a096264fb2d16cbf0c58.zip
implement single-driver storage layer with macros instead of inlines
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@18975 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/debug_menu.c2
-rw-r--r--firmware/SOURCES1
-rw-r--r--firmware/common/disk.c4
-rw-r--r--firmware/drivers/ata_mmc.c13
-rw-r--r--firmware/drivers/fat.c18
-rw-r--r--firmware/export/config.h5
-rw-r--r--firmware/export/mmc.h1
-rw-r--r--firmware/export/storage.h356
-rw-r--r--firmware/storage.c35
-rw-r--r--firmware/target/arm/ata-nand-telechips.c13
-rw-r--r--firmware/target/arm/ata-sd-pp.c12
-rw-r--r--firmware/usbstack/usb_storage.c16
12 files changed, 211 insertions, 265 deletions
diff --git a/apps/debug_menu.c b/apps/debug_menu.c
index b6038e7c89..05aab64404 100644
--- a/apps/debug_menu.c
+++ b/apps/debug_menu.c
@@ -1956,7 +1956,7 @@ static int disk_callback(int btn, struct gui_synclist *lists)
1956 (void)btn; 1956 (void)btn;
1957 (void)lists; 1957 (void)lists;
1958 struct storage_info info; 1958 struct storage_info info;
1959 storage_get_info(IF_MV2(0,)&info); 1959 storage_get_info(0,&info);
1960 simplelist_addline(SIMPLELIST_ADD_LINE, "Vendor: %s", info.vendor); 1960 simplelist_addline(SIMPLELIST_ADD_LINE, "Vendor: %s", info.vendor);
1961 simplelist_addline(SIMPLELIST_ADD_LINE, "Model: %s", info.product); 1961 simplelist_addline(SIMPLELIST_ADD_LINE, "Model: %s", info.product);
1962 simplelist_addline(SIMPLELIST_ADD_LINE, "Firmware: %s", info.revision); 1962 simplelist_addline(SIMPLELIST_ADD_LINE, "Firmware: %s", info.revision);
diff --git a/firmware/SOURCES b/firmware/SOURCES
index 03a5224d93..567fa1c579 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -108,7 +108,6 @@ drivers/serial.c
108 108
109 109
110/* Storage */ 110/* Storage */
111storage.c
112#ifndef SIMULATOR 111#ifndef SIMULATOR
113#if (CONFIG_STORAGE & STORAGE_MMC) 112#if (CONFIG_STORAGE & STORAGE_MMC)
114drivers/ata_mmc.c 113drivers/ata_mmc.c
diff --git a/firmware/common/disk.c b/firmware/common/disk.c
index 32b15b8857..ceb486ea1d 100644
--- a/firmware/common/disk.c
+++ b/firmware/common/disk.c
@@ -78,9 +78,11 @@ struct partinfo* disk_init(IF_MV_NONVOID(int drive))
78 return NULL; /* out of space in table */ 78 return NULL; /* out of space in table */
79#else 79#else
80 struct partinfo* pinfo = part; 80 struct partinfo* pinfo = part;
81 int drive;
82 (void)drive;
81#endif 83#endif
82 84
83 storage_read_sectors(IF_MV2(drive,) 0,1, &sector); 85 storage_read_sectors(drive, 0,1, &sector);
84 /* check that the boot sector is initialized */ 86 /* check that the boot sector is initialized */
85 if ( (sector[510] != 0x55) || 87 if ( (sector[510] != 0x55) ||
86 (sector[511] != 0xaa)) { 88 (sector[511] != 0xaa)) {
diff --git a/firmware/drivers/ata_mmc.c b/firmware/drivers/ata_mmc.c
index 097d0a0dbd..5104f8cf97 100644
--- a/firmware/drivers/ata_mmc.c
+++ b/firmware/drivers/ata_mmc.c
@@ -1002,3 +1002,16 @@ bool mmc_present(IF_MV_NONVOID(int drive))
1002} 1002}
1003#endif 1003#endif
1004 1004
1005
1006void mmc_sleep(void)
1007{
1008}
1009
1010void mmc_spin(void)
1011{
1012}
1013
1014void mmc_spindown(int seconds)
1015{
1016 (void)seconds;
1017}
diff --git a/firmware/drivers/fat.c b/firmware/drivers/fat.c
index 4317b70766..2ff4c61ac4 100644
--- a/firmware/drivers/fat.c
+++ b/firmware/drivers/fat.c
@@ -300,7 +300,7 @@ int fat_mount(IF_MV2(int volume,) IF_MV2(int drive,) long startsector)
300#endif 300#endif
301 301
302 /* Read the sector */ 302 /* Read the sector */
303 rc = storage_read_sectors(IF_MV2(drive,) startsector,1,buf); 303 rc = storage_read_sectors(drive, startsector,1,buf);
304 if(rc) 304 if(rc)
305 { 305 {
306 DEBUGF( "fat_mount() - Couldn't read BPB (error code %d)\n", rc); 306 DEBUGF( "fat_mount() - Couldn't read BPB (error code %d)\n", rc);
@@ -422,7 +422,7 @@ int fat_mount(IF_MV2(int volume,) IF_MV2(int drive,) long startsector)
422#endif /* #ifdef HAVE_FAT16SUPPORT */ 422#endif /* #ifdef HAVE_FAT16SUPPORT */
423 { 423 {
424 /* Read the fsinfo sector */ 424 /* Read the fsinfo sector */
425 rc = storage_read_sectors(IF_MV2(drive,) 425 rc = storage_read_sectors(drive,
426 startsector + fat_bpb->bpb_fsinfo, 1, buf); 426 startsector + fat_bpb->bpb_fsinfo, 1, buf);
427 if (rc < 0) 427 if (rc < 0)
428 { 428 {
@@ -597,7 +597,7 @@ static void flush_fat_sector(struct fat_cache_entry *fce,
597#endif 597#endif
598 598
599 /* Write to the first FAT */ 599 /* Write to the first FAT */
600 rc = storage_write_sectors(IF_MV2(fce->fat_vol->drive,) 600 rc = storage_write_sectors(fce->fat_vol->drive,
601 secnum, 1, 601 secnum, 1,
602 sectorbuf); 602 sectorbuf);
603 if(rc < 0) 603 if(rc < 0)
@@ -618,7 +618,7 @@ static void flush_fat_sector(struct fat_cache_entry *fce,
618#else 618#else
619 secnum += fat_bpbs[0].fatsize; 619 secnum += fat_bpbs[0].fatsize;
620#endif 620#endif
621 rc = storage_write_sectors(IF_MV2(fce->fat_vol->drive,) 621 rc = storage_write_sectors(fce->fat_vol->drive,
622 secnum, 1, sectorbuf); 622 secnum, 1, sectorbuf);
623 if(rc < 0) 623 if(rc < 0)
624 { 624 {
@@ -664,7 +664,7 @@ static void *cache_fat_sector(IF_MV2(struct bpb* fat_bpb,)
664 /* Load the sector if it is not cached */ 664 /* Load the sector if it is not cached */
665 if(!fce->inuse) 665 if(!fce->inuse)
666 { 666 {
667 rc = storage_read_sectors(IF_MV2(fat_bpb->drive,) 667 rc = storage_read_sectors(fat_bpb->drive,
668 secnum + fat_bpb->startsector,1, 668 secnum + fat_bpb->startsector,1,
669 sectorbuf); 669 sectorbuf);
670 if(rc < 0) 670 if(rc < 0)
@@ -923,7 +923,7 @@ static int update_fsinfo(IF_MV_NONVOID(struct bpb* fat_bpb))
923#endif /* #ifdef HAVE_FAT16SUPPORT */ 923#endif /* #ifdef HAVE_FAT16SUPPORT */
924 924
925 /* update fsinfo */ 925 /* update fsinfo */
926 rc = storage_read_sectors(IF_MV2(fat_bpb->drive,) 926 rc = storage_read_sectors(fat_bpb->drive,
927 fat_bpb->startsector + fat_bpb->bpb_fsinfo, 1,fsinfo); 927 fat_bpb->startsector + fat_bpb->bpb_fsinfo, 1,fsinfo);
928 if (rc < 0) 928 if (rc < 0)
929 { 929 {
@@ -936,7 +936,7 @@ static int update_fsinfo(IF_MV_NONVOID(struct bpb* fat_bpb))
936 intptr = (long*)&(fsinfo[FSINFO_NEXTFREE]); 936 intptr = (long*)&(fsinfo[FSINFO_NEXTFREE]);
937 *intptr = htole32(fat_bpb->fsinfo.nextfree); 937 *intptr = htole32(fat_bpb->fsinfo.nextfree);
938 938
939 rc = storage_write_sectors(IF_MV2(fat_bpb->drive,) 939 rc = storage_write_sectors(fat_bpb->drive,
940 fat_bpb->startsector + fat_bpb->bpb_fsinfo,1,fsinfo); 940 fat_bpb->startsector + fat_bpb->bpb_fsinfo,1,fsinfo);
941 if (rc < 0) 941 if (rc < 0)
942 { 942 {
@@ -2077,11 +2077,11 @@ static int transfer(IF_MV2(struct bpb* fat_bpb,)
2077 if (start + count > fat_bpb->totalsectors) 2077 if (start + count > fat_bpb->totalsectors)
2078 panicf("Write %ld after data\n", 2078 panicf("Write %ld after data\n",
2079 start + count - fat_bpb->totalsectors); 2079 start + count - fat_bpb->totalsectors);
2080 rc = storage_write_sectors(IF_MV2(fat_bpb->drive,) 2080 rc = storage_write_sectors(fat_bpb->drive,
2081 start + fat_bpb->startsector, count, buf); 2081 start + fat_bpb->startsector, count, buf);
2082 } 2082 }
2083 else 2083 else
2084 rc = storage_read_sectors(IF_MV2(fat_bpb->drive,) 2084 rc = storage_read_sectors(fat_bpb->drive,
2085 start + fat_bpb->startsector, count, buf); 2085 start + fat_bpb->startsector, count, buf);
2086 if (rc < 0) { 2086 if (rc < 0) {
2087 DEBUGF( "transfer() - Couldn't %s sector %lx" 2087 DEBUGF( "transfer() - Couldn't %s sector %lx"
diff --git a/firmware/export/config.h b/firmware/export/config.h
index 22a0bd2244..1574d40040 100644
--- a/firmware/export/config.h
+++ b/firmware/export/config.h
@@ -383,6 +383,11 @@
383#define CONFIG_TUNER_MULTI 383#define CONFIG_TUNER_MULTI
384#endif 384#endif
385 385
386#if (CONFIG_STORAGE & (CONFIG_STORAGE - 1)) != 0
387/* Multiple storage drivers */
388#define CONFIG_STORAGE_MULTI
389#endif
390
386#if defined(BOOTLOADER) && defined(HAVE_ADJUSTABLE_CPU_FREQ) 391#if defined(BOOTLOADER) && defined(HAVE_ADJUSTABLE_CPU_FREQ)
387/* Bootloaders don't use CPU frequency adjustment */ 392/* Bootloaders don't use CPU frequency adjustment */
388#undef HAVE_ADJUSTABLE_CPU_FREQ 393#undef HAVE_ADJUSTABLE_CPU_FREQ
diff --git a/firmware/export/mmc.h b/firmware/export/mmc.h
index 271d910763..5d6438ec28 100644
--- a/firmware/export/mmc.h
+++ b/firmware/export/mmc.h
@@ -39,6 +39,7 @@ void mmc_close(void);
39int mmc_read_sectors(IF_MV2(int drive,) unsigned long start, int count, void* buf); 39int mmc_read_sectors(IF_MV2(int drive,) unsigned long start, int count, void* buf);
40int mmc_write_sectors(IF_MV2(int drive,) unsigned long start, int count, const void* buf); 40int mmc_write_sectors(IF_MV2(int drive,) unsigned long start, int count, const void* buf);
41void mmc_spin(void); 41void mmc_spin(void);
42int mmc_spinup_time(void);
42 43
43#if (CONFIG_LED == LED_REAL) 44#if (CONFIG_LED == LED_REAL)
44void mmc_set_led_enabled(bool enabled); 45void mmc_set_led_enabled(bool enabled);
diff --git a/firmware/export/storage.h b/firmware/export/storage.h
index 52c6f2bed1..3c2a0e858e 100644
--- a/firmware/export/storage.h
+++ b/firmware/export/storage.h
@@ -48,204 +48,133 @@ struct storage_info
48 char *revision; 48 char *revision;
49}; 49};
50 50
51void storage_spindown(int seconds);
52
53#ifndef SIMULATOR 51#ifndef SIMULATOR
54static inline void storage_enable(bool on) 52 #ifndef CONFIG_STORAGE_MULTI
55{ 53 /* storage_spindown, storage_sleep and storage_spin are passed as
56#if (CONFIG_STORAGE & STORAGE_ATA) 54 * pointers, which doesn't work with argument-macros.
57 ata_enable(on); 55 */
58#elif (CONFIG_STORAGE & STORAGE_SD) 56 #if (CONFIG_STORAGE & STORAGE_ATA)
59 sd_enable(on); 57 #define storage_spindown ata_spindown
60#elif (CONFIG_STORAGE & STORAGE_MMC) 58 #define storage_sleep ata_sleep
61 mmc_enable(on); 59 #define storage_spin ata_spin
62#else 60
63 (void)on; 61 #define storage_enable(on) ata_enable(on)
64#endif 62 #define storage_sleepnow() ata_sleepnow()
65} 63 #define storage_disk_is_active() ata_disk_is_active()
66static inline void storage_sleep(void) 64 #define storage_hard_reset() ata_hard_reset()
67{ 65 #define storage_soft_reset() ata_soft_reset()
68#if (CONFIG_STORAGE & STORAGE_ATA) 66 #define storage_init() ata_init()
69 ata_sleep(); 67 #define storage_close() ata_close()
70#endif 68 #define storage_read_sectors(drive, start, count, buf) ata_read_sectors(IF_MV2(drive,) start, count, buf)
71} 69 #define storage_write_sectors(drive, start, count, buf) ata_write_sectors(IF_MV2(drive,) start, count, buf)
72static inline void storage_sleepnow(void) 70 #define storage_last_disk_activity() ata_last_disk_activity()
73{ 71 #define storage_spinup_time() ata_spinup_time()
74#if (CONFIG_STORAGE & STORAGE_ATA) 72 #define storage_get_identify() ata_get_identify()
75 ata_sleepnow(); 73
76#endif 74 #if (CONFIG_LED == LED_REAL)
77} 75 #define storage_set_led_enabled(enabled) ata_set_led_enabled(enabled)
78static inline bool storage_disk_is_active(void) 76 #endif
79{ 77 #ifdef STORAGE_GET_INFO
80#if (CONFIG_STORAGE & STORAGE_ATA) 78 #define storage_get_info(drive, info) ata_get_info(IF_MV2(drive,) info)
81 return ata_disk_is_active(); 79 #endif
82#elif (CONFIG_STORAGE & STORAGE_MMC) 80 #ifdef HAVE_HOTSWAP
83 return mmc_disk_is_active(); 81 #define storage_removable(drive) ata_removable(IF_MV(drive))
84#else 82 #define storage_present(drive) ata_present(IF_MV(drive))
85 return 0; 83 #endif
86#endif 84 #elif (CONFIG_STORAGE & STORAGE_SD)
87} 85 #define storage_spindown sd_spindown
88static inline int storage_hard_reset(void) 86 #define storage_sleep sd_sleep
89{ 87 #define storage_spin sd_spin
90#if (CONFIG_STORAGE & STORAGE_ATA) 88
91 return ata_hard_reset(); 89 #define storage_enable(on) sd_enable(on)
92#else 90 #define storage_sleepnow() sd_sleepnow()
93 return 0; 91 #define storage_disk_is_active() 0
94#endif 92 #define storage_hard_reset() (void)0
95} 93 #define storage_soft_reset() (void)0
96static inline int storage_soft_reset(void) 94 #define storage_init() sd_init()
97{ 95 #define storage_close() sd_close()
98#if (CONFIG_STORAGE & STORAGE_ATA) 96 #define storage_read_sectors(drive, start, count, buf) sd_read_sectors(IF_MV2(drive,) start, count, buf)
99 return ata_soft_reset(); 97 #define storage_write_sectors(drive, start, count, buf) sd_write_sectors(IF_MV2(drive,) start, count, buf)
100#else 98 #define storage_last_disk_activity() sd_last_disk_activity()
101 return 0; 99 #define storage_spinup_time() 0
102#endif 100 #define storage_get_identify() sd_get_identify()
103} 101
104static inline int storage_init(void) 102 #if (CONFIG_LED == LED_REAL)
105{ 103 #define storage_set_led_enabled(enabled) sd_set_led_enabled(enabled)
106#if (CONFIG_STORAGE & STORAGE_ATA) 104 #endif
107 return ata_init(); 105 #ifdef STORAGE_GET_INFO
108#elif (CONFIG_STORAGE & STORAGE_SD) 106 #define storage_get_info(drive, info) sd_get_info(IF_MV2(drive,) info)
109 return sd_init(); 107 #endif
110#elif (CONFIG_STORAGE & STORAGE_NAND) 108 #ifdef HAVE_HOTSWAP
111 return nand_init(); 109 #define storage_removable(drive) sd_removable(IF_MV(drive))
112#elif (CONFIG_STORAGE & STORAGE_MMC) 110 #define storage_present(drive) sd_present(IF_MV(drive))
113 return mmc_init(); 111 #endif
114#else 112 #elif (CONFIG_STORAGE & STORAGE_MMC)
115 #error No storage driver! 113 #define storage_spindown mmc_spindown
116#endif 114 #define storage_sleep mmc_sleep
117} 115 #define storage_spin mmc_spin
118static inline void storage_close(void) 116
119{ 117 #define storage_enable(on) mmc_enable(on)
120#if (CONFIG_STORAGE & STORAGE_ATA) 118 #define storage_sleepnow() mmc_sleepnow()
121 ata_close(); 119 #define storage_disk_is_active() mmc_disk_is_active()
122#endif 120 #define storage_hard_reset() (void)0
123} 121 #define storage_soft_reset() (void)0
124static inline int storage_read_sectors(IF_MV2(int drive,) unsigned long start, int count, void* buf) 122 #define storage_init() mmc_init()
125{ 123 #define storage_close() mmc_close()
126#if (CONFIG_STORAGE & STORAGE_ATA) 124 #define storage_read_sectors(drive, start, count, buf) mmc_read_sectors(IF_MV2(drive,) start, count, buf)
127 return ata_read_sectors(IF_MV2(drive,) start, count, buf); 125 #define storage_write_sectors(drive, start, count, buf) mmc_write_sectors(IF_MV2(drive,) start, count, buf)
128#elif (CONFIG_STORAGE & STORAGE_SD) 126 #define storage_last_disk_activity() mmc_last_disk_activity()
129 return sd_read_sectors(IF_MV2(drive,) start, count, buf); 127 #define storage_spinup_time() 0
130#elif (CONFIG_STORAGE & STORAGE_NAND) 128 #define storage_get_identify() mmc_get_identify()
131 return nand_read_sectors(IF_MV2(drive,) start, count, buf); 129
132#elif (CONFIG_STORAGE & STORAGE_MMC) 130 #if (CONFIG_LED == LED_REAL)
133 return mmc_read_sectors(IF_MV2(drive,) start, count, buf); 131 #define storage_set_led_enabled(enabled) mmc_set_led_enabled(enabled)
134#else 132 #endif
135 #error No storage driver! 133 #ifdef STORAGE_GET_INFO
136#endif 134 #define storage_get_info(drive, info) mmc_get_info(IF_MV2(drive,) info)
137} 135 #endif
138static inline int storage_write_sectors(IF_MV2(int drive,) unsigned long start, int count, const void* buf) 136 #ifdef HAVE_HOTSWAP
139{ 137 #define storage_removable(drive) mmc_removable(IF_MV(drive))
140#if (CONFIG_STORAGE & STORAGE_ATA) 138 #define storage_present(drive) mmc_present(IF_MV(drive))
141 return ata_write_sectors(IF_MV2(drive,) start, count, buf); 139 #endif
142#elif (CONFIG_STORAGE & STORAGE_SD) 140 #elif (CONFIG_STORAGE & STORAGE_NAND)
143 return sd_write_sectors(IF_MV2(drive,) start, count, buf); 141 #define storage_spindown nand_spindown
144#elif (CONFIG_STORAGE & STORAGE_NAND) 142 #define storage_sleep nand_sleep
145 return nand_write_sectors(IF_MV2(drive,) start, count, buf); 143 #define storage_spin nand_spin
146#elif (CONFIG_STORAGE & STORAGE_MMC) 144
147 return mmc_write_sectors(IF_MV2(drive,) start, count, buf); 145 #define storage_enable(on) (void)0
148#else 146 #define storage_sleepnow() nand_sleepnow()
149 #error No storage driver! 147 #define storage_disk_is_active() 0
150#endif 148 #define storage_hard_reset() (void)0
151} 149 #define storage_soft_reset() (void)0
152static inline void storage_spin(void) 150 #define storage_init() nand_init()
153{ 151 #define storage_close() nand_close()
154#if (CONFIG_STORAGE & STORAGE_ATA) 152 #define storage_read_sectors(drive, start, count, buf) nand_read_sectors(IF_MV2(drive,) start, count, buf)
155 ata_spin(); 153 #define storage_write_sectors(drive, start, count, buf) nand_write_sectors(IF_MV2(drive,) start, count, buf)
156#endif 154 #define storage_last_disk_activity() nand_last_disk_activity()
157} 155 #define storage_spinup_time() 0
158 156 #define storage_get_identify() nand_get_identify()
159#if (CONFIG_LED == LED_REAL) 157
160static inline void storage_set_led_enabled(bool enabled) 158 #if (CONFIG_LED == LED_REAL)
161{ 159 #define storage_set_led_enabled(enabled) nand_set_led_enabled(enabled)
162#if (CONFIG_STORAGE & STORAGE_ATA) 160 #endif
163 ata_set_led_enabled(enabled); 161 #ifdef STORAGE_GET_INFO
164#elif (CONFIG_STORAGE & STORAGE_SD) 162 #define storage_get_info(drive, info) nand_get_info(IF_MV2(drive,) info)
165 sd_set_led_enabled(enabled); 163 #endif
166#elif (CONFIG_STORAGE & STORAGE_NAND) 164 #ifdef HAVE_HOTSWAP
167 nand_set_led_enabled(enabled); 165 #define storage_removable(drive) nand_removable(IF_MV(drive))
168#elif (CONFIG_STORAGE & STORAGE_MMC) 166 #define storage_present(drive) nand_present(IF_MV(drive))
169 mmc_set_led_enabled(enabled); 167 #endif
170#else 168 #else
171 #error No storage driver! 169 //#error No storage driver!
172#endif 170 #endif
173} 171 #else /* NOT CONFIG_STORAGE_MULTI */
174#endif /*LED*/ 172
175 173 /* TODO : implement multi-driver here */
176static inline long storage_last_disk_activity(void) 174 #error Multi-driver storage not implemented yet
177{ 175
178#if (CONFIG_STORAGE & STORAGE_ATA) 176 #endif /* NOT CONFIG_STORAGE_MULTI */
179 return ata_last_disk_activity(); 177#else /*NOT SIMULATOR */
180#elif (CONFIG_STORAGE & STORAGE_SD)
181 return sd_last_disk_activity();
182#elif (CONFIG_STORAGE & STORAGE_NAND)
183 return nand_last_disk_activity();
184#elif (CONFIG_STORAGE & STORAGE_MMC)
185 return mmc_last_disk_activity();
186#else
187 #error No storage driver!
188#endif
189}
190
191static inline int storage_spinup_time(void)
192{
193#if (CONFIG_STORAGE & STORAGE_ATA)
194 return ata_spinup_time();
195#else
196 return 0;
197#endif
198}
199
200#ifdef STORAGE_GET_INFO
201static inline void storage_get_info(IF_MV2(int drive,) struct storage_info *info)
202{
203#if (CONFIG_STORAGE & STORAGE_ATA)
204 return ata_get_info(IF_MV2(drive,) info);
205#elif (CONFIG_STORAGE & STORAGE_SD)
206 return sd_get_info(IF_MV2(drive,) info);
207#elif (CONFIG_STORAGE & STORAGE_NAND)
208 return nand_get_info(IF_MV2(drive,) info);
209#elif (CONFIG_STORAGE & STORAGE_MMC)
210 return mmc_get_info(IF_MV2(drive,) info);
211#else
212 #error No storage driver!
213#endif
214}
215#endif
216
217#ifdef HAVE_HOTSWAP
218static inline bool storage_removable(IF_MV_NONVOID(int drive))
219{
220#if (CONFIG_STORAGE & STORAGE_ATA)
221 return ata_removable(IF_MV(drive));
222#elif (CONFIG_STORAGE & STORAGE_SD)
223 return sd_removable(IF_MV(drive));
224#elif (CONFIG_STORAGE & STORAGE_NAND)
225 return nand_removable(IF_MV(drive));
226#elif (CONFIG_STORAGE & STORAGE_MMC)
227 return mmc_removable(IF_MV(drive));
228#else
229 #error No storage driver!
230#endif
231}
232
233static inline bool storage_present(IF_MV_NONVOID(int drive))
234{
235#if (CONFIG_STORAGE & STORAGE_ATA)
236 return ata_present(IF_MV(drive));
237#elif (CONFIG_STORAGE & STORAGE_SD)
238 return sd_present(IF_MV(drive));
239#elif (CONFIG_STORAGE & STORAGE_NAND)
240 return nand_present(IF_MV(drive));
241#elif (CONFIG_STORAGE & STORAGE_MMC)
242 return mmc_present(IF_MV(drive));
243#else
244 #error No storage driver!
245#endif
246}
247#endif /* HOTSWAP */
248#else /* SIMULATOR */
249static inline void storage_enable(bool on) 178static inline void storage_enable(bool on)
250{ 179{
251 (void)on; 180 (void)on;
@@ -275,26 +204,31 @@ static inline int storage_init(void)
275static inline void storage_close(void) 204static inline void storage_close(void)
276{ 205{
277} 206}
278static inline int storage_read_sectors(IF_MV2(int drive,) unsigned long start, int count, void* buf) 207static inline int storage_read_sectors(int drive, unsigned long start, int count, void* buf)
279{ 208{
280 IF_MV((void)drive;) 209 (void)drive;
281 (void)start; 210 (void)start;
282 (void)count; 211 (void)count;
283 (void)buf; 212 (void)buf;
284 return 0; 213 return 0;
285} 214}
286static inline int storage_write_sectors(IF_MV2(int drive,) unsigned long start, int count, const void* buf) 215static inline int storage_write_sectors(int drive, unsigned long start, int count, const void* buf)
287{ 216{
288 IF_MV((void)drive;) 217 (void)drive;
289 (void)start; 218 (void)start;
290 (void)count; 219 (void)count;
291 (void)buf; 220 (void)buf;
292 return 0; 221 return 0;
293} 222}
223
294static inline void storage_spin(void) 224static inline void storage_spin(void)
295{ 225{
296} 226}
297 227static inline void storage_spindown(int seconds)
228{
229 (void)seconds;
230}
231
298#if (CONFIG_LED == LED_REAL) 232#if (CONFIG_LED == LED_REAL)
299static inline void storage_set_led_enabled(bool enabled) 233static inline void storage_set_led_enabled(bool enabled)
300{ 234{
@@ -313,25 +247,27 @@ static inline int storage_spinup_time(void)
313} 247}
314 248
315#ifdef STORAGE_GET_INFO 249#ifdef STORAGE_GET_INFO
316static inline void storage_get_info(IF_MV2(int drive,) struct storage_info *info) 250static inline void storage_get_info(int drive, struct storage_info *info)
317{ 251{
318 IF_MV((void)drive;) 252 (void)drive;
319 (void)info; 253 (void)info;
320} 254}
321#endif 255+#endif /* NOT CONFIG_STORAGE_MULTI */
256 #endif
322 257
323#ifdef HAVE_HOTSWAP 258#ifdef HAVE_HOTSWAP
324static inline bool storage_removable(IF_MV_NONVOID(int drive)) 259static inline bool storage_removable(int drive)
325{ 260{
326 IF_MV((void)drive;) 261 (void)drive;
327 return 0; 262 return 0;
328} 263}
329 264
330static inline bool storage_present(IF_MV_NONVOID(int drive)) 265static inline bool storage_present(int drive)
331{ 266{
332 IF_MV((void)drive;) 267 (void)drive;
333 return 0; 268 return 0;
334} 269}
335#endif /* HOTSWAP */ 270#endif /* HOTSWAP */
336#endif /* SIMULATOR */ 271
272#endif/*NOT SIMULATOR */
337#endif 273#endif
diff --git a/firmware/storage.c b/firmware/storage.c
deleted file mode 100644
index 631fbe6177..0000000000
--- a/firmware/storage.c
+++ /dev/null
@@ -1,35 +0,0 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id: $
9 *
10 * Copyright (C) 2008 by Frank Gevaerts
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21#include "config.h" /* for HAVE_MULTIVOLUME or not */
22#include "storage.h"
23
24/* storage_spindown() can't be inlined as it is passed as a function
25 pointer in settings_list.c
26*/
27
28void storage_spindown(int seconds)
29{
30#if (CONFIG_STORAGE & STORAGE_ATA)
31 ata_spindown(seconds);
32#else
33 (void)seconds;
34#endif
35}
diff --git a/firmware/target/arm/ata-nand-telechips.c b/firmware/target/arm/ata-nand-telechips.c
index a0c1bc9dfc..a6a901d222 100644
--- a/firmware/target/arm/ata-nand-telechips.c
+++ b/firmware/target/arm/ata-nand-telechips.c
@@ -856,3 +856,16 @@ long nand_last_disk_activity(void)
856{ 856{
857 return last_disk_activity; 857 return last_disk_activity;
858} 858}
859
860void nand_sleep(void)
861{
862}
863
864void nand_spin(void)
865{
866}
867
868void nand_spindown(int seconds)
869{
870 (void)seconds;
871}
diff --git a/firmware/target/arm/ata-sd-pp.c b/firmware/target/arm/ata-sd-pp.c
index f451a7fd8d..95e41e302b 100644
--- a/firmware/target/arm/ata-sd-pp.c
+++ b/firmware/target/arm/ata-sd-pp.c
@@ -1339,3 +1339,15 @@ bool sd_present(IF_MV_NONVOID(int drive))
1339} 1339}
1340#endif 1340#endif
1341 1341
1342void sd_sleep(void)
1343{
1344}
1345
1346void sd_spin(void)
1347{
1348}
1349
1350void sd_spindown(int seconds)
1351{
1352 (void)seconds;
1353}
diff --git a/firmware/usbstack/usb_storage.c b/firmware/usbstack/usb_storage.c
index 24ac00138d..5e97796db0 100644
--- a/firmware/usbstack/usb_storage.c
+++ b/firmware/usbstack/usb_storage.c
@@ -287,7 +287,7 @@ static bool check_disk_present(IF_MV_NONVOID(int volume))
287 return true; 287 return true;
288#else 288#else
289 unsigned char sector[512]; 289 unsigned char sector[512];
290 return storage_read_sectors(IF_MV2(volume,)0,1,sector) == 0; 290 return storage_read_sectors(volume,0,1,sector) == 0;
291#endif 291#endif
292} 292}
293 293
@@ -458,7 +458,7 @@ void usb_storage_transfer_complete(int ep,int dir,int status,int length)
458 cur_cmd.data[cur_cmd.data_select], 458 cur_cmd.data[cur_cmd.data_select],
459 MIN(BUFFER_SIZE/SECTOR_SIZE, cur_cmd.count)*SECTOR_SIZE); 459 MIN(BUFFER_SIZE/SECTOR_SIZE, cur_cmd.count)*SECTOR_SIZE);
460#else 460#else
461 int result = storage_write_sectors(IF_MV2(cur_cmd.lun,) 461 int result = storage_write_sectors(cur_cmd.lun,
462 cur_cmd.sector, 462 cur_cmd.sector,
463 MIN(BUFFER_SIZE/SECTOR_SIZE, 463 MIN(BUFFER_SIZE/SECTOR_SIZE,
464 cur_cmd.count), 464 cur_cmd.count),
@@ -637,7 +637,7 @@ static void send_and_read_next(void)
637 ramdisk_buffer + cur_cmd.sector*SECTOR_SIZE, 637 ramdisk_buffer + cur_cmd.sector*SECTOR_SIZE,
638 MIN(BUFFER_SIZE/SECTOR_SIZE, cur_cmd.count)*SECTOR_SIZE); 638 MIN(BUFFER_SIZE/SECTOR_SIZE, cur_cmd.count)*SECTOR_SIZE);
639#else 639#else
640 cur_cmd.last_result = storage_read_sectors(IF_MV2(cur_cmd.lun,) 640 cur_cmd.last_result = storage_read_sectors(cur_cmd.lun,
641 cur_cmd.sector, 641 cur_cmd.sector,
642 MIN(BUFFER_SIZE/SECTOR_SIZE, 642 MIN(BUFFER_SIZE/SECTOR_SIZE,
643 cur_cmd.count), 643 cur_cmd.count),
@@ -663,7 +663,7 @@ static void handle_scsi(struct command_block_wrapper* cbw)
663 unsigned char lun = cbw->lun; 663 unsigned char lun = cbw->lun;
664#endif 664#endif
665 unsigned int block_size_mult = 1; 665 unsigned int block_size_mult = 1;
666 storage_get_info(IF_MV2(lun,)&info); 666 storage_get_info(lun,&info);
667#ifdef USB_USE_RAMDISK 667#ifdef USB_USE_RAMDISK
668 block_size = SECTOR_SIZE; 668 block_size = SECTOR_SIZE;
669 block_count = RAMDISK_SIZE; 669 block_count = RAMDISK_SIZE;
@@ -673,7 +673,7 @@ static void handle_scsi(struct command_block_wrapper* cbw)
673#endif 673#endif
674 674
675#ifdef HAVE_HOTSWAP 675#ifdef HAVE_HOTSWAP
676 if(storage_removable(IF_MV(lun)) && !storage_present(IF_MV(lun))) { 676 if(storage_removable(lun) && !storage_present(lun)) {
677 ejected[lun] = true; 677 ejected[lun] = true;
678 try_release_ata(); 678 try_release_ata();
679 } 679 }
@@ -723,7 +723,7 @@ static void handle_scsi(struct command_block_wrapper* cbw)
723 for(i=0;i<NUM_VOLUMES;i++) 723 for(i=0;i<NUM_VOLUMES;i++)
724 { 724 {
725#ifdef HAVE_HOTSWAP 725#ifdef HAVE_HOTSWAP
726 if(storage_removable(IF_MV(i))) 726 if(storage_removable(i))
727 tb.lun_data->luns[i][1]=1; 727 tb.lun_data->luns[i][1]=1;
728 else 728 else
729#endif 729#endif
@@ -972,7 +972,7 @@ static void handle_scsi(struct command_block_wrapper* cbw)
972 ramdisk_buffer + cur_cmd.sector*SECTOR_SIZE, 972 ramdisk_buffer + cur_cmd.sector*SECTOR_SIZE,
973 MIN(BUFFER_SIZE/SECTOR_SIZE, cur_cmd.count)*SECTOR_SIZE); 973 MIN(BUFFER_SIZE/SECTOR_SIZE, cur_cmd.count)*SECTOR_SIZE);
974#else 974#else
975 cur_cmd.last_result = storage_read_sectors(IF_MV2(cur_cmd.lun,) 975 cur_cmd.last_result = storage_read_sectors(cur_cmd.lun,
976 cur_cmd.sector, 976 cur_cmd.sector,
977 MIN(BUFFER_SIZE/SECTOR_SIZE, 977 MIN(BUFFER_SIZE/SECTOR_SIZE,
978 cur_cmd.count), 978 cur_cmd.count),
@@ -1089,7 +1089,7 @@ static void fill_inquiry(IF_MV_NONVOID(int lun))
1089{ 1089{
1090 memset(tb.inquiry, 0, sizeof(struct inquiry_data)); 1090 memset(tb.inquiry, 0, sizeof(struct inquiry_data));
1091 struct storage_info info; 1091 struct storage_info info;
1092 storage_get_info(IF_MV2(lun,)&info); 1092 storage_get_info(lun,&info);
1093 copy_padded(tb.inquiry->VendorId,info.vendor,sizeof(tb.inquiry->VendorId)); 1093 copy_padded(tb.inquiry->VendorId,info.vendor,sizeof(tb.inquiry->VendorId));
1094 copy_padded(tb.inquiry->ProductId,info.product,sizeof(tb.inquiry->ProductId)); 1094 copy_padded(tb.inquiry->ProductId,info.product,sizeof(tb.inquiry->ProductId));
1095 copy_padded(tb.inquiry->ProductRevisionLevel,info.revision,sizeof(tb.inquiry->ProductRevisionLevel)); 1095 copy_padded(tb.inquiry->ProductRevisionLevel,info.revision,sizeof(tb.inquiry->ProductRevisionLevel));