summaryrefslogtreecommitdiffstats
path: root/firmware
diff options
context:
space:
mode:
authorJörg Hohensohn <hohensoh@rockbox.org>2004-12-29 22:10:24 +0000
committerJörg Hohensohn <hohensoh@rockbox.org>2004-12-29 22:10:24 +0000
commit1a5962f2be995b669f2cc3a49be33b3ecd8dede0 (patch)
treedd9f407265826fa02ed08cc12f9fd54a093e4ad8 /firmware
parent5c631a1222c81bb075ec241621aa3626bd44c31a (diff)
downloadrockbox-1a5962f2be995b669f2cc3a49be33b3ecd8dede0.tar.gz
rockbox-1a5962f2be995b669f2cc3a49be33b3ecd8dede0.tar.bz2
rockbox-1a5962f2be995b669f2cc3a49be33b3ecd8dede0.zip
Shared mounting code, also more general. It will mount multiple HD partitions, too, once HAVE_MULTIVOLUME is enabled.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@5518 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r--firmware/common/disk.c51
-rw-r--r--firmware/export/disk.h1
-rw-r--r--firmware/usb.c35
3 files changed, 54 insertions, 33 deletions
diff --git a/firmware/common/disk.c b/firmware/common/disk.c
index cfe15984f9..aa42f0793f 100644
--- a/firmware/common/disk.c
+++ b/firmware/common/disk.c
@@ -19,6 +19,10 @@
#include <stdio.h>
#include "ata.h"
#include "debug.h"
+#include "fat.h"
+#ifdef HAVE_MMC
+#include "ata_mmc.h"
+#endif
#include "disk.h"
/* Partition table entry layout:
@@ -39,7 +43,7 @@
(array[pos] | (array[pos+1] << 8 ) | \
(array[pos+2] << 16 ) | (array[pos+3] << 24 ))
-static struct partinfo part[8];
+static struct partinfo part[8]; /* space for 4 partitions on 2 drives */
struct partinfo* disk_init(IF_MV_NONVOID(int drive))
{
@@ -89,3 +93,48 @@ struct partinfo* disk_partinfo(int partition)
return &part[partition];
}
+int disk_mount_all(void)
+{
+ struct partinfo* pinfo;
+ int i,j;
+ int mounted = 0;
+ bool found;
+ int drives = 1;
+#ifdef HAVE_MMC
+ if (mmc_detect()) /* for Ondio, only if card detected */
+ {
+ drives = 2; /* in such case we have two drives to try */
+ }
+#endif
+
+ fat_init(); /* reset all mounted partitions */
+ for (j=0; j<drives; j++)
+ {
+ found = false; /* reset partition-on-drive flag */
+ pinfo = disk_init(IF_MV(j));
+ if (pinfo == NULL)
+ {
+ continue;
+ }
+ for (i=0; mounted<NUM_VOLUMES && i<4; i++)
+ {
+ if (!fat_mount(IF_MV2(mounted,) IF_MV2(j,) pinfo[i].start))
+ {
+ mounted++;
+ found = true; /* at least one valid entry */
+ }
+ }
+
+ if (!found && mounted<NUM_VOLUMES) /* none of the 4 entries worked? */
+ { /* try "superfloppy" mode */
+ DEBUGF("No partition found, trying to mount sector 0.\n");
+ if (!fat_mount(IF_MV2(mounted,) IF_MV2(j,) 0))
+ {
+ mounted++;
+ }
+ }
+ }
+
+ return mounted;
+}
+
diff --git a/firmware/export/disk.h b/firmware/export/disk.h
index 70b73c6547..e8525d1f75 100644
--- a/firmware/export/disk.h
+++ b/firmware/export/disk.h
@@ -34,5 +34,6 @@ struct partinfo {
/* returns a pointer to an array of 8 partinfo structs */
struct partinfo* disk_init(IF_MV_NONVOID(int volume));
struct partinfo* disk_partinfo(int partition);
+int disk_mount_all(void); /* returns the # of successful mounts */
#endif
diff --git a/firmware/usb.c b/firmware/usb.c
index ab8e080c45..7060ccfe23 100644
--- a/firmware/usb.c
+++ b/firmware/usb.c
@@ -122,7 +122,6 @@ static void usb_enable(bool on)
static void usb_slave_mode(bool on)
{
int rc;
- struct partinfo* pinfo;
if(on)
{
@@ -135,7 +134,6 @@ static void usb_slave_mode(bool on)
}
else
{
- int i;
DEBUGF("Leaving USB slave mode\n");
/* Let the ISDx00 settle */
@@ -146,6 +144,7 @@ static void usb_slave_mode(bool on)
rc = ata_init();
if(rc)
{
+ /* fixme: can we remove this? (already such in main.c) */
char str[32];
lcd_clear_display();
snprintf(str, 31, "ATA error: %d", rc);
@@ -157,38 +156,10 @@ static void usb_slave_mode(bool on)
panicf("ata: %d",rc);
}
- pinfo = disk_init(IF_MV(0));
- if (!pinfo)
- panicf("disk: NULL");
-
- fat_init();
- for ( i=0; i<4; i++ ) {
- rc = fat_mount(IF_MV2(0,) IF_MV2(0,) pinfo[i].start);
- if (!rc)
- break; /* only one partition gets mounted as of now */
- }
- if (i==4)
+ rc = disk_mount_all();
+ if (rc <= 0) /* no partition */
panicf("mount: %d",rc);
-#ifdef HAVE_MULTIVOLUME
- /* mount partition on the optional volume */
-#ifdef HAVE_MMC
- if (mmc_detect()) /* for Ondio, only if card detected */
-#endif
- {
- pinfo = disk_init(1);
- if (pinfo)
- {
- for ( i=0; i<4; i++ ) {
- if (!fat_mount(1, 1, pinfo[i].start))
- break; /* only one partition gets mounted as of now */
- }
- if ( i==4 ) {
- rc = fat_mount(1, 1, 0);
- }
- }
- }
-#endif /* #ifdef HAVE_MULTIVOLUME */
}
}