Blame view

tools/omapimage.c 4.07 KB
3decb14ab   John Rigby   mkimage: Add OMAP...
1
2
3
4
5
6
7
8
9
10
11
12
13
  /*
   * (C) Copyright 2010
   * Linaro LTD, www.linaro.org
   * Author: John Rigby <john.rigby@linaro.org>
   * Based on TI's signGP.c
   *
   * (C) Copyright 2009
   * Stefano Babic, DENX Software Engineering, sbabic@denx.de.
   *
   * (C) Copyright 2008
   * Marvell Semiconductor <www.marvell.com>
   * Written-by: Prafulla Wadaskar <prafulla@marvell.com>
   *
3765b3e7b   Wolfgang Denk   Coding Style clea...
14
   * SPDX-License-Identifier:	GPL-2.0+
3decb14ab   John Rigby   mkimage: Add OMAP...
15
   */
f86ed6a8d   Guilherme Maciel Ferreira   tools: moved code...
16
  #include "imagetool.h"
bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
17
  #include <compiler.h>
3decb14ab   John Rigby   mkimage: Add OMAP...
18
  #include <image.h>
bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
19
  #include "gpheader.h"
3decb14ab   John Rigby   mkimage: Add OMAP...
20
  #include "omapimage.h"
c8e1ca3eb   Philipp Tomsich   tools: omapimage:...
21
  #define DIV_ROUND_UP(n, d)     (((n) + (d) - 1) / (d))
3decb14ab   John Rigby   mkimage: Add OMAP...
22
23
  /* Header size is CH header rounded up to 512 bytes plus GP header */
  #define OMAP_CH_HDR_SIZE 512
bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
24
  #define OMAP_FILE_HDR_SIZE (OMAP_CH_HDR_SIZE + GPIMAGE_HDR_SIZE)
3decb14ab   John Rigby   mkimage: Add OMAP...
25

79b9ebb70   Tom Rini   omapimage: Add su...
26
  static int do_swap32 = 0;
3decb14ab   John Rigby   mkimage: Add OMAP...
27
28
29
30
31
32
  static uint8_t omapimage_header[OMAP_FILE_HDR_SIZE];
  
  static int omapimage_check_image_types(uint8_t type)
  {
  	if (type == IH_TYPE_OMAPIMAGE)
  		return EXIT_SUCCESS;
bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
33
  	return EXIT_FAILURE;
3decb14ab   John Rigby   mkimage: Add OMAP...
34
35
36
  }
  
  static int omapimage_verify_header(unsigned char *ptr, int image_size,
f86ed6a8d   Guilherme Maciel Ferreira   tools: moved code...
37
  			struct image_tool_params *params)
3decb14ab   John Rigby   mkimage: Add OMAP...
38
39
40
  {
  	struct ch_toc *toc = (struct ch_toc *)ptr;
  	struct gp_header *gph = (struct gp_header *)(ptr+OMAP_CH_HDR_SIZE);
bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
41
  	uint32_t offset, size;
3decb14ab   John Rigby   mkimage: Add OMAP...
42
43
44
  
  	while (toc->section_offset != 0xffffffff
  			&& toc->section_size != 0xffffffff) {
79b9ebb70   Tom Rini   omapimage: Add su...
45
  		if (do_swap32) {
bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
46
47
  			offset = cpu_to_be32(toc->section_offset);
  			size = cpu_to_be32(toc->section_size);
79b9ebb70   Tom Rini   omapimage: Add su...
48
49
50
51
  		} else {
  			offset = toc->section_offset;
  			size = toc->section_size;
  		}
3decb14ab   John Rigby   mkimage: Add OMAP...
52
53
54
55
56
57
58
  		if (!offset || !size)
  			return -1;
  		if (offset >= OMAP_CH_HDR_SIZE ||
  		    offset+size >= OMAP_CH_HDR_SIZE)
  			return -1;
  		toc++;
  	}
79b9ebb70   Tom Rini   omapimage: Add su...
59

bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
60
  	return gph_verify_header(gph, do_swap32);
3decb14ab   John Rigby   mkimage: Add OMAP...
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
  }
  
  static void omapimage_print_section(struct ch_settings *chs)
  {
  	const char *section_name;
  
  	if (chs->section_key)
  		section_name = "CHSETTINGS";
  	else
  		section_name = "UNKNOWNKEY";
  
  	printf("%s (%x) "
  		"valid:%x "
  		"version:%x "
  		"reserved:%x "
  		"flags:%x
  ",
  		section_name,
  		chs->section_key,
  		chs->valid,
  		chs->version,
  		chs->reserved,
  		chs->flags);
  }
  
  static void omapimage_print_header(const void *ptr)
  {
  	const struct ch_toc *toc = (struct ch_toc *)ptr;
  	const struct gp_header *gph =
  			(struct gp_header *)(ptr+OMAP_CH_HDR_SIZE);
bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
91
  	uint32_t offset, size;
3decb14ab   John Rigby   mkimage: Add OMAP...
92
93
94
  
  	while (toc->section_offset != 0xffffffff
  			&& toc->section_size != 0xffffffff) {
79b9ebb70   Tom Rini   omapimage: Add su...
95
  		if (do_swap32) {
bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
96
97
  			offset = cpu_to_be32(toc->section_offset);
  			size = cpu_to_be32(toc->section_size);
79b9ebb70   Tom Rini   omapimage: Add su...
98
99
100
101
  		} else {
  			offset = toc->section_offset;
  			size = toc->section_size;
  		}
3decb14ab   John Rigby   mkimage: Add OMAP...
102
103
104
105
106
107
108
109
110
111
112
113
114
115
  
  		if (offset >= OMAP_CH_HDR_SIZE ||
  		    offset+size >= OMAP_CH_HDR_SIZE)
  			exit(EXIT_FAILURE);
  
  		printf("Section %s offset %x length %x
  ",
  			toc->section_name,
  			toc->section_offset,
  			toc->section_size);
  
  		omapimage_print_section((struct ch_settings *)(ptr+offset));
  		toc++;
  	}
bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
116
  	gph_print_header(gph, do_swap32);
3decb14ab   John Rigby   mkimage: Add OMAP...
117
118
119
120
121
122
123
124
  }
  
  static int toc_offset(void *hdr, void *member)
  {
  	return member - hdr;
  }
  
  static void omapimage_set_header(void *ptr, struct stat *sbuf, int ifd,
f86ed6a8d   Guilherme Maciel Ferreira   tools: moved code...
125
  				struct image_tool_params *params)
3decb14ab   John Rigby   mkimage: Add OMAP...
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
  {
  	struct ch_toc *toc = (struct ch_toc *)ptr;
  	struct ch_settings *chs = (struct ch_settings *)
  					(ptr + 2 * sizeof(*toc));
  	struct gp_header *gph = (struct gp_header *)(ptr + OMAP_CH_HDR_SIZE);
  
  	toc->section_offset = toc_offset(ptr, chs);
  	toc->section_size = sizeof(struct ch_settings);
  	strcpy((char *)toc->section_name, "CHSETTINGS");
  
  	chs->section_key = KEY_CHSETTINGS;
  	chs->valid = 0;
  	chs->version = 1;
  	chs->reserved = 0;
  	chs->flags = 0;
  
  	toc++;
  	memset(toc, 0xff, sizeof(*toc));
3a0e70f18   Lokesh Vutla   tools: omapimage:...
144
  	gph_set_header(gph, sbuf->st_size - OMAP_CH_HDR_SIZE,
bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
145
  		       params->addr, 0);
79b9ebb70   Tom Rini   omapimage: Add su...
146
147
148
149
150
  
  	if (strncmp(params->imagename, "byteswap", 8) == 0) {
  		do_swap32 = 1;
  		int swapped = 0;
  		uint32_t *data = (uint32_t *)ptr;
c8e1ca3eb   Philipp Tomsich   tools: omapimage:...
151
152
  		const off_t size_in_words =
  			DIV_ROUND_UP(sbuf->st_size, sizeof(uint32_t));
79b9ebb70   Tom Rini   omapimage: Add su...
153

c8e1ca3eb   Philipp Tomsich   tools: omapimage:...
154
  		while (swapped < size_in_words) {
bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
155
  			*data = cpu_to_be32(*data);
79b9ebb70   Tom Rini   omapimage: Add su...
156
157
158
159
  			swapped++;
  			data++;
  		}
  	}
3decb14ab   John Rigby   mkimage: Add OMAP...
160
  }
3decb14ab   John Rigby   mkimage: Add OMAP...
161
162
163
  /*
   * omapimage parameters
   */
a93648d19   Guilherme Maciel Ferreira   imagetool: replac...
164
165
166
167
168
169
170
171
172
173
174
175
176
177
  U_BOOT_IMAGE_TYPE(
  	omapimage,
  	"TI OMAP CH/GP Boot Image support",
  	OMAP_FILE_HDR_SIZE,
  	(void *)&omapimage_header,
  	gpimage_check_params,
  	omapimage_verify_header,
  	omapimage_print_header,
  	omapimage_set_header,
  	NULL,
  	omapimage_check_image_types,
  	NULL,
  	NULL
  );