diff options
Diffstat (limited to 'tools/mxsimage.h')
| -rw-r--r-- | tools/mxsimage.h | 230 | 
1 files changed, 230 insertions, 0 deletions
| diff --git a/tools/mxsimage.h b/tools/mxsimage.h new file mode 100644 index 000000000..6cd59d2db --- /dev/null +++ b/tools/mxsimage.h @@ -0,0 +1,230 @@ +/* + * Freescale i.MX28 SB image generator + * + * Copyright (C) 2012 Marek Vasut <marex@denx.de> + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#ifndef __MXSSB_H__ +#define __MXSSB_H__ + +#include <stdint.h> +#include <arpa/inet.h> + +#define SB_BLOCK_SIZE		16 + +#define roundup(x, y)		((((x) + ((y) - 1)) / (y)) * (y)) +#define ARRAY_SIZE(x)		(sizeof(x) / sizeof((x)[0])) + +struct sb_boot_image_version { +	uint16_t	major; +	uint16_t	pad0; +	uint16_t	minor; +	uint16_t	pad1; +	uint16_t	revision; +	uint16_t	pad2; +}; + +struct sb_boot_image_header { +	union { +		/* SHA1 of the header. */ +		uint8_t	digest[20]; +		struct { +			/* CBC-MAC initialization vector. */ +			uint8_t iv[16]; +			uint8_t extra[4]; +		}; +	}; +	/* 'STMP' */ +	uint8_t		signature1[4]; +	/* Major version of the image format. */ +	uint8_t		major_version; +	/* Minor version of the image format. */ +	uint8_t		minor_version; +	/* Flags associated with the image. */ +	uint16_t	flags; +	/* Size of the image in 16b blocks. */ +	uint32_t	image_blocks; +	/* Offset of the first tag in 16b blocks. */ +	uint32_t	first_boot_tag_block; +	/* ID of the section to boot from. */ +	uint32_t	first_boot_section_id; +	/* Amount of crypto keys. */ +	uint16_t	key_count; +	/* Offset to the key dictionary in 16b blocks. */ +	uint16_t	key_dictionary_block; +	/* Size of this header in 16b blocks. */ +	uint16_t	header_blocks; +	/* Amount of section headers. */ +	uint16_t	section_count; +	/* Section header size in 16b blocks. */ +	uint16_t	section_header_size; +	/* Padding to align timestamp to uint64_t. */ +	uint8_t		padding0[2]; +	/* 'sgtl' (since v1.1) */ +	uint8_t		signature2[4]; +	/* Image generation date, in microseconds since 1.1.2000 . */ +	uint64_t	timestamp_us; +	/* Product version. */ +	struct sb_boot_image_version +			product_version; +	/* Component version. */ +	struct sb_boot_image_version +			component_version; +	/* Drive tag for the system drive. (since v1.1) */ +	uint16_t	drive_tag; +	/* Padding. */ +	uint8_t		padding1[6]; +}; + +#define	SB_VERSION_MAJOR	1 +#define	SB_VERSION_MINOR	1 + +/* Enable to HTLLC verbose boot report. */ +#define SB_IMAGE_FLAG_VERBOSE	(1 << 0) + +struct sb_key_dictionary_key { +	/* The CBC-MAC of image and sections header. */ +	uint8_t		cbc_mac[SB_BLOCK_SIZE]; +	/* The AES key encrypted by image key (zero). */ +	uint8_t		key[SB_BLOCK_SIZE]; +}; + +struct sb_ivt_header { +	uint32_t	header; +	uint32_t	entry; +	uint32_t	reserved1; +	uint32_t	dcd; +	uint32_t	boot_data; +	uint32_t	self; +	uint32_t	csf; +	uint32_t	reserved2; +}; + +#define	SB_HAB_IVT_TAG			0xd1UL +#define	SB_HAB_DCD_TAG			0xd2UL + +#define	SB_HAB_VERSION			0x40UL + +/* + * The "size" field in the IVT header is not naturally aligned, + * use this macro to fill first 4 bytes of the IVT header without + * causing issues on some systems (esp. M68k, PPC, MIPS-BE, ARM-BE). + */ +static inline uint32_t sb_hab_ivt_header(void) +{ +	uint32_t ret = 0; +	ret |= SB_HAB_IVT_TAG << 24; +	ret |= sizeof(struct sb_ivt_header) << 16; +	ret |= SB_HAB_VERSION; +	return htonl(ret); +} + +struct sb_sections_header { +	/* Section number. */ +	uint32_t	section_number; +	/* Offset of this sections first instruction after "TAG". */ +	uint32_t	section_offset; +	/* Size of the section in 16b blocks. */ +	uint32_t	section_size; +	/* Section flags. */ +	uint32_t	section_flags; +}; + +#define	SB_SECTION_FLAG_BOOTABLE	(1 << 0) + +struct sb_command { +	struct { +		uint8_t		checksum; +		uint8_t		tag; +		uint16_t	flags; +#define ROM_TAG_CMD_FLAG_ROM_LAST_TAG	0x1 +#define ROM_LOAD_CMD_FLAG_DCD_LOAD	0x1	/* MX28 only */ +#define ROM_JUMP_CMD_FLAG_HAB		0x1	/* MX28 only */ +#define ROM_CALL_CMD_FLAG_HAB		0x1	/* MX28 only */ +	} header; + +	union { +	struct { +		uint32_t	reserved[3]; +	} nop; +	struct { +		uint32_t	section_number; +		uint32_t	section_length; +		uint32_t	section_flags; +	} tag; +	struct { +		uint32_t	address; +		uint32_t	count; +		uint32_t	crc32; +	} load; +	struct { +		uint32_t	address; +		uint32_t	count; +		uint32_t	pattern; +	} fill; +	struct { +		uint32_t	address; +		uint32_t	reserved; +		/* Passed in register r0 before JUMP */ +		uint32_t	argument; +	} jump; +	struct { +		uint32_t	address; +		uint32_t	reserved; +		/* Passed in register r0 before CALL */ +		uint32_t	argument; +	} call; +	struct { +		uint32_t	reserved1; +		uint32_t	reserved2; +		uint32_t	mode; +	} mode; + +	}; +}; + +/* + * Most of the mode names are same or at least similar + * on i.MX23 and i.MX28, but some of the mode names + * differ. The "name" field represents the mode name + * on i.MX28 as seen in Table 12-2 of the datasheet. + * The "altname" field represents the differently named + * fields on i.MX23 as seen in Table 35-3 of the + * datasheet. + */ +static const struct { +	const char	*name; +	const char	*altname; +	const uint8_t	mode; +} modetable[] = { +	{ "USB",		NULL,		0x00 }, +	{ "I2C",		NULL,		0x01 }, +	{ "SPI2_FLASH",		"SPI1_FLASH",	0x02 }, +	{ "SPI3_FLASH",		"SPI2_FLASH",	0x03 }, +	{ "NAND_BCH",		NULL,		0x04 }, +	{ "JTAG",		NULL,		0x06 }, +	{ "SPI3_EEPROM",	"SPI2_EEPROM",	0x08 }, +	{ "SD_SSP0",		NULL,		0x09 }, +	{ "SD_SSP1",		NULL,		0x0A } +}; + +enum sb_tag { +	ROM_NOP_CMD	= 0x00, +	ROM_TAG_CMD	= 0x01, +	ROM_LOAD_CMD	= 0x02, +	ROM_FILL_CMD	= 0x03, +	ROM_JUMP_CMD	= 0x04, +	ROM_CALL_CMD	= 0x05, +	ROM_MODE_CMD	= 0x06 +}; + +struct sb_source_entry { +	uint8_t		tag; +	uint32_t	address; +	uint32_t	flags; +	char		*filename; +}; + +#endif	/* __MXSSB_H__ */ |