|
@@ -29,6 +29,7 @@ struct map_info rdc3210_map =
|
|
|
/* Dante: This is the default static mapping, however this is nothing but a hint. (Say dynamic mapping) */
|
|
|
static struct mtd_partition rdc3210_parts[] =
|
|
|
{
|
|
|
+#if CONFIG_MTD_RDC3210_SIZE == 0x400000
|
|
|
{ name: "linux", offset: 0, size: 0x003C0000 }, /* 3840 KB = (Kernel + ROMFS) = (768 KB + 3072 KB) */
|
|
|
{ name: "romfs", offset: 0x000C0000, size: 0x00300000 }, /* 3072 KB */
|
|
|
{ name: "nvram", offset: 0x003C0000, size: 0x00010000 }, /* 64 KB */
|
|
@@ -36,6 +37,17 @@ static struct mtd_partition rdc3210_parts[] =
|
|
|
{ name: "factory", offset: 0x003D0000, size: 0x00010000 }, /* 64 KB */
|
|
|
#endif
|
|
|
{ name: "bootldr", offset: 0x003E0000, size: 0x00020000 }, /* 128 KB */
|
|
|
+#elif CONFIG_MTD_RDC3210_SIZE == 0x200000
|
|
|
+ { name: "linux", offset: 0x00010000, size: 0x001E0000 },
|
|
|
+ { name: "romfs", offset: 0x000D0000, size: 0x00120000 },
|
|
|
+ { name: "nvram", offset: 0x00000000, size: 0x00010000 }, /* 64 KB */
|
|
|
+#ifdef CONFIG_MTD_RDC3210_FACTORY_PRESENT
|
|
|
+#error Unsupported configuration!
|
|
|
+#endif
|
|
|
+ { name: "bootldr", offset: 0x001F0000, size: 0x00010000 },
|
|
|
+#else
|
|
|
+#error Unsupported configuration!
|
|
|
+#endif
|
|
|
};
|
|
|
|
|
|
static __u32 crctab[257] = {
|
|
@@ -197,19 +209,42 @@ static int __init init_rdc3210_map(void)
|
|
|
|
|
|
#include "imghdr.h"
|
|
|
|
|
|
+ typedef struct {
|
|
|
+ u8 magic[4];
|
|
|
+ u32 kernelsz, ramdisksz;
|
|
|
+ u8 magic2[4];
|
|
|
+ u32 sz2;
|
|
|
+ }sc_imghdr_t;
|
|
|
+
|
|
|
if (rdc3210_mtd)
|
|
|
{ // Dante
|
|
|
- gt_imghdr_t *hdr = (gt_imghdr_t *)(rdc3210_map.map_priv_1)
|
|
|
+ sc_imghdr_t *hdr2= (sc_imghdr_t *)(rdc3210_map.map_priv_1);
|
|
|
+ gt_imghdr_t *hdr = (gt_imghdr_t *)hdr2
|
|
|
#ifdef CONFIG_MTD_RDC3210_ALLOW_JFFS2
|
|
|
, *ptmp
|
|
|
#endif
|
|
|
;
|
|
|
- unsigned int tmp = hdr->kernelsz + sizeof(gt_imghdr_t), tmp2 = rdc3210_mtd->erasesize;
|
|
|
- unsigned int tmp3 = ((tmp / 32) + ((tmp % 32) ? 1 : 0)) * 32;
|
|
|
- unsigned int tmp4 = ((tmp / tmp2) + ((tmp % tmp2) ? 1 : 0)) * tmp2;
|
|
|
- int len;
|
|
|
+ int len, tmp, tmp2, tmp3, tmp4, hdr_type = 0;
|
|
|
|
|
|
- if(memcmp(hdr->magic, GTIMG_MAGIC, 4))
|
|
|
+ if(!memcmp(hdr->magic, GTIMG_MAGIC, 4))
|
|
|
+ {
|
|
|
+ hdr_type = 1;
|
|
|
+ tmp = hdr->kernelsz + sizeof(gt_imghdr_t);
|
|
|
+ tmp2 = rdc3210_mtd->erasesize;
|
|
|
+ tmp3 = ((tmp / 32) + ((tmp % 32) ? 1 : 0)) * 32;
|
|
|
+ tmp4 = ((tmp / tmp2) + ((tmp % tmp2) ? 1 : 0)) * tmp2;
|
|
|
+ }
|
|
|
+#ifndef CONFIG_MTD_RDC3210_ALLOW_JFFS2
|
|
|
+ else if (!memcmp(hdr2->magic, "CSYS", 4))
|
|
|
+ {
|
|
|
+ hdr_type = 2;
|
|
|
+ tmp = hdr2->ramdisksz + hdr2->kernelsz + sizeof(sc_imghdr_t);
|
|
|
+ tmp2 = rdc3210_mtd->erasesize;
|
|
|
+ tmp3 = ((tmp / 32) + ((tmp % 32) ? 1 : 0)) * 32;
|
|
|
+ tmp4 = ((tmp / tmp2) + ((tmp % tmp2) ? 1 : 0)) * tmp2;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ else
|
|
|
{
|
|
|
iounmap((void *)rdc3210_map.map_priv_1);
|
|
|
rdc3210_map.map_priv_1 = 0L;
|
|
@@ -253,6 +288,7 @@ static int __init init_rdc3210_map(void)
|
|
|
rdc3210_parts[3].offset = tmp - (tmp % tmp2);
|
|
|
rdc3210_parts[3].size = rdc3210_mtd->size - rdc3210_parts[3].offset;
|
|
|
#endif
|
|
|
+ if (hdr_type == 1) {
|
|
|
/* 3. Adjust NVRAM */
|
|
|
#ifdef CONFIG_MTD_RDC3210_ALLOW_JFFS2
|
|
|
if (*(__u32 *)(((unsigned char *)ptmp)+tmp3) == SQUASHFS_MAGIC)
|
|
@@ -273,13 +309,19 @@ static int __init init_rdc3210_map(void)
|
|
|
rdc3210_parts[2].offset = tmp - (tmp % tmp2);
|
|
|
}
|
|
|
rdc3210_parts[2].size = rdc3210_parts[3].offset - rdc3210_parts[2].offset;
|
|
|
+ }
|
|
|
+ else if (hdr_type == 2)
|
|
|
+ {
|
|
|
+ len = 0;
|
|
|
+ tmp4 = tmp3;
|
|
|
+ }
|
|
|
|
|
|
/* 4. Adjust Linux (Kernel + ROMFS) */
|
|
|
- rdc3210_parts[0].size = rdc3210_parts[len + 2].offset - rdc3210_parts[0].offset;
|
|
|
+ rdc3210_parts[0].size = rdc3210_parts[len + hdr_type + 1].offset - rdc3210_parts[0].offset;
|
|
|
|
|
|
/* 5. Adjust ROMFS */
|
|
|
rdc3210_parts[1].offset = rdc3210_parts[0].offset + tmp4;
|
|
|
- rdc3210_parts[1].size = rdc3210_parts[2].offset - rdc3210_parts[1].offset;
|
|
|
+ rdc3210_parts[1].size = rdc3210_parts[hdr_type + 1].offset - rdc3210_parts[1].offset;
|
|
|
#ifdef CONFIG_MTD_RDC3210_ALLOW_JFFS2
|
|
|
if (!(hdr->reserved || len))
|
|
|
{
|