summaryrefslogtreecommitdiff
path: root/firmware/common/disk.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/common/disk.c')
-rw-r--r--firmware/common/disk.c51
1 files changed, 50 insertions, 1 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 @@
19#include <stdio.h> 19#include <stdio.h>
20#include "ata.h" 20#include "ata.h"
21#include "debug.h" 21#include "debug.h"
22#include "fat.h"
23#ifdef HAVE_MMC
24#include "ata_mmc.h"
25#endif
22#include "disk.h" 26#include "disk.h"
23 27
24/* Partition table entry layout: 28/* Partition table entry layout:
@@ -39,7 +43,7 @@
39 (array[pos] | (array[pos+1] << 8 ) | \ 43 (array[pos] | (array[pos+1] << 8 ) | \
40 (array[pos+2] << 16 ) | (array[pos+3] << 24 )) 44 (array[pos+2] << 16 ) | (array[pos+3] << 24 ))
41 45
42static struct partinfo part[8]; 46static struct partinfo part[8]; /* space for 4 partitions on 2 drives */
43 47
44struct partinfo* disk_init(IF_MV_NONVOID(int drive)) 48struct partinfo* disk_init(IF_MV_NONVOID(int drive))
45{ 49{
@@ -89,3 +93,48 @@ struct partinfo* disk_partinfo(int partition)
89 return &part[partition]; 93 return &part[partition];
90} 94}
91 95
96int disk_mount_all(void)
97{
98 struct partinfo* pinfo;
99 int i,j;
100 int mounted = 0;
101 bool found;
102 int drives = 1;
103#ifdef HAVE_MMC
104 if (mmc_detect()) /* for Ondio, only if card detected */
105 {
106 drives = 2; /* in such case we have two drives to try */
107 }
108#endif
109
110 fat_init(); /* reset all mounted partitions */
111 for (j=0; j<drives; j++)
112 {
113 found = false; /* reset partition-on-drive flag */
114 pinfo = disk_init(IF_MV(j));
115 if (pinfo == NULL)
116 {
117 continue;
118 }
119 for (i=0; mounted<NUM_VOLUMES && i<4; i++)
120 {
121 if (!fat_mount(IF_MV2(mounted,) IF_MV2(j,) pinfo[i].start))
122 {
123 mounted++;
124 found = true; /* at least one valid entry */
125 }
126 }
127
128 if (!found && mounted<NUM_VOLUMES) /* none of the 4 entries worked? */
129 { /* try "superfloppy" mode */
130 DEBUGF("No partition found, trying to mount sector 0.\n");
131 if (!fat_mount(IF_MV2(mounted,) IF_MV2(j,) 0))
132 {
133 mounted++;
134 }
135 }
136 }
137
138 return mounted;
139}
140