summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/main.c48
-rw-r--r--firmware/common/disk.c51
-rw-r--r--firmware/export/disk.h1
-rw-r--r--firmware/usb.c35
4 files changed, 57 insertions, 78 deletions
diff --git a/apps/main.c b/apps/main.c
index 572e0a3114..fece06a587 100644
--- a/apps/main.c
+++ b/apps/main.c
@@ -156,7 +156,6 @@ void init(void)
void init(void)
{
int rc, i;
- struct partinfo* pinfo;
/* if nobody initialized ATA before, I consider this a cold start */
bool coldstart = (PACR2 & 0x4000) != 0; /* starting from Flash */
@@ -240,12 +239,12 @@ void init(void)
usb_start_monitoring();
/* FixMe: the same kind of mounting happens in usb.c, share the code. */
- pinfo = disk_init(IF_MV(0));
- if (!pinfo)
+ rc = disk_mount_all();
+ if (rc<=0)
{
lcd_clear_display();
lcd_puts(0, 0, "No partition");
- lcd_puts(0, 1, "table.");
+ lcd_puts(0, 1, "found.");
#ifdef HAVE_LCD_BITMAP
lcd_puts(0, 2, "Insert USB cable");
lcd_puts(0, 3, "and fix it.");
@@ -256,47 +255,6 @@ void init(void)
system_reboot();
}
- fat_init();
- for ( i=0; i<4; i++ ) {
- if (!fat_mount(IF_MV2(0,) IF_MV2(0,) pinfo[i].start))
- break; /* only one partition gets mounted as of now */
- }
-
- if ( i==4 ) {
- DEBUGF("No partition found, trying to mount sector 0.\n");
- rc = fat_mount(IF_MV2(0,) IF_MV2(0,) 0);
- if(rc) {
- lcd_clear_display();
- lcd_puts(0,0,"No FAT32");
- lcd_puts(0,1,"partition!");
- lcd_update();
- sleep(HZ);
- /* Don't leave until we have been in USB mode */
- while(!dbg_partitions());
-
- /* The USB thread will panic if the drive still can't be mounted */
- }
- }
-#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 */
settings_calc_config_sector();
settings_load(SETTINGS_ALL);
settings_apply();
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 */
}
}