tools: add pack kernel tool for rv1108
Change-Id: I9a8e1b2884bcc26144162e3ca838750bef69907a Signed-off-by: Yifeng Zhao <zyf@rock-chips.com> Signed-off-by: Zhichao Yu <zhichao.yu@rock-chips.com>
This commit is contained in:
parent
db9b4c53f2
commit
c64e256218
|
|
@ -18,10 +18,11 @@ extern uint32_t crc32_rk(uint32_t, const unsigned char *, uint32_t);
|
||||||
#define OPT_UNPACK "--unpack"
|
#define OPT_UNPACK "--unpack"
|
||||||
#define OPT_UBOOT "--uboot"
|
#define OPT_UBOOT "--uboot"
|
||||||
#define OPT_TRUSTOS "--trustos"
|
#define OPT_TRUSTOS "--trustos"
|
||||||
|
#define OPT_KERNEL "--kernel"
|
||||||
#define OPT_SIZE "--size"
|
#define OPT_SIZE "--size"
|
||||||
#define OPT_VERSION "--version"
|
#define OPT_VERSION "--version"
|
||||||
#define OPT_INFO "--info"
|
#define OPT_INFO "--info"
|
||||||
#define OPT_PREPATH "--prepath"
|
#define OPT_PREPATH "--prepath"
|
||||||
|
|
||||||
/* pack or unpack */
|
/* pack or unpack */
|
||||||
#define MODE_PACK 0
|
#define MODE_PACK 0
|
||||||
|
|
@ -32,6 +33,7 @@ extern uint32_t crc32_rk(uint32_t, const unsigned char *, uint32_t);
|
||||||
/* image type */
|
/* image type */
|
||||||
#define IMAGE_UBOOT 0
|
#define IMAGE_UBOOT 0
|
||||||
#define IMAGE_TRUST 1
|
#define IMAGE_TRUST 1
|
||||||
|
#define IMAGE_KERNEL 2
|
||||||
|
|
||||||
/* magic and hash size */
|
/* magic and hash size */
|
||||||
#define LOADER_MAGIC_SIZE 8
|
#define LOADER_MAGIC_SIZE 8
|
||||||
|
|
@ -62,6 +64,14 @@ extern uint32_t crc32_rk(uint32_t, const unsigned char *, uint32_t);
|
||||||
#define RK_TRUST_MAGIC "TOS "
|
#define RK_TRUST_MAGIC "TOS "
|
||||||
#define RK_TRUST_RUNNING_ADDR (CONFIG_SYS_TEXT_BASE + SZ_128M + SZ_4M)
|
#define RK_TRUST_RUNNING_ADDR (CONFIG_SYS_TEXT_BASE + SZ_128M + SZ_4M)
|
||||||
|
|
||||||
|
#define KERNEL_NAME "kernel"
|
||||||
|
#define KERNEL_NUM 1
|
||||||
|
#define KERNEL_MAX_SIZE 30720 * 1024
|
||||||
|
#define KERNEL_VERSION_STRING "kernel os"
|
||||||
|
|
||||||
|
#define RK_KERNEL_MAGIC "KERNEL"
|
||||||
|
#define RK_KERNEL_RUNNING_ADDR (CONFIG_SYS_TEXT_BASE + SZ_4M)
|
||||||
|
|
||||||
typedef struct tag_second_loader_hdr {
|
typedef struct tag_second_loader_hdr {
|
||||||
uint8_t magic[LOADER_MAGIC_SIZE]; /* magic */
|
uint8_t magic[LOADER_MAGIC_SIZE]; /* magic */
|
||||||
uint32_t version;
|
uint32_t version;
|
||||||
|
|
@ -72,7 +82,8 @@ typedef struct tag_second_loader_hdr {
|
||||||
uint32_t hash_len; /* 20 or 32 , 0 is no hash */
|
uint32_t hash_len; /* 20 or 32 , 0 is no hash */
|
||||||
uint8_t hash[LOADER_HASH_SIZE]; /* sha */
|
uint8_t hash[LOADER_HASH_SIZE]; /* sha */
|
||||||
|
|
||||||
uint8_t reserved[1024 - 32 - 32];
|
unsigned int js_hash; /*js hsah*/
|
||||||
|
unsigned char reserved[1024-32-32-4];
|
||||||
uint32_t signTag; /* 0x4E474953 */
|
uint32_t signTag; /* 0x4E474953 */
|
||||||
uint32_t signlen; /* maybe 128 or 256 */
|
uint32_t signlen; /* maybe 128 or 256 */
|
||||||
uint8_t rsaHash[256]; /* maybe 128 or 256, using max size 256 */
|
uint8_t rsaHash[256]; /* maybe 128 or 256, using max size 256 */
|
||||||
|
|
@ -81,7 +92,7 @@ typedef struct tag_second_loader_hdr {
|
||||||
|
|
||||||
void usage(const char *prog)
|
void usage(const char *prog)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Usage: %s [--pack|--unpack] [--uboot|--trustos]\
|
fprintf(stderr, "Usage: %s [--pack|--unpack] [--uboot|--trustos|--kernel]\
|
||||||
file_in "
|
file_in "
|
||||||
"file_out [load_addr] [--size] [size number]\
|
"file_out [load_addr] [--size] [size number]\
|
||||||
[--version] "
|
[--version] "
|
||||||
|
|
@ -112,6 +123,17 @@ unsigned int str2hex(char *str)
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint32_t js_hash(uint8_t *buf, uint32_t len)
|
||||||
|
{
|
||||||
|
uint32_t hash = 0x47C6A7E6;
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < len; i++)
|
||||||
|
hash ^= ((hash << 5) + buf[i] + (hash >> 2));
|
||||||
|
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int mode = -1, image = -1;
|
int mode = -1, image = -1;
|
||||||
|
|
@ -152,6 +174,13 @@ int main(int argc, char *argv[])
|
||||||
/* detect whether loader address is delivered */
|
/* detect whether loader address is delivered */
|
||||||
if ((argv[i + 1]) && (strncmp(argv[i + 1], "--", 2)))
|
if ((argv[i + 1]) && (strncmp(argv[i + 1], "--", 2)))
|
||||||
in_loader_addr = str2hex(argv[++i]);
|
in_loader_addr = str2hex(argv[++i]);
|
||||||
|
} else if (!strcmp(argv[i], OPT_KERNEL)) {
|
||||||
|
image = IMAGE_KERNEL;
|
||||||
|
file_in = argv[++i];
|
||||||
|
file_out = argv[++i];
|
||||||
|
/* detect whether loader address is delivered */
|
||||||
|
if ((argv[i + 1]) && (strncmp(argv[i + 1], "--", 2)))
|
||||||
|
in_loader_addr = str2hex(argv[++i]);
|
||||||
} else if (!strcmp(argv[i], OPT_SIZE)) {
|
} else if (!strcmp(argv[i], OPT_SIZE)) {
|
||||||
in_size = strtoul(argv[++i], NULL, 10);
|
in_size = strtoul(argv[++i], NULL, 10);
|
||||||
/*
|
/*
|
||||||
|
|
@ -198,6 +227,15 @@ int main(int argc, char *argv[])
|
||||||
max_num = in_num ? in_num : TRUST_NUM;
|
max_num = in_num ? in_num : TRUST_NUM;
|
||||||
loader_addr =
|
loader_addr =
|
||||||
(in_loader_addr == -1) ? RK_TRUST_RUNNING_ADDR : in_loader_addr;
|
(in_loader_addr == -1) ? RK_TRUST_RUNNING_ADDR : in_loader_addr;
|
||||||
|
} else if (image == IMAGE_KERNEL) {
|
||||||
|
name = KERNEL_NAME;
|
||||||
|
magic = RK_KERNEL_MAGIC;
|
||||||
|
version = KERNEL_VERSION_STRING;
|
||||||
|
max_size = in_size ? in_size : KERNEL_MAX_SIZE;
|
||||||
|
max_num = in_num ? in_num : KERNEL_NUM;
|
||||||
|
loader_addr =
|
||||||
|
(in_loader_addr == -1) ? RK_KERNEL_RUNNING_ADDR : in_loader_addr;
|
||||||
|
|
||||||
} else if (mode == MODE_INFO) {
|
} else if (mode == MODE_INFO) {
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -261,7 +299,7 @@ int main(int argc, char *argv[])
|
||||||
hdr.crc32 = crc32_rk(
|
hdr.crc32 = crc32_rk(
|
||||||
0, (const unsigned char *)buf + sizeof(second_loader_hdr), size);
|
0, (const unsigned char *)buf + sizeof(second_loader_hdr), size);
|
||||||
printf("crc = 0x%08x\n", hdr.crc32);
|
printf("crc = 0x%08x\n", hdr.crc32);
|
||||||
|
hdr.js_hash = js_hash((uint8_t *)buf + sizeof(second_loader_hdr), size);
|
||||||
#ifndef CONFIG_SECUREBOOT_SHA256
|
#ifndef CONFIG_SECUREBOOT_SHA256
|
||||||
SHA_CTX ctx;
|
SHA_CTX ctx;
|
||||||
uint8_t *sha;
|
uint8_t *sha;
|
||||||
|
|
@ -300,8 +338,11 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
printf("%s version: %s\n", name, version);
|
printf("%s version: %s\n", name, version);
|
||||||
memcpy(buf, &hdr, sizeof(second_loader_hdr));
|
memcpy(buf, &hdr, sizeof(second_loader_hdr));
|
||||||
for (i = 0; i < max_num; i++)
|
if (image == IMAGE_KERNEL)
|
||||||
fwrite(buf, max_size, 1, fo);
|
fwrite(buf, size + sizeof(second_loader_hdr), 1, fo);
|
||||||
|
else
|
||||||
|
for (i = 0; i < max_num; i++)
|
||||||
|
fwrite(buf, max_size, 1, fo);
|
||||||
|
|
||||||
printf("pack %s success! \n", file_out);
|
printf("pack %s success! \n", file_out);
|
||||||
fclose(fi);
|
fclose(fi);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue