diff options
-rw-r--r-- | apps/main.c | 48 | ||||
-rw-r--r-- | firmware/common/disk.c | 51 | ||||
-rw-r--r-- | firmware/export/disk.h | 1 | ||||
-rw-r--r-- | firmware/usb.c | 35 |
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 */ } } |