From 542d350ea36355656946094aabdfa70fbece473e Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 4 Jul 2011 09:26:19 +0000 Subject: 2011-07-04 Sebastian Huber * misc/nand-mlc-erase-block-safe.c, misc/nand-mlc-write-blocks.c, include/nand-mlc.h: Fixed write blocks. --- c/src/lib/libbsp/arm/lpc32xx/ChangeLog | 5 ++++ c/src/lib/libbsp/arm/lpc32xx/include/nand-mlc.h | 16 +++++++++-- .../arm/lpc32xx/misc/nand-mlc-erase-block-safe.c | 32 ++++++++++++---------- .../arm/lpc32xx/misc/nand-mlc-write-blocks.c | 17 +++++------- 4 files changed, 42 insertions(+), 28 deletions(-) (limited to 'c/src/lib/libbsp/arm/lpc32xx') diff --git a/c/src/lib/libbsp/arm/lpc32xx/ChangeLog b/c/src/lib/libbsp/arm/lpc32xx/ChangeLog index df256ec869..f1255235bb 100644 --- a/c/src/lib/libbsp/arm/lpc32xx/ChangeLog +++ b/c/src/lib/libbsp/arm/lpc32xx/ChangeLog @@ -1,3 +1,8 @@ +2011-07-04 Sebastian Huber + + * misc/nand-mlc-erase-block-safe.c, misc/nand-mlc-write-blocks.c, + include/nand-mlc.h: Fixed write blocks. + 2011-07-01 Stephan Hoffmann Sebastian Huber diff --git a/c/src/lib/libbsp/arm/lpc32xx/include/nand-mlc.h b/c/src/lib/libbsp/arm/lpc32xx/include/nand-mlc.h index 29ad8d04b4..f4512aba3b 100644 --- a/c/src/lib/libbsp/arm/lpc32xx/include/nand-mlc.h +++ b/c/src/lib/libbsp/arm/lpc32xx/include/nand-mlc.h @@ -286,14 +286,24 @@ rtems_status_code lpc32xx_mlc_erase_block_safe(uint32_t block_index); * @brief Erases the block with index @a block_index. * * Variant of lpc32xx_mlc_erase_block_safe() with more parameters for - * efficiency reasons. + * efficiency reasons. The @a page_begin must be the index of the first page + * of the block. The @a page_end must be the page index of the last page of + * the block plus one. */ rtems_status_code lpc32xx_mlc_erase_block_safe_3( uint32_t block_index, - uint32_t first_page_of_block, - uint32_t pages_per_block + uint32_t page_begin, + uint32_t page_end ); +/** + * @brief Writes zero values to the pages specified by @a page_begin and + * @a page_end. + * + * The data and spare area are cleared to zero. This marks the pages as bad. + */ +void lpc32xx_mlc_zero_pages(uint32_t page_begin, uint32_t page_end); + /** * @brief Writes the page with index @a page_index. * diff --git a/c/src/lib/libbsp/arm/lpc32xx/misc/nand-mlc-erase-block-safe.c b/c/src/lib/libbsp/arm/lpc32xx/misc/nand-mlc-erase-block-safe.c index e7b49f58e7..07820ebc67 100644 --- a/c/src/lib/libbsp/arm/lpc32xx/misc/nand-mlc-erase-block-safe.c +++ b/c/src/lib/libbsp/arm/lpc32xx/misc/nand-mlc-erase-block-safe.c @@ -3,8 +3,8 @@ * * @ingroup lpc32xx_nand_mlc * - * @brief lpc32xx_mlc_erase_block_safe() and lpc32xx_mlc_erase_block_safe_3() - * implementation. + * @brief lpc32xx_mlc_erase_block_safe(), lpc32xx_mlc_erase_block_safe_3(), and + * lpc32xx_mlc_zero_block() implementation. */ /* @@ -27,13 +27,13 @@ #include -static void zero_block(uint32_t first_page_of_block, uint32_t pages_per_block) +void lpc32xx_mlc_zero_pages(uint32_t page_begin, uint32_t page_end) { uint32_t page = 0; - for (page = 0; page < pages_per_block; ++page) { + for (page = page_begin; page < page_end; ++page) { lpc32xx_mlc_write_page_with_ecc( - first_page_of_block + page, + page, lpc32xx_magic_zero_begin, lpc32xx_magic_zero_begin ); @@ -41,15 +41,15 @@ static void zero_block(uint32_t first_page_of_block, uint32_t pages_per_block) } static bool is_bad_page( - uint32_t first_page_of_block, - uint32_t page + uint32_t page_begin, + uint32_t page_offset ) { uint32_t spare [MLC_LARGE_SPARE_WORD_COUNT]; memset(spare, 0, MLC_LARGE_SPARE_SIZE); lpc32xx_mlc_read_page( - first_page_of_block + page, + page_begin + page_offset, lpc32xx_magic_zero_begin, spare ); @@ -58,23 +58,23 @@ static bool is_bad_page( rtems_status_code lpc32xx_mlc_erase_block_safe_3( uint32_t block_index, - uint32_t first_page_of_block, - uint32_t pages_per_block + uint32_t page_begin, + uint32_t page_end ) { rtems_status_code sc = RTEMS_SUCCESSFUL; - if (is_bad_page(first_page_of_block, 0)) { + if (is_bad_page(page_begin, 0)) { return RTEMS_INCORRECT_STATE; } - if (is_bad_page(first_page_of_block, 1)) { + if (is_bad_page(page_begin, 1)) { return RTEMS_INCORRECT_STATE; } sc = lpc32xx_mlc_erase_block(block_index); if (sc != RTEMS_SUCCESSFUL) { - zero_block(first_page_of_block, pages_per_block); + lpc32xx_mlc_zero_pages(page_begin, page_end); return RTEMS_IO_ERROR; } @@ -85,10 +85,12 @@ rtems_status_code lpc32xx_mlc_erase_block_safe_3( rtems_status_code lpc32xx_mlc_erase_block_safe(uint32_t block_index) { uint32_t pages_per_block = lpc32xx_mlc_pages_per_block(); + uint32_t page_begin = block_index * pages_per_block; + uint32_t page_end = page_begin + pages_per_block; return lpc32xx_mlc_erase_block_safe_3( block_index, - block_index * pages_per_block, - pages_per_block + page_begin, + page_end ); } diff --git a/c/src/lib/libbsp/arm/lpc32xx/misc/nand-mlc-write-blocks.c b/c/src/lib/libbsp/arm/lpc32xx/misc/nand-mlc-write-blocks.c index b95c9e1399..4a2af491c1 100644 --- a/c/src/lib/libbsp/arm/lpc32xx/misc/nand-mlc-write-blocks.c +++ b/c/src/lib/libbsp/arm/lpc32xx/misc/nand-mlc-write-blocks.c @@ -63,32 +63,29 @@ rtems_status_code lpc32xx_mlc_write_blocks( } for (block = block_begin; block != block_end; ++block) { - uint32_t first_page_of_block = block * pages_per_block; + uint32_t page_begin = block * pages_per_block; + uint32_t page_end = page_begin + pages_per_block; uint32_t page = 0; - sc = lpc32xx_mlc_erase_block_safe_3( - block, - first_page_of_block, - pages_per_block - ); + sc = lpc32xx_mlc_erase_block_safe_3(block, page_begin, page_end); if (sc != RTEMS_SUCCESSFUL) { continue; } - for (page = 0; page < pages_per_block; ++page) { + for (page = page_begin; page < page_end; ++page) { uintptr_t remainder = (uintptr_t) end - (uintptr_t) current; size_t delta = remainder < page_size ? remainder : page_size; if (remainder > 0) { memcpy(page_data_buffer, current, delta); sc = lpc32xx_mlc_write_page_with_ecc( - first_page_of_block + page, + page, page_data_buffer, ones_spare ); if (sc != RTEMS_SUCCESSFUL) { - erase_block(block, first_page_of_block, pages_per_block); - zero_block(first_page_of_block, pages_per_block); + lpc32xx_mlc_erase_block_safe_3(block, page_begin, page_end); + lpc32xx_mlc_zero_pages(page_begin, page_end); current = last; continue; } -- cgit v1.2.3