From 01470454b01b386c48645a2d76c643d1d327dbfd Mon Sep 17 00:00:00 2001
From: germeier <germeier>
Date: Sun, 13 Oct 2002 12:03:50 +0000
Subject: finished support for external memory!

---
 ChangeLog         |   4 ++
 libmpio/fat.c     |   6 +--
 libmpio/io.c      | 114 +++++++++++++++++++++++++++++++++---------------------
 libmpio/mpio.c    |   4 +-
 mpiosh/callback.c |   6 +--
 5 files changed, 82 insertions(+), 52 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index ea0e704..eb0232e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2002-10-13  Markus Germeier  <mager@tzi.de>
+
+	* all operations on external memory should work now!
+
 2002-10-13  Markus Germeier  <mager@tzi.de>
 
 	* libmpio/mpio.c (mpio_init): fixed segv when external memory
diff --git a/libmpio/fat.c b/libmpio/fat.c
index fdb6965..ad9f9dd 100644
--- a/libmpio/fat.c
+++ b/libmpio/fat.c
@@ -1,6 +1,6 @@
 /* 
  *
- * $Id: fat.c,v 1.17 2002/10/13 08:57:31 germeier Exp $
+ * $Id: fat.c,v 1.18 2002/10/13 12:03:51 germeier Exp $
  *
  * Library for USB MPIO-*
  *
@@ -837,10 +837,10 @@ mpio_fat_write(mpio_t *m, mpio_mem_t mem)
       for (i = 0; i < (sm->dir_offset + DIR_NUM) ; i++) {
 	/* before writing to a new block delete it! */
 	if (((i / 0x20) * 0x20) == i) {
-	  block = mpio_zone_block_find_seq(m, mem, i);
+	  block = mpio_zone_block_find_seq(m, mem, (i/0x20));
 	  if (block == MPIO_BLOCK_NOT_FOUND) 
 	    {
-	      block = mpio_zone_block_find_free_seq(m, mem, i);
+	      block = mpio_zone_block_find_free_seq(m, mem, (i/0x20));
 	    }
 	  if (block == MPIO_BLOCK_NOT_FOUND) 
 	    {
diff --git a/libmpio/io.c b/libmpio/io.c
index 856f453..87b74fe 100644
--- a/libmpio/io.c
+++ b/libmpio/io.c
@@ -2,7 +2,7 @@
 
 /* 
  *
- * $Id: io.c,v 1.19 2002/10/13 08:57:31 germeier Exp $
+ * $Id: io.c,v 1.20 2002/10/13 12:03:51 germeier Exp $
  *
  * Library for USB MPIO-*
  *
@@ -440,8 +440,13 @@ mpio_zone_block_find_free_seq(mpio_t *m, mpio_cmd_t mem, DWORD lblock)
 WORD 
 mpio_zone_block_get_logical(mpio_t *m, mpio_cmd_t mem, DWORD pblock)
 {
-
-  return 0;
+  int zone, block, pb;
+  
+  pb    = pblock / BLOCK_SECTORS;
+  zone  = pb / MPIO_ZONE_PBLOCKS;
+  block = pb % MPIO_ZONE_PBLOCKS;
+  
+  return m->external.zonetable[zone][block];
 }
 
 
@@ -761,49 +766,54 @@ mpio_io_sector_write(mpio_t *m, BYTE mem, DWORD index, BYTE *input)
    * - calculate the logical block for zone management
    */
 
-  if (index==MPIO_BLOCK_DEFECT) 
-    {
-      block_address = 0;
-      pvalue = 0;
-    } else {
-      if ((index>=MPIO_BLOCK_CIS) && (index<(MPIO_BLOCK_CIS + BLOCK_SECTORS)))
+  if (mem == MPIO_EXTERNAL_MEM) 
+    {      
+      if (index==MPIO_BLOCK_DEFECT) 
 	{
 	  block_address = 0;
-	  if (index==MPIO_BLOCK_CIS)
+	  pvalue = 0;
+	} else {
+	  if ((index>=MPIO_BLOCK_CIS) && 
+	      (index<(MPIO_BLOCK_CIS + BLOCK_SECTORS)))
 	    {
-	      pvalue=mpio_zone_block_find_free_seq(m, mem, index);  
-	    } else {
-	      /* find the block from the block list! */
-	      pvalue=mpio_zone_block_find_seq(m, mem, MPIO_BLOCK_CIS);
+	      block_address = 0;
+	      if (index==MPIO_BLOCK_CIS)
+		{
+		  pvalue=mpio_zone_block_find_free_seq(m, mem, index);  
+		} else {
+		  /* find the block from the block list! */
+		  pvalue=mpio_zone_block_find_seq(m, mem, MPIO_BLOCK_CIS);
+		}
+	      if (pvalue != MPIO_BLOCK_NOT_FOUND)
+		pvalue = pvalue + index - MPIO_BLOCK_CIS;
+	      
+	    } else {      
+	      block_address = blockaddress_encode(index / BLOCK_SECTORS); 
+	      if ((index % BLOCK_SECTORS) == 0)
+		{
+		  /* this is the first write to the block: allocate a new one */
+		  /* ... and mark it with the block_address */
+		  pvalue=mpio_zone_block_find_free_seq(m, mem, 
+						       (index / BLOCK_SECTORS));      
+		} else {
+		  /* find the block from the block list! */
+		  pvalue=mpio_zone_block_find_seq(m, mem, (index / BLOCK_SECTORS));
+		}
+	      if (pvalue != MPIO_BLOCK_NOT_FOUND)
+		pvalue = pvalue + (index % BLOCK_SECTORS);
+	      
 	    }
-	  if (pvalue != MPIO_BLOCK_NOT_FOUND)
-	    pvalue = pvalue + index - MPIO_BLOCK_CIS;
 	  
-	} else {      
-	  block_address = blockaddress_encode(index / BLOCK_SECTORS); 
-	  if ((index % BLOCK_SECTORS) == 0)
+	  if (pvalue == MPIO_BLOCK_NOT_FOUND)
 	    {
-	      /* this is the first write to the block, so allocate a new one */
-	      /* ... and mark it with the block_address */
-	      pvalue=mpio_zone_block_find_free_seq(m, mem, 
-						   (index / BLOCK_SECTORS));      
-	    } else {
-	      /* find the block from the block list! */
-	      pvalue=mpio_zone_block_find_seq(m, mem, (index / BLOCK_SECTORS));
-	    }
-	  if (pvalue != MPIO_BLOCK_NOT_FOUND)
-	    pvalue = pvalue + (index % BLOCK_SECTORS);
-	  
+	      debug ("Oops, this should never happen! (%6x : %6x)\n", 
+		     index, block_address);
+	      exit (-1);
+	    }      
 	}
-      
-      if (pvalue == MPIO_BLOCK_NOT_FOUND)
-	{
-	  debug ("Oops, this should never happen! (%6x : %6x)\n", 
-		 index, block_address);
-	  exit (-1);
-	}      
+    } else {
+      pvalue = index;
     }
-  
 
   mpio_io_set_cmdpacket(m, PUT_SECTOR, mem, pvalue, sm->size, 0, cmdpacket);
 
@@ -1028,6 +1038,12 @@ mpio_io_block_delete(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f)
 
   fatentry2hw(f, &chip, &address);
 
+  if (address == MPIO_BLOCK_NOT_FOUND)
+    {
+      debug("hmm, what happens here? (%4x)\n", f->entry);
+      return 0;
+    }
+
   return (mpio_io_block_delete_phys(m, chip, address));
 }
 
@@ -1083,7 +1099,7 @@ mpio_io_block_delete_phys(mpio_t *m, BYTE chip, DWORD address)
       if (chip == MPIO_EXTERNAL_MEM) 
 	{
 	  sm = &m->external;
-	  mpio_zone_block_set_free_phys(m, chip, address);
+	  mpio_zone_block_set_defect_phys(m, chip, address);
 	}      
     }
   
@@ -1101,10 +1117,19 @@ mpio_io_block_write(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f, BYTE *data)
   BYTE  chip=0;
   DWORD address;
 
-  if (mem == MPIO_INTERNAL_MEM) sm = &m->internal;
-  if (mem == MPIO_EXTERNAL_MEM) sm = &m->external;
-  
-  fatentry2hw(f, &chip, &address);
+  if (mem == MPIO_INTERNAL_MEM) 
+    {
+      sm = &m->internal;
+      fatentry2hw(f, &chip, &address);
+    }
+	
+  if (mem == MPIO_EXTERNAL_MEM) 
+    {
+      sm = &m->external;
+      /* find free physical block */
+      chip = MPIO_EXTERNAL_MEM;
+      address = mpio_zone_block_find_free_log(m, mem, f->entry);
+    }
 
   /* build block for transfer to MPIO */
   for (i = 0; i < BLOCK_SECTORS; i++) 
@@ -1129,7 +1154,8 @@ mpio_io_block_write(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f, BYTE *data)
       /* fill in block information */
       if (mem == MPIO_EXTERNAL_MEM) 
 	{      
-/* 	  block_address = cluster2blockaddress(address, sm->size); */
+	  block_address = mpio_zone_block_get_logical(m, mem, address);
+	  block_address = blockaddress_encode(block_address);
 
 	  ba = (block_address / 0x100) & 0xff;
 	  sendbuff[(i * SECTOR_TRANS) + SECTOR_SIZE + 0x06] = ba;
diff --git a/libmpio/mpio.c b/libmpio/mpio.c
index 8ca99e5..11ae5c7 100644
--- a/libmpio/mpio.c
+++ b/libmpio/mpio.c
@@ -1,6 +1,6 @@
 /* 
  *
- * $Id: mpio.c,v 1.32 2002/10/13 08:57:31 germeier Exp $
+ * $Id: mpio.c,v 1.33 2002/10/13 12:03:51 germeier Exp $
  *
  * Library for USB MPIO-*
  *
@@ -837,7 +837,7 @@ mpio_file_del(mpio_t *m, mpio_mem_t mem, mpio_filename_t filename,
 	  }
 	
       } while (mpio_fatentry_next_entry(m, mem, f));
-    mpio_io_block_delete(m, mem, &backup);
+/*     mpio_io_block_delete(m, mem, &backup); */
     mpio_fatentry_set_free(m, mem, &backup);
     free(f);
   
diff --git a/mpiosh/callback.c b/mpiosh/callback.c
index 3c59f4d..126199d 100644
--- a/mpiosh/callback.c
+++ b/mpiosh/callback.c
@@ -2,7 +2,7 @@
  *
  * Author: Andreas B�sching  <crunchy@tzi.de>
  *
- * $Id: callback.c,v 1.23 2002/10/13 08:57:31 germeier Exp $
+ * $Id: callback.c,v 1.24 2002/10/13 12:03:51 germeier Exp $
  *
  * Copyright (C) 2001 Andreas B�sching <crunchy@tzi.de>
  *
@@ -181,8 +181,8 @@ mpiosh_cmd_mem(char *args[])
       printf("Support for external memory is work in progress!!\n");
       printf("Assumed status:\n");
       printf("reading   : works (untested)\n");
-      printf("deleting  : broken\n");
-      printf("writing   : broken\n");
+      printf("deleting  : works (untested)\n");
+      printf("writing   : works (untested)\n");
       printf("formatting: complete (untested)\n");
       printf("external memory card is selected\n");
     } else {
-- 
cgit v1.2.3