Mercurial > flash_v2
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 +
