? packages/packages.15.diff
? packages/devs/usb/at91
Index: packages/devs/flash/arm/at91/current/ChangeLog
===================================================================
RCS file: /cvs/ecos/ecos/packages/devs/flash/arm/at91/current/ChangeLog,v
retrieving revision 1.5
diff -u -r1.5 ChangeLog
--- packages/devs/flash/arm/at91/current/ChangeLog	19 Feb 2006 19:43:01 -0000	1.5
+++ packages/devs/flash/arm/at91/current/ChangeLog	28 Mar 2006 19:36:43 -0000
@@ -1,4 +1,9 @@
 2006-02-19  Oliver Munz <munz@speag.ch>
+	
+	* src/at91_flash.c: Optimize the cyg_uint32 page...
+        And make the lock/unlock functions work.
+
+2006-02-19  Oliver Munz <munz@speag.ch>
 	    Andrew Lunn <andrew.lunn@ascom.ch>
 
 	* src/at91_flash.c: 
Index: packages/devs/flash/arm/at91/current/src/at91_flash.c
===================================================================
RCS file: /cvs/ecos/ecos/packages/devs/flash/arm/at91/current/src/at91_flash.c,v
retrieving revision 1.5
diff -u -r1.5 at91_flash.c
--- packages/devs/flash/arm/at91/current/src/at91_flash.c	19 Feb 2006 19:43:02 -0000	1.5
+++ packages/devs/flash/arm/at91/current/src/at91_flash.c	28 Mar 2006 19:36:44 -0000
@@ -129,19 +129,23 @@
 // probably not be in flash
 
 static int 
-flash_run_command(cyg_uint32 page, 
+flash_run_command(cyg_uint32 address, 
                   cyg_uint32 command, 
                   cyg_uint32 timeout) 
 CYGBLD_ATTRIB_SECTION(".2ram.flash_run_command");
 
 static int 
-flash_run_command(cyg_uint32 page, 
+flash_run_command(cyg_uint32 address, 
                   cyg_uint32 command, 
                   cyg_uint32 timeout) 
 {
   cyg_uint32 retcode;
   cyg_uint32 fsr;
   cyg_uint32 mask;
+  cyg_uint32 page;
+  
+  page = ((cyg_uint32) address - (cyg_uint32) flash_info.start) / 
+    flash_info.block_size;
   
   // Wait for the last command to finish
   retcode = flash_wait_for_controller(timeout);
@@ -269,7 +273,6 @@
   cyg_uint32 retcode;
   cyg_uint32 *buffer;
   cyg_uint32 *end;
-  cyg_uint32 page;
   
   buffer = (cyg_uint32 *) block;
   end = (cyg_uint32 *) (block + flash_info.block_size);
@@ -279,11 +282,8 @@
     buffer++;
   }
   
-  page = ((cyg_uint32) block - (cyg_uint32)flash_info.start) / 
-    flash_info.block_size;
-  
   flash_erase_before_write_enable();
-  retcode = flash_run_command(page, 
+  retcode = flash_run_command(block, 
                               AT91_MC_FCR_START_PROG, 
                               FLASH_TIMEOUT);
   
@@ -300,7 +300,6 @@
 {
   cyg_uint32 retcode;
   volatile unsigned long *target;
-  cyg_uint32 page;
   
   CYG_ASSERT(len % 4 == 0, "Only word writes allowed by current code");
   CYG_ASSERT(addr % 4 == 0, "Address must be word aligned for current code");
@@ -314,11 +313,8 @@
     len = len - sizeof(unsigned long);
   }
   
-  page = ((cyg_uint32) addr - (cyg_uint32)flash_info.start) / 
-    flash_info.block_size;
-
   flash_erase_before_write_disable();
-  retcode = flash_run_command(page, 
+  retcode = flash_run_command(addr, 
                               AT91_MC_FCR_START_PROG, 
                               FLASH_TIMEOUT);
   
@@ -334,14 +330,20 @@
 {
   cyg_uint32 sector;
   cyg_uint32 retcode;
+  cyg_uint32 status;
   
-  sector = ((cyg_uint32 )block) / sector_size;
-
-  retcode = flash_run_command(sector << 4, 
-                              AT91_MC_FCR_UNLOCK, 
-                              FLASH_TIMEOUT);
-
-  return retcode;
+  sector = (((cyg_uint32) block) - (cyg_uint32) flash_info.start) / sector_size;
+ 
+  HAL_READ_UINT32(AT91_MC + AT91_MC_FSR, status);
+  
+  if (status & (1 << (sector + 16))){
+      retcode = flash_run_command(block, 
+                                  AT91_MC_FCR_UNLOCK, 
+                                  FLASH_TIMEOUT);
+      return retcode;
+  } else {
+    return FLASH_ERR_OK;
+  }
 }
 
 // Lock a block. This is not strictly possible, we can only lock and
@@ -352,14 +354,21 @@
 {
   cyg_uint32 sector;
   cyg_uint32 retcode;
+  cyg_uint32 status;
   
-  sector = ((cyg_uint32) block) / sector_size;
+  sector = (((cyg_uint32) block) - (cyg_uint32) flash_info.start) / sector_size;
 
-  retcode = flash_run_command(sector << 4, 
-                              AT91_MC_FCR_UNLOCK, 
-                              FLASH_TIMEOUT);
+  HAL_READ_UINT32(AT91_MC + AT91_MC_FSR, status);
   
-  return retcode;
+  if (!(status & (1 << (sector + 16)))){
+      retcode = flash_run_command(block, 
+                                  AT91_MC_FCR_LOCK, 
+                                  FLASH_TIMEOUT);
+      
+      return retcode;
+  } else {
+    return FLASH_ERR_OK;
+  }
 }
 #endif 
   
