summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/arm/lpc32xx
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2011-07-04 09:26:19 +0000
committerSebastian Huber <sebastian.huber@embedded-brains.de>2011-07-04 09:26:19 +0000
commit542d350ea36355656946094aabdfa70fbece473e (patch)
treed1cd1c44bdbf20feee44b78e3730f32116a9ff96 /c/src/lib/libbsp/arm/lpc32xx
parent2011-07-04 Chris Johns <chrisj@rtems.org> (diff)
downloadrtems-542d350ea36355656946094aabdfa70fbece473e.tar.bz2
2011-07-04 Sebastian Huber <sebastian.huber@embedded-brains.de>
* misc/nand-mlc-erase-block-safe.c, misc/nand-mlc-write-blocks.c, include/nand-mlc.h: Fixed write blocks.
Diffstat (limited to 'c/src/lib/libbsp/arm/lpc32xx')
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/ChangeLog5
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/include/nand-mlc.h16
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/misc/nand-mlc-erase-block-safe.c32
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/misc/nand-mlc-write-blocks.c17
4 files changed, 42 insertions, 28 deletions
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 <sebastian.huber@embedded-brains.de>
+
+ * 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 <sho@reLinux.de>
Sebastian Huber <sebastian.huber@embedded-brains.de>
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,15 +286,25 @@ 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.
*
* 32-bit writes will be performed.
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 <bsp.h>
-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;
}