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

From: Shaohui Xie b21989@freescale.com
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 b21989@freescale.com --- rebased to lasted tree.
Makefile | 5 + board/freescale/corenet_ds/config.mk | 26 +++ board/freescale/corenet_ds/pblimage.cfg | 60 ++++++ common/image.c | 1 + doc/README.pblimage | 140 +++++++++++++ include/image.h | 1 + tools/Makefile | 2 + tools/mkimage.c | 5 + tools/mkimage.h | 2 + tools/pblimage.c | 329 +++++++++++++++++++++++++++++++ tools/pblimage.h | 36 ++++ 11 files changed, 607 insertions(+), 0 deletions(-) create mode 100644 board/freescale/corenet_ds/config.mk create mode 100644 board/freescale/corenet_ds/pblimage.cfg create mode 100644 doc/README.pblimage create mode 100644 tools/pblimage.c create mode 100644 tools/pblimage.h
diff --git a/Makefile b/Makefile index 57ad45b..99f993a 100644 --- a/Makefile +++ b/Makefile @@ -416,6 +416,10 @@ $(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_PBL_CONFIG) -T pblimage \ + -d $< $@ + $(obj)u-boot.sha1: $(obj)u-boot.bin $(obj)tools/ubsha1 $(obj)u-boot.bin
@@ -773,6 +777,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/config.mk b/board/freescale/corenet_ds/config.mk new file mode 100644 index 0000000..72464dc --- /dev/null +++ b/board/freescale/corenet_ds/config.mk @@ -0,0 +1,26 @@ +# +# 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 +# + +ifeq ($(CONFIG_RAMBOOT_PBL), y) +CONFIG_PBL_CONFIG = $(SRCTREE)/$(CONFIG_BOARDDIR)/pblimage.cfg +ALL-y += $(obj)u-boot.pbl +endif diff --git a/board/freescale/corenet_ds/pblimage.cfg b/board/freescale/corenet_ds/pblimage.cfg new file mode 100644 index 0000000..898fe6d --- /dev/null +++ b/board/freescale/corenet_ds/pblimage.cfg @@ -0,0 +1,60 @@ +# +# Copyright 2012 Freescale Semiconductor, Inc. +# Written-by: Shaohui Xieb21989@freescale.com +# +# 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 for P4080, replace it when building image +#for P3041DS or P5020DS. +4c580000 00000000 18185218 0000cccc +40464000 3c3c2000 58000000 61000000 +00000000 00000000 00000000 008b6000 +00000000 00000000 00000000 00000000 + +#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 diff --git a/common/image.c b/common/image.c index 202c8a1..afc7155 100644 --- a/common/image.c +++ b/common/image.c @@ -147,6 +147,7 @@ static const table_entry_t uimage_type[] = { { IH_TYPE_SCRIPT, "script", "Script", }, { IH_TYPE_STANDALONE, "standalone", "Standalone Program", }, { IH_TYPE_UBLIMAGE, "ublimage", "Davinci UBL image",}, + { IH_TYPE_PBLIMAGE, "pblimage", "Freescale PBL Boot Image",}, { -1, "", "", }, };
diff --git a/doc/README.pblimage b/doc/README.pblimage new file mode 100644 index 0000000..73d90f1 --- /dev/null +++ b/doc/README.pblimage @@ -0,0 +1,140 @@ +------------------------------------------------------------------ +Freescale PBL(pre-boot loader) Boot Image generation using mkimage +------------------------------------------------------------------ + +This document describes the U-Boot feature as it +is implemented for the Freescale CoreNet SoC. + +The CoreNet SoC's can boot directly from eSPI FLASH, SD/MMC. + +for more details refer section 5 Pre-boot loader specifications. + +Building PBL Boot Image and boot steps +-------------------------------------- + +1. Building PBL Boot Image. + The default Image is u-boot.pbl. Before build the iamge, make sure + rcw data in pblimage.cfg is suitable for the platform, if not, this + need to be fixed in step 2. + + For eSPI boot: + To build the eSPI boot image for P4080DS: + make P4080DS_SPIFLASH + + To build the eSPI boot image for P3041DS: + make P3041DS_SPIFLASH + + To build the eSPI boot image for P5020DS: + make P5020DS_SPIFLASH + + For SD boot: + To build the SD boot image for P4080DS: + make P4080DS_SDCARD + + To build the SD boot image for P3041DS: + make P3041DS_SDCARD + + To build the SD boot image for P5020DS: + make P5020DS_SDCARD + + For Nand boot(P4080DS does not have Nand chip): + To build the PBL boot image for P3041DS: + make P3041DS_NAND + + To build the PBL boot image for P5020DS: + make P5020DS_NAND + + +2. Command below provided a way to re-build the PBL boot image if the +configuration file needes to be modified while the u-boot.bin does not +need to be re-build. + +Command syntax: +-------------- +./tools/mkimage -n <board specific configuration file> \ + -T pblimage -d <input_raw_binary> <output_pblboot_file> + +for ex. +./tools/mkimage -n ./board/freescale/corenet_ds/pblimage.cfg \ + -T pblimage -d u-boot.bin u-boot.pbl + + +3. pblimage support available with mkimage utility will generate Freescale PBL +boot image that can be flashed on the board eSPI flash, SD/MMC. Following steps +described how to boot from eSPI flash, SD/MMC. + + 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, Note that in case of eLBC NAND + flash, the address starts from the first good block. + 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. This file must present in the $(BOARDDIR) and the name should be + pblimage.cfg (since this is used in Makefile) +2. This file can have empty lines and lines starting with "#" as first + character to put comments + +Typical example of pblimage.cfg file: +----------------------------------- + +#PBL preamble and RCW header +aa55aa55 010e0100 +#64 bytes RCW data for P4080DS, replace it when building image +#for P3041DS or P5020DS +4c580000 00000000 18185218 0000cccc +40464000 3c3c2000 58000000 61000000 +00000000 00000000 00000000 008b6000 +00000000 00000000 00000000 00000000 + +#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 Xieb21989@freescale.com 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..ef76d94 100644 --- a/tools/mkimage.c +++ b/tools/mkimage.c @@ -150,6 +150,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 */ @@ -440,6 +442,9 @@ NXTARG: ; break; } } + } else if (params.type == IH_TYPE_PBLIMAGE) { + /* PBL has special Image format, implements its' own */ + pbl_load_uboot(ifd, ¶ms); } else { copy_file (ifd, params.datafile, 0); } diff --git a/tools/mkimage.h b/tools/mkimage.h index 5fe1a48..a886305 100644 --- a/tools/mkimage.h +++ b/tools/mkimage.h @@ -147,6 +147,8 @@ void mkimage_register (struct image_type_params *tparams); * * Supported image types init functions */ +void pbl_load_uboot(int, struct mkimage_params *); +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..d0c29a6 --- /dev/null +++ b/tools/pblimage.c @@ -0,0 +1,329 @@ +/* + * 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" + +/* + * PBL can load 64 bytes each time in MAX, so the u-boot need to be splited into + * pieces of 64 bytes, PBL needs a command for each piece, the command looks + * like 81xxxxxx, the "xxxxxx" is offset, it starts from F80000 in our case. + */ +static unsigned int uboot_label = 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 mem_byte_cnt; +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) +{ + unsigned int val = uboot_label; + uboot_label += 0x40; + int i; + + for (i = 3; i >= 0; i--) { + *pmem_buf++ = (val >> (i * 8)) & 0xff; + mem_byte_cnt++; + } +} + +static void pbl_fget(size_t size, FILE *stream) +{ + unsigned char c; + while (size) { + c = (unsigned char)fgetc(stream); + *pmem_buf++ = c; + mem_byte_cnt++; + size--; + } +} + +/* load splited u-boot with PBI command 81xxxxxx. */ +static void load_uboot(FILE *fp_uboot) +{ + while (uboot_label < 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; + mem_byte_cnt++; + } +} + +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, unsigned int len) +{ + unsigned int crc32_val = 0xffffffff; + unsigned int 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 unsigned int reverse_byte(unsigned int val) +{ + unsigned int 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) +{ + unsigned int pbl_end_cmd[4] = {0x09138000, 0x00000000, + 0x091380c0, 0x00000000}; + unsigned int 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++; + mem_byte_cnt++; + } + + /* Add PBI CRC command. */ + *pmem_buf++ = 0x08; + *pmem_buf++ = 0x13; + *pmem_buf++ = 0x80; + *pmem_buf++ = 0x40; + mem_byte_cnt += 4; + + /* calculated CRC32 and write it to memory. */ + crc32_pbl = pbl_crc32(0, (const char *)mem_buf, mem_byte_cnt); + *pmem_buf++ = (crc32_pbl >> 24) & 0xff; + *pmem_buf++ = (crc32_pbl >> 16) & 0xff; + *pmem_buf++ = (crc32_pbl >> 8) & 0xff; + *pmem_buf++ = (crc32_pbl) & 0xff; + mem_byte_cnt += 4; + + if (((mem_byte_cnt) % 16) != 0) { + for (i = 0; i < 8; i++) { + *pmem_buf++ = 0x0; + mem_byte_cnt++; + } + } + if ((mem_byte_cnt % 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 pblimage.cfg file. */ + pbl_parser(params->imagename); + + 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 = mem_byte_cnt; + 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) +{ + mem_byte_cnt = 0; + mkimage_register(&pblimage_params); +} diff --git a/tools/pblimage.h b/tools/pblimage.h new file mode 100644 index 0000000..887d4c9 --- /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_ */

On 06/04/2012 03:57 AM, Shaohui Xie wrote:
From: Shaohui Xie b21989@freescale.com
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 b21989@freescale.com
rebased to lasted tree.
Makefile | 5 + board/freescale/corenet_ds/config.mk | 26 +++ board/freescale/corenet_ds/pblimage.cfg | 60 ++++++ common/image.c | 1 + doc/README.pblimage | 140 +++++++++++++ include/image.h | 1 + tools/Makefile | 2 + tools/mkimage.c | 5 + tools/mkimage.h | 2 + tools/pblimage.c | 329 +++++++++++++++++++++++++++++++ tools/pblimage.h | 36 ++++ 11 files changed, 607 insertions(+), 0 deletions(-) create mode 100644 board/freescale/corenet_ds/config.mk create mode 100644 board/freescale/corenet_ds/pblimage.cfg create mode 100644 doc/README.pblimage create mode 100644 tools/pblimage.c create mode 100644 tools/pblimage.h
diff --git a/Makefile b/Makefile index 57ad45b..99f993a 100644 --- a/Makefile +++ b/Makefile @@ -416,6 +416,10 @@ $(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_PBL_CONFIG) -T pblimage \
-d $< $@
$(obj)u-boot.sha1: $(obj)u-boot.bin $(obj)tools/ubsha1 $(obj)u-boot.bin
@@ -773,6 +777,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/config.mk b/board/freescale/corenet_ds/config.mk new file mode 100644 index 0000000..72464dc --- /dev/null +++ b/board/freescale/corenet_ds/config.mk @@ -0,0 +1,26 @@ +# +# 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 +#
+ifeq ($(CONFIG_RAMBOOT_PBL), y) +CONFIG_PBL_CONFIG = $(SRCTREE)/$(CONFIG_BOARDDIR)/pblimage.cfg +ALL-y += $(obj)u-boot.pbl +endif
Why is this specific to corenet_ds?
diff --git a/board/freescale/corenet_ds/pblimage.cfg b/board/freescale/corenet_ds/pblimage.cfg new file mode 100644 index 0000000..898fe6d --- /dev/null +++ b/board/freescale/corenet_ds/pblimage.cfg @@ -0,0 +1,60 @@ +# +# Copyright 2012 Freescale Semiconductor, Inc. +# Written-by: Shaohui Xieb21989@freescale.com +# +# 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 for P4080, replace it when building image +#for P3041DS or P5020DS. +4c580000 00000000 18185218 0000cccc +40464000 3c3c2000 58000000 61000000 +00000000 00000000 00000000 008b6000 +00000000 00000000 00000000 00000000
Could you have the tool source this from a separate file, rather than require the user to replace it manually?
Talk to Timur (when he gets back from vacation in a couple weeks) about his RCW tool and how best to accept the output it produces.
+#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
Why is eSPI in here? Isn't this supposed to just generically write an image into CPC SRAM?
diff --git a/doc/README.pblimage b/doc/README.pblimage new file mode 100644 index 0000000..73d90f1 --- /dev/null +++ b/doc/README.pblimage @@ -0,0 +1,140 @@ +------------------------------------------------------------------ +Freescale PBL(pre-boot loader) Boot Image generation using mkimage +------------------------------------------------------------------
+This document describes the U-Boot feature as it +is implemented for the Freescale CoreNet SoC.
+The CoreNet SoC's can boot directly from eSPI FLASH, SD/MMC.
+for more details refer section 5 Pre-boot loader specifications.
+Building PBL Boot Image and boot steps +--------------------------------------
+1. Building PBL Boot Image.
- The default Image is u-boot.pbl. Before build the iamge, make sure
- rcw data in pblimage.cfg is suitable for the platform, if not, this
- need to be fixed in step 2.
- For eSPI boot:
- To build the eSPI boot image for P4080DS:
- make P4080DS_SPIFLASH
- To build the eSPI boot image for P3041DS:
- make P3041DS_SPIFLASH
- To build the eSPI boot image for P5020DS:
- make P5020DS_SPIFLASH
- For SD boot:
- To build the SD boot image for P4080DS:
- make P4080DS_SDCARD
- To build the SD boot image for P3041DS:
- make P3041DS_SDCARD
- To build the SD boot image for P5020DS:
- make P5020DS_SDCARD
- For Nand boot(P4080DS does not have Nand chip):
- To build the PBL boot image for P3041DS:
- make P3041DS_NAND
- To build the PBL boot image for P5020DS:
- make P5020DS_NAND
+2. Command below provided a way to re-build the PBL boot image if the +configuration file needes to be modified while the u-boot.bin does not +need to be re-build.
+Command syntax: +-------------- +./tools/mkimage -n <board specific configuration file> \
-T pblimage -d <input_raw_binary> <output_pblboot_file>
+for ex. +./tools/mkimage -n ./board/freescale/corenet_ds/pblimage.cfg \
-T pblimage -d u-boot.bin u-boot.pbl
+3. pblimage support available with mkimage utility will generate Freescale PBL +boot image that can be flashed on the board eSPI flash, SD/MMC. Following steps +described how to boot from eSPI flash, SD/MMC.
- 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, Note that in case of eLBC NAND
- flash, the address starts from the first good block.
- 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
How do you load the environment? We should find a way, possibly using SPL, to have the environment ready early. We do not want to wait post relocation for the full NAND/SD/SPI driver to load the environment.
diff --git a/tools/mkimage.h b/tools/mkimage.h index 5fe1a48..a886305 100644 --- a/tools/mkimage.h +++ b/tools/mkimage.h @@ -147,6 +147,8 @@ void mkimage_register (struct image_type_params *tparams);
- Supported image types init functions
*/ +void pbl_load_uboot(int, struct mkimage_params *);
Please provide names for parameters.
+/*
- PBL can load 64 bytes each time in MAX, so the u-boot need to be splited into
- pieces of 64 bytes, PBL needs a command for each piece, the command looks
- like 81xxxxxx, the "xxxxxx" is offset, it starts from F80000 in our case.
- */
Better wording:
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.
Why are we hardcoding 0xf80000? Where does it come from?
+static unsigned int uboot_label = 0x81F80000;
I'm not sure that label is the right word here. Maybe "next_pbl_cmd"?
+/*
- 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];
600000 is arbitrary. Do you have any checking if the image size exceeds this? Can you dynamically allocate the buffer instead?
+static unsigned char *pmem_buf = mem_buf; +static int mem_byte_cnt;
s/mem_byte_cnt/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'} };
Please fix whitespace.
+#define ENDIANNESS ((char)endian_test.l)
+static void generate_pbl_cmd(void) +{
- unsigned int val = uboot_label;
s/unsigned int/uint32_t/
- uboot_label += 0x40;
- int i;
- for (i = 3; i >= 0; i--) {
*pmem_buf++ = (val >> (i * 8)) & 0xff;
mem_byte_cnt++;
- }
+}
+static void pbl_fget(size_t size, FILE *stream) +{
- unsigned char c;
- while (size) {
c = (unsigned char)fgetc(stream);
Check for fgetc() returning EOF before converting to unsigned char.
+/* load splited u-boot with PBI command 81xxxxxx. */
s/splited/split/
+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);
Why do you need to tokenize if you're using getline()?
+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, unsigned int len) +{
- unsigned int crc32_val = 0xffffffff;
- unsigned int 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;
+}
Is this the standard CRC32 function (which we should be able to pull in from elsewhere instead of reimplementing here) or is it something different (which deserves a comment)?
+static unsigned int reverse_byte(unsigned int val) +{
- unsigned int 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) +{
- unsigned int pbl_end_cmd[4] = {0x09138000, 0x00000000,
0x091380c0, 0x00000000};
s/unsigned int/uint32_t/
- unsigned int 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]);
- }
Can you use htonl() or similar, to avoid the endian test? Or have a function to write out a 32-bit word by bytes, similar to what you open-code in generate_pbl_cmd().
- for (i = 0; i < 16; i++) {
*pmem_buf++ = *p++;
mem_byte_cnt++;
- }
memcpy()?
- if (((mem_byte_cnt) % 16) != 0) {
Unnecessary parentheses.
for (i = 0; i < 8; i++) {
*pmem_buf++ = 0x0;
mem_byte_cnt++;
}
- }
- if ((mem_byte_cnt % 16 != 0)) {
printf("Error: Bad size of image file\n");
exit(EXIT_FAILURE);
- }
+}
No blank line at end of block.
diff --git a/tools/pblimage.h b/tools/pblimage.h new file mode 100644 index 0000000..887d4c9 --- /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_
s/_PBLIMAGE_H_/PBLIMAGE_H/
Leading underscores are reserved to the C implementation when followed by an uppercase letter or another underscore, or when in file scope.
I know most of the other tools/ headers do this, but it's wrong.
-Scott

-----Original Message----- From: Wood Scott-B07421 Sent: Tuesday, June 05, 2012 8:33 AM To: Xie Shaohui-B21989 Cc: u-boot@lists.denx.de; Tabi Timur-B04825 Subject: Re: [U-Boot] [PATCH] powerpc/CoreNet: add tool to support pbl image build.
On 06/04/2012 03:57 AM, Shaohui Xie wrote:
From: Shaohui Xie b21989@freescale.com
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 b21989@freescale.com
rebased to lasted tree.
Makefile | 5 + board/freescale/corenet_ds/config.mk | 26 +++ board/freescale/corenet_ds/pblimage.cfg | 60 ++++++ common/image.c | 1 + doc/README.pblimage | 140 +++++++++++++ include/image.h | 1 + tools/Makefile | 2 + tools/mkimage.c | 5 + tools/mkimage.h | 2 + tools/pblimage.c | 329
+++++++++++++++++++++++++++++++
tools/pblimage.h | 36 ++++ 11 files changed, 607 insertions(+), 0 deletions(-) create mode 100644 board/freescale/corenet_ds/config.mk create mode 100644 board/freescale/corenet_ds/pblimage.cfg create mode 100644 doc/README.pblimage create mode 100644 tools/pblimage.c create mode 100644 tools/pblimage.h
diff --git a/Makefile b/Makefile index 57ad45b..99f993a 100644 --- a/Makefile +++ b/Makefile @@ -416,6 +416,10 @@ $(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_PBL_CONFIG) -T pblimage \
-d $< $@
$(obj)u-boot.sha1: $(obj)u-boot.bin $(obj)tools/ubsha1 $(obj)u-boot.bin
@@ -773,6 +777,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/config.mk b/board/freescale/corenet_ds/config.mk new file mode 100644 index 0000000..72464dc --- /dev/null +++ b/board/freescale/corenet_ds/config.mk @@ -0,0 +1,26 @@ +#
+#PBL preamble and RCW header +aa55aa55 010e0100 +#64 bytes RCW data for P4080, replace it when building image #for +P3041DS or P5020DS. +4c580000 00000000 18185218 0000cccc +40464000 3c3c2000 58000000 61000000 +00000000 00000000 00000000 008b6000 +00000000 00000000 00000000 00000000
Could you have the tool source this from a separate file, rather than require the user to replace it manually?
[Xie Shaohui] Then I have to prepare a separate file and a tool... It is quite simple to replace, just copy and paste, and users may need to modify the RCW when the default one does not fit their use case, they will always have to do it manually. It's simple to do it here.
Talk to Timur (when he gets back from vacation in a couple weeks) about his RCW tool and how best to accept the output it produces.
Why is eSPI in here? Isn't this supposed to just generically write an image into CPC SRAM?
[Xie Shaohui] No. some interfaces need to be pre-initialized before PBL start to load stuff from it, and default configurations for SPI is suitable, this tool provides a more compatible configurations.
diff --git a/doc/README.pblimage b/doc/README.pblimage new file mode 100644 index 0000000..73d90f1 --- /dev/null +++ b/doc/README.pblimage @@ -0,0 +1,140 @@
- 3). Boot from Nand
- Write u-boot.pbl to Nand from offset 0x0, Note that in case of eLBC
NAND
- flash, the address starts from the first good block.
- 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
How do you load the environment? We should find a way, possibly using SPL, to have the environment ready early. We do not want to wait post relocation for the full NAND/SD/SPI driver to load the environment.
[Xie Shaohui] This tool did not intend to provide a way to load the environment. The ENV thing should belong to the boot Image, this tool is a wrapper.
diff --git a/tools/mkimage.h b/tools/mkimage.h index 5fe1a48..a886305 100644 --- a/tools/mkimage.h +++ b/tools/mkimage.h @@ -147,6 +147,8 @@ void mkimage_register (struct image_type_params
*tparams);
- Supported image types init functions
*/ +void pbl_load_uboot(int, struct mkimage_params *);
Please provide names for parameters.
[Xie Shaohui] OK.
+/*
- PBL can load 64 bytes each time in MAX, so the u-boot need to be
+splited into
- pieces of 64 bytes, PBL needs a command for each piece, the
+command looks
- like 81xxxxxx, the "xxxxxx" is offset, it starts from F80000 in our
case.
- */
Better wording:
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.
[Xie Shaohui] OK. Thanks.
Why are we hardcoding 0xf80000? Where does it come from?
[Xie Shaohui] it's from CONFIG_SYS_TEXT_BASE. I hardcoded it for simple coding.
+static unsigned int uboot_label = 0x81F80000;
I'm not sure that label is the right word here. Maybe "next_pbl_cmd"?
[Xie Shaohui] Right. "next_pbl_cmd" is better.
+/*
- 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];
600000 is arbitrary. Do you have any checking if the image size exceeds this? Can you dynamically allocate the buffer instead?
[Xie Shaohui] Actually, I thought of dynamically allocate the buffer at beginning, but I found at least I need to allocate a buffer to store the parsed result of the configure file, but we won't know the size until we parsed the file, so I decided to use an arbitrary size, I thought 600k is big enough.
+static unsigned char *pmem_buf = mem_buf; static int mem_byte_cnt;
s/mem_byte_cnt/pbl_size/
[Xie Shaohui] OK.
+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'} };
Please fix whitespace.
[Xie Shaohui] OK. Thanks. I did not find it when using checkpatch.pl
+#define ENDIANNESS ((char)endian_test.l)
+static void generate_pbl_cmd(void) +{
- unsigned int val = uboot_label;
s/unsigned int/uint32_t/
[Xie Shaohui] OK.
- uboot_label += 0x40;
- int i;
- for (i = 3; i >= 0; i--) {
*pmem_buf++ = (val >> (i * 8)) & 0xff;
mem_byte_cnt++;
- }
+}
+static void pbl_fget(size_t size, FILE *stream) {
- unsigned char c;
- while (size) {
c = (unsigned char)fgetc(stream);
Check for fgetc() returning EOF before converting to unsigned char.
[Xie Shaohui] OK.
+/* load splited u-boot with PBI command 81xxxxxx. */
s/splited/split/
[Xie Shaohui] OK.
+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);
Why do you need to tokenize if you're using getline()?
[Xie Shaohui] I need to drop empty lines.
+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, unsigned +int len) {
- unsigned int crc32_val = 0xffffffff;
- unsigned int 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;
+}
Is this the standard CRC32 function (which we should be able to pull in from elsewhere instead of reimplementing here) or is it something different (which deserves a comment)?
[Xie Shaohui] This not standard CRC32 function, I tried use the one which u-boot provides, but it did not work with PBL, PBL uses a different algorithm. I've indicated it in make_crc_table() above.
+static unsigned int reverse_byte(unsigned int val) {
- unsigned int 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) {
- unsigned int pbl_end_cmd[4] = {0x09138000, 0x00000000,
0x091380c0, 0x00000000};
s/unsigned int/uint32_t/
[Xie Shaohui] OK.
- unsigned int 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]);
- }
Can you use htonl() or similar, to avoid the endian test? Or have a function to write out a 32-bit word by bytes, similar to what you open- code in generate_pbl_cmd().
[Xie Shaohui] OK. I'll have a try.
- for (i = 0; i < 16; i++) {
*pmem_buf++ = *p++;
mem_byte_cnt++;
- }
memcpy()?
[Xie Shaohui] memcpy() works here, but also need to move pointer of *pmem_buf and calculate the mem_byte_cnt. So I used this one straight.
- if (((mem_byte_cnt) % 16) != 0) {
Unnecessary parentheses.
[Xie Shaohui] OK.
for (i = 0; i < 8; i++) {
*pmem_buf++ = 0x0;
mem_byte_cnt++;
}
- }
- if ((mem_byte_cnt % 16 != 0)) {
printf("Error: Bad size of image file\n");
exit(EXIT_FAILURE);
- }
+}
No blank line at end of block.
[Xie Shaohui] OK.
diff --git a/tools/pblimage.h b/tools/pblimage.h new file mode 100644 index 0000000..887d4c9 --- /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_
s/_PBLIMAGE_H_/PBLIMAGE_H/
Leading underscores are reserved to the C implementation when followed by an uppercase letter or another underscore, or when in file scope.
I know most of the other tools/ headers do this, but it's wrong.
[Xie Shaohui] OK. Thanks for reviewing this patch.
Best Regards, Shaohui Xie

On 06/05/2012 12:35 AM, Xie Shaohui-B21989 wrote:
+++ b/board/freescale/corenet_ds/config.mk @@ -0,0 +1,26 @@ +#
+#PBL preamble and RCW header +aa55aa55 010e0100 +#64 bytes RCW data for P4080, replace it when building image #for +P3041DS or P5020DS. +4c580000 00000000 18185218 0000cccc +40464000 3c3c2000 58000000 61000000 +00000000 00000000 00000000 008b6000 +00000000 00000000 00000000 00000000
Could you have the tool source this from a separate file, rather than require the user to replace it manually?
[Xie Shaohui] Then I have to prepare a separate file and a tool... It is quite simple to replace, just copy and paste, and users may need to modify the RCW when the default one does not fit their use case, they will always have to do it manually. It's simple to do it here.
I disagree that copy and paste is good enough, though taking an external RCW source (such as output from Timur's tool) could be a future enhancement.
Talk to Timur (when he gets back from vacation in a couple weeks) about his RCW tool and how best to accept the output it produces.
Why is eSPI in here? Isn't this supposed to just generically write an image into CPC SRAM?
[Xie Shaohui] No. some interfaces need to be pre-initialized before PBL start to load stuff from it, and default configurations for SPI is suitable, this tool provides a more compatible configurations.
What do you mean by a more compatible configuration? If the default is good enough to load the first few PBL commands, why is it not goot enough to load the rest?
diff --git a/doc/README.pblimage b/doc/README.pblimage new file mode 100644 index 0000000..73d90f1 --- /dev/null +++ b/doc/README.pblimage @@ -0,0 +1,140 @@
- 3). Boot from Nand
- Write u-boot.pbl to Nand from offset 0x0, Note that in case of eLBC
NAND
- flash, the address starts from the first good block.
- 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
How do you load the environment? We should find a way, possibly using SPL, to have the environment ready early. We do not want to wait post relocation for the full NAND/SD/SPI driver to load the environment.
[Xie Shaohui] This tool did not intend to provide a way to load the environment. The ENV thing should belong to the boot Image, this tool is a wrapper.
This isn't a comment on this tool specifically, but rather on this method of booting. This is a problem that needs to be solved.
Please fix whitespace.
[Xie Shaohui] OK. Thanks. I did not find it when using checkpatch.pl
No tool can find every possible error.
- while ((getline(&line, &len, fd)) > 0) {
lineno++;
token = strtok_r(line, "\r\n", &saveptr1);
Why do you need to tokenize if you're using getline()?
[Xie Shaohui] I need to drop empty lines.
strtok is a bit heavy handed for that, but whatever...
-Scott

-----Original Message----- From: Wood Scott-B07421 Sent: Wednesday, June 06, 2012 2:14 AM To: Xie Shaohui-B21989 Cc: Wood Scott-B07421; u-boot@lists.denx.de; Tabi Timur-B04825 Subject: Re: [U-Boot] [PATCH] powerpc/CoreNet: add tool to support pbl image build.
On 06/05/2012 12:35 AM, Xie Shaohui-B21989 wrote:
+++ b/board/freescale/corenet_ds/config.mk @@ -0,0 +1,26 @@ +#
+#PBL preamble and RCW header +aa55aa55 010e0100 +#64 bytes RCW data for P4080, replace it when building image #for +P3041DS or P5020DS. +4c580000 00000000 18185218 0000cccc 40464000 3c3c2000 58000000 +61000000 00000000 00000000 00000000 008b6000 00000000 00000000 +00000000 00000000
Could you have the tool source this from a separate file, rather than require the user to replace it manually?
[Xie Shaohui] Then I have to prepare a separate file and a tool... It is quite simple to replace, just copy and paste, and users may need to modify the RCW when the default one does not fit their use case, they will always have to do it manually. It's simple to do it here.
I disagree that copy and paste is good enough, though taking an external RCW source (such as output from Timur's tool) could be a future enhancement.
[Xie Shaohui] OK. Suppose we got the output from Timur's tool, what should we do for the input if we need to change the RCW? Can Timur's tool do it automatically, or by some arguments provided? And even though, there will be two files for configuration, one is RCW output from Timur's tool, and another is PBI commands. This is too much for the tool; it has only one entry for configuration file.
Talk to Timur (when he gets back from vacation in a couple weeks) about his RCW tool and how best to accept the output it produces.
Why is eSPI in here? Isn't this supposed to just generically write an image into CPC SRAM?
[Xie Shaohui] No. some interfaces need to be pre-initialized before PBL start to load stuff from it, and default configurations for SPI is suitable, this tool provides a more compatible configurations.
What do you mean by a more compatible configuration? If the default is good enough to load the first few PBL commands, why is it not goot enough to load the rest?
[Xie Shaohui] the default configurations for SPI is too slow, it will take more than half minutes to finish the loading.
diff --git a/doc/README.pblimage b/doc/README.pblimage new file mode 100644 index 0000000..73d90f1 --- /dev/null +++ b/doc/README.pblimage @@ -0,0 +1,140 @@
- 3). Boot from Nand
- Write u-boot.pbl to Nand from offset 0x0, Note that in case of
+eLBC
NAND
- flash, the address starts from the first good block.
- 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
How do you load the environment? We should find a way, possibly using SPL, to have the environment ready early. We do not want to wait post relocation for the full NAND/SD/SPI driver to load the
environment.
[Xie Shaohui] This tool did not intend to provide a way to load the environment. The ENV thing should belong to the boot Image, this tool is a wrapper.
This isn't a comment on this tool specifically, but rather on this method of booting. This is a problem that needs to be solved.
[Xie Shaohui] OK. This is will be a new work.
Best Regards, Shaohui Xie

On 06/05/2012 09:45 PM, Xie Shaohui-B21989 wrote:
-----Original Message----- From: Wood Scott-B07421 Sent: Wednesday, June 06, 2012 2:14 AM To: Xie Shaohui-B21989 Cc: Wood Scott-B07421; u-boot@lists.denx.de; Tabi Timur-B04825 Subject: Re: [U-Boot] [PATCH] powerpc/CoreNet: add tool to support pbl image build.
On 06/05/2012 12:35 AM, Xie Shaohui-B21989 wrote:
+++ b/board/freescale/corenet_ds/config.mk @@ -0,0 +1,26 @@ +#
+#PBL preamble and RCW header +aa55aa55 010e0100 +#64 bytes RCW data for P4080, replace it when building image #for +P3041DS or P5020DS. +4c580000 00000000 18185218 0000cccc 40464000 3c3c2000 58000000 +61000000 00000000 00000000 00000000 008b6000 00000000 00000000 +00000000 00000000
Could you have the tool source this from a separate file, rather than require the user to replace it manually?
[Xie Shaohui] Then I have to prepare a separate file and a tool... It is quite simple to replace, just copy and paste, and users may need to modify the RCW when the default one does not fit their use case, they will always have to do it manually. It's simple to do it here.
I disagree that copy and paste is good enough, though taking an external RCW source (such as output from Timur's tool) could be a future enhancement.
[Xie Shaohui] OK. Suppose we got the output from Timur's tool, what should we do for the input if we need to change the RCW?
You change the input to Timur's tool -- that's what it's for. It compiles a textual description of the RCW settings into a PBL image.
Can Timur's tool do it automatically, or by some arguments provided? And even though, there will be two files for configuration, one is RCW output from Timur's tool, and another is PBI commands. This is too much for the tool; it has only one entry for configuration file.
Too much for which tool, and why can't that be changed?
Talk to Timur (when he gets back from vacation in a couple weeks) about his RCW tool and how best to accept the output it produces.
Why is eSPI in here? Isn't this supposed to just generically write an image into CPC SRAM?
[Xie Shaohui] No. some interfaces need to be pre-initialized before PBL start to load stuff from it, and default configurations for SPI is suitable, this tool provides a more compatible configurations.
What do you mean by a more compatible configuration? If the default is good enough to load the first few PBL commands, why is it not goot enough to load the rest?
[Xie Shaohui] the default configurations for SPI is too slow, it will take more than half minutes to finish the loading.
Please add a comment describing what you're doing to the SPI controller and why. Are there any situations where the faster speed you're programming won't work?
-Scott

-----Original Message----- From: Wood Scott-B07421 Sent: Thursday, June 07, 2012 2:19 AM To: Xie Shaohui-B21989 Cc: Wood Scott-B07421; u-boot@lists.denx.de; Tabi Timur-B04825 Subject: Re: [U-Boot] [PATCH] powerpc/CoreNet: add tool to support pbl image build.
On 06/05/2012 09:45 PM, Xie Shaohui-B21989 wrote:
-----Original Message----- From: Wood Scott-B07421 Sent: Wednesday, June 06, 2012 2:14 AM To: Xie Shaohui-B21989 Cc: Wood Scott-B07421; u-boot@lists.denx.de; Tabi Timur-B04825 Subject: Re: [U-Boot] [PATCH] powerpc/CoreNet: add tool to support pbl image build.
On 06/05/2012 12:35 AM, Xie Shaohui-B21989 wrote:
+++ b/board/freescale/corenet_ds/config.mk @@ -0,0 +1,26 @@ +#
+#PBL preamble and RCW header +aa55aa55 010e0100 +#64 bytes RCW data for P4080, replace it when building image #for +P3041DS or P5020DS. +4c580000 00000000 18185218 0000cccc 40464000 3c3c2000 58000000 +61000000 00000000 00000000 00000000 008b6000 00000000 00000000 +00000000 00000000
Could you have the tool source this from a separate file, rather than require the user to replace it manually?
[Xie Shaohui] Then I have to prepare a separate file and a tool... It is quite simple to replace, just copy and paste, and users may need to modify the RCW when the default one does not fit their use case, they will always have to do it manually. It's simple to do it
here.
I disagree that copy and paste is good enough, though taking an external RCW source (such as output from Timur's tool) could be a future enhancement.
[Xie Shaohui] OK. Suppose we got the output from Timur's tool, what should we do for the input if we need to change the RCW?
You change the input to Timur's tool -- that's what it's for. It compiles a textual description of the RCW settings into a PBL image.
Can Timur's tool do it automatically, or by some arguments provided? And even though, there will be two files for configuration, one is RCW output from Timur's tool, and another is PBI commands. This is too much for the tool; it has only one entry for configuration file.
Too much for which tool, and why can't that be changed?
[Xie Shaohui] The mkimage structure provides one entry to indicate the configuration file, is it OK to add a more entry just for PBL?
Talk to Timur (when he gets back from vacation in a couple weeks) about his RCW tool and how best to accept the output it produces.
Why is eSPI in here? Isn't this supposed to just generically write an image into CPC SRAM?
[Xie Shaohui] No. some interfaces need to be pre-initialized before PBL start to load stuff from it, and default configurations for SPI is suitable, this tool provides a more compatible configurations.
What do you mean by a more compatible configuration? If the default is good enough to load the first few PBL commands, why is it not goot enough to load the rest?
[Xie Shaohui] the default configurations for SPI is too slow, it will take more than half minutes to finish the loading.
Please add a comment describing what you're doing to the SPI controller and why. Are there any situations where the faster speed you're programming won't work?
[Xie Shaohui] OK. Will add a comment in new version. The configuration for SPI is same as the one used in u-boot, so I think it's OK for PBL.
Best Regards, Shaohui Xie

On 06/06/2012 10:16 PM, Xie Shaohui-B21989 wrote:
-----Original Message----- From: Wood Scott-B07421 Sent: Thursday, June 07, 2012 2:19 AM To: Xie Shaohui-B21989 Cc: Wood Scott-B07421; u-boot@lists.denx.de; Tabi Timur-B04825 Subject: Re: [U-Boot] [PATCH] powerpc/CoreNet: add tool to support pbl image build.
On 06/05/2012 09:45 PM, Xie Shaohui-B21989 wrote:
Can Timur's tool do it automatically, or by some arguments provided? And even though, there will be two files for configuration, one is RCW output from Timur's tool, and another is PBI commands. This is too much for the tool; it has only one entry for configuration file.
Too much for which tool, and why can't that be changed?
[Xie Shaohui] The mkimage structure provides one entry to indicate the configuration file, is it OK to add a more entry just for PBL?
I don't see why not.
-Scott

On 06/06/2012 10:16 PM, Xie Shaohui-B21989 wrote:
-----Original Message----- From: Wood Scott-B07421 Sent: Thursday, June 07, 2012 2:19 AM To: Xie Shaohui-B21989 Cc: Wood Scott-B07421; u-boot@lists.denx.de; Tabi Timur-B04825 Subject: Re: [U-Boot] [PATCH] powerpc/CoreNet: add tool to support pbl image build.
On 06/05/2012 09:45 PM, Xie Shaohui-B21989 wrote:
Can Timur's tool do it automatically, or by some arguments provided? And even though, there will be two files for configuration, one is RCW output from Timur's tool, and another is PBI commands. This is too much for the tool; it has only one entry for configuration file.
Too much for which tool, and why can't that be changed?
[Xie Shaohui] The mkimage structure provides one entry to indicate the configuration file, is it OK to add a more entry just for PBL?
I don't see why not.
[Xie Shaohui] OK. Then I'll split the current configuration file in two, one is for RCW, another is for PBI commands. Also, add one more entry for the second configuration file. But as you know, Timur's tool is not in open source now, I can only use a default RCW file for now.
I have two questions: 1. Is there a plan that we submit Timur' tool to open source? 2. If yes, should I combine Timur's tool with my tool or I just tell user They should use Timur's tool to produce the RCW and then use it in my tool?
Best Regards, Shaohui Xie

On 06/07/2012 09:55 PM, Xie Shaohui-B21989 wrote:
On 06/06/2012 10:16 PM, Xie Shaohui-B21989 wrote:
-----Original Message----- From: Wood Scott-B07421 Sent: Thursday, June 07, 2012 2:19 AM To: Xie Shaohui-B21989 Cc: Wood Scott-B07421; u-boot@lists.denx.de; Tabi Timur-B04825 Subject: Re: [U-Boot] [PATCH] powerpc/CoreNet: add tool to support pbl image build.
On 06/05/2012 09:45 PM, Xie Shaohui-B21989 wrote:
Can Timur's tool do it automatically, or by some arguments provided? And even though, there will be two files for configuration, one is RCW output from Timur's tool, and another is PBI commands. This is too much for the tool; it has only one entry for configuration file.
Too much for which tool, and why can't that be changed?
[Xie Shaohui] The mkimage structure provides one entry to indicate the configuration file, is it OK to add a more entry just for PBL?
I don't see why not.
[Xie Shaohui] OK. Then I'll split the current configuration file in two, one is for RCW, another is for PBI commands. Also, add one more entry for the second configuration file. But as you know, Timur's tool is not in open source now, I can only use a default RCW file for now.
I have two questions:
- Is there a plan that we submit Timur' tool to open source?
I hope so. If not, the RCW will have to be provided directly as a hexdump/binary/etc.
- If yes, should I combine Timur's tool with my tool or I just tell user
They should use Timur's tool to produce the RCW and then use it in my tool?
They should be separate, since there are situations where you just want the RCW and not the PBL image loading -- but it should all be an automatic part of the U-Boot bulid process for targets that require it.
-Scott

On Jun 8, 2012, at 6:09 PM, "Wood Scott-B07421" B07421@freescale.com wrote:
I have two questions:
- Is there a plan that we submit Timur' tool to open source?
I hope so. If not, the RCW will have to be provided directly as a hexdump/binary/etc.
Where do you think my compiler should go?
- If yes, should I combine Timur's tool with my tool or I just tell user
They should use Timur's tool to produce the RCW and then use it in my tool?
They should be separate, since there are situations where you just want the RCW and not the PBL image loading -- but it should all be an automatic part of the U-Boot bulid process for targets that require it.
I can add a parameter or command to embed a pbl image into an rcw binary during the compilation.
-Scott

On 06/12/2012 12:42 PM, Tabi Timur-B04825 wrote:
On Jun 8, 2012, at 6:09 PM, "Wood Scott-B07421" B07421@freescale.com wrote:
I have two questions:
- Is there a plan that we submit Timur' tool to open source?
I hope so. If not, the RCW will have to be provided directly as a hexdump/binary/etc.
Where do you think my compiler should go?
tools/
- If yes, should I combine Timur's tool with my tool or I just tell user
They should use Timur's tool to produce the RCW and then use it in my tool?
They should be separate, since there are situations where you just want the RCW and not the PBL image loading -- but it should all be an automatic part of the U-Boot bulid process for targets that require it.
I can add a parameter or command to embed a pbl image into an rcw binary during the compilation.
You mean to replace this tool? There are other PBL things that may need to be done, such as reconfiguring the SPI speed so it doesn't take forever to read out the rest of the PBL image.
-Scott

On Jun 12, 2012, at 7:54 PM, "Wood Scott-B07421" B07421@freescale.com wrote:
You mean to replace this tool? There are other PBL things that may need to be done, such as reconfiguring the SPI speed so it doesn't take forever to read out the rest of the PBL image.
My tool builds and RCW image. I could change it so that it also understands the PBL language, but that's not trivial. For now, it would be easy to add a feature to only embed the PBL binary into the RCW binary.
-Scott
participants (4)
-
Scott Wood
-
Shaohui Xie
-
Tabi Timur-B04825
-
Xie Shaohui-B21989