diff packages/io/flash/current/include/flash_dev.h @ 1764:96ec7e534d98

V2 flash header files clean-up. Eliminate flash_priv.h, moving the functionality into flash_dev.h instead.
author bartv
date Tue, 22 Feb 2005 21:03:43 +0000
parents f493618bc252
children
line wrap: on
line diff
--- a/packages/io/flash/current/include/flash_dev.h
+++ b/packages/io/flash/current/include/flash_dev.h
@@ -10,6 +10,9 @@
 //####ECOSGPLCOPYRIGHTBEGIN####
 // -------------------------------------------
 // This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 2004 eCosCentric Ltd.
+// Copyright (C) 2004 Andrew Lunn
+// Copyright (C) 2003 Gary Thomas
 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
 //
 // eCos is free software; you can redistribute it and/or modify it under
@@ -42,6 +45,144 @@
 //==========================================================================
 //#####DESCRIPTIONBEGIN####
 //
+// Author(s):    gthomas
+// Contributors: gthomas, Andrew Lunn, bartv
+// Date:         2000-07-14
+// Purpose:      
+// Description:  
+//              
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+
+#include <pkgconf/system.h>
+#include <pkgconf/io_flash.h>
+#include <cyg/infra/cyg_type.h>
+#include <cyg/io/flash.h>
+#include <cyg/hal/hal_cache.h>
+#include <cyg/hal/hal_tables.h>
+
+// Forward reference of the device structure
+struct cyg_flash_dev;
+
+// Structure of pointers to functions in the device driver
+struct cyg_flash_dev_funs {
+  int     (*flash_init) (struct cyg_flash_dev *dev);
+  size_t  (*flash_query) (struct cyg_flash_dev *dev,
+                          void * data, size_t len);
+  int     (*flash_erase_block) (struct cyg_flash_dev *dev, 
+                                cyg_flashaddr_t block_base);
+  int     (*flash_program) (struct cyg_flash_dev *dev, 
+                            cyg_flashaddr_t base, 
+                            const void* data, size_t len);
+  int     (*flash_read) (struct cyg_flash_dev *dev, 
+                         const cyg_flashaddr_t base, 
+                         void* data, size_t len);
+#ifdef CYGHWR_IO_FLASH_BLOCK_LOCKING    
+  int     (*flash_block_lock) (struct cyg_flash_dev *dev, 
+                               const cyg_flashaddr_t block_base);
+  int     (*flash_block_unlock) (struct cyg_flash_dev *dev, 
+                                 const cyg_flashaddr_t block_base);
+#endif    
+};
+
+// Dummy functions for some of the above operations, if a device does
+// not support e.g. locking.
+externC int     cyg_flash_devfn_init_nop(struct cyg_flash_dev*);
+externC size_t  cyg_flash_devfn_query_nop(struct cyg_flash_dev*, void*, const size_t);
+externC int     cyg_flash_devfn_lock_nop(struct cyg_flash_dev*, const cyg_flashaddr_t);
+externC int     cyg_flash_devfn_unlock_nop(struct cyg_flash_dev*, const cyg_flashaddr_t);
+
+// Facilitate function calls between flash-resident code and .2ram
+// functions.
+externC void*   cyg_flash_anonymizer(void*);
+
+// Structure each device places in the HAL table
+struct cyg_flash_dev {
+  const struct cyg_flash_dev_funs *funs;            // Function pointers
+  cyg_uint32                      flags;            // Device characteristics
+  cyg_flashaddr_t                 start;            // First address
+  cyg_flashaddr_t                 end;              // Last address
+  cyg_uint32                      num_block_infos;  // Number of entries
+  const cyg_flash_block_info_t    *block_info;      // Info about one block size
+
+  const void                      *priv;            // Devices private data
+
+  // The following are only written to by the FLASH IO layer.
+  cyg_flash_printf                *pf;              // Pointer to diagnostic printf
+  bool                            init;             // Device has been initialised
+#ifdef CYGPKG_KERNEL
+  cyg_mutex_t                     mutex;            // Mutex for thread safeness
+#endif
+#if (CYGHWR_IO_FLASH_DEVICE > 1)    
+  struct cyg_flash_dev            *next;            // Pointer to next device
+#endif    
+} CYG_HAL_TABLE_TYPE;
+
+// Macros for instantiating the above structures.
+#ifdef CYGHWR_IO_FLASH_BLOCK_LOCKING
+# define CYG_FLASH_FUNS(_funs_, _init_, _query_ , _erase_, _prog_ , _read_, _lock_, _unlock_) \
+struct cyg_flash_dev_funs _funs_ =      \
+{										\
+	.flash_init             = _init_,   \
+	.flash_query            = _query_,  \
+	.flash_erase_block      = _erase_,  \
+	.flash_program          = _prog_,   \
+	.flash_read             = _read_,   \
+	.flash_block_lock       = _lock_,   \
+	.flash_block_unlock     = _unlock_  \
+}
+#else
+# define CYG_FLASH_FUNS(_funs_, _init_, _query_ , _erase_, _prog_ , _read_, _lock_, _unlock_) \
+struct cyg_flash_dev_funs _funs_ =      \
+{										\
+	.flash_init             = _init_,   \
+	.flash_query            = _query_,  \
+	.flash_erase_block      = _erase_,  \
+	.flash_program          = _prog_,   \
+	.flash_read             = _read_    \
+}
+#endif
+
+// We assume HAL tables are placed into RAM.
+#define CYG_FLASH_DRIVER(_name_, _funs_, _flags_, _start_, _end_, _num_block_infos_, _block_info_, _priv_)  \
+struct cyg_flash_dev _name_ CYG_HAL_TABLE_ENTRY(cyg_flashdev) = \
+{                                                               \
+    .funs               = _funs_,                               \
+    .flags              = _flags_,                              \
+    .start              = _start_,                              \
+    .end                = _end_,                                \
+    .num_block_infos    = _num_block_infos_,                    \
+    .block_info         = _block_info_,                         \
+    .priv               = _priv_                                \
+}
+
+// Additional support for legacy device drivers.
+#ifdef CYGHWR_IO_FLASH_DEVICE_LEGACY
+struct flash_info {
+  int	block_size;	  // Assuming fixed size "blocks"
+  int	blocks;		  // Number of blocks
+  int	buffer_size;  // Size of write buffer (only defined for some devices)
+  unsigned long block_mask;
+  void *start, *end;  // Address range
+  int	init;
+  cyg_flash_printf *pf;
+};
+
+externC struct flash_info flash_info;
+externC int	 flash_hwr_init(void);
+externC int	 flash_hwr_map_error(int err);
+externC void flash_dev_query(void *data);
+#endif // CYGHWR_IO_FLASH_DEVICE_LEGACY
+
+// ----------------------------------------------------------------------------
+// This section provides utility macros used by some flash drivers, especially
+// the legacy ones. Such flash drivers need to #define _FLASH_PRIVATE before
+// including this file.
+
+#ifdef _FLASH_PRIVATE_
+
+//==========================================================================
 // Author(s):    hmt
 // Contributors: hmt, jskov, Jose Pascual <josepascual@almudi.com>
 // Date:         2001-02-22
@@ -53,16 +194,8 @@
 //               The FLASH_P2V macro can be used to fix up non-linear
 //               mappings of flash blocks (defaults to a linear 
 //               implementation).
-//              
-//####DESCRIPTIONEND####
-//
 //==========================================================================
 
-#ifdef _FLASH_PRIVATE_
-#include <cyg/infra/cyg_type.h>
-
-// ------------------------------------------------------------------------
-//
 // No mapping on this target - but these casts would be needed if some
 // manipulation did occur.  An example of this might be:
 // // First 4K page of flash at physical address zero is
@@ -165,3 +298,4 @@ typedef cyg_uint64 flash_data_t;
 #endif // CYGONCE_IO_FLASH_FLASH_DEV_H
 //----------------------------------------------------------------------------
 // end of flash_dev.h
+