xref: /rk3399_rockchip-uboot/tools/rockchip/boot_merger.h (revision 23ba6841ccdaeb51290dc49d4e32f175bd3baa34)
1*23ba6841SJoseph Chen /*
2*23ba6841SJoseph Chen  * (C) Copyright 2008-2015 Fuzhou Rockchip Electronics Co., Ltd
3*23ba6841SJoseph Chen  *
4*23ba6841SJoseph Chen  * SPDX-License-Identifier:	GPL-2.0+
5*23ba6841SJoseph Chen  */
6*23ba6841SJoseph Chen #ifndef BOOT_MERGER_H
7*23ba6841SJoseph Chen #define BOOT_MERGER_H
8*23ba6841SJoseph Chen 
9*23ba6841SJoseph Chen #include <stdint.h>
10*23ba6841SJoseph Chen #include <stdio.h>
11*23ba6841SJoseph Chen #include <stdlib.h>
12*23ba6841SJoseph Chen #include <memory.h>
13*23ba6841SJoseph Chen #include <stdbool.h>
14*23ba6841SJoseph Chen 
15*23ba6841SJoseph Chen /* #define DEBUG */
16*23ba6841SJoseph Chen 
17*23ba6841SJoseph Chen extern bool gDebug;
18*23ba6841SJoseph Chen 
19*23ba6841SJoseph Chen #define LOGE(fmt, args...) fprintf(stderr, "E: [%s] "fmt, __func__, ##args)
20*23ba6841SJoseph Chen #define LOGD(fmt, args...) do {\
21*23ba6841SJoseph Chen 	if (gDebug) \
22*23ba6841SJoseph Chen 	fprintf(stderr, "W: [%s] "fmt, __func__, ##args); \
23*23ba6841SJoseph Chen } while (0)
24*23ba6841SJoseph Chen 
25*23ba6841SJoseph Chen 
26*23ba6841SJoseph Chen #define SCANF_EAT(in)   fscanf(in, "%*[ \r\n\t/]")//, gEat)
27*23ba6841SJoseph Chen #define MAX_LINE_LEN        256
28*23ba6841SJoseph Chen extern char gEat[MAX_LINE_LEN];
29*23ba6841SJoseph Chen 
30*23ba6841SJoseph Chen typedef char line_t[MAX_LINE_LEN];
31*23ba6841SJoseph Chen 
32*23ba6841SJoseph Chen 
33*23ba6841SJoseph Chen 
34*23ba6841SJoseph Chen #define DEF_CONFIG_FILE     "CONFIG.ini"
35*23ba6841SJoseph Chen 
36*23ba6841SJoseph Chen #define DEF_MAJOR           0
37*23ba6841SJoseph Chen #define DEF_MINOR           3
38*23ba6841SJoseph Chen #define DEF_CHIP            "RK30"
39*23ba6841SJoseph Chen #define DEF_CODE471_NUM     1
40*23ba6841SJoseph Chen #define DEF_CODE472_NUM     1
41*23ba6841SJoseph Chen #define DEF_CODE471_SLEEP   0
42*23ba6841SJoseph Chen #define DEF_CODE472_SLEEP   0
43*23ba6841SJoseph Chen #define DEF_CODE471_PATH    "30_LPDDR2_300MHz_DDR3_300MHz.bin"
44*23ba6841SJoseph Chen #define DEF_CODE472_PATH    "rk30usbplug.bin"
45*23ba6841SJoseph Chen #define DEF_LOADER_NUM      2
46*23ba6841SJoseph Chen #define DEF_LOADER0         "FlashData"
47*23ba6841SJoseph Chen #define DEF_LOADER0_PATH    "30_LPDDR2_300MHz_DDR3_300MHz.bin"
48*23ba6841SJoseph Chen #define DEF_LOADER1         "FlashBoot"
49*23ba6841SJoseph Chen #define DEF_LOADER1_PATH    "../../u-boot.bin"
50*23ba6841SJoseph Chen #define DEF_OUT_PATH        "../../RK30xxLoader_uboot.bin"
51*23ba6841SJoseph Chen 
52*23ba6841SJoseph Chen #define OUT_SUBFIX          ".bin"
53*23ba6841SJoseph Chen 
54*23ba6841SJoseph Chen #define SEC_CHIP            "[CHIP_NAME]"
55*23ba6841SJoseph Chen #define SEC_VERSION         "[VERSION]"
56*23ba6841SJoseph Chen #define SEC_471             "[CODE471_OPTION]"
57*23ba6841SJoseph Chen #define SEC_472             "[CODE472_OPTION]"
58*23ba6841SJoseph Chen #define SEC_LOADER          "[LOADER_OPTION]"
59*23ba6841SJoseph Chen #define SEC_OUT             "[OUTPUT]"
60*23ba6841SJoseph Chen 
61*23ba6841SJoseph Chen #define OPT_NAME            "NAME"
62*23ba6841SJoseph Chen #define OPT_MAJOR           "MAJOR"
63*23ba6841SJoseph Chen #define OPT_MINOR           "MINOR"
64*23ba6841SJoseph Chen #define OPT_NUM             "NUM"
65*23ba6841SJoseph Chen #define OPT_LOADER_NUM      "LOADERCOUNT"
66*23ba6841SJoseph Chen #define OPT_PATH            "Path"
67*23ba6841SJoseph Chen #define OPT_SLEEP           "Sleep"
68*23ba6841SJoseph Chen #define OPT_LOADER_NAME     "LOADER"
69*23ba6841SJoseph Chen #define OPT_OUT_PATH        "PATH"
70*23ba6841SJoseph Chen 
71*23ba6841SJoseph Chen typedef struct {
72*23ba6841SJoseph Chen 	char       name[MAX_LINE_LEN];
73*23ba6841SJoseph Chen 	char       path[MAX_LINE_LEN];
74*23ba6841SJoseph Chen } name_entry;
75*23ba6841SJoseph Chen 
76*23ba6841SJoseph Chen typedef struct {
77*23ba6841SJoseph Chen 	int         major;
78*23ba6841SJoseph Chen 	int         minor;
79*23ba6841SJoseph Chen 	char        chip[MAX_LINE_LEN];
80*23ba6841SJoseph Chen 	int         code471Sleep;
81*23ba6841SJoseph Chen 	int         code472Sleep;
82*23ba6841SJoseph Chen 	int         code471Num;
83*23ba6841SJoseph Chen 	int         code472Num;
84*23ba6841SJoseph Chen 	line_t*     code471Path;
85*23ba6841SJoseph Chen 	line_t*     code472Path;
86*23ba6841SJoseph Chen 	int         loaderNum;
87*23ba6841SJoseph Chen 	name_entry* loader;
88*23ba6841SJoseph Chen 	char        outPath[MAX_LINE_LEN];
89*23ba6841SJoseph Chen } options;
90*23ba6841SJoseph Chen 
91*23ba6841SJoseph Chen 
92*23ba6841SJoseph Chen #define TAG						0x544F4F42
93*23ba6841SJoseph Chen #define MERGER_VERSION          0x01030000
94*23ba6841SJoseph Chen #define SMALL_PACKET			512
95*23ba6841SJoseph Chen 
96*23ba6841SJoseph Chen #define MAX_NAME_LEN            20
97*23ba6841SJoseph Chen #define MAX_MERGE_SIZE          (512 << 10)
98*23ba6841SJoseph Chen 
99*23ba6841SJoseph Chen #define SEC_CHIP_TYPES          "[CHIP_TYPES]"
100*23ba6841SJoseph Chen 
101*23ba6841SJoseph Chen #define CHIP_RK28               "RK28"
102*23ba6841SJoseph Chen #define CHIP_RK281X             "RK281X"
103*23ba6841SJoseph Chen #define CHIP_RKPANDA            "RKPANDA"
104*23ba6841SJoseph Chen #define CHIP_RK27               "RK27"
105*23ba6841SJoseph Chen #define CHIP_RKNANO             "RKNANO"
106*23ba6841SJoseph Chen #define CHIP_RKSMART            "RKSMART"
107*23ba6841SJoseph Chen #define CHIP_RKCROWN            "RKCROWN"
108*23ba6841SJoseph Chen #define CHIP_RKCAYMAN           "RKCAYMAN"
109*23ba6841SJoseph Chen #define CHIP_RK29               "RK29"
110*23ba6841SJoseph Chen #define CHIP_RK292X             "RK292X"
111*23ba6841SJoseph Chen #define CHIP_RK30               "RK30"
112*23ba6841SJoseph Chen #define CHIP_RK30B              "RK30B"
113*23ba6841SJoseph Chen #define CHIP_RK31               "RK31"
114*23ba6841SJoseph Chen #define CHIP_RK32               "RK32"
115*23ba6841SJoseph Chen 
116*23ba6841SJoseph Chen typedef enum {
117*23ba6841SJoseph Chen 	RKNONE_DEVICE   =0,
118*23ba6841SJoseph Chen 	RK27_DEVICE     =0x10,
119*23ba6841SJoseph Chen 	RKCAYMAN_DEVICE =0x11,
120*23ba6841SJoseph Chen 	RK28_DEVICE     =0x20,
121*23ba6841SJoseph Chen 	RK281X_DEVICE   =0x21,
122*23ba6841SJoseph Chen 	RKPANDA_DEVICE  =0x22,
123*23ba6841SJoseph Chen 	RKNANO_DEVICE   =0x30,
124*23ba6841SJoseph Chen 	RKSMART_DEVICE  =0x31,
125*23ba6841SJoseph Chen 	RKCROWN_DEVICE  =0x40,
126*23ba6841SJoseph Chen 	RK29_DEVICE     =0x50,
127*23ba6841SJoseph Chen 	RK292X_DEVICE   =0x51,
128*23ba6841SJoseph Chen 	RK30_DEVICE     =0x60,
129*23ba6841SJoseph Chen 	RK30B_DEVICE    =0x61,
130*23ba6841SJoseph Chen 	RK31_DEVICE     =0x70,
131*23ba6841SJoseph Chen 	RK32_DEVICE     =0x80
132*23ba6841SJoseph Chen } rk_chip_type;
133*23ba6841SJoseph Chen 
134*23ba6841SJoseph Chen typedef enum {
135*23ba6841SJoseph Chen 	ENTRY_471       =1,
136*23ba6841SJoseph Chen 	ENTRY_472       =2,
137*23ba6841SJoseph Chen 	ENTRY_LOADER    =4,
138*23ba6841SJoseph Chen } rk_entry_type;
139*23ba6841SJoseph Chen 
140*23ba6841SJoseph Chen #pragma pack(1)
141*23ba6841SJoseph Chen typedef struct {
142*23ba6841SJoseph Chen 	uint16_t  year;
143*23ba6841SJoseph Chen 	uint8_t   month;
144*23ba6841SJoseph Chen 	uint8_t   day;
145*23ba6841SJoseph Chen 	uint8_t   hour;
146*23ba6841SJoseph Chen 	uint8_t   minute;
147*23ba6841SJoseph Chen 	uint8_t   second;
148*23ba6841SJoseph Chen } rk_time;
149*23ba6841SJoseph Chen 
150*23ba6841SJoseph Chen #define  BOOT_RESERVED_SIZE 57
151*23ba6841SJoseph Chen typedef struct {
152*23ba6841SJoseph Chen 	uint32_t        tag;
153*23ba6841SJoseph Chen 	uint16_t        size;
154*23ba6841SJoseph Chen 	uint32_t        version;
155*23ba6841SJoseph Chen 	uint32_t        mergerVersion;
156*23ba6841SJoseph Chen 	rk_time         releaseTime;
157*23ba6841SJoseph Chen 	uint32_t        chipType;
158*23ba6841SJoseph Chen 	uint8_t         code471Num;
159*23ba6841SJoseph Chen 	uint32_t        code471Offset;
160*23ba6841SJoseph Chen 	uint8_t         code471Size;
161*23ba6841SJoseph Chen 	uint8_t         code472Num;
162*23ba6841SJoseph Chen 	uint32_t        code472Offset;
163*23ba6841SJoseph Chen 	uint8_t         code472Size;
164*23ba6841SJoseph Chen 	uint8_t         loaderNum;
165*23ba6841SJoseph Chen 	uint32_t        loaderOffset;
166*23ba6841SJoseph Chen 	uint8_t         loaderSize;
167*23ba6841SJoseph Chen 	uint8_t         signFlag;
168*23ba6841SJoseph Chen 	uint8_t         rc4Flag;
169*23ba6841SJoseph Chen 	uint8_t         reserved[BOOT_RESERVED_SIZE];
170*23ba6841SJoseph Chen } rk_boot_header;
171*23ba6841SJoseph Chen 
172*23ba6841SJoseph Chen typedef struct {
173*23ba6841SJoseph Chen 	uint8_t         size;
174*23ba6841SJoseph Chen 	rk_entry_type   type;
175*23ba6841SJoseph Chen 	uint16_t        name[MAX_NAME_LEN];
176*23ba6841SJoseph Chen 	uint32_t        dataOffset;
177*23ba6841SJoseph Chen 	uint32_t        dataSize;
178*23ba6841SJoseph Chen 	uint32_t        dataDelay;
179*23ba6841SJoseph Chen } rk_boot_entry;
180*23ba6841SJoseph Chen #pragma pack()
181*23ba6841SJoseph Chen 
182*23ba6841SJoseph Chen #define OPT_VERBOSE         "--verbose"
183*23ba6841SJoseph Chen #define OPT_HELP            "--help"
184*23ba6841SJoseph Chen #define OPT_VERSION         "--version"
185*23ba6841SJoseph Chen #define OPT_MERGE           "--pack"
186*23ba6841SJoseph Chen #define OPT_UNPACK          "--unpack"
187*23ba6841SJoseph Chen #define OPT_SUBFIX          "--subfix"
188*23ba6841SJoseph Chen #define OPT_REPLACE         "--replace"
189*23ba6841SJoseph Chen #define OPT_SIZE	    "--size"
190*23ba6841SJoseph Chen 
191*23ba6841SJoseph Chen #define OPT_CHIP	"-c"
192*23ba6841SJoseph Chen #define OPT_471		"-1"
193*23ba6841SJoseph Chen #define OPT_472		"-2"
194*23ba6841SJoseph Chen #define	OPT_DATA	"-d"
195*23ba6841SJoseph Chen #define	OPT_BOOT	"-b"
196*23ba6841SJoseph Chen #define	OPT_OUT		"-o"
197*23ba6841SJoseph Chen 
198*23ba6841SJoseph Chen 
199*23ba6841SJoseph Chen #define VERSION             "2013-8-12 14:27:23"
200*23ba6841SJoseph Chen 
201*23ba6841SJoseph Chen #endif/* BOOT_MERGER_H */
202