*
* This module allows read/write access to Micron MT29F serial
* NANDs.
-* 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, 0);
-* // enable access only on desired blocks
-* // start block = 50, num blocks = 20
-* kblock_trim(&fls.blk, 50, 20);
-* // ...
-* // now write to the flash
-* // block number is automatically converted
-* kblock_write(&fls.blk, 0, buf, 0, 128);
-* \endcode
*
* \author Stefano Fedrigo <aleph@develer.com>
*
* $WIZ$ module_name = "mt29f"
-* $WIZ$ module_depends = "kfile", "kfile_block", "kblock"
+* $WIZ$ module_depends = "timer", "kblock", "heap"
* $WIZ$ module_configuration = "bertos/cfg/cfg_mt29f.h"
*/
#define DRV_MT29F_H
#include "cfg/cfg_mt29f.h"
-
#include <cfg/macros.h>
-#include <cfg/compiler.h>
-
#include <io/kblock.h>
-#include <io/kfile.h>
-#include <io/kfile_block.h>
-#include <cpu/attr.h>
+/**
+ * \name Error codes.
+ * \{
+ */
+#define MT29F_ERR_ERASE BV(1) ///< Error erasing a block
+#define MT29F_ERR_WRITE BV(2) ///< Error writing a page
+#define MT29F_ERR_RD_TMOUT BV(3) ///< Read timeout
+#define MT29F_ERR_WR_TMOUT BV(4) ///< Write timeout
+#define MT29F_ERR_ECC BV(5) ///< Unrecoverable ECC error
+/** \} */
-struct Mt29fHardware;
/**
- * MT29F KBlock context structure.
+ * MT29F context.
*/
typedef struct Mt29f
{
- KBlock blk; ///< KBlock context
- struct Mt29fHardware *hw;
+ KBlock fd; // KBlock descriptor
+
+ uint8_t chip_select; // Chip select where NAND is connected
+ uint8_t status; // Status bitmap
+
+ uint16_t *block_map; // For bad blocks remapping
+ uint16_t remap_start; // First unused remap block
} Mt29f;
/*
- * Kblock type ID.
+ * Kblock id.
*/
-#define KBT_MT29F MAKE_ID('M', 'T', '2', '9')
+#define KBT_NAND MAKE_ID('N', 'A', 'N', 'D')
/**
- * Convert + ASSERT from generic KBlock to Flash.
- */
-INLINE Mt29f *FLASH_CAST(KBlock *fls)
+* Convert + ASSERT from generic KBlock to NAND context.
+*/
+INLINE Mt29f *MT29F_CAST(KBlock *kb)
{
- ASSERT(fls->priv.type == KBT_MT29F);
- return (Mt29f *)fls;
+ ASSERT(kb->priv.type == KBT_NAND);
+ return (Mt29f *)kb;
}
-void mt29f_hw_init(Mt29f *fls);
-void mt29f_hw_initUnbuffered(Mt29f *fls);
+struct Heap;
+
+// Kblock interface
+bool mt29f_init(Mt29f *chip, struct Heap *heap, unsigned chip_select);
+bool mt29f_initUnbuffered(Mt29f *chip, struct Heap *heap, unsigned chip_select);
+
+// NAND specific functions
+bool mt29f_getDevId(Mt29f *chip, uint8_t dev_id[5]);
+int mt29f_blockErase(Mt29f *chip, uint16_t block);
+void mt29f_format(Mt29f *chip);
+
+#ifdef _DEBUG
+void mt29f_ruinSomeBlocks(Mt29f *chip);
+#endif
+
#endif /* DRV_MT29F_H */