From patchwork Fri Jan 16 07:19:19 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Albert ARIBAUD (3ADEV)" X-Patchwork-Id: 429752 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 5108B1401DA for ; Fri, 16 Jan 2015 18:38:09 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 63F8F4B67F; Fri, 16 Jan 2015 08:37:45 +0100 (CET) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id I6p+7QGcbYcg; Fri, 16 Jan 2015 08:37:45 +0100 (CET) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id DC0824B616; Fri, 16 Jan 2015 08:37:16 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 2F07C4B616 for ; Fri, 16 Jan 2015 08:20:48 +0100 (CET) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id TaZoCUES3q3X for ; Fri, 16 Jan 2015 08:20:48 +0100 (CET) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from smtp2-g21.free.fr (smtp2-g21.free.fr [212.27.42.2]) by theia.denx.de (Postfix) with ESMTPS id A79424B615 for ; Fri, 16 Jan 2015 08:20:47 +0100 (CET) Received: from localhost.localdomain (unknown [IPv6:2a01:e35:2eb9:21:d504:b12c:7b53:5149]) (Authenticated sender: aribaud.smtp) by smtp2-g21.free.fr (Postfix) with ESMTPSA id 9698C4B0267; Fri, 16 Jan 2015 08:18:15 +0100 (CET) From: "Albert ARIBAUD (3ADEV)" To: u-boot@lists.denx.de Date: Fri, 16 Jan 2015 08:19:19 +0100 Message-Id: <1421392760-21810-8-git-send-email-albert.aribaud@3adev.fr> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1421392760-21810-7-git-send-email-albert.aribaud@3adev.fr> References: <1421392760-21810-1-git-send-email-albert.aribaud@3adev.fr> <1421392760-21810-2-git-send-email-albert.aribaud@3adev.fr> <1421392760-21810-3-git-send-email-albert.aribaud@3adev.fr> <1421392760-21810-4-git-send-email-albert.aribaud@3adev.fr> <1421392760-21810-5-git-send-email-albert.aribaud@3adev.fr> <1421392760-21810-6-git-send-email-albert.aribaud@3adev.fr> <1421392760-21810-7-git-send-email-albert.aribaud@3adev.fr> X-Mailman-Approved-At: Fri, 16 Jan 2015 08:37:02 +0100 Cc: Marek Vasut , Stefan Roese , =?UTF-8?q?Henrik=20Nordstr=C3=B6m?= , "Albert ARIBAUD \(3ADEV\)" , Ian Campbell Subject: [U-Boot] [PATCH v1 7/8] lpc32xx: add lpc32xx-spl.bin boot image target X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.13 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: u-boot-bounces@lists.denx.de Errors-To: u-boot-bounces@lists.denx.de Signed-off-by: Albert ARIBAUD (3ADEV) --- Makefile | 3 + scripts/Makefile.spl | 11 ++++ tools/.gitignore | 1 + tools/Makefile | 2 + tools/mklpc32xxboot.c | 169 ++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 186 insertions(+) create mode 100644 tools/mklpc32xxboot.c diff --git a/Makefile b/Makefile index 36a9a28..f5c9da5 100644 --- a/Makefile +++ b/Makefile @@ -1198,6 +1198,9 @@ spl/u-boot-spl: tools prepare spl/sunxi-spl.bin: spl/u-boot-spl @: +spl/lpc32xx-spl.bin: spl/u-boot-spl + @: + tpl/u-boot-tpl.bin: tools prepare $(Q)$(MAKE) obj=tpl -f $(srctree)/scripts/Makefile.spl all diff --git a/scripts/Makefile.spl b/scripts/Makefile.spl index ecf3037..4020383 100644 --- a/scripts/Makefile.spl +++ b/scripts/Makefile.spl @@ -158,6 +158,10 @@ ALL-y += $(obj)/sunxi-spl.bin endif endif +ifdef CONFIG_LPC32XX_SPL +ALL-y += $(obj)/lpc32xx-spl.bin +endif + ifeq ($(CONFIG_SYS_SOC),"at91") ALL-y += boot.bin endif @@ -196,6 +200,13 @@ $(obj)/sunxi-spl.bin: $(obj)/$(SPL_BIN).bin $(call if_changed,mksunxiboot) endif +ifdef CONFIG_LPC32XX_SPL +quiet_cmd_mklpc32xxboot = MKLPC32XX $@ +cmd_mklpc32xxboot = $(objtree)/tools/mklpc32xxboot $< $@ +$(obj)/lpc32xx-spl.bin: $(obj)/$(SPL_BIN).bin + $(call if_changed,mklpc32xxboot) +endif + quiet_cmd_u-boot-spl = LD $@ cmd_u-boot-spl = (cd $(obj) && $(LD) $(LDFLAGS) $(LDFLAGS_$(@F)) \ $(patsubst $(obj)/%,%,$(u-boot-spl-init)) --start-group \ diff --git a/tools/.gitignore b/tools/.gitignore index 9bc9fec..79a5d75 100644 --- a/tools/.gitignore +++ b/tools/.gitignore @@ -11,6 +11,7 @@ /mkenvimage /mkimage /mkexynosspl +/mklpc32xxboot /mpc86x_clk /mxsboot /mksunxiboot diff --git a/tools/Makefile b/tools/Makefile index e549f8e..6fe21b0 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -135,6 +135,8 @@ HOSTCFLAGS_mxsboot.o := -pedantic hostprogs-$(CONFIG_SUNXI) += mksunxiboot +hostprogs-$(CONFIG_LPC32XX_SPL) += mklpc32xxboot + hostprogs-$(CONFIG_NETCONSOLE) += ncb hostprogs-$(CONFIG_SHA1_CHECK_UB_IMG) += ubsha1 diff --git a/tools/mklpc32xxboot.c b/tools/mklpc32xxboot.c new file mode 100644 index 0000000..9f7d72e --- /dev/null +++ b/tools/mklpc32xxboot.c @@ -0,0 +1,169 @@ +/* + * LPC32XX NAND boot image generator + * + * For details on NAND boot, see LPC32XX UM chapter 35 (boot process) + * + * (C) Copyright 2014 DENX Software Engineering GmbH + * Written-by: Albert ARIBAUD + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * NAND page 0 boot header + */ + +struct nand_page_0_boot_header { + uint32_t data[129]; + uint32_t pad[383]; +}; + +/* + * Default ICC (interface configuration data [sic]) if none specified + * in board config + */ + +#ifndef LPC32XX_BOOT_ICR +#define LPC32XX_BOOT_ICR 0x00000096 +#endif + +/* + * Default boot NAND page size if none specified in board config + */ + +#ifndef LPC32XX_BOOT_NAND_PAGESIZE +#define LPC32XX_BOOT_NAND_PAGESIZE 2048 +#endif + +/* + * Default boot NAND pages per sector if none specified in board config + */ + +#ifndef LPC32XX_BOOT_NAND_PAGES_PER_SECTOR +#define LPC32XX_BOOT_NAND_PAGES_PER_SECTOR 64 +#endif + +/* + * Maximum size for boot code is 56K unless defined in board config + */ + +#ifndef LPC32XX_BOOT_CODESIZE +#define LPC32XX_BOOT_CODESIZE (56*1024) +#endif + +/* signature byte for a readable block */ + +#define LPC32XX_BOOT_BLOCK_OK 0xaa + +/* + * Output boot data for both sectors 0 and 1 + */ + +int main(int argc, char *argv[]) +{ + int fd_in, fd_out; + struct nand_page_0_boot_header header; + uint8_t page[LPC32XX_BOOT_NAND_PAGESIZE]; + unsigned file_size_b; + unsigned file_size_p; + int sectors_left, pages_left, bytes_left, bytes_read; + + if (argc < 2) { + printf("\tThis program takes an u-boot-spl.bin file " + "as input and produces an LPC32XX boot image.\n" + "\tUsage: %s input_file output_file\n", argv[0]); + return EXIT_FAILURE; + } + + fd_in = open(argv[1], O_RDONLY); + if (fd_in < 0) { + perror(argv[1]); + return 1; + } + + /* get input file size in bytes */ + file_size_b = lseek(fd_in, 0, SEEK_END); + + /* check maximum size */ + if (file_size_b > LPC32XX_BOOT_CODESIZE) { + fprintf(stderr, "ERROR: File too large!\n"); + return 2; + } + + /* turn filesize from bytes to NAND pages, page 0 included */ + file_size_p = ((file_size_b + (2 * LPC32XX_BOOT_NAND_PAGESIZE) - 1) + / LPC32XX_BOOT_NAND_PAGESIZE); + + /* fill header -- default byte value is 0x00, not 0xFF */ + memset(&header, 0, sizeof(header)); + header.data[0] = (header.data[2] = 0xff & LPC32XX_BOOT_ICR); + header.data[1] = (header.data[3] = 0xff & ~LPC32XX_BOOT_ICR); + header.data[4] = (header.data[6] = (header.data[8] + = (header.data[10] = 0xff & file_size_p))); + header.data[5] = (header.data[7] = (header.data[9] + = (header.data[11] = 0xff & ~file_size_p))); + header.data[12] = (header.data[128] = LPC32XX_BOOT_BLOCK_OK); + + /* open the boot file for writing */ + fd_out = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0666); + if (fd_out < 0) { + perror(argv[2]); + return 3; + } + + /* write sectors 0 then 1 */ + for (sectors_left = 2; sectors_left > 0; sectors_left--) { + /* write header */ + if (write(fd_out, &header, sizeof(header)) != sizeof(header)) { + perror(argv[2]); + return 4; + } + + /* write file, page-wise */ + bytes_left = file_size_b; + lseek(fd_in, 0, SEEK_SET); + while (bytes_left) { + bytes_read = sizeof(page); + if (bytes_read > bytes_left) + bytes_read = bytes_left; + memset(page, 0xFF, sizeof(page)); + if (read(fd_in, page, bytes_read) != bytes_read) { + perror(argv[1]); + return 5; + } + if (write(fd_out, page, sizeof(page)) + != sizeof(page)) { + perror(argv[2]); + return 6; + } + bytes_left -= bytes_read; + } + + /* pad with blank pages */ + memset(page, 0xFF, sizeof(page)); + /* fill sector minus header and SPL */ + pages_left = LPC32XX_BOOT_NAND_PAGES_PER_SECTOR + - file_size_p - 1; + while (pages_left) { + if (write(fd_out, page, sizeof(page)) + != sizeof(page)) { + perror(argv[2]); + return 7; + } + pages_left--; + } + } + + close(fd_in); + close(fd_out); + + return 0; +}