Subject: RFC: Flash memory device API
To: None <tech-kern@NetBSD.org>
From: Jared D. McNeill <jmcneill@invisible.ca>
List: tech-kern
Date: 09/04/2006 20:27:58
Hey folks --
On the road to building a flash filesystem for NetBSD, I decided that
a generic flash API was needed first. Feedback is welcome.
Externally, flash(4) exposes the following ioctl operations:
FLASH_ERASEBLOCK: erase a single block
FLASH_GBLOCKSTATUS: get the status of a single block
FLASH_SBLOCKSTATUS: set the status of a single block
FLASH_GETINFO: query flash device capabilities
Flash device capabilities is defined by flash_info_t, which provides:
enum flash_type fi_type; /* NOR or NAND */
block_id_t fi_nblocks;
size_t fi_bytesperblock;
size_t fi_sectorsperblock;
size_t fi_sectorsize;
Internally, a hardware flash device driver must implement the
following callbacks:
init(void *)
deinit(void *)
get_info(void *, flash_info_t *)
erase_block(void *, block_id_t)
get_block_status(void *, block_id_t)
set_block_status(void *, block_id_t, int)
read_sector(void *, int, uint8_t *, sector_info_t *, int)
write_sector(void *, int, uint8_t *, sector_info_t *, int)
ioctl(void *, u_long, caddr_t, int, struct lwp *) <-- optional
After filling in the structure of function callbacks, the hardware
driver must call flash_attach_mi.
Additionally, a userland utility is provided as flashctl(8) that
allows you to query device info, erase blocks, and get or set block
status.
Source code is available here for review:
http://www.invisible.ca/~jmcneill/netbsd/flash-20060904.tar
Cheers,
Jared