X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fdrv%2Fflash.h;h=543b3242d440df8da4986c551479cc433d601947;hb=cd7538b224bbe4fb287b96903678df6ae435522c;hp=9552a2e6a7b76172b780610176db5dad7509014f;hpb=2cf89a4723de15eadeeba8f8453170c94b19d496;p=bertos.git diff --git a/bertos/drv/flash.h b/bertos/drv/flash.h index 9552a2e6..543b3242 100644 --- a/bertos/drv/flash.h +++ b/bertos/drv/flash.h @@ -29,14 +29,38 @@ * Copyright 2005 Develer S.r.l. (http://www.develer.com/) * --> * +* \defgroup drv_emb_flash Embedded flash driver +* \ingroup drivers +* \{ * * \brief Embedded flash for cpu. * +* This module allows to access in reading and writing to the internal +* flash memory of the micro. It is a block device, so it must be +* accessed using the KBlock interface functions (see kblock.h). +* +* Once you have opened the flash for writing, you may want to use +* kblock_trim() to avoid overwriting data on other flash banks. +* +* Example usage: +* \code +* Flash fls; +* flash_init(&fls.blk, 0); +* // enable access only on desired blocks +* // start block = 50, num blocks = 20 +* kblock_trim(&fls, 50, 20); +* // ... +* // now write to the flash +* // block number is automatically converted +* kblock_write(&fls.blk, 0, buf, 0, 128); +* \endcode +* * \author Francesco Sacchi * \author Daniele Basile * * $WIZ$ module_name = "flash" * $WIZ$ module_depends = "kfile", "kfile_block", "kblock" +* $WIZ$ module_configuration = "bertos/cfg/cfg_emb_flash.h" */ #ifndef DRV_FLASH_H @@ -51,23 +75,45 @@ #include #include -/* - * Embedded flash error flags +#include + +#if COMPILER_C99 + #define flash_init(...) PP_CAT(flash_init_, COUNT_PARMS(__VA_ARGS__)) (__VA_ARGS__) +#else + /** + * Init function for flash driver. + * + * This macro cannot fail, so no error conditions are reported. + * + * This macro expands to + * - flash_init_2(Flash *fls, flags), the new KBlock API + * - flash_init_1(Flash *fls), old API, provided for compatibility + * + * Do NOT use the above functions directly, use flash_init() instead. + * Disable old API if you are not upgrading an existing project. + */ + #define flash_init(args...) PP_CAT(flash_init_, COUNT_PARMS(args)) (args) +#endif + +/** + * \name Embedded flash error values + * \{ */ #define FLASH_WR_OK 0 ///< Write ok. #define FLASH_NOT_ERASED BV(1) ///< Flash memory was not erased before to write it. #define FLASH_WR_PROTECT BV(2) ///< Write not allowed the flash memory was protected. #define FLASH_WR_TIMEOUT BV(3) ///< Timeout while writing #define FLASH_WR_ERR BV(4) ///< Invalid command and/or a bad keywords +/** \} */ struct FlashHardware; /** - * EmbFlash KFile context structure. + * EmbFlash KBlock context structure. */ typedef struct Flash { - KBlock blk; + KBlock blk; ///< KBlock context struct FlashHardware *hw; #if !CONFIG_FLASH_DISABLE_OLD_API union { @@ -77,13 +123,13 @@ typedef struct Flash #endif /* !CONFIG_FLASH_DISABLE_OLD_API */ } Flash; -/** +/* * ID for FLASH */ #define KBT_FLASH MAKE_ID('F', 'L', 'A', 'S') /** -* Convert + ASSERT from generic KFile to Flash. +* Convert + ASSERT from generic KBlock to Flash. */ INLINE Flash *FLASH_CAST(KBlock *fls) { @@ -91,26 +137,35 @@ INLINE Flash *FLASH_CAST(KBlock *fls) return (Flash *)fls; } -void flash_hw_init(Flash *fls); -void flash_hw_initUnbuffered(Flash *fls); +void flash_hw_init(Flash *fls, int flags); +void flash_hw_initUnbuffered(Flash *fls, int flags); #include CPU_HEADER(flash) -INLINE void flash_init(Flash *fls) -{ - flash_hw_init(fls); +/** + * \name Flash init flags + * \{ + */ +#define FLASH_WRITE_ONCE BV(0) ///< Allow only one write per block. +#define FLASH_UNBUFFERED BV(1) ///< Open flash memory disabling page caching, no modification and partial write are allowed. +/** \} */ - #if !CONFIG_FLASH_DISABLE_OLD_API - kfileblock_init(&fls->fdblk, &fls->blk); - #endif /* !CONFIG_FLASH_DISABLE_OLD_API */ -} +/** + * Initialize \a fls Flash context structure. + * \param fls Flash context structure + * \param flags A combination of flash init flags + */ +#define flash_init_2(fls, flags) (flags & FLASH_UNBUFFERED) ? \ + flash_hw_initUnbuffered(fls, flags) : flash_hw_init(fls, flags) -INLINE void flash_initUnbuffered(Flash *fls) +#if !CONFIG_FLASH_DISABLE_OLD_API +INLINE DEPRECATED void flash_init_1(Flash *fls) { - flash_hw_initUnbuffered(fls); + flash_hw_init(fls, 0); + kfileblock_init(&fls->fdblk, &fls->blk); } +#endif /* !CONFIG_FLASH_DISABLE_OLD_API */ -#include CPU_HEADER(flash) +/** \} */ #endif /* DRV_FLASH_H */ -