xref: /rk3399_rockchip-uboot/tools/rockchip/boot_merger.h (revision 5b69ab5af529a21949a8e6ebbdd3007a8093c20f)
123ba6841SJoseph Chen /*
223ba6841SJoseph Chen  * (C) Copyright 2008-2015 Fuzhou Rockchip Electronics Co., Ltd
323ba6841SJoseph Chen  *
423ba6841SJoseph Chen  * SPDX-License-Identifier:	GPL-2.0+
523ba6841SJoseph Chen  */
623ba6841SJoseph Chen #ifndef BOOT_MERGER_H
723ba6841SJoseph Chen #define BOOT_MERGER_H
823ba6841SJoseph Chen 
923ba6841SJoseph Chen #include <stdint.h>
1023ba6841SJoseph Chen #include <stdio.h>
1123ba6841SJoseph Chen #include <stdlib.h>
1223ba6841SJoseph Chen #include <memory.h>
1323ba6841SJoseph Chen #include <stdbool.h>
1423ba6841SJoseph Chen 
1523ba6841SJoseph Chen /* #define DEBUG */
1623ba6841SJoseph Chen 
1723ba6841SJoseph Chen extern bool gDebug;
1823ba6841SJoseph Chen 
1923ba6841SJoseph Chen #define LOGE(fmt, args...) fprintf(stderr, "E: [%s] "fmt, __func__, ##args)
2023ba6841SJoseph Chen #define LOGD(fmt, args...) do {\
2123ba6841SJoseph Chen 	if (gDebug) \
2223ba6841SJoseph Chen 	fprintf(stderr, "W: [%s] "fmt, __func__, ##args); \
2323ba6841SJoseph Chen } while (0)
2423ba6841SJoseph Chen 
2523ba6841SJoseph Chen 
2623ba6841SJoseph Chen #define SCANF_EAT(in)   fscanf(in, "%*[ \r\n\t/]")//, gEat)
2723ba6841SJoseph Chen #define MAX_LINE_LEN        256
2823ba6841SJoseph Chen extern char gEat[MAX_LINE_LEN];
2923ba6841SJoseph Chen 
3023ba6841SJoseph Chen typedef char line_t[MAX_LINE_LEN];
3123ba6841SJoseph Chen 
3223ba6841SJoseph Chen 
3323ba6841SJoseph Chen 
3423ba6841SJoseph Chen #define DEF_CONFIG_FILE     "CONFIG.ini"
3523ba6841SJoseph Chen 
3623ba6841SJoseph Chen #define DEF_MAJOR           0
3723ba6841SJoseph Chen #define DEF_MINOR           3
3823ba6841SJoseph Chen #define DEF_CHIP            "RK30"
3923ba6841SJoseph Chen #define DEF_CODE471_NUM     1
4023ba6841SJoseph Chen #define DEF_CODE472_NUM     1
4123ba6841SJoseph Chen #define DEF_CODE471_SLEEP   0
4223ba6841SJoseph Chen #define DEF_CODE472_SLEEP   0
4323ba6841SJoseph Chen #define DEF_CODE471_PATH    "30_LPDDR2_300MHz_DDR3_300MHz.bin"
4423ba6841SJoseph Chen #define DEF_CODE472_PATH    "rk30usbplug.bin"
4523ba6841SJoseph Chen #define DEF_LOADER_NUM      2
4623ba6841SJoseph Chen #define DEF_LOADER0         "FlashData"
4723ba6841SJoseph Chen #define DEF_LOADER0_PATH    "30_LPDDR2_300MHz_DDR3_300MHz.bin"
4823ba6841SJoseph Chen #define DEF_LOADER1         "FlashBoot"
4923ba6841SJoseph Chen #define DEF_LOADER1_PATH    "../../u-boot.bin"
5023ba6841SJoseph Chen #define DEF_OUT_PATH        "../../RK30xxLoader_uboot.bin"
5123ba6841SJoseph Chen 
5223ba6841SJoseph Chen #define OUT_SUBFIX          ".bin"
5323ba6841SJoseph Chen 
5423ba6841SJoseph Chen #define SEC_CHIP            "[CHIP_NAME]"
5523ba6841SJoseph Chen #define SEC_VERSION         "[VERSION]"
5623ba6841SJoseph Chen #define SEC_471             "[CODE471_OPTION]"
5723ba6841SJoseph Chen #define SEC_472             "[CODE472_OPTION]"
5823ba6841SJoseph Chen #define SEC_LOADER          "[LOADER_OPTION]"
5923ba6841SJoseph Chen #define SEC_OUT             "[OUTPUT]"
6023ba6841SJoseph Chen 
6123ba6841SJoseph Chen #define OPT_NAME            "NAME"
6223ba6841SJoseph Chen #define OPT_MAJOR           "MAJOR"
6323ba6841SJoseph Chen #define OPT_MINOR           "MINOR"
6423ba6841SJoseph Chen #define OPT_NUM             "NUM"
6523ba6841SJoseph Chen #define OPT_LOADER_NUM      "LOADERCOUNT"
6623ba6841SJoseph Chen #define OPT_PATH            "Path"
6723ba6841SJoseph Chen #define OPT_SLEEP           "Sleep"
6823ba6841SJoseph Chen #define OPT_LOADER_NAME     "LOADER"
6923ba6841SJoseph Chen #define OPT_OUT_PATH        "PATH"
7023ba6841SJoseph Chen 
7123ba6841SJoseph Chen typedef struct {
7223ba6841SJoseph Chen 	char       name[MAX_LINE_LEN];
7323ba6841SJoseph Chen 	char       path[MAX_LINE_LEN];
7423ba6841SJoseph Chen } name_entry;
7523ba6841SJoseph Chen 
7623ba6841SJoseph Chen typedef struct {
7723ba6841SJoseph Chen 	int         major;
7823ba6841SJoseph Chen 	int         minor;
7923ba6841SJoseph Chen 	char        chip[MAX_LINE_LEN];
8023ba6841SJoseph Chen 	int         code471Sleep;
8123ba6841SJoseph Chen 	int         code472Sleep;
8223ba6841SJoseph Chen 	int         code471Num;
8323ba6841SJoseph Chen 	int         code472Num;
8423ba6841SJoseph Chen 	line_t*     code471Path;
8523ba6841SJoseph Chen 	line_t*     code472Path;
8623ba6841SJoseph Chen 	int         loaderNum;
8723ba6841SJoseph Chen 	name_entry* loader;
88*5b69ab5aSYifeng Zhao 	char        outPath[MAX_LINE_LEN * 2];
8923ba6841SJoseph Chen } options;
9023ba6841SJoseph Chen 
9123ba6841SJoseph Chen 
9223ba6841SJoseph Chen #define TAG						0x544F4F42
9323ba6841SJoseph Chen #define MERGER_VERSION          0x01030000
9423ba6841SJoseph Chen #define SMALL_PACKET			512
9523ba6841SJoseph Chen 
9623ba6841SJoseph Chen #define MAX_NAME_LEN            20
9723ba6841SJoseph Chen #define MAX_MERGE_SIZE          (512 << 10)
9823ba6841SJoseph Chen 
9923ba6841SJoseph Chen #define SEC_CHIP_TYPES          "[CHIP_TYPES]"
10023ba6841SJoseph Chen 
10123ba6841SJoseph Chen #define CHIP_RK28               "RK28"
10223ba6841SJoseph Chen #define CHIP_RK281X             "RK281X"
10323ba6841SJoseph Chen #define CHIP_RKPANDA            "RKPANDA"
10423ba6841SJoseph Chen #define CHIP_RK27               "RK27"
10523ba6841SJoseph Chen #define CHIP_RKNANO             "RKNANO"
10623ba6841SJoseph Chen #define CHIP_RKSMART            "RKSMART"
10723ba6841SJoseph Chen #define CHIP_RKCROWN            "RKCROWN"
10823ba6841SJoseph Chen #define CHIP_RKCAYMAN           "RKCAYMAN"
10923ba6841SJoseph Chen #define CHIP_RK29               "RK29"
11023ba6841SJoseph Chen #define CHIP_RK292X             "RK292X"
11123ba6841SJoseph Chen #define CHIP_RK30               "RK30"
11223ba6841SJoseph Chen #define CHIP_RK30B              "RK30B"
11323ba6841SJoseph Chen #define CHIP_RK31               "RK31"
11423ba6841SJoseph Chen #define CHIP_RK32               "RK32"
11523ba6841SJoseph Chen 
11623ba6841SJoseph Chen typedef enum {
11723ba6841SJoseph Chen 	RKNONE_DEVICE   =0,
11823ba6841SJoseph Chen 	RK27_DEVICE     =0x10,
11923ba6841SJoseph Chen 	RKCAYMAN_DEVICE =0x11,
12023ba6841SJoseph Chen 	RK28_DEVICE     =0x20,
12123ba6841SJoseph Chen 	RK281X_DEVICE   =0x21,
12223ba6841SJoseph Chen 	RKPANDA_DEVICE  =0x22,
12323ba6841SJoseph Chen 	RKNANO_DEVICE   =0x30,
12423ba6841SJoseph Chen 	RKSMART_DEVICE  =0x31,
12523ba6841SJoseph Chen 	RKCROWN_DEVICE  =0x40,
12623ba6841SJoseph Chen 	RK29_DEVICE     =0x50,
12723ba6841SJoseph Chen 	RK292X_DEVICE   =0x51,
12823ba6841SJoseph Chen 	RK30_DEVICE     =0x60,
12923ba6841SJoseph Chen 	RK30B_DEVICE    =0x61,
13023ba6841SJoseph Chen 	RK31_DEVICE     =0x70,
13123ba6841SJoseph Chen 	RK32_DEVICE     =0x80
13223ba6841SJoseph Chen } rk_chip_type;
13323ba6841SJoseph Chen 
13423ba6841SJoseph Chen typedef enum {
13523ba6841SJoseph Chen 	ENTRY_471       =1,
13623ba6841SJoseph Chen 	ENTRY_472       =2,
13723ba6841SJoseph Chen 	ENTRY_LOADER    =4,
13823ba6841SJoseph Chen } rk_entry_type;
13923ba6841SJoseph Chen 
14023ba6841SJoseph Chen #pragma pack(1)
14123ba6841SJoseph Chen typedef struct {
14223ba6841SJoseph Chen 	uint16_t  year;
14323ba6841SJoseph Chen 	uint8_t   month;
14423ba6841SJoseph Chen 	uint8_t   day;
14523ba6841SJoseph Chen 	uint8_t   hour;
14623ba6841SJoseph Chen 	uint8_t   minute;
14723ba6841SJoseph Chen 	uint8_t   second;
14823ba6841SJoseph Chen } rk_time;
14923ba6841SJoseph Chen 
15023ba6841SJoseph Chen #define  BOOT_RESERVED_SIZE 57
15123ba6841SJoseph Chen typedef struct {
15223ba6841SJoseph Chen 	uint32_t        tag;
15323ba6841SJoseph Chen 	uint16_t        size;
15423ba6841SJoseph Chen 	uint32_t        version;
15523ba6841SJoseph Chen 	uint32_t        mergerVersion;
15623ba6841SJoseph Chen 	rk_time         releaseTime;
15723ba6841SJoseph Chen 	uint32_t        chipType;
15823ba6841SJoseph Chen 	uint8_t         code471Num;
15923ba6841SJoseph Chen 	uint32_t        code471Offset;
16023ba6841SJoseph Chen 	uint8_t         code471Size;
16123ba6841SJoseph Chen 	uint8_t         code472Num;
16223ba6841SJoseph Chen 	uint32_t        code472Offset;
16323ba6841SJoseph Chen 	uint8_t         code472Size;
16423ba6841SJoseph Chen 	uint8_t         loaderNum;
16523ba6841SJoseph Chen 	uint32_t        loaderOffset;
16623ba6841SJoseph Chen 	uint8_t         loaderSize;
16723ba6841SJoseph Chen 	uint8_t         signFlag;
16823ba6841SJoseph Chen 	uint8_t         rc4Flag;
16923ba6841SJoseph Chen 	uint8_t         reserved[BOOT_RESERVED_SIZE];
17023ba6841SJoseph Chen } rk_boot_header;
17123ba6841SJoseph Chen 
17223ba6841SJoseph Chen typedef struct {
17323ba6841SJoseph Chen 	uint8_t         size;
17423ba6841SJoseph Chen 	rk_entry_type   type;
17523ba6841SJoseph Chen 	uint16_t        name[MAX_NAME_LEN];
17623ba6841SJoseph Chen 	uint32_t        dataOffset;
17723ba6841SJoseph Chen 	uint32_t        dataSize;
17823ba6841SJoseph Chen 	uint32_t        dataDelay;
17923ba6841SJoseph Chen } rk_boot_entry;
18023ba6841SJoseph Chen #pragma pack()
18123ba6841SJoseph Chen 
18223ba6841SJoseph Chen #define OPT_VERBOSE         "--verbose"
18323ba6841SJoseph Chen #define OPT_HELP            "--help"
18423ba6841SJoseph Chen #define OPT_VERSION         "--version"
18523ba6841SJoseph Chen #define OPT_MERGE           "--pack"
18623ba6841SJoseph Chen #define OPT_UNPACK          "--unpack"
18723ba6841SJoseph Chen #define OPT_SUBFIX          "--subfix"
18823ba6841SJoseph Chen #define OPT_REPLACE         "--replace"
189e311da24SJoseph Chen #define OPT_PREPATH         "--prepath"
19023ba6841SJoseph Chen #define OPT_SIZE	    "--size"
19124f9e652SJoseph Chen #define OPT_RC4		    "--rc4"
19223ba6841SJoseph Chen 
19323ba6841SJoseph Chen #define OPT_CHIP	"-c"
19423ba6841SJoseph Chen #define OPT_471		"-1"
19523ba6841SJoseph Chen #define OPT_472		"-2"
19623ba6841SJoseph Chen #define	OPT_DATA	"-d"
19723ba6841SJoseph Chen #define	OPT_BOOT	"-b"
19823ba6841SJoseph Chen #define	OPT_OUT		"-o"
19923ba6841SJoseph Chen 
20023ba6841SJoseph Chen 
20123ba6841SJoseph Chen #define VERSION             "2013-8-12 14:27:23"
20223ba6841SJoseph Chen 
20323ba6841SJoseph Chen #endif/* BOOT_MERGER_H */
204