Some general NAND flash questions
If interoperability with other systems is not required, your choice of algorithms will depend upon the resources you have available (most notably RAM) and your usage patterns.  If you can get by with block-level granularity, and if no block will have to be rewritten too many times, the simplest approach is to simply map logical pages directly onto fixed physical blocks.  Some applications are amenable to such an approach, but others are not.  Generally, what is done is to have logical page addresses and keep a table of where each page is presently stored on the chip.  When a page should be changed, a new blank location is selected for it, the data is written there, the location table is updated, and the old page is invalidated.  If after such operation a block contains many invalid pages and no valid ones, erase it.  If the number of blank pages gets low, the system should identify a block which contains many invalid pages and, move the still-valid pages to new locations in other blocks, and invalidate the copies in the old locations; once that is done, the block won't contain any valid pages anymore and may thus be erased.

There are many variations to this approach based upon things like the amount of RAM available for page tables, the amount of time one is willing to spend searching for pages, etc.  If the number of pages is too large to keep a full table in memory, it may be necessary to store some of the table in flash.  If this is done, it may be helpful to have a virtual mapping between logical block numbers and physical blocks, and have the "cleanup" operation find a new blank block, copy all of the valid pages from the old block to the corresponding pages in the new one, and assign the new block the same logical block number that the old one had.  If one does this, one can avoid updating the tables that hold the locations of pages within the block.