114 lines
2.5 KiB
C
114 lines
2.5 KiB
C
/*
|
|
* Copyright (c) 2017 Paweł Jarosz <paweljarosz3691@gmail.com>
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0+
|
|
*/
|
|
|
|
#include "imagetool.h"
|
|
#include <image.h>
|
|
#include <rc4.h>
|
|
#include "mkimage.h"
|
|
#include "rkcommon.h"
|
|
|
|
#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
|
|
|
|
enum {
|
|
RKNAND_SECT_LEN = RK_BLK_SIZE * 4,
|
|
};
|
|
|
|
struct rknand_info {
|
|
uint32_t pagesize;
|
|
uint32_t itersize;
|
|
uint32_t tplsplsize;
|
|
};
|
|
|
|
struct rknand_info ninfo;
|
|
|
|
static void rknand_set_header(void *buf, struct stat *sbuf, int ifd,
|
|
struct image_tool_params *params)
|
|
{
|
|
int sector;
|
|
unsigned int size;
|
|
|
|
size = params->orig_file_size;
|
|
|
|
rkcommon_set_header(buf, sbuf, ifd, params);
|
|
|
|
/*
|
|
* Spread the image out so we only use the first 2KB of each pagesize
|
|
* region. This is a feature of the NAND format required by the Rockchip
|
|
* boot ROM.
|
|
*/
|
|
if (params->vflag)
|
|
fprintf(stderr, "Spreading nand image from %u to %u\n",
|
|
size, params->file_size);
|
|
|
|
for (sector = ninfo.tplsplsize / ninfo.itersize - 1; sector >= 0;
|
|
sector--) {
|
|
memmove(buf + ninfo.pagesize + sector * ninfo.itersize,
|
|
buf + RK_SPL_HDR_START + sector * RKNAND_SECT_LEN,
|
|
RKNAND_SECT_LEN);
|
|
|
|
memset(buf + ninfo.pagesize + sector * ninfo.itersize +
|
|
RKNAND_SECT_LEN, 0xFF,
|
|
ninfo.itersize - RKNAND_SECT_LEN);
|
|
}
|
|
|
|
/* Fill up padded area of the header. */
|
|
memset(buf + RK_SPL_HDR_START, 0xFF, ninfo.pagesize - RK_SPL_HDR_START);
|
|
}
|
|
|
|
static int rknand_check_image_type(uint8_t type)
|
|
{
|
|
if (type == IH_TYPE_RKNAND)
|
|
return EXIT_SUCCESS;
|
|
else
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
static int rknand_vrec_header(struct image_tool_params *params,
|
|
struct image_type_params *tparams)
|
|
{
|
|
int tplsplsize;
|
|
uint32_t skippages;
|
|
int ret;
|
|
|
|
rkcommon_vrec_header(params, tparams);
|
|
|
|
ret = sscanf(params->extraparams, "%u,%u", &ninfo.pagesize, &skippages);
|
|
if (ret != 2 || (ninfo.pagesize % RKNAND_SECT_LEN)) {
|
|
fprintf(stderr, "%s: Wrong nand params\n", params->cmdname);
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
ninfo.itersize = ninfo.pagesize * (skippages + 1);
|
|
|
|
tplsplsize = params->file_size - RK_SPL_HDR_START;
|
|
ninfo.tplsplsize =
|
|
DIV_ROUND_UP(tplsplsize, RKNAND_SECT_LEN) * ninfo.itersize;
|
|
|
|
/* Padded file size = padded header + padded tpl & spl. */
|
|
params->file_size = ninfo.pagesize + ninfo.tplsplsize;
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* rknand parameters
|
|
*/
|
|
U_BOOT_IMAGE_TYPE(
|
|
rknand,
|
|
"Rockchip NAND Boot Image support",
|
|
0,
|
|
NULL,
|
|
rkcommon_check_params,
|
|
/* TODO: Support rknand in there helpers */
|
|
NULL, //rkcommon_verify_header,
|
|
NULL, //rkcommon_print_header,
|
|
rknand_set_header,
|
|
NULL,
|
|
rknand_check_image_type,
|
|
NULL,
|
|
rknand_vrec_header
|
|
);
|