Skip to content

Commit

Permalink
firmware-utils: Add support for the Cisco Meraki MX60/MX60W
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
riptidewave93 authored and blogic committed Nov 21, 2016
1 parent ffd7c15 commit a72e169
Showing 1 changed file with 58 additions and 11 deletions.
69 changes: 58 additions & 11 deletions tools/firmware-utils/src/mkmerakifw.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};
Expand All @@ -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,
Expand All @@ -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 */
}
};
Expand Down Expand Up @@ -237,18 +272,30 @@ 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);
writel(buf, HDR_OFF_IMAGELEN, klen);

/* 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");
Expand Down

0 comments on commit a72e169

Please sign in to comment.