This is a library which allows NAND flash devices to be accessed
by the eCos kernel and applications. It is analogous to the eCos FLASH
library, but for NAND devices. It exists as a separate library because of
the fundamental differences between the two types of flash memory.
This library provides the following functionality:
Interrogation to confirm that the expected device is
present
Reading from and writing to flash pages
Erasing flash blocks
The ability to divide a single device into multiple
partitions, like those of a hard drive
Creation and maintenance of a Bad Block Table
Use of an Error Correcting Code to detect and correct
single-bit errors, and to detect multiple-bit errors
Packing of the ECC and application out-of-band data into
the spare area on the device
Note: The spare area, ECC and bad block table have been
deliberately created with the intention of compatibility with
current versions of the Linux MTD layer. For example, this would
allow a single NAND device to be accessed by RedBoot to load a Linux
kernel, which could then go on to use another partition as its root
filesystem.
Tip: This library is also used
as glue to allow appropriate filesystems to use NAND devices. This
allows more useful higher-level access by applications and RedBoot via
the File I/O and POSIX interfaces. In other words, your application
may not need to invoke this library directly, though of course you
may still have to write a driver for your chip and/or board.
This library has two principal interfaces: one for
applications to call into it, and another to call
out to the chip-specific drivers. (The chip drivers
themselves then require support from the relevant platform HAL to allow
them to access the physical chip in an appropriate manner for the board -
such as the memory-mapped I/O range to use.)
The following diagram illustrates the calls from two applications
all the way to an underlying NAND device. Application 1 uses the NAND
library directly, whereas application 2 is using a filesystem and the
eCos File I/O layer.
Before this library can be used on a given board, an appropriate
device driver must be created. Each driver is for a particular NAND
part or family of parts; the HAL for each board then instantiates the
relevant driver(s) appropriately with board-specific glue such as the
memory-mapped I/O range to use. Full details on creating a driver are
presented in Chapter 52.