Merge "ipq806x: Added ar8033_gpio entry in AP160.2 board"
diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
index e441aa2..2451ba7 100644
--- a/arch/arm/dts/Makefile
+++ b/arch/arm/dts/Makefile
@@ -24,6 +24,7 @@
 	ipq807x-hk02.dtb \
 	ipq807x-hk05.dtb \
 	ipq807x-hk06.dtb \
+	ipq807x-hk07.dtb \
 	ipq807x-db-hk01.dtb \
 	ipq807x-db-hk02.dtb \
 	ipq807x-hk01-c2.dtb
diff --git a/arch/arm/dts/ipq40xx-dk07-c3.dts b/arch/arm/dts/ipq40xx-dk07-c3.dts
index 1268ad7..1ed72ae 100644
--- a/arch/arm/dts/ipq40xx-dk07-c3.dts
+++ b/arch/arm/dts/ipq40xx-dk07-c3.dts
@@ -17,5 +17,5 @@
 	spi_nor_available = <0>;
 	machid = <0x8010206>;
 	ddr_size = <512>;
-	config_name = "config@ap.dk07.1-c1";
+	config_name = "config@ap.dk07.1-c3";
 };
diff --git a/arch/arm/dts/ipq807x-hk07.dts b/arch/arm/dts/ipq807x-hk07.dts
new file mode 100644
index 0000000..fce0f18
--- /dev/null
+++ b/arch/arm/dts/ipq807x-hk07.dts
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2016 - 2018, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+/dts-v1/;
+#include "ipq807x-soc.dtsi"
+#include <dt-bindings/qcom/gpio-ipq807x.h>
+/ {
+	model ="QCA, IPQ807x-HK07";
+	compatible = "qca,ipq807x", "qca,ipq807x-hk07";
+	machid = <0x08010006>;
+	config_name = "config@hk07";
+
+	aliases {
+		console = "/serial@78B3000";
+		uart2 = "/serial@78B0000";
+		i2c0 = "/i2c@78b6000";
+		pci0 = "/pci@20000000";
+		pci1 = "/pci@10000000";
+	};
+};
+
diff --git a/arch/arm/include/asm/mach-types.h b/arch/arm/include/asm/mach-types.h
index bc46b2c..bd0b6ed 100644
--- a/arch/arm/include/asm/mach-types.h
+++ b/arch/arm/include/asm/mach-types.h
@@ -1132,6 +1132,7 @@
 #define MACH_TYPE_IPQ40XX_AP_DK04_1_C3  0x8010201
 #define MACH_TYPE_IPQ40XX_AP_DK06_1_C1  0x8010005
 #define MACH_TYPE_IPQ40XX_AP_DK07_1_C1  0x8010006
+#define MACH_TYPE_IPQ40XX_AP_DK07_1_C3  0x8010206
 #define MACH_TYPE_IPQ40XX_DB_DK01_1_C1  0x1010002
 #define MACH_TYPE_IPQ40XX_DB_DK02_1_C1  0x1010003
 #define MACH_TYPE_IPQ40XX_TB832         0x1010004
diff --git a/board/qca/arm/common/ethaddr.c b/board/qca/arm/common/ethaddr.c
index 76496ad..65d1726 100644
--- a/board/qca/arm/common/ethaddr.c
+++ b/board/qca/arm/common/ethaddr.c
@@ -19,6 +19,7 @@
 #include <asm/arch-qca-common/smem.h>
 #include "qca_common.h"
 #include <sdhci.h>
+#include <malloc.h>
 
 #ifdef CONFIG_QCA_MMC
 #ifndef CONFIG_SDHCI_SUPPORT
@@ -45,6 +46,8 @@
 	disk_partition_t disk_info;
 	struct mmc *mmc;
 	char mmc_blks[512];
+	u8 *tmp_block_buf;
+	u32 blks_cnt;
 #endif
 	if (sfi->flash_type != SMEM_BOOT_MMC_FLASH) {
 		if (qca_smem_flash_info.flash_type == SMEM_BOOT_SPI_FLASH)
@@ -80,13 +83,25 @@
 		 * ART partition 0th position will contain MAC address.
 		 * Read 1 block.
 		 */
-		if (ret == 0) {
+		if (ret > 0) {
 			mmc = mmc_host.mmc;
-			ret = mmc->block_dev.block_read
-				(mmc_host.dev_num, disk_info.start,
-						1, mmc_blks);
-			memcpy(enetaddr, mmc_blks, length);
-                }
+			blks_cnt = (length / disk_info.blksz) + 1;
+			if (blks_cnt > disk_info.size)
+				blks_cnt = disk_info.size;
+
+			tmp_block_buf = malloc(blks_cnt * disk_info.blksz);
+
+			if (NULL == tmp_block_buf) {
+				printf("memory allocation failed..\n");
+				return -ENOMEM;
+			}
+
+			ret = mmc->block_dev.block_read(mmc_host.dev_num,
+					disk_info.start, blks_cnt,
+					tmp_block_buf);
+			memcpy(enetaddr, tmp_block_buf, length);
+			free(tmp_block_buf);
+		}
 		if (ret < 0)
 			printf("ART partition read failed..\n");
 #endif
diff --git a/board/qca/arm/ipq40xx/ipq40xx.c b/board/qca/arm/ipq40xx/ipq40xx.c
index 2fbc7b0..1ae7913 100644
--- a/board/qca/arm/ipq40xx/ipq40xx.c
+++ b/board/qca/arm/ipq40xx/ipq40xx.c
@@ -205,6 +205,7 @@
 		ipq40xx_register_switch(ipq_qca8075_phy_init);
 		break;
 	case MACH_TYPE_IPQ40XX_AP_DK07_1_C1:
+	case MACH_TYPE_IPQ40XX_AP_DK07_1_C3:
 		/* 8075 out of reset */
 		mdelay(100);
 		gpio_set_value(41, 1);
diff --git a/drivers/net/ipq40xx/ipq40xx_ess_sw.c b/drivers/net/ipq40xx/ipq40xx_ess_sw.c
index 95c9693..ad742fa 100644
--- a/drivers/net/ipq40xx/ipq40xx_ess_sw.c
+++ b/drivers/net/ipq40xx/ipq40xx_ess_sw.c
@@ -76,6 +76,7 @@
 	case MACH_TYPE_IPQ40XX_AP_DK04_1_C3:
 	case MACH_TYPE_IPQ40XX_AP_DK06_1_C1:
 	case MACH_TYPE_IPQ40XX_AP_DK07_1_C1:
+	case MACH_TYPE_IPQ40XX_AP_DK07_1_C3:
 
 		ipq40xx_ess_sw_wr(S17_P0LOOKUP_CTRL_REG, 0x140000);
 		ipq40xx_ess_sw_wr(S17_P1LOOKUP_CTRL_REG, 0x140000);
diff --git a/net/bootp.c b/net/bootp.c
index 8aeddb0..3e38600 100644
--- a/net/bootp.c
+++ b/net/bootp.c
@@ -660,7 +660,7 @@
 	bootp_num_ids = 0;
 	bootp_try = 0;
 	bootp_start = get_timer(0);
-	bootp_timeout = 250;
+	bootp_timeout = 5000;
 }
 
 void bootp_request(void)
diff --git a/tools/pack_hk.py b/tools/pack_hk.py
deleted file mode 100755
index f3743f4..0000000
--- a/tools/pack_hk.py
+++ /dev/null
@@ -1,1412 +0,0 @@
-######################################################################
-# Copyright (c) 2017, The Linux Foundation. All rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License version 2 and
-# only version 2 as published by the Free Software Foundation.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#####################################################################
-
-"""
-Script to create a U-Boot flashable multi-image blob.
-
-This script creates a multi-image blob, from a bunch of images, and
-adds a U-Boot shell script to the blob, that can flash the images from
-within U-Boot. The procedure to use this script is listed below.
-
-  1. Create an images folder. Ex: my-pack
-
-  2. Copy all the images to be flashed into the folder.
-
-  3. Copy the partition MBN file into the folder. The file should be
-     named 'partition.mbn'. This is used to determine the offsets for
-     each of the named partitions.
-
-  4. Create a flash configuration file, specifying the images be
-     flashed, and the partition in which the images is to be
-     flashed. The flash configuration file can be specified using the
-     -f option, default is flash.conf.
-
-  5. Invoke 'pack' with the folder name as argument, pass flash
-     parameters as arguments if required. A single image file will
-     be created, out side the images folder, with .img suffix. Ex:
-     my-pack.img
-
-  6. Transfer the file into a valid SDRAM address and invoke the
-     following U-Boot command to flash the images. Replace 0x41000000,
-     with address location where the image has been loaded. The script
-     expects the variable 'imgaddr' to be set.
-
-     u-boot> imgaddr=0x88000000 source $imgaddr:script
-
-Host-side Pre-req
-
-  * Python >= 2.6
-  * ordereddict >= 1.1 (for Python 2.6)
-  * mkimage >= 2012.07
-  * dtc >= 1.2.0
-
-Target-side Pre-req
-
-The following U-Boot config macros should be enabled, for the
-generated flashing script to work.
-
-  * CONFIG_FIT -- FIT image format support
-  * CONFIG_SYS_HUSH_PARSER -- bash style scripting support
-  * CONFIG_SYS_NULLDEV -- redirecting command output support
-  * CONFIG_CMD_XIMG -- extracting sub-images support
-  * CONFIG_CMD_NAND -- NAND Flash commands support
-  * CONFIG_CMD_NAND_YAFFS -- NAND YAFFS2 write support
-  * CONFIG_CMD_SF -- SPI Flash commands support
-"""
-
-from os.path import getsize
-from getopt import getopt
-from getopt import GetoptError
-from collections import namedtuple
-from string import Template
-
-import os
-import sys
-import os.path
-import subprocess
-import struct
-import hashlib
-import xml.etree.ElementTree as ET
-
-version = "1.1"
-ARCH_NAME = ""
-SRC_DIR = ""
-MODE = ""
-#
-# Python 2.6 and earlier did not have OrderedDict use the backport
-# from ordereddict package. If that is not available report error.
-#
-try:
-    from collections import OrderedDict
-except ImportError:
-    try:
-        from ordereddict import OrderedDict
-    except ImportError:
-        print "error: this script requires the 'ordereddict' class."
-        print "Try 'pip install --user ordereddict'"
-        print "Or  'easy_install --user ordereddict'"
-        sys.exit(1)
-
-def error(msg, ex=None):
-    """Print an error message and exit.
-
-    msg -- string, the message to print
-    ex -- exception, the associate exception, if any
-    """
-
-    sys.stderr.write("pack: %s" % msg)
-    if ex != None: sys.stderr.write(": %s" % str(ex))
-    sys.stderr.write("\n")
-    sys.exit(1)
-
-FlashInfo = namedtuple("FlashInfo", "type pagesize blocksize chipsize")
-ImageInfo = namedtuple("ProgInfo", "name filename type")
-PartInfo = namedtuple("PartInfo", "name offset length which_flash")
-
-def roundup(value, roundto):
-    """Return the next largest multiple of 'roundto'."""
-
-    return ((value + roundto - 1) // roundto) * roundto
-
-class GPT(object):
-    GPTheader = namedtuple("GPTheader", "signature revision header_size"
-                            " crc32 current_lba backup_lba first_usable_lba"
-                            " last_usable_lba disk_guid start_lba_part_entry"
-                            " num_part_entry part_entry_size part_crc32")
-    GPT_SIGNATURE = 'EFI PART'
-    GPT_REVISION = '\x00\x00\x01\x00'
-    GPT_HEADER_SIZE = 0x5C
-    GPT_HEADER_FMT = "<8s4sLL4xQQQQ16sQLLL"
-
-    GPTtable = namedtuple("GPTtable", "part_type unique_guid first_lba"
-                           " last_lba attribute_flag part_name")
-    GPT_TABLE_FMT = "<16s16sQQQ72s"
-
-    def __init__(self, filename, pagesize, blocksize, chipsize):
-        self.filename = filename
-        self.pagesize = pagesize
-        self.blocksize = blocksize
-        self.chipsize = chipsize
-        self.__partitions = OrderedDict()
-
-    def __validate_and_read_parts(self, part_fp):
-        """Validate the GPT and read the partition"""
-        part_fp.seek(self.blocksize, os.SEEK_SET)
-        gptheader_str = part_fp.read(struct.calcsize(GPT.GPT_HEADER_FMT))
-        gptheader = struct.unpack(GPT.GPT_HEADER_FMT, gptheader_str)
-        gptheader = GPT.GPTheader._make(gptheader)
-
-        if gptheader.signature != GPT.GPT_SIGNATURE:
-            error("Invalid signature")
-
-        if gptheader.revision != GPT.GPT_REVISION:
-            error("Unsupported GPT Revision")
-
-        if gptheader.header_size != GPT.GPT_HEADER_SIZE:
-            error("Invalid Header size")
-
-        # Adding GPT partition info. This has to be flashed first.
-        # GPT Header starts at LBA1 so (current_lba -1) will give the
-        # starting of primary GPT.
-        # blocksize will equal to gptheader.first_usuable_lba - current_lba + 1
-
-        name = "0:GPT"
-        block_start = gptheader.current_lba - 1
-        block_count = gptheader.first_usable_lba - gptheader.current_lba + 1
-        which_flash = 0
-        part_info = PartInfo(name, block_start, block_count, which_flash)
-        self.__partitions[name] = part_info
-
-        part_fp.seek(2 * self.blocksize, os.SEEK_SET)
-
-        for i in range(gptheader.num_part_entry):
-            gpt_table_str = part_fp.read(struct.calcsize(GPT.GPT_TABLE_FMT))
-            gpt_table = struct.unpack(GPT.GPT_TABLE_FMT, gpt_table_str)
-            gpt_table = GPT.GPTtable._make(gpt_table)
-
-            block_start = gpt_table.first_lba
-            block_count = gpt_table.last_lba - gpt_table.first_lba + 1
-
-            part_name = gpt_table.part_name.strip(chr(0))
-            name = part_name.replace('\0','')
-            part_info = PartInfo(name, block_start, block_count, which_flash)
-            self.__partitions[name] = part_info
-
-        # Adding the GPT Backup partition.
-        # GPT header backup_lba gives block number where the GPT backup header will be.
-        # GPT Backup header will start from offset of 32 blocks before
-        # the GPTheader.backup_lba. Backup GPT size is 33 blocks.
-        name = "0:GPTBACKUP"
-        block_start = gptheader.backup_lba - 32
-        block_count = 33
-        part_info = PartInfo(name, block_start, block_count, which_flash)
-        self.__partitions[name] = part_info
-
-    def get_parts(self):
-        """Returns a list of partitions present in the GPT."""
-
-        try:
-            with open(self.filename, "r") as part_fp:
-                self.__validate_and_read_parts(part_fp)
-        except IOError, e:
-            error("error opening %s" % self.filename, e)
-
-        return self.__partitions
-
-class MIBIB(object):
-    Header = namedtuple("Header", "magic1 magic2 version age")
-    HEADER_FMT = "<LLLL"
-    HEADER_MAGIC1 = 0xFE569FAC
-    HEADER_MAGIC2 = 0xCD7F127A
-    HEADER_VERSION = 4
-
-    Table = namedtuple("Table", "magic1 magic2 version numparts")
-    TABLE_FMT = "<LLLL"
-    TABLE_MAGIC1 = 0x55EE73AA
-    TABLE_MAGIC2 = 0xE35EBDDB
-    TABLE_VERSION_IPQ806X = 3
-    TABLE_VERSION_OTHERS = 4
-
-
-    Entry = namedtuple("Entry", "name offset length"
-                        " attr1 attr2 attr3 which_flash")
-    ENTRY_FMT = "<16sLLBBBB"
-
-    def __init__(self, filename, pagesize, blocksize, chipsize, nand_blocksize, nand_chipsize, root_part):
-        self.filename = filename
-        self.pagesize = pagesize
-        self.blocksize = blocksize
-        self.chipsize = chipsize
-        self.nand_blocksize = nand_blocksize
-        self.nand_chipsize = nand_chipsize
-        self.__partitions = OrderedDict()
-
-    def __validate(self, part_fp):
-       """Validate the MIBIB by checking for magic bytes."""
-
-       mheader_str = part_fp.read(struct.calcsize(MIBIB.HEADER_FMT))
-       mheader = struct.unpack(MIBIB.HEADER_FMT, mheader_str)
-       mheader = MIBIB.Header._make(mheader)
-
-       if (mheader.magic1 != MIBIB.HEADER_MAGIC1
-           or mheader.magic2 != MIBIB.HEADER_MAGIC2):
-           """ mheader.magic1 = MIBIB.HEADER_MAGIC1
-           mheader.magic2 = MIBIB.HEADER_MAGIC2 """
-           error("invalid partition table, magic byte not present")
-
-       if mheader.version != MIBIB.HEADER_VERSION:
-           error("unsupport mibib version")
-
-    def __read_parts(self, part_fp):
-        """Read the partitions from the MIBIB."""
-	global ARCH_NAME
-        part_fp.seek(self.pagesize, os.SEEK_SET)
-        mtable_str = part_fp.read(struct.calcsize(MIBIB.TABLE_FMT))
-        mtable = struct.unpack(MIBIB.TABLE_FMT, mtable_str)
-        mtable = MIBIB.Table._make(mtable)
-
-        if (mtable.magic1 != MIBIB.TABLE_MAGIC1
-            or mtable.magic2 != MIBIB.TABLE_MAGIC2):
-            """ mtable.magic1 = MIBIB.TABLE_MAGIC1
-            mtable.magic2 = MIBIB.TABLE_MAGIC2 """
-            error("invalid sys part. table, magic byte not present")
-        if ARCH_NAME == "ipq806x":
-            if mtable.version != MIBIB.TABLE_VERSION_IPQ806X:
-                error("unsupported partition table version")
-        else:
-            if mtable.version != MIBIB.TABLE_VERSION_OTHERS:
-                error("unsupported partition table version")
-
-        for i in range(mtable.numparts):
-            mentry_str = part_fp.read(struct.calcsize(MIBIB.ENTRY_FMT))
-            mentry = struct.unpack(MIBIB.ENTRY_FMT, mentry_str)
-            mentry = MIBIB.Entry._make(mentry)
-            self.flash_flag = self.blocksize
-            self.chip_flag = self.chipsize
-
-            if mentry.which_flash != 0:
-                self.flash_flag = self.nand_blocksize
-                self.chip_flag = self.nand_chipsize
-
-            byte_offset = mentry.offset * self.flash_flag
-
-            if mentry.length == 0xFFFFFFFF:
-               byte_length = self.chip_flag - byte_offset
-            else:
-               byte_length = mentry.length * self.flash_flag
-
-            part_name = mentry.name.strip(chr(0))
-            part_info = PartInfo(part_name, byte_offset, byte_length, mentry.which_flash)
-            self.__partitions[part_name] = part_info
-
-    def get_parts(self):
-        """Returns a list of partitions present in the MIBIB. CE """
-
-        try:
-            with open(self.filename, "r") as part_fp:
-                self.__validate(part_fp)
-                self.__read_parts(part_fp)
-        except IOError, e:
-            error("error opening %s" % self.filename, e)
-
-        return self.__partitions
-
-class FlashScript(object):
-    """Base class for creating flash scripts."""
-
-    def __init__(self, flinfo):
-        self.pagesize = flinfo.pagesize
-        self.blocksize = flinfo.blocksize
-        self.script = []
-        self.parts = []
-        self.curr_stdout = "serial"
-        self.activity = None
-        self.flash_type = flinfo.type
-
-        self.script.append('if test "x$verbose" = "x"; then\n')
-        self.script.append("failedmsg='[failed]'\n")
-        self.script.append('else\n')
-        self.script.append("failedmsg='%s Failed'\n" % ("#" * 40))
-        self.script.append('fi\n')
-
-    def append(self, cmd, fatal=True):
-        """Add a command to the script.
-
-        Add additional code, to terminate on error. This can be
-        supressed by passing 'fatal' as False.
-        """
-
-        if fatal:
-            self.script.append(cmd
-                               + ' || setenv stdout serial'
-                               + ' && echo "$failedmsg"'
-                               + ' && exit 1\n')
-        else:
-            self.script.append(cmd + "\n")
-
-    def dumps(self):
-        """Return the created script as a string."""
-        return "".join(self.script)
-
-    def redirect(self, dev):
-        """Generate code, to redirect command output to a device."""
-
-        if self.curr_stdout == dev:
-            return
-
-        self.append("setenv stdout %s" % dev, fatal=False)
-        self.curr_stdout = dev
-
-    def start_activity(self, activity):
-        """Generate code, to indicate start of an activity."""
-
-        self.script.append('if test "x$verbose" = "x"; then\n')
-        self.echo("'%-40.40s'" % activity, nl=False)
-        self.script.append('else\n')
-        self.echo("'%s %s Started'" % ("#" * 40, activity), verbose=True)
-        self.script.append('fi\n')
-        self.activity = activity
-
-    def finish_activity(self):
-        """Generate code, to indicate end of an activity."""
-
-        self.script.append('if test "x$verbose" = "x"; then\n')
-        self.echo("'[ done ]'")
-        self.redirect("serial")
-        self.script.append('else\n')
-        self.echo("'%s %s Done'" % ("#" * 40, self.activity), verbose=True)
-        self.script.append('fi\n')
-
-    def imxtract(self, part):
-        """Generate code, to extract image location, from a multi-image blob.
-
-        part -- string, name of the sub-image
-
-        Sets the $fileaddr environment variable, to point to the
-        location of the sub-image.
-        """
-
-        self.append("imxtract $imgaddr %s" % part)
-
-    def echo(self, msg, nl=True, verbose=False):
-        """Generate code, to print a message.
-
-        nl -- bool, indicates whether newline is to be printed
-        verbose -- bool, indicates whether printing in verbose mode
-        """
-
-        if not verbose:
-            self.redirect("serial")
-
-        if nl:
-            self.append("echo %s" % msg, fatal=False)
-        else:
-            self.append("echo %s%s" % (r"\\c", msg), fatal=False)
-
-        if not verbose:
-            self.redirect("nulldev")
-
-    def end(self):
-        """Generate code, to indicate successful completion of script."""
-
-        self.append("exit 0\n", fatal=False)
-
-    def start_if(self, var, value):
-        """Generate code, to check an environment variable.
-
-        var -- string, variable to check
-        value -- string, the value to compare with
-        """
-
-        self.append('if test "$%s" = "%s"; then\n' % (var, value),
-                    fatal=False)
-
-    def end_if(self):
-        """Generate code, to end if statement."""
-
-        self.append('fi\n', fatal=False)
-
-class Flash_Script(FlashScript):
-    """Class for creating NAND flash scripts."""
-
-    def __init__(self, *args):
-        FlashScript.__init__(self, args[0])
-        if args[0].type == "nand":
-            self.ipq_nand = args[1]
-        elif args[0].type == "nor" or args[0].type == "norplusnand":
-            self.nand_pagesize = args[1]
-
-    def erase(self, offset, size):
-        """Generate code, to erase the specified partition."""
-
-        if self.flash_type != "emmc":
-            size = roundup(size, self.blocksize)
-
-        if self.flash_type == "nand":
-                self.append("nand erase 0x%08x 0x%08x" % (offset, size))
-        elif self.flash_type == "nor":
-            self.append("sf erase 0x%08x +0x%08x" % (offset, size))
-        elif self.flash_type == "emmc":
-            self.append("mmc erase 0x%08x %x" % (offset, size))
-
-    def nand_write(self, offset, part_size, img_size, spi_nand):
-       """Handle the NOR + NAND case
-          All binaries upto HLOS will go to NOR and Root FS will go to NAND
-          Assumed all nand page sizes are less than are equal to 8KB
-          """
-
-       if spi_nand == "true":
-           self.append("nand device 1 && nand erase 0x%08x 0x%08x" % (offset, part_size))
-       else:
-           self.append("nand device 0 && nand erase 0x%08x 0x%08x" % (offset, part_size))
-
-       if img_size > 0:
-            self.append("nand write $fileaddr 0x%08x 0x%08x" % (offset, img_size))
-
-    def write(self, offset, size):
-        """Generate code, to write to a partition."""
-
-        if self.flash_type == "nand":
-            if size > 0:
-                size = roundup(size, self.pagesize)
-                self.append("nand write $fileaddr 0x%08x 0x%08x" % (offset, size))
-
-        elif self.flash_type == "nor":
-            if size > 0:
-                self.append("sf write $fileaddr 0x%08x 0x%08x" % (offset, size))
-
-        elif self.flash_type == "emmc":
-            if size > 0:
-               size = roundup(size, self.blocksize)
-               blk_cnt = size / self.blocksize
-               self.append("mmc write $fileaddr 0x%08x %x" % (offset, blk_cnt))
-
-    def probe(self):
-        if self.flash_type == "nand":
-            pass
-        elif self.flash_type == "nor":
-            self.append("sf probe")
-        else:
-            pass
-
-    def switch_layout(self, layout):
-        if self.flash_type == "nand":
-            self.append("ipq_nand %s" % layout)
-        else:
-            pass
-
-its_tmpl = Template("""
-/dts-v1/;
-
-/ {
-        description = "${desc}";
-        images {
-${images}
-        };
-};
-""")
-
-its_image_tmpl = Template("""
-                ${name} {
-                        description = "${desc}";
-                        data = /incbin/("./${fname}");
-                        type = "${imtype}";
-                        arch = "arm";
-                        compression = "none";
-                        hash@1 { algo = "crc32"; };
-                };
-""")
-
-def sha1(message):
-    """Returns SHA1 digest in hex format of the message."""
-
-    m = hashlib.sha1()
-    m.update(message)
-    return m.hexdigest()
-
-class Pack(object):
-    """Class to create a flashable, multi-image blob.
-
-    Combine multiple images present in a directory, and generate a
-    U-Boot script to flash the images.
-    """
-    # The maximum rootfs size is 64MB
-    norplusnand_rootfs_img_size = (64 * 1024 * 1024)
-
-    def __init__(self):
-        self.flinfo = None
-        self.images_dname = None
-        self.ipq_nand = None
-        self.partitions = {}
-
-        self.fconf_fname = None
-        self.scr_fname = None
-        self.its_fname = None
-        self.img_fname = None
-        self.emmc_page_size = 512
-        self.emmc_block_size = 512
-
-    def __get_machid(self, section):
-        """Get the machid for a section.
-
-        info -- ConfigParser object, containing image flashing info
-        section -- section to retreive the machid from
-        """
-        try:
-            machid = int(section.find("./machid").text, 0)
-            machid = "%x" % machid
-        except ValueError, e:
-            error("invalid value for machid, should be integer")
-
-        return machid
-
-    def __get_img_size(self, filename):
-        """Get the size of the image to be flashed
-
-        filaneme -- string, filename of the image to be flashed
-        """
-
-        if filename.lower() == "none":
-            return 0
-        try:
-            return getsize(os.path.join(self.images_dname, filename))
-        except OSError, e:
-            error("error getting image size '%s'" % filename, e)
-
-    def __get_part_info(self, partition):
-        """Return partition info for the specified partition.
-
-        partition -- string, partition name
-        """
-        try:
-            return self.partitions[partition]
-        except KeyError, e:
-            return None
-
-    def __gen_flash_script_cdt(self, entries, partition, flinfo, script):
-	global ARCH_NAME
-        for section in entries:
-
-            machid = int(section.find(".//machid").text, 0)
-            machid = "%x" % machid
-            board = section.find(".//board").text
-            spi_nand = section.find(".//spi_nand").text
-            if ARCH_NAME != "ipq806x":
-                try:
-                    memory = section.find(".//memory").text
-                except AttributeError, e:
-                    memory = "128M16"
-                filename = "cdt-" + board + "_" + memory + ".bin"
-            else:
-                filename = "cdt-" + board + ".bin"
-
-            img_size = self.__get_img_size(filename)
-            part_info = self.__get_part_info(partition)
-
-            section_label = partition.split(":")
-            if len(section_label) != 1:
-                section_conf = section_label[1]
-            else:
-                section_conf = section_label[0]
-
-            section_conf = section_conf.lower()
-
-            if self.flinfo.type == 'nand':
-                size = roundup(img_size, flinfo.pagesize)
-                tr = ' | tr \"\\000\" \"\\377\"'
-
-            if self.flinfo.type == 'emmc':
-                size = roundup(img_size, flinfo.blocksize)
-                tr = ''
-
-            if ((self.flinfo.type == 'nand' or self.flinfo.type == 'emmc') and (size != img_size)):
-                pad_size = size - img_size
-                filename_abs = os.path.join(self.images_dname, filename)
-                filename_abs_pad = filename_abs + ".padded"
-                cmd = 'cat %s > %s' % (filename_abs, filename_abs_pad)
-                ret = subprocess.call(cmd, shell=True)
-                if ret != 0:
-                    error("failed to copy image")
-                cmd = 'dd if=/dev/zero count=1 bs=%s %s >> %s' % (pad_size, tr, filename_abs_pad)
-                cmd = '(' + cmd + ') 1>/dev/null 2>/dev/null'
-                ret = subprocess.call(cmd, shell=True)
-                if ret != 0:
-                    error("failed to create padded image from script")
-
-            if self.flinfo.type != "emmc":
-               if part_info == None:
-                   if self.flinfo.type == 'norplusnand':
-                       if count > 2:
-                           error("More than 2 NAND images for NOR+NAND is not allowed")
-               elif img_size > part_info.length:
-                   error("img size is larger than part. len in '%s'" % section_conf)
-            else:
-                if part_info != None:
-                    if (img_size > 0):
-                        if img_size > (part_info.length * self.flinfo.blocksize):
-                            error("img size is larger than part. len in '%s'" % section_conf)
-
-            if part_info == None and self.flinfo.type != 'norplusnand':
-                print "Flash type is norplusemmc"
-                continue
-
-            if machid:
-                script.start_if("machid", machid)
-            if ARCH_NAME != "ipq806x":
-                script.start_activity("Flashing ddr-%s_%s:" % ( board, memory ))
-                if img_size > 0:
-                    filename_pad = filename + ".padded"
-                    if ((self.flinfo.type == 'nand' or self.flinfo.type == 'emmc') and (size != img_size)):
-                        script.imxtract("ddr-" + board + "_" + memory + "-" + sha1(filename_pad))
-                    else:
-                        script.imxtract("ddr-" + board + "_" + memory + "-" + sha1(filename))
-                        """ script.imxtract("cdt-" + board + "_" + memory + ".bin-" + sha1(filename_pad))
-                    else:
-                        script.imxtract("cdt-" + board + "_" + memory + ".bin-" + sha1(filename)) """
-
-            else:
-                script.start_activity("Flashing ddr-%s:" % (board))
-                script.switch_layout("sbl")
-                if img_size > 0:
-                    filename_pad = filename + ".padded"
-                    if ((self.flinfo.type == 'nand' or self.flinfo.type == 'emmc') and (size != img_size)):
-                        script.imxtract("ddr-" + board + "-" + sha1(filename_pad))
-                    else:
-                        script.imxtract("ddr-" + board + "-" + sha1(filename))
-                        """ script.imxtract("cdt-" + board + ".bin-" + sha1(filename_pad))
-                    else:
-                        script.imxtract("cdt-" + board + ".bin-" + sha1(filename)) """
-
-            part_size = Pack.norplusnand_rootfs_img_size
-            if part_info == None:
-                if self.flinfo.type == 'norplusnand':
-                    offset = count * Pack.norplusnand_rootfs_img_size
-                    script.nand_write(offset, part_size, img_size, spi_nand)
-                    count = count + 1
-            else:
-                if part_info.which_flash == 0:
-                    offset = part_info.offset
-                    script.erase(offset, part_info.length)
-                    script.write(offset, img_size)
-                else:
-                    offset = part_info.offset
-                    script.nand_write(offset, part_info.length, img_size, spi_nand)
-
-            script.finish_activity()
-
-            if machid:
-                script.end_if()
-
-    def __gen_flash_script(self, script, flinfo, root):
-        """Generate the script to flash the images.
-
-        info -- ConfigParser object, containing image flashing info
-        script -- Script object, to append commands to
-        """
-	global MODE
-	global SRC_DIR
-	global ARCH_NAME
-
-	diff_files = ""
-        count = 0
-
-        if self.flash_type == "norplusemmc" and flinfo.type == "emmc":
-            srcDir_part = SRC_DIR + "/" + ARCH_NAME + "/flash_partition/" + flinfo.type + "-partition.xml"
-        else:
-            srcDir_part = SRC_DIR + "/" + ARCH_NAME + "/flash_partition/" + self.flash_type.lower() + "-partition.xml"
-
-        root_part = ET.parse(srcDir_part)
-        if self.flash_type != "emmc" and flinfo.type != "emmc":
-            parts = root_part.findall(".//partitions/partition")
-        elif self.flash_type != "emmc" and flinfo.type == "emmc":
-            parts = root_part.findall(".//physical_partition[@ref='norplusemmc']/partition")
-        else:
-            parts = root_part.findall(".//physical_partition[@ref='emmc']/partition")
-        if flinfo.type == "emmc":
-            parts_length = len(parts) + 2
-        else:
-            parts_length = len(parts)
-        entries = root.findall(".//data[@type='MACH_ID_BOARD_MAP']/entry")
-
-        first = False
-        section = None
-        part_index = 0
-
-        if flinfo.type == "emmc":
-            first = True
-
-        for index in range(parts_length):
-
-            if first:
-                if self.flash_type == "norplusemmc":
-                    part_info = root.find(".//data[@type='NORPLUSEMMC_PARAMETER']")
-                else:
-                    part_info = root.find(".//data[@type='EMMC_PARAMETER']")
-                part_fname = part_info.find(".//partition_mbn")
-                filename = part_fname.text
-                partition = "0:GPT"
-                first = False
-
-            elif index == (parts_length - 1) and flinfo.type == "emmc":
-                if self.flash_type == "norplusemmc":
-                    part_info = root.find(".//data[@type='NORPLUSEMMC_PARAMETER']")
-                else:
-                    part_info = root.find(".//data[@type='EMMC_PARAMETER']")
-                part_fname = part_info.find(".//partition_mbn_backup")
-                filename = part_fname.text
-                partition = "0:GPTBACKUP"
-
-            else:
-                section = parts[part_index]
-                part_index += 1
-                if flinfo.type != "emmc":
-                    try:
-                        filename = section[8].text
-			try:
-			   if section[8].attrib['mode'] != MODE:
-				filename = section[9].text
-			   else:
-				pass
-			except AttributeError, e:
-			   pass
-			except KeyError, e:
-			   pass
-                    except IndexError, e:
-                        if index == (parts_length - 1):
-                            return
-                        else:
-                            continue
-                    partition = section[0].text
-                else:
-		    try:
-			diff_files = section.attrib['diff_files']
-		    except KeyError, e:
-                            try:
-                                filename = section.attrib['filename']
-                                partition = section.attrib['label']
-				if filename == "":
-					continue
-	                    except KeyError, e:
-                                error("Error getting image info in section '%s'" % section.attrib['label'], e)
-
-		    if diff_files == "true":
-			try:
-                              filename = section.attrib['filename_' + MODE]
-                              partition = section.attrib['label']
-			      if filename == "":
-					continue
-                        except KeyError, e:
-                              error("Error getting image info in section '%s'" % section.attrib['label'], e)
-			diff_files = "" # Clear for next iteration
-
-            # Get machID
-            if partition != "0:CDT" and partition != "0:DDRCONFIG":
-                machid = None
-            else:
-                self.__gen_flash_script_cdt(entries, partition, flinfo, script)
-                continue
-
-            if ARCH_NAME == "ipq806x":
-            # Get Layout
-                try:
-                    layout = section[9].text
-		except:
-		    layout  = None
-
-                if layout not in ("sbl", "linux", None):
-                    error("invalid layout in '%s'" % section)
-
-            img_size = self.__get_img_size(filename)
-            part_info = self.__get_part_info(partition)
-
-            section_label = partition.split(":")
-            if len(section_label) != 1:
-                section_conf = section_label[1]
-            else:
-                section_conf = section_label[0]
-
-            section_conf = section_conf.lower()
-            spi_nand = False
-
-            if self.flinfo.type == 'nand':
-                size = roundup(img_size, flinfo.pagesize)
-                tr = ' | tr \"\\000\" \"\\377\"'
-
-            if self.flinfo.type == 'emmc':
-                size = roundup(img_size, flinfo.blocksize)
-                tr = ''
-
-            if ((self.flinfo.type == 'nand' or self.flinfo.type == 'emmc') and (size != img_size)):
-                pad_size = size - img_size
-                filename_abs = os.path.join(self.images_dname, filename)
-                filename_abs_pad = filename_abs + ".padded"
-                cmd = 'cat %s > %s' % (filename_abs, filename_abs_pad)
-                ret = subprocess.call(cmd, shell=True)
-                if ret != 0:
-                    error("failed to copy image")
-                cmd = 'dd if=/dev/zero count=1 bs=%s %s >> %s' % (pad_size, tr, filename_abs_pad)
-                cmd = '(' + cmd + ') 1>/dev/null 2>/dev/null'
-                ret = subprocess.call(cmd, shell=True)
-                if ret != 0:
-                    error("failed to create padded image from script")
-
-            if self.flinfo.type != "emmc":
-                if part_info == None:
-                    if self.flinfo.type == 'norplusnand':
-                        if count > 2:
-                            error("More than 2 NAND images for NOR+NAND is not allowed")
-                elif img_size > part_info.length:
-                    error("img size is larger than part. len in '%s'" % section_conf)
-            else:
-                if part_info != None:
-                    if (img_size > 0):
-                        if img_size > (part_info.length * self.flinfo.blocksize):
-                            error("img size is larger than part. len in '%s'" % section_conf)
-
-            if part_info == None and self.flinfo.type != 'norplusnand':
-                print "Flash type is norplusemmc"
-                continue
-
-            if machid:
-                script.start_if("machid", machid)
-
-            if section_conf == "qsee":
-                section_conf = "tz"
-            elif section_conf == "appsbl":
-                section_conf = "u-boot"
-            elif section_conf == "rootfs" and flinfo.type != "nor" and self.flash_type != "norplusemmc":
-                section_conf = "ubi"
-
-            script.start_activity("Flashing %s:" % section_conf)
-
-            if ARCH_NAME == "ipq806x":
-                script.switch_layout(layout)
-            if img_size > 0:
-                filename_pad = filename + ".padded"
-                if ((self.flinfo.type == 'nand' or self.flinfo.type == 'emmc') and (size != img_size)):
-                    script.imxtract(section_conf + "-" + sha1(filename_pad))
-                else:
-                    script.imxtract(section_conf + "-" + sha1(filename))
-
-            part_size = Pack.norplusnand_rootfs_img_size
-            if part_info == None:
-                if self.flinfo.type == 'norplusnand':
-                    offset = count * Pack.norplusnand_rootfs_img_size
-                    img_size = Pack.norplusnand_rootfs_img_size
-                    script.nand_write(offset, part_size, img_size, spi_nand)
-                    count = count + 1
-            else:
-                if part_info.which_flash == 0:
-                    offset = part_info.offset
-                    script.erase(offset, part_info.length)
-                    script.write(offset, img_size)
-                else:
-                    offset = part_info.offset
-                    script.nand_write(offset, part_info.length, img_size, spi_nand)
-
-            script.finish_activity()
-
-            if machid:
-                script.end_if()
-
-    def __gen_script_cdt(self, images, flinfo, root, section_conf, partition):
-        global ARCH_NAME
-
-        entries = root.findall(".//data[@type='MACH_ID_BOARD_MAP']/entry")
-
-        for section in entries:
-
-            board = section.find(".//board").text
-            if ARCH_NAME != "ipq806x":
-                try:
-                    memory = section.find(".//memory").text
-                except AttributeError, e:
-                    memory = "128M16"
-
-                filename = "cdt-" + board + "_" + memory + ".bin"
-                file_info = "ddr-" + board + "_" + memory
-            else:
-                filename = "cdt-" + board + ".bin"
-                file_info = "ddr-" + board
-
-            part_info = self.__get_part_info(partition)
-
-            if part_info == None and self.flinfo.type != 'norplusnand':
-                continue
-
-            if self.flinfo.type == 'nand':
-                img_size = self.__get_img_size(filename)
-                size = roundup(img_size, flinfo.pagesize)
-                if ( size != img_size ):
-                    filename = filename + ".padded"
-            if self.flinfo.type == 'emmc':
-                img_size = self.__get_img_size(filename)
-                size = roundup(img_size, flinfo.blocksize)
-                if ( size != img_size ):
-                    filename = filename + ".padded"
-            image_info = ImageInfo(file_info + "-" + sha1(filename),
-                                   filename, "firmware")
-            if filename.lower() != "none":
-                if image_info not in images:
-                   images.append(image_info)
-
-    def __gen_script(self, script_fp, script, images, flinfo, root):
-        """Generate the script to flash the multi-image blob.
-
-        script_fp -- file object, to write script to
-        info_fp -- file object, to read flashing information from
-        script -- Script object, to append the commands to
-        images -- list of ImageInfo, appended to, based on images in config
-        """
-	global MODE
-	global SRC_DIR
-
-	diff_files = ""
-        self.__gen_flash_script(script, flinfo, root)
-        if (self.flash_type == "norplusemmc" and flinfo.type == "emmc") or (self.flash_type != "norplusemmc"):
-            if flinfo.type == "emmc":
-                script.start_activity("Flashing rootfs_data:")
-                part_info = self.partitions["rootfs_data"]
-                script.erase(part_info.offset, part_info.length)
-                script.finish_activity()
-            script.end()
-
-        if self.flash_type == "norplusemmc" and flinfo.type == "emmc":
-            srcDir_part = SRC_DIR + "/" + ARCH_NAME + "/flash_partition/" + flinfo.type + "-partition.xml"
-        else:
-            srcDir_part = SRC_DIR + "/" + ARCH_NAME + "/flash_partition/" + self.flash_type.lower() + "-partition.xml"
-        root_part = ET.parse(srcDir_part)
-        if self.flash_type != "emmc" and flinfo.type != "emmc":
-            parts = root_part.findall(".//partitions/partition")
-        elif self.flash_type != "emmc" and flinfo.type == "emmc":
-            parts = root_part.findall(".//physical_partition[@ref='norplusemmc']/partition")
-        else:
-            parts = root_part.findall(".//physical_partition[@ref='emmc']/partition")
-        if flinfo.type == "emmc":
-            parts_length = len(parts) + 2
-        else:
-            parts_length = len(parts)
-
-        first = False
-        section = None
-        part_index = 0
-
-        if flinfo.type == "emmc":
-            first = True
-
-        for index in range(parts_length):
-
-            if first:
-                if self.flash_type == "norplusemmc":
-                    part_info = root.find(".//data[@type='NORPLUSEMMC_PARAMETER']")
-                else:
-                    part_info = root.find(".//data[@type='EMMC_PARAMETER']")
-                part_fname = part_info.find(".//partition_mbn")
-                filename = part_fname.text
-                partition = "0:GPT"
-                first = False
-
-            elif index == (parts_length - 1) and flinfo.type == "emmc":
-                if self.flash_type == "norplusemmc":
-                    part_info = root.find(".//data[@type='NORPLUSEMMC_PARAMETER']")
-                else:
-                    part_info = root.find(".//data[@type='EMMC_PARAMETER']")
-                part_fname = part_info.find(".//partition_mbn_backup")
-                filename = part_fname.text
-                partition = "0:GPTBACKUP"
-
-            else:
-                section = parts[part_index]
-                part_index += 1
-                if flinfo.type != "emmc":
-                    try:
-                        filename = section[8].text
-			try:
-			   if section[8].attrib['mode'] != MODE:
-				filename = section[9].text
-			except AttributeError, e:
-			   pass
-			except KeyError, e:
-			   pass
-                    except IndexError, e:
-                        if index == (parts_length - 1):
-                            return
-                        else:
-                            continue
-                    partition = section[0].text
-                else:
-
-		    try:
-			diff_files = section.attrib['diff_files']
-		    except KeyError, e:
-                            try:
-                                filename = section.attrib['filename']
-                                partition = section.attrib['label']
-				if filename == "":
-                                        continue
-	                    except KeyError, e:
-                                error("Error getting image info in section '%s'" % section.attrib['label'], e)
-
-		    if diff_files == "true":
-			try:
-                              filename = section.attrib['filename_' + MODE]
-                              partition = section.attrib['label']
-			      if filename == "":
-                                        continue
-
-                        except KeyError, e:
-                              error("Error getting image info in section '%s'" % section.attrib['label'], e)
-			diff_files = "" # Clear for next iteration
-
-            part_info = self.__get_part_info(partition)
-
-            section_label = partition.split(":")
-            if len(section_label) != 1:
-                section_conf = section_label[1]
-            else:
-                section_conf = section_label[0]
-
-            section_conf = section_conf.lower()
-
-            if section_conf == "cdt" or section_conf == "ddrconfig":
-                self.__gen_script_cdt(images, flinfo, root, section_conf, partition)
-                continue
-
-            if part_info == None and self.flinfo.type != 'norplusnand':
-                continue
-
-            if self.flinfo.type == 'nand':
-                img_size = self.__get_img_size(filename)
-                size = roundup(img_size, flinfo.pagesize)
-                if ( size != img_size ):
-                    filename = filename + ".padded"
-            if self.flinfo.type == 'emmc':
-                img_size = self.__get_img_size(filename)
-                size = roundup(img_size, flinfo.blocksize)
-                if ( size != img_size ):
-                    filename = filename + ".padded"
-            if section_conf == "qsee":
-                section_conf = "tz"
-            elif section_conf == "appsbl":
-                section_conf = "u-boot"
-            elif section_conf == "rootfs" and flinfo.type != "nor" and self.flash_type != "norplusemmc":
-                section_conf = "ubi"
-            image_info = ImageInfo(section_conf + "-" + sha1(filename),
-                                    filename, "firmware")
-            if filename.lower() != "none":
-                if image_info not in images:
-                    images.append(image_info)
-
-    def __mkimage(self, images):
-        """Create the multi-image blob.
-
-        images -- list of ImageInfo, containing images to be part of the blob
-        """
-        try:
-            its_fp = open(self.its_fname, "wb")
-        except IOError, e:
-            error("error opening its file '%s'" % self.its_fname, e)
-
-        desc = "Flashing %s %x %x"
-        desc = desc % (self.flinfo.type, self.flinfo.pagesize,
-                       self.flinfo.blocksize)
-
-        image_data = []
-        for (section, fname, imtype) in images:
-            fname = fname.replace("\\", "\\\\")
-            subs = dict(name=section, desc=fname, fname=fname, imtype=imtype)
-            image_data.append(its_image_tmpl.substitute(subs))
-
-        image_data = "".join(image_data)
-        its_data = its_tmpl.substitute(desc=desc, images=image_data)
-
-        its_fp.write(its_data)
-        its_fp.close()
-	
-        try:
-            cmd = ["mkimage", "-f", self.its_fname, self.img_fname]
-            ret = subprocess.call(cmd)
-            if ret != 0:
-                print ret
-                error("failed to create u-boot image from script")
-        except OSError, e:
-            error("error executing mkimage", e)
-
-    def __create_fnames(self):
-        """Populate the filenames."""
-
-        self.scr_fname = os.path.join(self.images_dname, "flash.scr")
-        self.its_fname = os.path.join(self.images_dname, "flash.its")
-
-    def __gen_board_script(self, flinfo, part_fname, images, root):
-	global SRC_DIR
-	global ARCH_NAME
-
-        """Generate the flashing script for one board.
-
-        board_section -- string, board section in board config file
-        machid -- string, board machine ID in hex format
-        flinfo -- FlashInfo object, contains board specific flash params
-        part_fname -- string, partition file specific to the board
-        fconf_fname -- string, flash config file specific to the board
-        images -- list of ImageInfo, append images used by the board here
-        """
-        script_fp = open(self.scr_fname, "a")
-
-        if flinfo.type != "emmc":
-            flash_param = root.find(".//data[@type='NAND_PARAMETER']")
-            pagesize = int(flash_param.find(".//page_size").text)
-            pages_per_block = int(flash_param.find(".//pages_per_block").text)
-            blocksize = pages_per_block * pagesize
-            blocks_per_chip = int(flash_param.find(".//total_block").text)
-            chipsize = blocks_per_chip * blocksize
-
-            srcDir_part = SRC_DIR + "/" + ARCH_NAME + "/flash_partition/" + flinfo.type + "-partition.xml"
-            root_part = ET.parse(srcDir_part)
-            mibib = MIBIB(part_fname, flinfo.pagesize, flinfo.blocksize,
-                          flinfo.chipsize, blocksize, chipsize, root_part)
-            self.partitions = mibib.get_parts()
-            if flinfo.type == "nand":
-                script = Flash_Script(flinfo, self.ipq_nand)
-            elif flinfo.type == "nor":
-                script = Flash_Script(flinfo, pagesize)
-        else:
-            gpt = GPT(part_fname, flinfo.pagesize, flinfo.blocksize, flinfo.chipsize)
-            self.partitions = gpt.get_parts()
-            script = Flash_Script(flinfo)
-
-        self.flinfo = flinfo
-
-        script.probe()
-        self.__gen_script(script_fp, script, images, flinfo, root)
-
-        try:
-            script_fp.write(script.dumps())
-        except IOError, e:
-            error("error writing to script '%s'" % script_fp.name, e)
-
-        script_fp.close()
-
-    def __process_board_flash_emmc(self, ftype, images, root):
-        """Extract board info from config and generate the flash script.
-
-        ftype -- string, flash type 'emmc'
-        board_section -- string, board section in config file
-        machid -- string, board machine ID in hex format
-        images -- list of ImageInfo, append images used by the board here
-        """
-
-        try:
-            part_info = root.find(".//data[@type='" + self.flash_type.upper() + "_PARAMETER']")
-            part_fname = part_info.find(".//partition_mbn")
-            part_fname = part_fname.text
-            part_fname = os.path.join(self.images_dname, part_fname)
-            if ftype == "norplusemmc":
-                part_info = root.find(".//data[@type='NORPLUSEMMC_PARAMETER']")
-                pagesize = int(part_info.find(".//page_size_flash").text)
-                part_info = root.find(".//data[@type='EMMC_PARAMETER']")
-            else:
-                pagesize = self.emmc_page_size
-            blocksize = self.emmc_block_size
-            chipsize = int(part_info.find(".//total_block").text)
-            if ftype.lower() == "norplusemmc":
-                ftype = "emmc"
-
-        except ValueError, e:
-            error("invalid flash info in section '%s'" % board_section.find('machid').text, e)
-
-        flinfo = FlashInfo(ftype, pagesize, blocksize, chipsize)
-
-        self.__gen_board_script(flinfo, part_fname, images, root)
-
-    def __process_board_flash(self, ftype, images, root):
-	global SRC_DIR
-	global ARCH_NAME
-
-        try:
-            part_info = root.find(".//data[@type='" + ftype.upper() + "_PARAMETER']")
-            part_file = SRC_DIR + "/" + ARCH_NAME + "/flash_partition/" + ftype + "-partition.xml"
-            part_xml = ET.parse(part_file)
-            partition = part_xml.find(".//partitions/partition[2]")
-            part_fname = partition[8].text
-            part_fname = os.path.join(self.images_dname, part_fname)
-            pagesize = int(part_info.find(".//page_size").text)
-            pages_per_block = int(part_info.find(".//pages_per_block").text)
-            blocks_per_chip = int(part_info.find(".//total_block").text)
-
-            if ftype == "norplusnand" or ftype == "norplusemmc":
-                ftype = "nor"
-
-        except ValueError, e:
-            error("invalid flash info in section '%s'" % board_section.find('machid').text, e)
-
-        blocksize = pages_per_block * pagesize
-        chipsize = blocks_per_chip * blocksize
-
-        flinfo = FlashInfo(ftype, pagesize, blocksize, chipsize)
-
-        self.__gen_board_script(flinfo, part_fname, images, root)
-
-    def __process_board(self, images, root):
-
-        try:
-            if self.flash_type in [ "nand", "nor", "norplusnand" ]:
-                self.__process_board_flash(self.flash_type, images, root)
-            elif self.flash_type == "emmc":
-                self.__process_board_flash_emmc(self.flash_type, images, root)
-            elif self.flash_type == "norplusemmc":
-                self.__process_board_flash("norplusemmc", images, root)
-                self.__process_board_flash_emmc("norplusemmc", images, root)
-        except ValueError, e:
-            error("error getting board info in section '%s'" % board_section.find('machid').text, e)
-
-    def main_bconf(self, flash_type, images_dname, out_fname, root):
-        """Start the packing process, using board config.
-
-        flash_type -- string, indicates flash type, 'nand' or 'nor' or 'emmc' or 'norplusnand'
-        images_dname -- string, name of images directory
-        out_fname -- string, output file path
-        """
-        self.flash_type = flash_type
-        self.images_dname = images_dname
-        self.img_fname = out_fname
-
-        self.__create_fnames()
-        try:
-            os.unlink(self.scr_fname)
-        except OSError, e:
-            pass
-
-        images = []
-        self.__process_board(images, root)
-        images.insert(0, ImageInfo("script", "flash.scr", "script"))
-        self.__mkimage(images)
-
-class UsageError(Exception):
-    """Indicates error in command arguments."""
-    pass
-
-class ArgParser(object):
-    """Class to parse command-line arguments."""
-
-    DEFAULT_TYPE = "nor,nand,norplusnand,emmc,norplusemmc"
-
-    def __init__(self):
-        self.flash_type = None
-        self.images_dname = None
-        self.out_dname = None
-        self.scr_fname = None
-        self.its_fname = None
-
-    def parse(self, argv):
-	global MODE
-	global SRC_DIR
-	global ARCH_NAME
-
-        """Start the parsing process, and populate members with parsed value.
-
-        argv -- list of string, the command line arguments
-        """
-
-	cdir = os.path.abspath(os.path.dirname(""))
-        if len(sys.argv) > 1:
-            try:
-                opts, args = getopt(sys.argv[1:], "", ["arch=", "fltype=", "srcPath=", "inImage=", "outImage="])
-            except GetoptError, e:
-		raise UsageError(e.msg)
-
-	    for option, value in opts:
-		if option == "--arch":
-		    ARCH_NAME = value
-
-		elif option == "--fltype":
-		    self.flash_type = value
-
-		elif option == "--srcPath":
-		    SRC_DIR = os.path.abspath(value)
-
-		elif option == "--inImage":
-		    self.images_dname = os.path.join(cdir, value)
-
-		elif option == "--outImage":
-		    self.out_dname = os.path.join(cdir, value)
-
-#Verify Arguments passed by user
-
-# Verify arch type
-	    if ARCH_NAME not in ["ipq40xx", "ipq806x", "ipq807x", "ipq807x_64"]:
-		raise UsageError("Invalid arch type '%s'" % arch)
-
-	    if ARCH_NAME == "ipq807x":
-		MODE = "32"
-	    elif ARCH_NAME == "ipq807x_64":
-		MODE = "64"
-		ARCH_NAME = "ipq807x"
-
-# Set flash type to default type (nand) if not given by user
-	    if self.flash_type == None:
-                self.flash_type = ArgParser.DEFAULT_TYPE
-	    for flash_type in self.flash_type.split(","):
-                if flash_type not in [ "nand", "nor", "emmc", "norplusnand", "norplusemmc" ]:
-                    raise UsageError("invalid flash type '%s'" % flash_type)
-
-# Verify src Path
-	    if SRC_DIR == "":
-		raise UsageError("Source Path is not provided")
-
-#Verify input image path
-	    if self.images_dname == None:
-		raise UsageError("input images' Path is not provided")
-
-#Verify Output image path
-	    if self.out_dname == None:
-		raise UsageError("Output Path is not provided")
-
-    def usage(self, msg):
-        """Print error message and command usage information.
-
-        msg -- string, the error message
-        """
-        print "pack: %s" % msg
-        print
-        print "Usage:"
-	print "python pack_hk.py [options] [Value] ..."
-	print
-        print "options:"
-        print "  --arch \tARCH_TYPE [ipq40xx/ipq806x/ipq807x/ipq807x_64]"
-	print
-	print "  --fltype \tFlash Type [nor/nand/emmc/norplusnand/norplusemmc]"
-        print " \t\tMultiple flashtypes can be passed by a comma separated string"
-        print " \t\tDefault is all. i.e If \"--fltype\" is not passed image for all the flash-type will be created.\n"
-        print "  --srcPath \tPath to the directory containg the meta scripts and configs"
-	print
-	print "  --inImage \tPath to the direcory containg binaries and images needed for singleimage"
-	print
-        print "  --outImage \tPath to the directory where single image will be generated"
-        print
-        print "Pack Version: %s" % version
-
-def main():
-    """Main script entry point.
-
-    Created to avoid polluting the global namespace.
-    """
-    try:
-        parser = ArgParser()
-        parser.parse(sys.argv)
-    except UsageError, e:
-        parser.usage(e.args[0])
-        sys.exit(1)
-
-    pack = Pack()
-
-    if not os.path.exists(parser.out_dname):
-	os.makedirs(parser.out_dname)
-
-    config = SRC_DIR + "/" + ARCH_NAME + "/config.xml"
-    root = ET.parse(config)
-
-# Format the output image name from Arch, flash type and mode
-    for flash_type in parser.flash_type.split(","):
-        if MODE == "64":
-            parser.out_fname = flash_type + "-" + ARCH_NAME + "_" + MODE + "-single.img"
-        else:
-	    parser.out_fname = flash_type + "-" + ARCH_NAME + "-single.img"
-
-        parser.out_fname = os.path.join(parser.out_dname, parser.out_fname)
-
-        pack.main_bconf(flash_type, parser.images_dname,
-                        parser.out_fname, root)
-
-if __name__ == "__main__":
-    main()