uboot/tools/rkcommon.c
<<
>>
Prefs
   1/*
   2 * (C) Copyright 2015 Google,  Inc
   3 * Written by Simon Glass <sjg@chromium.org>
   4 *
   5 * SPDX-License-Identifier:     GPL-2.0+
   6 *
   7 * Helper functions for Rockchip images
   8 */
   9
  10#include "imagetool.h"
  11#include <image.h>
  12#include <rc4.h>
  13#include "mkimage.h"
  14#include "rkcommon.h"
  15
  16enum {
  17        RK_SIGNATURE            = 0x0ff0aa55,
  18};
  19
  20/**
  21 * struct header0_info - header block for boot ROM
  22 *
  23 * This is stored at SD card block 64 (where each block is 512 bytes, or at
  24 * the start of SPI flash. It is encoded with RC4.
  25 *
  26 * @signature:          Signature (must be RKSD_SIGNATURE)
  27 * @disable_rc4:        0 to use rc4 for boot image,  1 to use plain binary
  28 * @init_offset:        Offset in blocks of the SPL code from this header
  29 *                      block. E.g. 4 means 2KB after the start of this header.
  30 * Other fields are not used by U-Boot
  31 */
  32struct header0_info {
  33        uint32_t signature;
  34        uint8_t reserved[4];
  35        uint32_t disable_rc4;
  36        uint16_t init_offset;
  37        uint8_t reserved1[492];
  38        uint16_t init_size;
  39        uint16_t init_boot_size;
  40        uint8_t reserved2[2];
  41};
  42
  43/**
  44 * struct spl_info - spl info for each chip
  45 *
  46 * @imagename:          Image name(passed by "mkimage -n")
  47 * @spl_hdr:            Boot ROM requires a 4-bytes spl header
  48 * @spl_size:           Spl size(include extra 4-bytes spl header)
  49 */
  50struct spl_info {
  51        const char *imagename;
  52        const char *spl_hdr;
  53        const uint32_t spl_size;
  54};
  55
  56static struct spl_info spl_infos[] = {
  57        { "rk3036", "RK30", 0x1000 },
  58        { "rk3288", "RK32", 0x8000 },
  59};
  60
  61static unsigned char rc4_key[16] = {
  62        124, 78, 3, 4, 85, 5, 9, 7,
  63        45, 44, 123, 56, 23, 13, 23, 17
  64};
  65
  66static struct spl_info *rkcommon_get_spl_info(char *imagename)
  67{
  68        int i;
  69
  70        for (i = 0; i < ARRAY_SIZE(spl_infos); i++)
  71                if (!strncmp(imagename, spl_infos[i].imagename, 6))
  72                        return spl_infos + i;
  73
  74        return NULL;
  75}
  76
  77int rkcommon_check_params(struct image_tool_params *params)
  78{
  79        int i;
  80
  81        if (rkcommon_get_spl_info(params->imagename) != NULL)
  82                return 0;
  83
  84        fprintf(stderr, "ERROR: imagename (%s) is not supported!\n",
  85                strlen(params->imagename) > 0 ? params->imagename : "NULL");
  86
  87        fprintf(stderr, "Available imagename:");
  88        for (i = 0; i < ARRAY_SIZE(spl_infos); i++)
  89                fprintf(stderr, "\t%s", spl_infos[i].imagename);
  90        fprintf(stderr, "\n");
  91
  92        return -1;
  93}
  94
  95const char *rkcommon_get_spl_hdr(struct image_tool_params *params)
  96{
  97        struct spl_info *info = rkcommon_get_spl_info(params->imagename);
  98
  99        /*
 100         * info would not be NULL, because of we checked params before.
 101         */
 102        return info->spl_hdr;
 103}
 104
 105int rkcommon_get_spl_size(struct image_tool_params *params)
 106{
 107        struct spl_info *info = rkcommon_get_spl_info(params->imagename);
 108
 109        /*
 110         * info would not be NULL, because of we checked params before.
 111         */
 112        return info->spl_size;
 113}
 114
 115int rkcommon_set_header(void *buf, uint file_size,
 116                        struct image_tool_params *params)
 117{
 118        struct header0_info *hdr;
 119
 120        if (file_size > rkcommon_get_spl_size(params))
 121                return -ENOSPC;
 122
 123        memset(buf,  '\0', RK_INIT_OFFSET * RK_BLK_SIZE);
 124        hdr = (struct header0_info *)buf;
 125        hdr->signature = RK_SIGNATURE;
 126        hdr->disable_rc4 = 1;
 127        hdr->init_offset = RK_INIT_OFFSET;
 128
 129        hdr->init_size = (file_size + RK_BLK_SIZE - 1) / RK_BLK_SIZE;
 130        hdr->init_size = (hdr->init_size + 3) & ~3;
 131        hdr->init_boot_size = hdr->init_size + RK_MAX_BOOT_SIZE / RK_BLK_SIZE;
 132
 133        rc4_encode(buf, RK_BLK_SIZE, rc4_key);
 134
 135        return 0;
 136}
 137