summaryrefslogtreecommitdiff
path: root/tools/imagetool.c
blob: a25b86b36ebafa3baaa43344a1ab3c08033c033e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*
 * (C) Copyright 2013
 *
 * Written by Guilherme Maciel Ferreira <guilherme.maciel.ferreira@gmail.com>
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */

#include "imagetool.h"

#include <image.h>

/*
 * Callback function to register a image type within a tool
 */
static imagetool_register_t register_func;

/*
 * register_image_tool -
 *
 * The tool provides its own registration function in order to all image
 * types initialize themselves.
 */
void register_image_tool(imagetool_register_t image_register)
{
	/*
	 * Save the image tool callback function. It will be used to register
	 * image types within that tool
	 */
	register_func = image_register;

	/* Init ATMEL ROM Boot Image generation/list support */
	init_atmel_image_type();
	/* Init Freescale PBL Boot image generation/list support */
	init_pbl_image_type();
	/* Init Kirkwood Boot image generation/list support */
	init_kwb_image_type();
	/* Init Freescale imx Boot image generation/list support */
	init_imx_image_type();
	/* Init Freescale mxs Boot image generation/list support */
	init_mxs_image_type();
	/* Init FIT image generation/list support */
	init_fit_image_type();
	/* Init TI OMAP Boot image generation/list support */
	init_omap_image_type();
	/* Init Default image generation/list support */
	init_default_image_type();
	/* Init Davinci UBL support */
	init_ubl_image_type();
	/* Init Davinci AIS support */
	init_ais_image_type();
	/* Init Altera SOCFPGA support */
	init_socfpga_image_type();
	/* Init TI Keystone boot image generation/list support */
	init_gpimage_type();
}

/*
 * register_image_type -
 *
 * Register a image type within a tool
 */
void register_image_type(struct image_type_params *tparams)
{
	register_func(tparams);
}

struct image_type_params *imagetool_get_type(
	int type,
	struct image_type_params *tparams)
{
	struct image_type_params *curr;

	for (curr = tparams; curr != NULL; curr = curr->next) {
		if (curr->check_image_type) {
			if (!curr->check_image_type(type))
				return curr;
		}
	}
	return NULL;
}

int imagetool_verify_print_header(
	void *ptr,
	struct stat *sbuf,
	struct image_type_params *tparams,
	struct image_tool_params *params)
{
	int retval = -1;
	struct image_type_params *curr;

	for (curr = tparams; curr != NULL; curr = curr->next) {
		if (curr->verify_header) {
			retval = curr->verify_header((unsigned char *)ptr,
						     sbuf->st_size, params);

			if (retval == 0) {
				/*
				 * Print the image information  if verify is
				 * successful
				 */
				if (curr->print_header) {
					curr->print_header(ptr);
				} else {
					fprintf(stderr,
						"%s: print_header undefined for %s\n",
						params->cmdname, curr->name);
				}
				break;
			}
		}
	}

	return retval;
}

int imagetool_save_datafile(
	const char *file_name,
	ulong file_data,
	ulong file_len)
{
	int dfd;

	dfd = open(file_name, O_RDWR | O_CREAT | O_TRUNC | O_BINARY,
		   S_IRUSR | S_IWUSR);
	if (dfd < 0) {
		fprintf(stderr, "Can't open \"%s\": %s\n",
			file_name, strerror(errno));
		return -1;
	}

	if (write(dfd, (void *)file_data, file_len) != (ssize_t)file_len) {
		fprintf(stderr, "Write error on \"%s\": %s\n",
			file_name, strerror(errno));
		close(dfd);
		return -1;
	}

	close(dfd);

	return 0;
}