diff options
author | Jörg Hohensohn <hohensoh@rockbox.org> | 2004-12-29 22:10:24 +0000 |
---|---|---|
committer | Jörg Hohensohn <hohensoh@rockbox.org> | 2004-12-29 22:10:24 +0000 |
commit | 1a5962f2be995b669f2cc3a49be33b3ecd8dede0 (patch) | |
tree | dd9f407265826fa02ed08cc12f9fd54a093e4ad8 /firmware | |
parent | 5c631a1222c81bb075ec241621aa3626bd44c31a (diff) | |
download | rockbox-1a5962f2be995b669f2cc3a49be33b3ecd8dede0.tar.gz 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.c | 51 | ||||
-rw-r--r-- | firmware/export/disk.h | 1 | ||||
-rw-r--r-- | firmware/usb.c | 35 |
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 */ } } |