]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
rockchip: Add support for the SD image
authorSimon Glass <sjg@chromium.org>
Sun, 30 Aug 2015 22:55:25 +0000 (16:55 -0600)
committerSimon Glass <sjg@chromium.org>
Thu, 3 Sep 2015 03:28:23 +0000 (21:28 -0600)
The Rockchip boot ROM requires a particular file format. It consists of
64KB of zeroes, a 512-byte header encoded with RC4, and then some executable
code.

Add support to mkimage so that an SPL image (u-boot-spl-dtb.bin) can be
converted to this format.

Signed-off-by: Simon Glass <sjg@chromium.org>
common/image.c
include/image.h
tools/Makefile
tools/rksd.c [new file with mode: 0644]

index cf2806f9831894797d0fe0c80a1fd91c06358d2d..2cdc728e229a4132a01c6f47f88e51c92f048369 100644 (file)
@@ -156,6 +156,7 @@ static const table_entry_t uimage_type[] = {
        {       IH_TYPE_X86_SETUP,  "x86_setup",  "x86 setup.bin",    },
        {       IH_TYPE_LPC32XXIMAGE, "lpc32xximage",  "LPC32XX Boot Image", },
        {       IH_TYPE_RKIMAGE,    "rkimage",    "Rockchip Boot Image" },
+       {       IH_TYPE_RKSD,       "rksd",       "Rockchip SD Boot Image" },
        {       -1,                 "",           "",                   },
 };
 
index 2daa74aa38c667b9f7433bd15be7f2a730f7f453..ea16205ef750e5a0ccce1a4a5af4bf6b74674a46 100644 (file)
@@ -246,8 +246,9 @@ struct lmb;
 #define IH_TYPE_LPC32XXIMAGE   21      /* x86 setup.bin Image          */
 #define IH_TYPE_LOADABLE       22      /* A list of typeless images    */
 #define IH_TYPE_RKIMAGE                23      /* Rockchip Boot Image          */
+#define IH_TYPE_RKSD           24      /* Rockchip SD card             */
 
-#define IH_TYPE_COUNT          24      /* Number of image types */
+#define IH_TYPE_COUNT          25      /* Number of image types */
 
 /*
  * Compression Types
index 267f55c93396335deb5613b4b661fca6a8ad10d0..9082bda219fc6d93d05637a7fc7959d3681518cf 100644 (file)
@@ -64,7 +64,7 @@ RSA_OBJS-$(CONFIG_FIT_SIGNATURE) := $(addprefix lib/rsa/, \
                                        rsa-sign.o rsa-verify.o rsa-checksum.o \
                                        rsa-mod-exp.o)
 
-ROCKCHIP_OBS = lib/rc4.o rkcommon.o rkimage.o
+ROCKCHIP_OBS = lib/rc4.o rkcommon.o rkimage.o rksd.o
 
 # common objs for dumpimage and mkimage
 dumpimage-mkimage-objs := aisimage.o \
diff --git a/tools/rksd.c b/tools/rksd.c
new file mode 100644 (file)
index 0000000..2efcd68
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * (C) Copyright 2015 Google,  Inc
+ * Written by Simon Glass <sjg@chromium.org>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ *
+ * See README.rockchip for details of the rksd format
+ */
+
+#include "imagetool.h"
+#include <image.h>
+#include <rc4.h>
+#include "mkimage.h"
+#include "rkcommon.h"
+
+enum {
+       RKSD_HEADER0_START      = 64 * RK_BLK_SIZE,
+       RKSD_SPL_HDR_START      = RKSD_HEADER0_START +
+                                       RK_CODE1_OFFSET * RK_BLK_SIZE,
+       RKSD_SPL_START          = RKSD_SPL_HDR_START + 4,
+       RKSD_HEADER_LEN         = RKSD_SPL_START,
+};
+
+static char dummy_hdr[RKSD_HEADER_LEN];
+
+static int rksd_check_params(struct image_tool_params *params)
+{
+       return 0;
+}
+
+static int rksd_verify_header(unsigned char *buf,  int size,
+                                struct image_tool_params *params)
+{
+       return 0;
+}
+
+static void rksd_print_header(const void *buf)
+{
+}
+
+static void rksd_set_header(void *buf,  struct stat *sbuf,  int ifd,
+                              struct image_tool_params *params)
+{
+       unsigned int size;
+       int ret;
+
+       /* Zero the whole header. The first 32KB is empty */
+       memset(buf,  '\0',  RKSD_HEADER0_START);
+
+       size = params->file_size - RKSD_SPL_HDR_START;
+       ret = rkcommon_set_header(buf + RKSD_HEADER0_START, size);
+       if (ret) {
+               /* TODO(sjg@chromium.org): This method should return an error */
+               printf("Warning: SPL image is too large (size %#x) and will not boot\n",
+                      size);
+       }
+
+       memcpy(buf + RKSD_SPL_HDR_START, "RK32", 4);
+}
+
+static int rksd_extract_subimage(void *buf,  struct image_tool_params *params)
+{
+       return 0;
+}
+
+static int rksd_check_image_type(uint8_t type)
+{
+       if (type == IH_TYPE_RKSD)
+               return EXIT_SUCCESS;
+       else
+               return EXIT_FAILURE;
+}
+
+/* We pad the file out to a fixed size - this method returns that size */
+static int rksd_vrec_header(struct image_tool_params *params,
+                           struct image_type_params *tparams)
+{
+       int pad_size;
+
+       pad_size = RKSD_SPL_HDR_START + RK_MAX_CODE1_SIZE;
+       debug("pad_size %x\n", pad_size);
+
+       return pad_size - params->file_size;
+}
+
+/*
+ * rk_sd parameters
+ */
+U_BOOT_IMAGE_TYPE(
+       rksd,
+       "Rockchip SD Boot Image support",
+       RKSD_HEADER_LEN,
+       dummy_hdr,
+       rksd_check_params,
+       rksd_verify_header,
+       rksd_print_header,
+       rksd_set_header,
+       rksd_extract_subimage,
+       rksd_check_image_type,
+       NULL,
+       rksd_vrec_header
+);