NAND: Add support for NAND devices with 4k page size
Add support to read page, write page and test bad block for nand devices
with 4k page size.
diff --git a/app/aboot/aboot.c b/app/aboot/aboot.c
index 78e0382..9c525c8 100644
--- a/app/aboot/aboot.c
+++ b/app/aboot/aboot.c
@@ -133,11 +133,12 @@
}
-#define PAGE_MASK 2047
+unsigned page_size = 0;
+unsigned page_mask = 0;
-#define ROUND_TO_PAGE(x) (((x) + PAGE_MASK) & (~PAGE_MASK))
+#define ROUND_TO_PAGE(x,y) (((x) + (y)) & (~(y)))
-static unsigned char buf[2048];
+static unsigned char buf[4096]; //Equal to max-supported pagesize
int boot_linux_from_flash(void)
{
@@ -160,25 +161,30 @@
return -1;
}
- if (flash_read(ptn, offset, buf, 2048)) {
+ if (flash_read(ptn, offset, buf, page_size)) {
dprintf(CRITICAL, "ERROR: Cannot read boot image header\n");
return -1;
}
- offset += 2048;
+ offset += page_size;
if (memcmp(hdr->magic, BOOT_MAGIC, BOOT_MAGIC_SIZE)) {
dprintf(CRITICAL, "ERROR: Invaled boot image heador\n");
return -1;
}
- n = ROUND_TO_PAGE(hdr->kernel_size);
+ if (hdr->page_size != page_size) {
+ dprintf(CRITICAL, "ERROR: Invaled boot image pagesize. Device pagesize: %d, Image pagesize: %d\n",page_size,hdr->page_size);
+ return -1;
+ }
+
+ n = ROUND_TO_PAGE(hdr->kernel_size, page_mask);
if (flash_read(ptn, offset, (void *)hdr->kernel_addr, n)) {
dprintf(CRITICAL, "ERROR: Cannot read kernel image\n");
return -1;
}
offset += n;
- n = ROUND_TO_PAGE(hdr->ramdisk_size);
+ n = ROUND_TO_PAGE(hdr->ramdisk_size, page_mask);
if (flash_read(ptn, offset, (void *)hdr->ramdisk_addr, n)) {
dprintf(CRITICAL, "ERROR: Cannot read ramdisk image\n");
return -1;
@@ -224,8 +230,8 @@
/* ensure commandline is terminated */
hdr.cmdline[BOOT_ARGS_SIZE-1] = 0;
- kernel_actual = ROUND_TO_PAGE(hdr.kernel_size);
- ramdisk_actual = ROUND_TO_PAGE(hdr.ramdisk_size);
+ kernel_actual = ROUND_TO_PAGE(hdr.kernel_size, page_mask);
+ ramdisk_actual = ROUND_TO_PAGE(hdr.ramdisk_size, page_mask);
if (2048 + kernel_actual + ramdisk_actual < sz) {
fastboot_fail("incomplete bootimage");
@@ -294,9 +300,9 @@
}
if (!strcmp(ptn->name, "system") || !strcmp(ptn->name, "userdata"))
- extra = 64;
+ extra = ((page_size >> 9) * 16);
else
- sz = ROUND_TO_PAGE(sz);
+ sz = ROUND_TO_PAGE(sz, page_mask);
dprintf(INFO, "writing %d bytes to '%s'\n", sz, ptn->name);
if (flash_write(ptn, extra, data, sz)) {
@@ -317,6 +323,8 @@
void aboot_init(const struct app_descriptor *app)
{
+ page_size = flash_page_size();
+ page_mask = page_size - 1;
if (keys_get_state(KEY_BACK) != 0)
goto fastboot;