add new flash map driver, jffs2 is found, squashfs not.
authorWaldemar Brodkorb <mail@waldemar-brodkorb.de>
Sat, 3 Sep 2005 17:57:21 +0000 (17:57 +0000)
committerWaldemar Brodkorb <mail@waldemar-brodkorb.de>
Sat, 3 Sep 2005 17:57:21 +0000 (17:57 +0000)
SVN-Revision: 1829

openwrt/target/linux/image/brcm/Makefile
openwrt/target/linux/linux-2.6/patches/brcm/001-bcm947xx.patch
openwrt/target/linux/package/shfs/Makefile

index 54963b671b348196f0176d973a62ab42480b9d37..634aaeeb3d85e65586fe3491c84df5c9ee93fbfc 100644 (file)
@@ -31,7 +31,7 @@ ifeq ($(KERNEL),2.6)
 FSNAME:=$(patsubst jffs2-%,jffs2,$(FS))
 
 $(BIN_DIR)/openwrt-wgt634u-2.6-$(FSNAME).bin: $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(FS).trx
-       dd if=$(BUILD_DIR)/loader-0.04/loader.o of=$@ bs=65536 conv=sync
+       dd if=$(BUILD_DIR)/loader.elf of=$@ bs=131072 conv=sync
        cat $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(FS).trx >> $@
 
 install: $(BIN_DIR)/openwrt-wgt634u-2.6-$(FSNAME).bin
index 3a4f78fc9fd111763de1b3530e8fa0bee532e204..225e1c044df9c42a03e8b9a7910800a0b94b220f 100644 (file)
@@ -13123,14 +13123,45 @@ diff -Nur linux-2.6.12.5/drivers/mtd/maps/Makefile linux-2.6.12.5-brcm/drivers/m
  obj-$(CONFIG_MTD_SBC_GXX)     += sbc_gxx.o
 diff -Nur linux-2.6.12.5/drivers/mtd/maps/bcm47xx-flash.c linux-2.6.12.5-brcm/drivers/mtd/maps/bcm47xx-flash.c
 --- linux-2.6.12.5/drivers/mtd/maps/bcm47xx-flash.c    1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.12.5-brcm/drivers/mtd/maps/bcm47xx-flash.c       2005-08-28 17:01:50.948899632 +0200
-@@ -0,0 +1,131 @@
++++ linux-2.6.12.5-brcm/drivers/mtd/maps/bcm47xx-flash.c       2005-09-03 18:50:05.090478752 +0200
+@@ -0,0 +1,247 @@
 +/*
-+ * Flash mapping for BCM947XX boards
++ *  Copyright (C) 2004 Florian Schirmer (jolt@tuxbox.org)
++ *  Copyright (C) 2005 Waldemar Brodkorb <wbx@openwrt.org>
 + *
-+ * Copyright (C) 2001 Broadcom Corporation
++ *  original functions for finding root filesystem from Mike Baker 
 + *
-+ * $Id: bcm47xx-flash.c,v 1.1 2004/10/21 07:18:31 jolt Exp $
++ *  This program is free software; you can redistribute  it and/or modify it
++ *  under  the terms of  the GNU General  Public License as published by the
++ *  Free Software Foundation;  either version 2 of the  License, or (at your
++ *  option) any later version.
++ *
++ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
++ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
++ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
++ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
++ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
++ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
++ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
++ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ *
++ *  You should have received a copy of the  GNU General Public License along
++ *  with this program; if not, write  to the Free Software Foundation, Inc.,
++ *  675 Mass Ave, Cambridge, MA 02139, USA.
++ * 
++ *  Copyright 2001-2003, Broadcom Corporation
++ *  All Rights Reserved.
++ * 
++ *  THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
++ *  KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
++ *  SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
++ *  FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
++ *
++ *  $Id: bcm47xx-flash.c,v 1.1 2004/10/21 07:18:31 jolt Exp $
++ *
++ *  Flash mapping for BCM947XX boards
 + */
 +
 +#include <linux/init.h>
@@ -13142,6 +13173,14 @@ diff -Nur linux-2.6.12.5/drivers/mtd/maps/bcm47xx-flash.c linux-2.6.12.5-brcm/dr
 +#include <linux/mtd/map.h>
 +#include <linux/mtd/partitions.h>
 +#include <linux/config.h>
++#include <typedefs.h>
++#include <bcmutils.h>
++#include <bcmnvram.h>
++#include <trxhdr.h>
++
++#ifdef CONFIG_MTD_PARTITIONS
++extern struct mtd_partition * init_mtd_partitions(struct mtd_info *mtd, size_t size);
++#endif
 +
 +#define WINDOW_ADDR 0x1c000000
 +#define WINDOW_SIZE (0x400000*2)
@@ -13176,49 +13215,110 @@ diff -Nur linux-2.6.12.5/drivers/mtd/maps/bcm47xx-flash.c linux-2.6.12.5-brcm/dr
 +      phys: WINDOW_ADDR,
 +};
 +
-+#define SECTORS *64*1024
-+
 +#ifdef CONFIG_MTD_PARTITIONS
-+#if 0
-+static struct mtd_partition bcm947xx_parts[] = {
-+// 64 - 4 - 14 - 1 = 45 = 8 + 37
-+      { name: "pmon", offset: 0, size: 4 SECTORS, mask_flags: MTD_WRITEABLE },
-+      { name: "linux", offset: MTDPART_OFS_APPEND, size: 14 SECTORS },
-+      { name: "rescue", offset: MTDPART_OFS_APPEND, size: 8 SECTORS },
-+      { name: "rootfs", offset: MTDPART_OFS_APPEND, size: 37 SECTORS },
-+      { name: "nvram", offset: MTDPART_OFS_APPEND, size: 1 SECTORS, mask_flags: MTD_WRITEABLE },
-+};
-+#else
++
 +static struct mtd_partition bcm947xx_parts[] = {
-+      { name: "cfe",
-+           offset:  0,
-+           size:  384*1024,
-+           mask_flags: MTD_WRITEABLE
-+         },
-+      { name: "config",
-+           offset:  MTDPART_OFS_APPEND,
-+           size:  128*1024
-+         },
-+      { name: "linux",
-+           offset:  MTDPART_OFS_APPEND,
-+           size:  10*128*1024
-+         },
-+      { name: "jffs",
-+           offset: MTDPART_OFS_APPEND,
-+           size: (8*1024*1024)-((384*1024)+(128*1024)+(10*128*1024)+(128*1024)),
-+         },
-+      { name: "nvram",
-+           offset: MTDPART_OFS_APPEND,
-+           size: 128*1024,
-+           mask_flags: MTD_WRITEABLE
-+         },
++      { name: "cfe",  offset: 0, size: 0, mask_flags: MTD_WRITEABLE, },
++      { name: "linux", offset: 0, size: 0, },
++      { name: "rootfs", offset: 0, size: 0, },
++      { name: "nvram", offset: 0, size: 0, },
++      { name: "OpenWrt", offset: 0, size: 0, },
++      { name: NULL, },
 +};
-+#endif
++
++static int __init
++find_root(struct mtd_info *mtd, size_t size, struct mtd_partition *part)
++{
++      struct trx_header *trx;
++      unsigned char buf[512];
++      int off;
++      size_t len;
++
++      trx = (struct trx_header *) buf;
++
++      printk(KERN_NOTICE 
++              "MTD erasesize: %d, Size: %d\n", 
++              mtd->erasesize, size);
++
++      for (off = (384*1024); off < size; off += mtd->erasesize) {
++              memset(buf, 0xe5, sizeof(buf));
++
++              /*
++               * Read into buffer 
++               */
++              if (MTD_READ(mtd, off, sizeof(buf), &len, buf) ||
++                  len != sizeof(buf))
++                      continue;
++
++              /* found a TRX header */
++              if (le32_to_cpu(trx->magic) == TRX_MAGIC) {
++                      printk(KERN_NOTICE "Found TRX Header!\n");
++
++                      part->offset = le32_to_cpu(trx->offsets[2]) ? : 
++                              le32_to_cpu(trx->offsets[1]);
++                      part->size = le32_to_cpu(trx->len); 
++
++                      part->size -= part->offset;
++                      part->offset += off;
++
++                      goto done;
++              }
++      }
++
++      printk(KERN_NOTICE
++             "%s: Couldn't find root filesystem\n",
++             mtd->name);
++      return -1;
++
++ done:
++              return part->size;
++}
++
++struct mtd_partition * __init
++init_mtd_partitions(struct mtd_info *mtd, size_t size)
++{
++
++      /* boot loader */
++      bcm947xx_parts[0].offset=0;
++      bcm947xx_parts[0].size=384*1024;
++
++      /* nvram */
++      bcm947xx_parts[3].offset = size - (128*1024);
++      bcm947xx_parts[3].size   = size - bcm947xx_parts[3].offset;
++
++      /* Size linux (kernel and rootfs) */
++      bcm947xx_parts[1].offset = bcm947xx_parts[0].size;
++      bcm947xx_parts[1].size   = bcm947xx_parts[3].offset - bcm947xx_parts[1].offset;
++
++      /* Find and size rootfs */
++      if (find_root(mtd,size,&bcm947xx_parts[2])==0) {
++              /* entirely jffs2 */
++              bcm947xx_parts[2].size = bcm947xx_parts[3].offset - bcm947xx_parts[2].offset; 
++              bcm947xx_parts[4].name = NULL;
++      } else {
++              /* legacy setup */
++              /* calculate leftover flash, and assign it to the jffs2 partition */
++              bcm947xx_parts[4].offset = bcm947xx_parts[2].offset + bcm947xx_parts[2].size;
++              bcm947xx_parts[4].offset = ROUNDUP(bcm947xx_parts[4].offset, mtd->erasesize);
++              bcm947xx_parts[4].size = bcm947xx_parts[3].offset - bcm947xx_parts[4].offset;
++      }
++
++      return bcm947xx_parts;
++}
++
++EXPORT_SYMBOL(init_mtd_partitions);
 +#endif
 +
 +int __init init_bcm947xx_map(void)
 +{
-+      bcm947xx_map.virt = (unsigned long)ioremap(WINDOW_ADDR, WINDOW_SIZE);
++      size_t size;
++      int ret = 0;
++#ifdef CONFIG_MTD_PARTITIONS
++      struct mtd_partition *parts;
++      int i;
++#endif
++
++      bcm947xx_map.virt = ioremap(WINDOW_ADDR, WINDOW_SIZE);
 +
 +      if (!bcm947xx_map.virt) {
 +              printk("Failed to ioremap\n");
@@ -13236,13 +13336,29 @@ diff -Nur linux-2.6.12.5/drivers/mtd/maps/bcm47xx-flash.c linux-2.6.12.5-brcm/dr
 +
 +      bcm947xx_mtd->owner = THIS_MODULE;
 +
-+      printk(KERN_NOTICE "flash device: %x at %x\n", bcm947xx_mtd->size, WINDOW_ADDR);
++      size = bcm947xx_mtd->size;
++
++      printk(KERN_NOTICE "Flash device: 0x%x at 0x%x\n", bcm947xx_mtd->size, WINDOW_ADDR);
 +
 +#ifdef CONFIG_MTD_PARTITIONS
-+      return add_mtd_partitions(bcm947xx_mtd, bcm947xx_parts, sizeof(bcm947xx_parts)/sizeof(bcm947xx_parts[0]));
-+#else
-+      return 0;
++      parts = init_mtd_partitions(bcm947xx_mtd, size);
++      for (i = 0; parts[i].name; i++);
++      ret = add_mtd_partitions(bcm947xx_mtd, parts, i);
++      if (ret) {
++              printk(KERN_ERR "Flash: add_mtd_partitions failed\n");
++              goto fail;
++      }
 +#endif
++
++      return 0;
++
++ fail:
++      if (bcm947xx_mtd)
++              map_destroy(bcm947xx_mtd);
++      if (bcm947xx_map.map_priv_1)
++              iounmap((void *) bcm947xx_map.map_priv_1);
++      bcm947xx_map.map_priv_1 = 0;
++      return ret;
 +}
 +
 +void __exit cleanup_bcm947xx_map(void)
index fb345b2c5c8050813aec578d74c6a3bd80661f8e..2231363b3131892917a6d5ab9ac4eec7fd42b370 100644 (file)
@@ -42,7 +42,7 @@ $(PKG_BUILD_DIR)/.built:
 
 $(IPKG_KMOD_SHFS):
        install -m0755 -d $(IDIR_KMOD_SHFS)/lib/modules/$(LINUX_VERSION)
-       cp -fpR $(PKG_INSTALL_DIR)/lib/modules/$(LINUX_VERSION)/kernel/fs/shfs/shfs.o \
+       cp -fpR $(PKG_INSTALL_DIR)/lib/modules/$(LINUX_VERSION)/kernel/fs/shfs/shfs.*o \
         $(IDIR_KMOD_SHFS)/lib/modules/$(LINUX_VERSION)/
        $(RSTRIP_KMOD) $(IDIR_KMOD_SHFS)
        $(IPKG_BUILD) $(IDIR_KMOD_SHFS) $(PACKAGE_DIR)