#include <linux/mtd/map.h>
#include <linux/mtd/partitions.h>
#include <linux/autoconf.h>
+#include <linux/sched.h>
#include <linux/squashfs_fs.h>
static struct mtd_info *rdc3210_mtd;
/* 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 */
{ 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] = {
#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;
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)
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))
{