diff packages/io/flash/current/src/flashiodev.c @ 791:a2dfa8bf3c57

Export RedBoot FIS functions - from Knud Woehler <knud.woehler@microplex.de>
author gthomas
date Mon, 03 Mar 2003 17:09:56 +0000
parents d2c90368aeef
children 3c5c8c8ffa30
line wrap: on
line diff
--- a/packages/io/flash/current/src/flashiodev.c
+++ b/packages/io/flash/current/src/flashiodev.c
@@ -41,7 +41,7 @@
 //#####DESCRIPTIONBEGIN####
 //
 // Author(s):    jlarmour
-// Contributors: 
+// Contributors: woehler
 // Date:         2002-01-16
 // Purpose:      
 // Description:  
@@ -59,22 +59,53 @@
 #include <cyg/io/config_keys.h>
 #include <cyg/io/flash.h>
 #include <string.h> // memcpy
+#include <cyg/hal/hal_if.h>
 
 #define MIN(x,y) ((x)<(y) ? (x) : (y))
 
 // 1 per devtab entry, so only 1 for now
-static char flashiodev_workspaces[1][FLASH_MIN_WORKSPACE];
+//static char flashiodev_workspaces[1][FLASH_MIN_WORKSPACE];
+
+struct flashiodev_priv_t{
+	char workspace[FLASH_MIN_WORKSPACE];
+	char *start;
+	char *end;
+};
+
+static struct flashiodev_priv_t flashiodev_priv[1];
 
 static int dummy_printf( const char *fmt, ... ) {return 0;}
 
 static bool
 flashiodev_init( struct cyg_devtab_entry *tab )
 {
-    char *ws = (char *)tab->priv;
+	struct flashiodev_priv_t *dev = (struct flashiodev_priv_t *)tab->priv;
+	char *ws = dev->workspace;
     int stat = flash_init( ws, FLASH_MIN_WORKSPACE, &dummy_printf );
+    if ( stat == 0 )
+	{
+#ifdef CYGNUM_IO_FLASH_BLOCK_CFG_FIS_1
+		CYG_ADDRESS		flash_base;
+		unsigned long	size;
 
-    if ( stat == 0 )
+		if(!CYGACC_CALL_IF_FLASH_FIS_OP(CYGNUM_CALL_IF_FLASH_FIS_GET_FLASH_BASE, 
+                                        CYGDAT_IO_FLASH_BLOCK_FIS_NAME_1,
+									    &flash_base))
+			return false;
+		if(!CYGACC_CALL_IF_FLASH_FIS_OP(CYGNUM_CALL_IF_FLASH_FIS_GET_SIZE, 
+	                                    CYGDAT_IO_FLASH_BLOCK_FIS_NAME_1,
+									    &size))
+			return false;
+			
+		dev->start = (char *)flash_base;
+		dev->end = (char *)flash_base + size;
+#else
+		dev->start = (char *)flash_info.start + CYGNUM_IO_FLASH_BLOCK_OFFSET_1;
+		dev->end = (char *)flash_info.start + CYGNUM_IO_FLASH_BLOCK_OFFSET_1 + 
+                           CYGNUM_IO_FLASH_BLOCK_LENGTH_1)
+#endif
         return true;
+	}
     else
         return false;
 } // flashiodev_init()
@@ -92,21 +123,21 @@ static Cyg_ErrNo
 flashiodev_bread( cyg_io_handle_t handle, void *buf, cyg_uint32 *len,
                   cyg_uint32 pos)
 {
-    char *startpos = (char *)flash_info.start + pos + 
-        CYGNUM_IO_FLASH_BLOCK_OFFSET_1;
+	struct cyg_devtab_entry *tab = (struct cyg_devtab_entry *)handle;
+	struct flashiodev_priv_t *dev = (struct flashiodev_priv_t *)tab->priv;
+
+	char *startpos = dev->start + pos;
 
 #ifdef CYGPKG_INFRA_DEBUG // don't bother checking this all the time
     char *endpos = startpos + *len - 1;
-    char *flashend = MIN( (char *)flash_info.end,
-                          ((char *)flash_info.start + CYGNUM_IO_FLASH_BLOCK_OFFSET_1 + 
-                           CYGNUM_IO_FLASH_BLOCK_LENGTH_1));
-    if ( startpos < (char *)flash_info.start+CYGNUM_IO_FLASH_BLOCK_OFFSET_1 )
+    char *flashend = MIN( (char *)flash_info.end, dev->end);
+    if ( startpos < dev->start )
         return -EINVAL;
     if ( endpos > flashend )
         return -EINVAL;
 #endif
+
     memcpy( buf, startpos, *len );
-    
     return ENOERR;
 } // flashiodev_bread()
 
@@ -114,17 +145,17 @@ static Cyg_ErrNo
 flashiodev_bwrite( cyg_io_handle_t handle, const void *buf, cyg_uint32 *len,
                    cyg_uint32 pos )
 {   
+	struct cyg_devtab_entry *tab = (struct cyg_devtab_entry *)handle;
+	struct flashiodev_priv_t *dev = (struct flashiodev_priv_t *)tab->priv;
+
     Cyg_ErrNo err = ENOERR;
     void *erraddr;
-
-    char *startpos = (char *)flash_info.start + pos + CYGNUM_IO_FLASH_BLOCK_OFFSET_1;
+    char *startpos = dev->start + pos;
 
 #ifdef CYGPKG_INFRA_DEBUG // don't bother checking this all the time
     char *endpos = startpos + *len - 1;
-    char *flashend = MIN( (char *)flash_info.end,
-                          ((char *)flash_info.start + CYGNUM_IO_FLASH_BLOCK_OFFSET_1 + 
-                           CYGNUM_IO_FLASH_BLOCK_LENGTH_1));
-    if ( startpos < (char *)flash_info.start + CYGNUM_IO_FLASH_BLOCK_OFFSET_1 )
+    char *flashend = MIN( (char *)flash_info.end, dev->end);
+    if ( startpos < dev->start )
         return -EINVAL;
     if ( endpos > flashend )
         return -EINVAL;
@@ -143,22 +174,22 @@ flashiodev_get_config( cyg_io_handle_t h
                        void* buf,
                        cyg_uint32* len)
 {
+	struct cyg_devtab_entry *tab = (struct cyg_devtab_entry *)handle;
+	struct flashiodev_priv_t *dev = (struct flashiodev_priv_t *)tab->priv;
+
     switch (key) {
     case CYG_IO_GET_CONFIG_FLASH_ERASE:
     {
         if ( *len != sizeof( cyg_io_flash_getconfig_erase_t ) )
              return -EINVAL;
         {
-            cyg_io_flash_getconfig_erase_t *e =
-                (cyg_io_flash_getconfig_erase_t *)buf;
-            char *startpos = (char *)flash_info.start + e->offset + CYGNUM_IO_FLASH_BLOCK_OFFSET_1;
+            cyg_io_flash_getconfig_erase_t *e = (cyg_io_flash_getconfig_erase_t *)buf;
+            char *startpos = dev->start + e->offset;
 
 #ifdef CYGPKG_INFRA_DEBUG // don't bother checking this all the time
             char *endpos = startpos + e->len - 1;
-            char *flashend = MIN( (char *)flash_info.end,
-                          ((char *)flash_info.start + CYGNUM_IO_FLASH_BLOCK_OFFSET_1 + 
-                           CYGNUM_IO_FLASH_BLOCK_LENGTH_1));
-            if ( startpos < (char *)flash_info.start + CYGNUM_IO_FLASH_BLOCK_OFFSET_1 )
+		    char *flashend = MIN( (char *)flash_info.end, dev->end);
+			if ( startpos < dev->start )
                 return -EINVAL;
             if ( endpos > flashend )
                 return -EINVAL;
@@ -176,7 +207,7 @@ flashiodev_get_config( cyg_io_handle_t h
                 (cyg_io_flash_getconfig_devsize_t *)buf;
 
 	    //d->dev_size = flash_info.blocks * flash_info.block_size;
-	    d->dev_size = CYGNUM_IO_FLASH_BLOCK_LENGTH_1;
+			d->dev_size = dev->end - dev->start;
         }
         return ENOERR;
     }
@@ -185,12 +216,11 @@ flashiodev_get_config( cyg_io_handle_t h
     {
         cyg_io_flash_getconfig_blocksize_t *b =
             (cyg_io_flash_getconfig_blocksize_t *)buf;
-        char *startpos = (char *)flash_info.start + CYGNUM_IO_FLASH_BLOCK_OFFSET_1 + b->offset;
 #ifdef CYGPKG_INFRA_DEBUG // don't bother checking this all the time
-        char *flashend = MIN( (char *)flash_info.end,
-                          ((char *)flash_info.start + CYGNUM_IO_FLASH_BLOCK_OFFSET_1 + 
-                           CYGNUM_IO_FLASH_BLOCK_LENGTH_1));
-        if ( startpos < (char *)flash_info.start + CYGNUM_IO_FLASH_BLOCK_OFFSET_1 )
+       char *startpos = dev->start + b->offset;
+	    char *flashend = MIN( (char *)flash_info.end, dev->end);
+
+        if ( startpos < dev->start )
             return -EINVAL;
         if ( startpos > flashend )
             return -EINVAL;
@@ -199,7 +229,7 @@ flashiodev_get_config( cyg_io_handle_t h
              return -EINVAL;
         
         // offset unused for now
-	b->block_size = flash_info.block_size;
+		b->block_size = flash_info.block_size;
         return ENOERR;
     }
 
@@ -215,6 +245,9 @@ flashiodev_set_config( cyg_io_handle_t h
                        const void* buf,
                        cyg_uint32* len)
 {
+	struct cyg_devtab_entry *tab = (struct cyg_devtab_entry *)handle;
+	struct flashiodev_priv_t *dev = (struct flashiodev_priv_t *)tab->priv;
+
     switch (key) {
     default:
         return -EINVAL;
@@ -240,6 +273,6 @@ BLOCK_DEVTAB_ENTRY( cyg_io_flashdev1,
                     &cyg_io_flashdev1_ops,
                     &flashiodev_init,
                     0, // No lookup required
-                    &flashiodev_workspaces[0] );
+                    &flashiodev_priv[0] );
 
 // EOF flashiodev.c