diff mbox

[U-Boot,v3] powerpc/CoreNet: add tool to support pbl image build.

Message ID 1339488668-18901-1-git-send-email-Shaohui.Xie@freescale.com
State Superseded, archived
Delegated to: Andy Fleming
Headers show

Commit Message

shaohui xie June 12, 2012, 8:11 a.m. UTC
Provides a tool to build boot Image for PBL(Pre boot loader) which is
used on Freescale CoreNet SoCs, PBL can be used to load some instructions
and/or data for pre-initialization. The default output image is u-boot.pbl,
for more details please refer to doc/README.pblimage.

Signed-off-by: Shaohui Xie <Shaohui.Xie@freescale.com>
---
changes for v3:
1. dump config.mk, aligned to comment of Wolfgang Denk;
2. split one configuration file to two, one is for RCW, one is for PBI
commands, add second entry in mkimage for second configuration file,
aligned to comment of Wood Scott;
3. refined the README.pblimage;

 Makefile                           |    6 +
 board/freescale/corenet_ds/pbi.cfg |   51 ++++++
 board/freescale/corenet_ds/rcw.cfg |   32 ++++
 common/image.c                     |    1 +
 doc/README.pblimage                |  114 +++++++++++++
 include/configs/corenet_ds.h       |    2 +
 include/image.h                    |    1 +
 tools/Makefile                     |    2 +
 tools/mkimage.c                    |   15 ++
 tools/mkimage.h                    |    3 +
 tools/pblimage.c                   |  328 ++++++++++++++++++++++++++++++++++++
 tools/pblimage.h                   |   36 ++++
 12 files changed, 591 insertions(+), 0 deletions(-)
 create mode 100644 board/freescale/corenet_ds/pbi.cfg
 create mode 100644 board/freescale/corenet_ds/rcw.cfg
 create mode 100644 doc/README.pblimage
 create mode 100644 tools/pblimage.c
 create mode 100644 tools/pblimage.h

Comments

shaohui xie June 27, 2012, 9:31 a.m. UTC | #1
Hello, Andy,

Do you have any comment for this patch, if no could you help apply it?


Best Regards, 
Shaohui Xie 


>-----Original Message-----
>From: Xie Shaohui-B21989
>Sent: Tuesday, June 12, 2012 4:11 PM
>To: u-boot@lists.denx.de
>Cc: Xie Shaohui-B21989
>Subject: [PATCH][v3] powerpc/CoreNet: add tool to support pbl image build.
>
>Provides a tool to build boot Image for PBL(Pre boot loader) which is used
>on Freescale CoreNet SoCs, PBL can be used to load some instructions
>and/or data for pre-initialization. The default output image is u-boot.pbl,
>for more details please refer to doc/README.pblimage.
>
>Signed-off-by: Shaohui Xie <Shaohui.Xie@freescale.com>
>---
>changes for v3:
>1. dump config.mk, aligned to comment of Wolfgang Denk; 2. split one
>configuration file to two, one is for RCW, one is for PBI commands, add
>second entry in mkimage for second configuration file, aligned to comment
>of Wood Scott; 3. refined the README.pblimage;
>
> Makefile                           |    6 +
> board/freescale/corenet_ds/pbi.cfg |   51 ++++++
> board/freescale/corenet_ds/rcw.cfg |   32 ++++
> common/image.c                     |    1 +
> doc/README.pblimage                |  114 +++++++++++++
> include/configs/corenet_ds.h       |    2 +
> include/image.h                    |    1 +
> tools/Makefile                     |    2 +
> tools/mkimage.c                    |   15 ++
> tools/mkimage.h                    |    3 +
> tools/pblimage.c                   |  328
>++++++++++++++++++++++++++++++++++++
> tools/pblimage.h                   |   36 ++++
> 12 files changed, 591 insertions(+), 0 deletions(-)  create mode 100644
>board/freescale/corenet_ds/pbi.cfg
> create mode 100644 board/freescale/corenet_ds/rcw.cfg
> create mode 100644 doc/README.pblimage
> create mode 100644 tools/pblimage.c
> create mode 100644 tools/pblimage.h
>
Andy Fleming Aug. 8, 2012, 9:10 p.m. UTC | #2
On Tue, Jun 12, 2012 at 3:11 AM, Shaohui Xie <Shaohui.Xie@freescale.com> wrote:
> Provides a tool to build boot Image for PBL(Pre boot loader) which is
> used on Freescale CoreNet SoCs, PBL can be used to load some instructions
> and/or data for pre-initialization. The default output image is u-boot.pbl,
> for more details please refer to doc/README.pblimage.
>
> Signed-off-by: Shaohui Xie <Shaohui.Xie@freescale.com>
> ---
> changes for v3:
> 1. dump config.mk, aligned to comment of Wolfgang Denk;
> 2. split one configuration file to two, one is for RCW, one is for PBI
> commands, add second entry in mkimage for second configuration file,
> aligned to comment of Wood Scott;
> 3. refined the README.pblimage;
>
>  Makefile                           |    6 +
>  board/freescale/corenet_ds/pbi.cfg |   51 ++++++
>  board/freescale/corenet_ds/rcw.cfg |   32 ++++


If I apply this patch, and then run:

make P5020DS_SDCARD_config
make u-boot.pbl

And then follow the instructions from the README:

2). Boot from SD/MMC
Write u-boot.pbl to SD/MMC from offset 0x1000.
=>tftp 100000 u-boot.pbl
=>mmcinfo
=>mmc write 100000 8 441
Change SW1[1:5] = off off on on off.

Will it work?

If I replace the word P5020DS with P3041DS, will it still work?

What I'm trying to figure out is whether rcw.cfg and pbi.cfg are truly
generic for all 3 systems this patch claims support for, or if I have
to replace them with different versions for those P* systems. My guess
is that the rcw.cfg needs to be changed, but I wanted to check. If it
needs to be changed, then what we need is something like
rcw_p5020ds.cfg, rcw_p4080ds.cfg, rcw_p3041.cfg.

Andy
shaohui xie Aug. 9, 2012, 2:32 a.m. UTC | #3
>-----Original Message-----
>From: Andy Fleming [mailto:afleming@gmail.com]
>Sent: Thursday, August 09, 2012 5:10 AM
>To: Xie Shaohui-B21989
>Cc: u-boot@lists.denx.de
>Subject: Re: [U-Boot] [PATCH][v3] powerpc/CoreNet: add tool to support pbl
>image build.
>
>On Tue, Jun 12, 2012 at 3:11 AM, Shaohui Xie <Shaohui.Xie@freescale.com>
>wrote:
>> Provides a tool to build boot Image for PBL(Pre boot loader) which is
>> used on Freescale CoreNet SoCs, PBL can be used to load some
>> instructions and/or data for pre-initialization. The default output
>> image is u-boot.pbl, for more details please refer to
>doc/README.pblimage.
>>
>> Signed-off-by: Shaohui Xie <Shaohui.Xie@freescale.com>
>> ---
>> changes for v3:
>> 1. dump config.mk, aligned to comment of Wolfgang Denk; 2. split one
>> configuration file to two, one is for RCW, one is for PBI commands,
>> add second entry in mkimage for second configuration file, aligned to
>> comment of Wood Scott; 3. refined the README.pblimage;
>>
>>  Makefile                           |    6 +
>>  board/freescale/corenet_ds/pbi.cfg |   51 ++++++
>>  board/freescale/corenet_ds/rcw.cfg |   32 ++++
>
>
>If I apply this patch, and then run:
>
>make P5020DS_SDCARD_config
>make u-boot.pbl
>
>And then follow the instructions from the README:
>
>2). Boot from SD/MMC
>Write u-boot.pbl to SD/MMC from offset 0x1000.
>=>tftp 100000 u-boot.pbl
>=>mmcinfo
>=>mmc write 100000 8 441
>Change SW1[1:5] = off off on on off.
>
>Will it work?
>
>If I replace the word P5020DS with P3041DS, will it still work?
>
>What I'm trying to figure out is whether rcw.cfg and pbi.cfg are truly
>generic for all 3 systems this patch claims support for, or if I have to
>replace them with different versions for those P* systems. My guess is
>that the rcw.cfg needs to be changed, but I wanted to check. If it needs
>to be changed, then what we need is something like rcw_p5020ds.cfg,
>rcw_p4080ds.cfg, rcw_p3041.cfg.
[Xie Shaohui] You are right. The pbl.cfg is general, but rcw.cfg is different on different boards, it must be replaced according to boards when building boot Image for different boards, but the RCW is really based on user's choice, there are so many different settings user can do to change RCW. What should this situation be handled? Or we just provide a default RCW for each board respectively, but user will still need to replace it according to his case.


Best Regards, 
Shaohui Xie
diff mbox

Patch

diff --git a/Makefile b/Makefile
index 57ad45b..98421b9 100644
--- a/Makefile
+++ b/Makefile
@@ -416,6 +416,11 @@  $(obj)u-boot.kwb:       $(obj)u-boot.bin
 		$(obj)tools/mkimage -n $(CONFIG_SYS_KWD_CONFIG) -T kwbimage \
 		-a $(CONFIG_SYS_TEXT_BASE) -e $(CONFIG_SYS_TEXT_BASE) -d $< $@
 
+$(obj)u-boot.pbl:	$(obj)u-boot.bin
+		$(obj)tools/mkimage -n $(CONFIG_PBLRCW_CONFIG) \
+		-R $(CONFIG_PBLPBI_CONFIG) -T pblimage \
+		-d $< $@
+
 $(obj)u-boot.sha1:	$(obj)u-boot.bin
 		$(obj)tools/ubsha1 $(obj)u-boot.bin
 
@@ -773,6 +778,7 @@  clobber:	tidy
 		$(obj)cscope.* $(obj)*.*~
 	@rm -f $(obj)u-boot $(obj)u-boot.map $(obj)u-boot.hex $(ALL-y)
 	@rm -f $(obj)u-boot.kwb
+	@rm -f $(obj)u-boot.pbl
 	@rm -f $(obj)u-boot.imx
 	@rm -f $(obj)u-boot.ubl
 	@rm -f $(obj)u-boot.ais
diff --git a/board/freescale/corenet_ds/pbi.cfg b/board/freescale/corenet_ds/pbi.cfg
new file mode 100644
index 0000000..50806ca
--- /dev/null
+++ b/board/freescale/corenet_ds/pbi.cfg
@@ -0,0 +1,51 @@ 
+#
+# Copyright 2012 Freescale Semiconductor, Inc.
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# 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 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.
+#
+# 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., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301 USA
+#
+# Refer docs/README.pblimage for more details about how-to configure
+# and create PBL boot image
+#
+
+#PBI commands
+#Initialize CPC1 as 1MB SRAM
+09010000 00200400
+09138000 00000000
+091380c0 00000100
+09010100 00000000
+09010104 fff0000b
+09010f00 08000000
+09010000 80000000
+#Configure LAW for CPC1
+09000d00 00000000
+09000d04 fff00000
+09000d08 81000013
+09000010 00000000
+09000014 ff000000
+09000018 81000000
+#Initialize eSPI controller, default configuration is slow for eSPI to
+#load data, this configuration comes from u-boot eSPI driver.
+09110000 80000403
+09110020 2d170008
+09110024 00100008
+09110028 00100008
+0911002c 00100008
+#Flush PBL data
+09138000 00000000
+091380c0 00000000
diff --git a/board/freescale/corenet_ds/rcw.cfg b/board/freescale/corenet_ds/rcw.cfg
new file mode 100644
index 0000000..424c7c4
--- /dev/null
+++ b/board/freescale/corenet_ds/rcw.cfg
@@ -0,0 +1,32 @@ 
+#
+# Copyright 2012 Freescale Semiconductor, Inc.
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# 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 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.
+#
+# 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., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301 USA
+#
+# Refer docs/README.pblimage for more details about how-to configure
+# and create PBL boot image
+#
+
+#PBL preamble and RCW header
+aa55aa55 010e0100
+#64 bytes RCW data
+4c580000 00000000 18185218 0000cccc
+40464000 3c3c2000 58000000 61000000
+00000000 00000000 00000000 008b6000
+00000000 00000000 00000000 00000000
diff --git a/common/image.c b/common/image.c
index 202c8a1..71f55dc 100644
--- a/common/image.c
+++ b/common/image.c
@@ -143,6 +143,7 @@  static const table_entry_t uimage_type[] = {
 	{	IH_TYPE_INVALID,    NULL,	  "Invalid Image",	},
 	{	IH_TYPE_MULTI,	    "multi",	  "Multi-File Image",	},
 	{	IH_TYPE_OMAPIMAGE,  "omapimage",  "TI OMAP SPL With GP CH",},
+	{	IH_TYPE_PBLIMAGE,   "pblimage",   "Freescale PBL Boot Image",},
 	{	IH_TYPE_RAMDISK,    "ramdisk",	  "RAMDisk Image",	},
 	{	IH_TYPE_SCRIPT,     "script",	  "Script",		},
 	{	IH_TYPE_STANDALONE, "standalone", "Standalone Program", },
diff --git a/doc/README.pblimage b/doc/README.pblimage
new file mode 100644
index 0000000..2b9bb5c
--- /dev/null
+++ b/doc/README.pblimage
@@ -0,0 +1,114 @@ 
+------------------------------------------------------------------
+Freescale PBL(pre-boot loader) Boot Image generation using mkimage
+------------------------------------------------------------------
+
+The CoreNet SoC's can boot directly from eSPI FLASH, SD/MMC and
+NAND, etc. These SoCs use PBL to load RCW and/or pre-initialization
+instructions. For more details refer section 5 Pre-boot loader
+specifications of reference manual P3041RM/P4080RM/P5020RM at link:
+http://www.freescale.com/webapp/search/Serp.jsp?Reference+Manuals
+
+Building PBL Boot Image and boot steps
+--------------------------------------
+
+1. Building PBL Boot Image.
+   The default Image is u-boot.pbl.
+
+   For eSPI boot(available on P3041/P4080/P5020):
+	To build the eSPI boot image:
+	make <board_name>_SPIFLASH_config
+	make u-boot.pbl
+
+   For SD boot(available on P3041/P4080/P5020):
+	To build the SD boot image:
+	make <board_name>_SDCARD_config
+	make u-boot.pbl
+
+   For Nand boot(available on P3041/P5020):
+	To build the NAND boot image:
+	make <board_name>_NAND_config
+	make u-boot.pbl
+
+
+2. pblimage support available with mkimage utility will generate Freescale PBL
+boot image that can be flashed on the board eSPI flash, SD/MMC and NAND.
+Following steps describe it in detail.
+
+	1). Boot from eSPI flash
+	Write u-boot.pbl to eSPI flash from offset 0x0.
+	for ex in u-boot:
+	=>tftp 100000 u-boot.pbl
+	=>sf probe 0
+	=>sf erase 0 100000
+	=>sf write 100000 0 $filesize
+	Change SW1[1:5] = off off on off on.
+
+	2). Boot from SD/MMC
+	Write u-boot.pbl to SD/MMC from offset 0x1000.
+	for ex in u-boot:
+	=>tftp 100000 u-boot.pbl
+	=>mmcinfo
+	=>mmc write 100000 8 441
+	Change SW1[1:5] = off off on on off.
+
+	3). Boot from Nand
+	Write u-boot.pbl to Nand from offset 0x0.
+	for ex in u-boot:
+	=>tftp 100000 u-boot.pbl
+	=>nand info
+	=>nand erase 0 100000
+	=>nand write 100000 0 $filesize
+	Change SW1[1:5] = off on off off on
+	Change SW7[1:4] = on off off on
+
+Board specific configuration file specifications:
+------------------------------------------------
+1. Configuration files rcw.cfg and pbi.cfg must present in the
+board/freescale/corenet_ds/, rcw.cfg is for RCW, pbi.cfg is for
+PBI instructions. File name must not be changed since they are used
+in Makefile.
+2. These files can have empty lines and lines starting with "#" as first
+character to put comments
+
+Typical example of rcw.cfg file:
+-----------------------------------
+
+#PBL preamble and RCW header
+aa55aa55 010e0100
+#64 bytes RCW data
+4c580000 00000000 18185218 0000cccc
+40464000 3c3c2000 58000000 61000000
+00000000 00000000 00000000 008b6000
+00000000 00000000 00000000 00000000
+
+Typical example of pbi.cfg file:
+-----------------------------------
+
+#PBI commands
+#Initialize CPC1
+09010000 00200400
+09138000 00000000
+091380c0 00000100
+09010100 00000000
+09010104 fff0000b
+09010f00 08000000
+09010000 80000000
+#Configure LAW for CPC1
+09000d00 00000000
+09000d04 fff00000
+09000d08 81000013
+09000010 00000000
+09000014 ff000000
+09000018 81000000
+#Initialize eSPI controller
+09110000 80000403
+09110020 2d170008
+09110024 00100008
+09110028 00100008
+0911002c 00100008
+#Flush PBL data
+09138000 00000000
+091380c0 00000000
+
+------------------------------------------------
+Author: Shaohui Xie<Shaohui.Xie@freescale.com>
diff --git a/include/configs/corenet_ds.h b/include/configs/corenet_ds.h
index d0894fd..d3b0222 100644
--- a/include/configs/corenet_ds.h
+++ b/include/configs/corenet_ds.h
@@ -31,6 +31,8 @@ 
 #ifdef CONFIG_RAMBOOT_PBL
 #define CONFIG_RAMBOOT_TEXT_BASE	CONFIG_SYS_TEXT_BASE
 #define CONFIG_RESET_VECTOR_ADDRESS	0xfffffffc
+#define CONFIG_PBLPBI_CONFIG $(SRCTREE)/board/freescale/corenet_ds/pbi.cfg
+#define CONFIG_PBLRCW_CONFIG $(SRCTREE)/board/freescale/corenet_ds/rcw.cfg
 #endif
 
 #ifdef CONFIG_SRIOBOOT_SLAVE
diff --git a/include/image.h b/include/image.h
index bbf80f0..0913e35 100644
--- a/include/image.h
+++ b/include/image.h
@@ -164,6 +164,7 @@ 
 #define IH_TYPE_OMAPIMAGE	12	/* TI OMAP Config Header Image	*/
 #define IH_TYPE_AISIMAGE	13	/* TI Davinci AIS Image		*/
 #define IH_TYPE_KERNEL_NOLOAD	14	/* OS Kernel Image, can run from any load address */
+#define IH_TYPE_PBLIMAGE	15	/* Freescale PBL Boot Image	*/
 
 /*
  * Compression Types
diff --git a/tools/Makefile b/tools/Makefile
index 64bcc4d..26f4927 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -90,6 +90,7 @@  OBJ_FILES-$(CONFIG_CMD_LOADS) += img2srec.o
 OBJ_FILES-$(CONFIG_XWAY_SWAP_BYTES) += xway-swap-bytes.o
 NOPED_OBJ_FILES-y += aisimage.o
 NOPED_OBJ_FILES-y += kwbimage.o
+NOPED_OBJ_FILES-y += pblimage.o
 NOPED_OBJ_FILES-y += imximage.o
 NOPED_OBJ_FILES-y += omapimage.o
 NOPED_OBJ_FILES-y += mkenvimage.o
@@ -203,6 +204,7 @@  $(obj)mkimage$(SFX):	$(obj)aisimage.o \
 			$(obj)image.o \
 			$(obj)imximage.o \
 			$(obj)kwbimage.o \
+			$(obj)pblimage.o \
 			$(obj)md5.o \
 			$(obj)mkimage.o \
 			$(obj)os_support.o \
diff --git a/tools/mkimage.c b/tools/mkimage.c
index eeb1b10..e43b09f 100644
--- a/tools/mkimage.c
+++ b/tools/mkimage.c
@@ -39,6 +39,7 @@  struct mkimage_params params = {
 	.comp = IH_COMP_GZIP,
 	.dtc = MKIMAGE_DEFAULT_DTC_OPTIONS,
 	.imagename = "",
+	.imagename2 = "",
 };
 
 /*
@@ -150,6 +151,8 @@  main (int argc, char **argv)
 	int retval = 0;
 	struct image_type_params *tparams = NULL;
 
+	/* Init Freescale PBL Boot image generation/list support */
+	init_pbl_image_type();
 	/* Init Kirkwood Boot image generation/list support */
 	init_kwb_image_type ();
 	/* Init Freescale imx Boot image generation/list support */
@@ -250,6 +253,15 @@  main (int argc, char **argv)
 					usage ();
 				params.imagename = *++argv;
 				goto NXTARG;
+			case 'R':
+				if (--argc <= 0)
+					usage();
+				/*
+				 * This entry is for the second configuration
+				 * file, if only one is not enough.
+				 */
+				params.imagename2 = *++argv;
+				goto NXTARG;
 			case 's':
 				params.skipcpy = 1;
 				break;
@@ -440,6 +452,9 @@  NXTARG:		;
 					break;
 				}
 			}
+		} else if (params.type == IH_TYPE_PBLIMAGE) {
+			/* PBL has special Image format, implements its' own */
+			pbl_load_uboot(ifd, &params);
 		} else {
 			copy_file (ifd, params.datafile, 0);
 		}
diff --git a/tools/mkimage.h b/tools/mkimage.h
index 5fe1a48..ea45f5c 100644
--- a/tools/mkimage.h
+++ b/tools/mkimage.h
@@ -69,6 +69,7 @@  struct mkimage_params {
 	unsigned int addr;
 	unsigned int ep;
 	char *imagename;
+	char *imagename2;
 	char *datafile;
 	char *imagefile;
 	char *cmdname;
@@ -147,6 +148,8 @@  void mkimage_register (struct image_type_params *tparams);
  *
  * Supported image types init functions
  */
+void pbl_load_uboot(int fd, struct mkimage_params *mparams);
+void init_pbl_image_type(void);
 void init_ais_image_type(void);
 void init_kwb_image_type (void);
 void init_imx_image_type (void);
diff --git a/tools/pblimage.c b/tools/pblimage.c
new file mode 100644
index 0000000..bfb39ca
--- /dev/null
+++ b/tools/pblimage.c
@@ -0,0 +1,328 @@ 
+/*
+ * Copyright 2012 Freescale Semiconductor, Inc.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * 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 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.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+#define _GNU_SOURCE
+
+#include "mkimage.h"
+#include <image.h>
+#include "pblimage.h"
+
+/*
+ * The PBL can load up to 64 bytes at a time, so we split the U-Boot
+ * image into 64 byte chunks. PBL needs a command for each piece, of
+ * the form "81xxxxxx", where "xxxxxx" is the offset. SYS_TEXT_BASE
+ * is 0xFFF80000 for PBL boot, and PBL only cares about low 24-bit,
+ * so it starts from 0x81F80000.
+ */
+static uint32_t next_pbl_cmd = 0x81F80000;
+/*
+ * need to store all bytes in memory for calculating crc32, then write the
+ * bytes to image file for PBL boot.
+ */
+static unsigned char mem_buf[600000];
+static unsigned char *pmem_buf = mem_buf;
+static int pbl_size;
+static char *fname = "Unknown";
+static int lineno = -1;
+static struct pbl_header pblimage_header;
+
+static union
+{
+	char c[4];
+	unsigned char l;
+} endian_test = { {'l', '?', '?', 'b'} };
+
+#define ENDIANNESS ((char)endian_test.l)
+
+static void generate_pbl_cmd(void)
+{
+	uint32_t val = next_pbl_cmd;
+	next_pbl_cmd += 0x40;
+	int i;
+
+	for (i = 3; i >= 0; i--) {
+		*pmem_buf++ = (val >> (i * 8)) & 0xff;
+		pbl_size++;
+	}
+}
+
+static void pbl_fget(size_t size, FILE *stream)
+{
+	unsigned char c;
+	while (size && (c = fgetc(stream)) != EOF) {
+		*pmem_buf++ = c;
+		pbl_size++;
+		size--;
+	}
+}
+
+/* load split u-boot with PBI command 81xxxxxx. */
+static void load_uboot(FILE *fp_uboot)
+{
+	while (next_pbl_cmd < 0x82000000) {
+		generate_pbl_cmd();
+		pbl_fget(64, fp_uboot);
+	}
+}
+
+static void check_get_hexval(char *token)
+{
+	uint32_t hexval;
+	int i;
+
+	if (!sscanf(token, "%x", &hexval)) {
+		printf("Error:%s[%d] - Invalid hex data(%s)\n", fname,
+			lineno, token);
+		exit(EXIT_FAILURE);
+	}
+	for (i = 3; i >= 0; i--) {
+		*pmem_buf++ = (hexval >> (i * 8)) & 0xff;
+		pbl_size++;
+	}
+}
+
+static void pbl_parser(char *name)
+{
+	FILE *fd = NULL;
+	char *line = NULL;
+	char *token, *saveptr1, *saveptr2;
+	size_t len = 0;
+
+	fname = name;
+	fd = fopen(name, "r");
+	if (fd == NULL) {
+		printf("Error:%s - Can't open\n", fname);
+		exit(EXIT_FAILURE);
+	}
+
+	while ((getline(&line, &len, fd)) > 0) {
+		lineno++;
+		token = strtok_r(line, "\r\n", &saveptr1);
+		/* drop all lines with zero tokens (= empty lines) */
+		if (token == NULL)
+			continue;
+		for (line = token;; line = NULL) {
+			token = strtok_r(line, " \t", &saveptr2);
+			if (token == NULL)
+				break;
+			/* Drop all text starting with '#' as comments */
+			if (token[0] == '#')
+				break;
+			check_get_hexval(token);
+		}
+	}
+	if (line)
+		free(line);
+	fclose(fd);
+}
+
+static uint32_t crc_table[256];
+
+static void make_crc_table(void)
+{
+	uint32_t mask;
+	int i, j;
+	uint32_t poly; /* polynomial exclusive-or pattern */
+
+	/*
+	 * the polynomial used by PBL is 1 + x1 + x2 + x4 + x5 + x7 + x8 + x10
+	 * + x11 + x12 + x16 + x22 + x23 + x26 + x32.
+	 */
+	poly = 0x04c11db7;
+
+	for (i = 0; i < 256; i++) {
+		mask = i << 24;
+		for (j = 0; j < 8; j++) {
+			if (mask & 0x80000000)
+				mask = (mask << 1) ^ poly;
+			else
+				mask <<= 1;
+		}
+		crc_table[i] = mask;
+	}
+}
+
+unsigned long pbl_crc32(unsigned long crc, const char *buf, uint32_t len)
+{
+	uint32_t crc32_val = 0xffffffff;
+	uint32_t xor = 0x0;
+	int i;
+
+	make_crc_table();
+
+	for (i = 0; i < len; i++)
+		crc32_val = (crc32_val << 8) ^
+			crc_table[(crc32_val >> 24) ^ (*buf++ & 0xff)];
+
+	crc32_val = crc32_val ^ xor;
+	if (crc32_val < 0) {
+		crc32_val += 0xffffffff;
+		crc32_val += 1;
+	}
+	return crc32_val;
+}
+
+static uint32_t reverse_byte(uint32_t val)
+{
+	uint32_t temp;
+	unsigned char *p1;
+	int j;
+
+	temp = val;
+	p1 = (unsigned char *)&temp;
+	for (j = 3; j >= 0; j--)
+		*p1++ = (val >> (j * 8)) & 0xff;
+	return temp;
+}
+
+/* write end command and crc command to memory. */
+static void add_end_cmd(void)
+{
+	uint32_t pbl_end_cmd[4] = {0x09138000, 0x00000000,
+		0x091380c0, 0x00000000};
+	uint32_t crc32_pbl;
+	int i;
+	unsigned char *p = (unsigned char *)&pbl_end_cmd;
+
+	if (ENDIANNESS == 'l') {
+		for (i = 0; i < 4; i++)
+			pbl_end_cmd[i] = reverse_byte(pbl_end_cmd[i]);
+	}
+
+	for (i = 0; i < 16; i++) {
+		*pmem_buf++ = *p++;
+		pbl_size++;
+	}
+
+	/* Add PBI CRC command. */
+	*pmem_buf++ = 0x08;
+	*pmem_buf++ = 0x13;
+	*pmem_buf++ = 0x80;
+	*pmem_buf++ = 0x40;
+	pbl_size += 4;
+
+	/* calculated CRC32 and write it to memory. */
+	crc32_pbl = pbl_crc32(0, (const char *)mem_buf, pbl_size);
+	*pmem_buf++ = (crc32_pbl >> 24) & 0xff;
+	*pmem_buf++ = (crc32_pbl >> 16) & 0xff;
+	*pmem_buf++ = (crc32_pbl >> 8) & 0xff;
+	*pmem_buf++ = (crc32_pbl) & 0xff;
+	pbl_size += 4;
+
+	if ((pbl_size % 16) != 0) {
+		for (i = 0; i < 8; i++) {
+			*pmem_buf++ = 0x0;
+			pbl_size++;
+		}
+	}
+	if ((pbl_size % 16 != 0)) {
+		printf("Error: Bad size of image file\n");
+		exit(EXIT_FAILURE);
+	}
+}
+
+void pbl_load_uboot(int ifd, struct mkimage_params *params)
+{
+	FILE *fp_uboot;
+	int size;
+
+	/* parse the rcw.cfg file. */
+	pbl_parser(params->imagename);
+
+	/* parse the pbi.cfg file. */
+	pbl_parser(params->imagename2);
+
+	fp_uboot = fopen(params->datafile, "r");
+	if (fp_uboot == NULL) {
+		printf("Error: %s open failed\n", params->datafile);
+		exit(EXIT_FAILURE);
+	}
+
+	load_uboot(fp_uboot);
+	add_end_cmd();
+	fclose(fp_uboot);
+	lseek(ifd, 0, SEEK_SET);
+
+	size = pbl_size;
+	if (write(ifd, (const void *)&mem_buf, size) != size) {
+		fprintf(stderr, "Write error on %s: %s\n",
+			params->imagefile, strerror(errno));
+		exit(EXIT_FAILURE);
+	}
+}
+
+static int pblimage_check_image_types(uint8_t type)
+{
+	if (type == IH_TYPE_PBLIMAGE)
+		return EXIT_SUCCESS;
+	else
+		return EXIT_FAILURE;
+}
+
+static int pblimage_verify_header(unsigned char *ptr, int image_size,
+			struct mkimage_params *params)
+{
+	struct pbl_header *pbl_hdr = (struct pbl_header *) ptr;
+
+	/* Only a few checks can be done: search for magic numbers */
+	if (ENDIANNESS == 'l') {
+		if (pbl_hdr->preamble != reverse_byte(RCW_PREAMBLE))
+			return -FDT_ERR_BADSTRUCTURE;
+
+		if (pbl_hdr->rcwheader != reverse_byte(RCW_HEADER))
+			return -FDT_ERR_BADSTRUCTURE;
+	} else {
+		if (pbl_hdr->preamble != RCW_PREAMBLE)
+			return -FDT_ERR_BADSTRUCTURE;
+
+		if (pbl_hdr->rcwheader != RCW_HEADER)
+			return -FDT_ERR_BADSTRUCTURE;
+	}
+	return 0;
+}
+
+static void pblimage_print_header(const void *ptr)
+{
+	printf("Image Type:   Freescale PBL Boot Image\n");
+}
+
+static void pblimage_set_header(void *ptr, struct stat *sbuf, int ifd,
+				struct mkimage_params *params)
+{
+	/*nothing need to do, pbl_load_uboot takes care of whole file. */
+}
+
+/* pblimage parameters */
+static struct image_type_params pblimage_params = {
+	.name		= "Freescale PBL Boot Image support",
+	.header_size	= sizeof(struct pbl_header),
+	.hdr		= (void *)&pblimage_header,
+	.check_image_type = pblimage_check_image_types,
+	.verify_header	= pblimage_verify_header,
+	.print_header	= pblimage_print_header,
+	.set_header	= pblimage_set_header,
+};
+
+void init_pbl_image_type(void)
+{
+	pbl_size = 0;
+	mkimage_register(&pblimage_params);
+}
diff --git a/tools/pblimage.h b/tools/pblimage.h
new file mode 100644
index 0000000..514a477
--- /dev/null
+++ b/tools/pblimage.h
@@ -0,0 +1,36 @@ 
+/*
+ * Copyright 2012 Freescale Semiconductor, Inc.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * 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 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.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef PBLIMAGE_H
+#define PBLIMAGE_H
+
+#define RCW_BYTES	64
+#define RCW_PREAMBLE	0xaa55aa55
+#define RCW_HEADER	0x010e0100
+
+struct pbl_header {
+	uint32_t preamble;
+	uint32_t rcwheader;
+	uint8_t rcw_data[RCW_BYTES];
+};
+
+#endif /* PBLIMAGE_H */