aboutsummaryrefslogtreecommitdiff
path: root/libmpio/fat.c
diff options
context:
space:
mode:
authorgermeier <germeier>2002-09-08 23:22:48 +0000
committergermeier <germeier>2002-09-08 23:22:48 +0000
commita14db4165ee76dac3d04b815ba258f3f6a3f7f40 (patch)
treec6ce63f8e051e1dad4ad338bef2d6067a59ea393 /libmpio/fat.c
parent13d3be139c5209a0c0d20159c85c91f59906a471 (diff)
downloadmpiosh-a14db4165ee76dac3d04b815ba258f3f6a3f7f40.tar.gz
mpiosh-a14db4165ee76dac3d04b815ba258f3f6a3f7f40.tar.bz2
mpiosh-a14db4165ee76dac3d04b815ba258f3f6a3f7f40.zip
fixed some issues for MPIOs with more than one internal chip
Diffstat (limited to 'libmpio/fat.c')
-rw-r--r--libmpio/fat.c100
1 files changed, 72 insertions, 28 deletions
diff --git a/libmpio/fat.c b/libmpio/fat.c
index 29a44fe..554a620 100644
--- a/libmpio/fat.c
+++ b/libmpio/fat.c
@@ -1,6 +1,6 @@
/*
*
- * $Id: fat.c,v 1.3 2002/09/03 21:20:53 germeier Exp $
+ * $Id: fat.c,v 1.4 2002/09/08 23:22:48 germeier Exp $
*
* Library for USB MPIO-*
*
@@ -30,6 +30,68 @@
#include <string.h>
#include <stdlib.h>
+void
+mpio_fatentry_hw2entry(mpio_t *m, mpio_fatentry_t *f)
+{
+ mpio_smartmedia_t *sm;
+ BYTE chip;
+ DWORD value;
+
+ if (f->mem == MPIO_INTERNAL_MEM)
+ {
+ sm = &m->internal;
+
+ if (f->hw_address == 0xffffffff)
+ return ;
+
+ value = f->hw_address;
+ chip = value >> 24;
+
+ value &= 0xffffff;
+ value /= 0x20;
+ value += (chip-1) * (sm->max_cluster / sm->chips);
+
+ f->entry = value;
+
+ return;
+ }
+
+ debug("This should never happen!\n");
+ exit(-1);
+
+ return;
+}
+
+
+void
+mpio_fatentry_entry2hw(mpio_t *m, mpio_fatentry_t *f)
+{
+ mpio_smartmedia_t *sm;
+ DWORD cluster;
+ BYTE chip;
+
+ if (f->mem == MPIO_INTERNAL_MEM)
+ {
+ sm = &m->internal;
+
+ chip = f->entry / (sm->max_cluster / sm->chips);
+ cluster = f->entry - ((sm->max_cluster / sm->chips) * chip);
+ cluster *= 0x20;
+ cluster += 0x01000000 * (chip+1);
+
+ f->hw_address=cluster;
+
+ return;
+ }
+
+ debug("This should never happen!\n");
+ exit(-1);
+
+ return;
+}
+
+
+
int
mpio_bootblocks_read (mpio_t *m, mpio_mem_t mem)
{
@@ -391,54 +453,36 @@ mpio_fatentry_next_entry(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f)
mpio_smartmedia_t *sm;
DWORD value;
DWORD endvalue;
- BYTE chip;
value = mpio_fatentry_read(m, mem, f);
- f->entry = value;
if (mem == MPIO_INTERNAL_MEM)
{
- sm = &m->internal;
+ sm = &m->internal;
f->hw_address = value;
- if (value == 0xffffffff)
- return 0;
-
- chip = value >> 24;
+ mpio_fatentry_hw2entry(m, f);
- value &= 0xffffff;
- value /= 0x20;
- value += (chip-1)
- * (m->internal.fat_size * SECTOR_SIZE / 0x10 / m->internal.chips);
-
-
-/* this is the opposite code in mpio_dentry_get_startcluster */
-/* cluster += */
-/* 0x01000000 * ((cluster / 0x20 / (m->internal.fat_size * SECTOR_SIZE / */
-/* 0x10 / m->internal.chips)) + 1); */
-
-
- f->entry = value;
-
+ endvalue = 0xffffffff;
}
if (mem == MPIO_EXTERNAL_MEM)
{
- sm = &m->external;
+ sm = &m->external;
+ f->entry = value;
if (sm->size==128)
{
endvalue = 0xfff8;
} else {
endvalue = 0xff8;
- }
-
- if (value >= endvalue)
- return 0;
-
+ }
}
+ if (value >= endvalue)
+ return 0;
+
return 1;
}