[ECOS] Re: NAND flash driver considerations: RFC
Rutger Hofman
rutger@cs.vu.nl
Thu Sep 25 08:24:00 GMT 2008
I have received no responses for this RFC.
Wouldn't anybody care to comment?
Or do you think it is more useful if I just present my proposed NAND
controller interfaces (public and controller-specific), my proposed NAND
chip interfaces, and my proposed .cdl config setup? For sure that is
some stages later in the design.
Rutger
Rutger Hofman wrote:
> I am writing a NAND flash driver for eCos. I would like to get reactions
> and advice on some issues, so I can correct now while I am still coding
> (and my guess is, this won't be the last time).
>
>
> NAND internal interfaces
> ------------------------
>
> NAND flash is actually two devices: the flash chip(s), and the
> controller, often a separate part, sometimes integrated into a CPU (as
> with my BlackFin BF54x).
> The chips seem to have a fairly uniform interface, as canonicalized by
> ONFI (http://www.onfi.org). All chips have lines for 'chip enable',
> 'select command', 'select address', 'r/w', 'data bus (x8 or x16)',
> 'status', which are handled in a standard way.
> Consequently, any controller has a very good chance of being able to
> speak to any chip, in hardware terms.
> Moreover, the command set is mostly (a subset of) ONFI.
> Deviations from the ONFI standard seem to be centered in the command
> that interrogates the chip about its properties. #LUNs, #blocks/LUN,
> #pages/block, data/page, spare size, bus width (x8 or x16), support for
> optional commands, and timing characteristics can typically be obtained
> either in ONFI speak (the 'READ PARAMETER BLOCK' command) or with a
> manufacturer-specific command.
>
> The NAND flash controllers vary in their CPU interface. They may have
> registers that reflect the basic capabilities of the chip interface
> ('command', 'address', 'data', 'status'). Or they may solve that
> differently, in some serial way or whatever.
>
> +++ My proposal:
>
> = define a NAND controller /interface/ that specifies functions for the
> chip capabilities ('command', 'address', 'data', 'status'); any NAND
> controller /implementation/ must define them.
> (See below: on top of that NAND controller interface, generic NAND code
> provides the functions specified by ONFI to read/program (partial) pages
> incl. spare erea, erase blocks, etc.)
>
> = as far as the chip is concerned: most of the parameters are found
> through chip interrogation, only very few parameters remain to be
> specified in a .cdl or a chip .h file: bus width?, maybe some timings;
> the src for the chip must contain any routines that deviate from ONFI,
> where the device interrogation routine may be an obvious candidate. (If
> a chip doesn't support this kind of interrogation, or if it must be
> overridden, well, it must go into the chip .cdl after all.)
>
>
> eCos directory structure
> ------------------------
>
> Should NAND be grouped under flash in packages/io and packages/devs? To
> be honest, the interface under which NAND flash is approached only
> vaguely resembles that for NOR flash. When we would choose for
> flash/nand, then we should also have to have flash/nor/ and move all
> things currently flashing down there.
>
> +++ My proposal:
>
> have packages/io/nand/ and packages/devs/nand/* *beside* packages/flash/
> and packages/devs/flash/*. They are very different. Also, who wants
> refactoring of flash/* into flash/nor/*.
> Is there a case to be made for separate nand/controller/ and nand/chip/
> trees?
>
>
> NAND eCos device type
> ----------------
>
> NAND flash is neither a character device (CHAR_DEVTAB_ENTRY), nor a
> block device (BLOCK_DEVTAB_ENTRY), nor a net device (NET_DEVTAB_ENTRY),
> nor a flash device in the sense of the eCos device driver structure.
> NAND:
> - must be erased in 'blocks'
> - must be programmed/read in (partial) pages (there usually is a good
> number of pages per block)
> - has a 'spare' area for each page (to store ECCs, bad block info, and
> client, e.g. file system info); spare is to be handled explicitly
> - has single-bit failures, corrected by ECCs
> - has bad blocks
> - and may have a copy-back function to relocate data within the flash chip.
> NAND controllers may calculate ECCs in hardware on the fly.
>
> So, should we copy/paste one of those many device driver infrastructures
> and modify them to accomodate the NAND flash devices?
> eCos NOR flash has solved this in its own way: it does device lookup
> based on the addresses that the NOR flash is memory-mapped to. But NAND
> flash is *not* memory-mapped. Besides, NAND flashes can/will exceed 4GB
> in size, so they cannot be addressed with 32bits.
>
> +++ My proposal:
>
> = I would rather create NAND devices as just DEVTAB_ENTRYs, and mark
> them as NAND (or OTHER or ...) i.s.o. CHAR/BLOCK type. The function
> dispatch block ptr can be cast, or it can be put in the private area.
> This way one can do device lookup in the normal way with cyg_io_lookup()
> ("/dev/nand0" resolves to a device handle).
>
> = I propose to create two separate device types: NAND controllers and
> NAND chips. The two device types might be designated as "/dev/nand0" for
> controller 0, and "/dev/nand0.2" for the third chip connected to
> controller 0.
>
> I agree that this is kind of broken. But I have trouble thinking of a
> way to do device lookup otherwise. Besides, we might consider
> generalization of the device structure in the sense that the functions
> block is no longer strictly typed. Its actual type might be derived from
> the device driver type field.
>
>
> External interface of NAND devices (controller on top of chip)
> --------------------------------------------------------------
>
> +++ My proposal:
> the ONFI functions exported by the generic NAND controller code are
> sufficient.
>
> These are:
> - lookup/init; a controller must initialize any chips it owns, locating
> them e.g. by their names ("/dev/nand0" owns "/dev/nand0.0" ..
> "/dev/nand0.X")
> - programming of a (partial) page incl spare
> - reading of a (partial) page incl spare, optionally exporting the
> controller's calculated ECC
> - erase of a block
> - marking block as bad
> - querying block badness
> - retrieving initial bad block table
>
> To be extended later:
> - reading/programming of multiple pages ?within a block
> - copyback
> - interleaved support
>
> The spare area will usually have fields for ECC values, either
> calculated by the layer above, or by a controller that supports it.
>
> So, at the NAND flash layer, there is no attempt to hide bad blocks,
> spare areas, ECC handling. The layer above (file system, 'contiguous'
> programmer) must handle that.
>
> This exactly fits the YAFFS2 interface (sorry, no idea about JFFS2, but
> I'd hope so).
>
> I don't know yet how 'contiguous' programming should work. Typical
> application: the boot loader code. For NAND flash booting, typically a
> first-level bootstrap is read from block 0 (guaranteed to be 'good').
> This contains code to copy the rest of the bootloader code from NAND
> flash to RAM, while taking in consideration any bad blocks. Hmmm...
> would there be any interest in this? As for me, I am currently just
> interested in getting YAFFS2 alive.
>
>
> Well, I hope that this is understandable, and sorry that it is so much.
>
> Looking forward to your comments,
>
> Rutger Hofman
> VU Amsterdam
--
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss
More information about the Ecos-discuss
mailing list