firmware-utils: Add support for the Cisco Meraki MX60/MX60W
This patch adds header support for the Cisco Meraki MX60/MX60W, which are a part of the apm821xx target. Some structure changes were needed due to the fact this device uses U-Boot (unlike other devices in mkmerakifw.c) which uses a different header structure to define the load offsets for the image. A thanks to Christian for helping implement this properly. Cc: Christian Lamparter <chunkeey@gmail.com> Signed-off-by: Chris Blake <chrisrblake93@gmail.com>
This commit is contained in:
		
							parent
							
								
									ffd7c15500
								
							
						
					
					
						commit
						a72e1692b8
					
				| @ -32,13 +32,27 @@ | ||||
| #define HDR_OFF_IMAGELEN	8 | ||||
| #define HDR_OFF_CHECKSUM	12 | ||||
| #define HDR_OFF_MAGIC2		32 | ||||
| #define HDR_OFF_FILLER		36 | ||||
| #define HDR_OFF_MAGIC3		36 | ||||
| #define HDR_OFF_STATICHASH	40 | ||||
| #define HDR_OFF_KERNEL_OFFSET	40 | ||||
| #define HDR_OFF_RAMDISK_OFFSET	44 | ||||
| #define HDR_OFF_FDT_OFFSET	48 | ||||
| #define HDR_OFF_UNKNOWN_OFFSET	52 | ||||
| 
 | ||||
| struct board_info { | ||||
| 	uint32_t magic; | ||||
| 	uint32_t magic1; | ||||
| 	uint32_t magic2; | ||||
| 	uint32_t magic3; | ||||
| 	uint32_t imagelen; | ||||
| 	unsigned char statichash[20]; | ||||
| 	union { | ||||
| 		unsigned char statichash[20]; | ||||
| 		struct { | ||||
| 			uint32_t kernel_offset; | ||||
| 			uint32_t ramdisk_offset; | ||||
| 			uint32_t fdt_offset; | ||||
| 			uint32_t unknown_offset; | ||||
| 		} mx60; | ||||
| 	}; | ||||
| 	char *id; | ||||
| 	char *description; | ||||
| }; | ||||
| @ -55,7 +69,8 @@ static const struct board_info boards[] = { | ||||
| 	{ | ||||
| 		.id		= "mr18", | ||||
| 		.description	= "Meraki MR18 Access Point", | ||||
| 		.magic		= 0x8e73ed8a, | ||||
| 		.magic1		= 0x8e73ed8a, | ||||
| 		.magic2		= 0x8e73ed8a, | ||||
| 		.imagelen	= 0x00800000, | ||||
| 		.statichash	= {0xda, 0x39, 0xa3, 0xee, 0x5e, | ||||
| 				   0x6b, 0x4b, 0x0d, 0x32, 0x55, | ||||
| @ -64,14 +79,34 @@ static const struct board_info boards[] = { | ||||
| 	}, { | ||||
| 		.id		= "mr24", | ||||
| 		.description	= "Meraki MR24 Access Point", | ||||
| 		.magic		= 0x8e73ed8a, | ||||
| 		.magic1		= 0x8e73ed8a, | ||||
| 		.magic2		= 0x8e73ed8a, | ||||
| 		.imagelen	= 0x00800000, | ||||
| 		.statichash	= {0xff, 0xff, 0xff, 0xff, 0xff, | ||||
| 				   0xff, 0xff, 0xff, 0xff, 0xff, | ||||
| 				   0xff, 0xff, 0xff, 0xff, 0xff, | ||||
| 				   0xff, 0xff, 0xff, 0xff, 0xff}, | ||||
| 	}, { | ||||
| 
 | ||||
| 		.id		= "mx60", | ||||
| 		.description	= "Meraki MX60/MX60W Security Appliance", | ||||
| 		.magic1		= 0x8e73ed8a, | ||||
| 		.magic2		= 0xa1f0beef, /* Enables use of load addr in statichash */ | ||||
| 		.magic3		= 0x00060001, /* This goes along with magic2 */ | ||||
| 		.imagelen	= 0x3fd00000, | ||||
| 		/* The static hash below does the following:
 | ||||
| 		 * 1st Row: Kernel Offset | ||||
| 		 * 2nd Row: Ramdisk Offset | ||||
| 		 * 3rd Row: FDT Offset | ||||
| 		 * 4th Row: ? Unused/Unknown ? | ||||
| 		 * 5th Row: ? Unused/Unknown ? | ||||
| 		 */ | ||||
| 		.mx60		= { | ||||
| 			.kernel_offset	= 0x10000, | ||||
| 			.ramdisk_offset	= 0x3FFC00, | ||||
| 			.fdt_offset	= 0x0400, | ||||
| 			.unknown_offset	= 0x0400, | ||||
| 		}, | ||||
| 	}, { | ||||
| 		/* terminating entry */ | ||||
| 	} | ||||
| }; | ||||
| @ -237,10 +272,10 @@ int main(int argc, char *argv[]) | ||||
| 	kernel = buf + HDR_LENGTH; | ||||
| 	fread(kernel, klen, 1, in); | ||||
| 
 | ||||
| 	/* Write magic values and filler */ | ||||
| 	writel(buf, HDR_OFF_MAGIC1, board->magic); | ||||
| 	writel(buf, HDR_OFF_MAGIC2, board->magic); | ||||
| 	writel(buf, HDR_OFF_FILLER, 0); | ||||
| 	/* Write magic values */ | ||||
| 	writel(buf, HDR_OFF_MAGIC1, board->magic1); | ||||
| 	writel(buf, HDR_OFF_MAGIC2, board->magic2); | ||||
| 	writel(buf, HDR_OFF_MAGIC3, board->magic3); | ||||
| 
 | ||||
| 	/* Write header and image length */ | ||||
| 	writel(buf, HDR_OFF_HDRLEN, HDR_LENGTH); | ||||
| @ -248,7 +283,19 @@ int main(int argc, char *argv[]) | ||||
| 
 | ||||
| 	/* Write checksum and static hash */ | ||||
| 	sha1_csum(kernel, klen, buf + HDR_OFF_CHECKSUM); | ||||
| 	memcpy(buf + HDR_OFF_STATICHASH, board->statichash, 20); | ||||
| 
 | ||||
| 	switch (board->magic2) { | ||||
| 	case 0xa1f0beef: | ||||
| 		writel(buf, HDR_OFF_KERNEL_OFFSET, board->mx60.kernel_offset); | ||||
| 		writel(buf, HDR_OFF_RAMDISK_OFFSET, board->mx60.ramdisk_offset); | ||||
| 		writel(buf, HDR_OFF_FDT_OFFSET, board->mx60.fdt_offset), | ||||
| 		writel(buf, HDR_OFF_UNKNOWN_OFFSET, board->mx60.unknown_offset); | ||||
| 		break; | ||||
| 
 | ||||
| 	case 0x8e73ed8a: | ||||
| 		memcpy(buf + HDR_OFF_STATICHASH, board->statichash, 20); | ||||
| 		break; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Save finished image */ | ||||
| 	out = fopen(ofname, "w"); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user