package: mtd: use in-kernel bcm63xx image tag header

Use the image tag header from the kernel instead of an external header
file.

SVN-Revision: 33654
This commit is contained in:
Jonas Gorski 2012-10-08 09:59:47 +00:00
parent f16ea6be3f
commit dd81dc48dd
3 changed files with 30 additions and 30 deletions

View file

@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=mtd PKG_NAME:=mtd
PKG_RELEASE:=18 PKG_RELEASE:=19
PKG_BUILD_DIR := $(KERNEL_BUILD_DIR)/$(PKG_NAME) PKG_BUILD_DIR := $(KERNEL_BUILD_DIR)/$(PKG_NAME)
STAMP_PREPARED := $(STAMP_PREPARED)_$(call confvar,CONFIG_MTD_REDBOOT_PARTS) STAMP_PREPARED := $(STAMP_PREPARED)_$(call confvar,CONFIG_MTD_REDBOOT_PARTS)

View file

@ -1 +0,0 @@
../../../target/linux/brcm63xx/files/arch/mips/include/asm/mach-bcm63xx/bcm_tag.h

View file

@ -32,9 +32,10 @@
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <mtd/mtd-user.h> #include <mtd/mtd-user.h>
#include <../arch/mips/include/asm/mach-bcm63xx/bcm963xx_tag.h>
#include "mtd.h" #include "mtd.h"
#include "crc32.h" #include "crc32.h"
#include "bcm_tag.h"
ssize_t pread(int fd, void *buf, size_t count, off_t offset); ssize_t pread(int fd, void *buf, size_t count, off_t offset);
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset); ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
@ -112,28 +113,28 @@ trx_fixup(int fd, const char *name)
tag = (struct bcm_tag *) (ptr); tag = (struct bcm_tag *) (ptr);
cfelen = strntoul(&tag->cfeLength[0], NULL, 10, IMAGE_LEN); cfelen = strntoul(&tag->cfe_length[0], NULL, 10, IMAGE_LEN);
if (cfelen) { if (cfelen) {
fprintf(stderr, "Non-zero CFE length. This is currently unsupported.\n"); fprintf(stderr, "Non-zero CFE length. This is currently unsupported.\n");
exit(1); exit(1);
} }
headercrc = compute_crc32(CRC_START, offset, offsetof(struct bcm_tag, headerCRC), fd); headercrc = compute_crc32(CRC_START, offset, offsetof(struct bcm_tag, header_crc), fd);
if (headercrc != *(uint32_t *)(&tag->headerCRC[0])) { if (headercrc != *(uint32_t *)(&tag->header_crc)) {
fprintf(stderr, "Tag verify failed. This may not be a valid image.\n"); fprintf(stderr, "Tag verify failed. This may not be a valid image.\n");
exit(1); exit(1);
} }
sprintf(&tag->flashRootLength[0], "%lu", 0); sprintf(&tag->root_length[0], "%u", 0);
strncpy(&tag->totalLength[0], &tag->kernelLength[0], IMAGE_LEN); strncpy(&tag->total_length[0], &tag->kernel_length[0], IMAGE_LEN);
imagestart = sizeof(tag); imagestart = sizeof(tag);
memcpy(&tag->imageCRC[0], &tag->kernelCRC[0], CRC_LEN); memcpy(&tag->image_crc, &tag->kernel_crc, sizeof(uint32_t));
memcpy(&tag->fskernelCRC[0], &tag->kernelCRC[0], CRC_LEN); memcpy(&tag->fskernel_crc, &tag->kernel_crc, sizeof(uint32_t));
rootfscrc = CRC_START; rootfscrc = CRC_START;
memcpy(&tag->rootfsCRC[0], &rootfscrc, sizeof(uint32_t)); memcpy(&tag->rootfs_crc, &rootfscrc, sizeof(uint32_t));
headercrc = crc32(CRC_START, tag, offsetof(struct bcm_tag, headerCRC)); headercrc = crc32(CRC_START, tag, offsetof(struct bcm_tag, header_crc));
memcpy(&tag->headerCRC[0], &headercrc, sizeof(uint32_t)); memcpy(&tag->header_crc, &headercrc, sizeof(uint32_t));
msync(ptr, sizeof(struct bcm_tag), MS_SYNC|MS_INVALIDATE); msync(ptr, sizeof(struct bcm_tag), MS_SYNC|MS_INVALIDATE);
munmap(ptr, len); munmap(ptr, len);
@ -164,12 +165,12 @@ trx_check(int imagefd, const char *mtd, char *buf, int *len)
fprintf(stdout, "Could not get image header, file too small (%d bytes)\n", *len); fprintf(stdout, "Could not get image header, file too small (%d bytes)\n", *len);
return 0; return 0;
} }
headerCRC = crc32buf(buf, offsetof(struct bcm_tag, headerCRC)); headerCRC = crc32buf(buf, offsetof(struct bcm_tag, header_crc));
if (*(uint32_t *)(&tag->headerCRC[0]) != headerCRC) { if (*(uint32_t *)(&tag->header_crc) != headerCRC) {
if (quiet < 2) { if (quiet < 2) {
fprintf(stderr, "Bad header CRC got %08lx, calculated %08lx\n", fprintf(stderr, "Bad header CRC got %08x, calculated %08x\n",
*(uint32_t *)(&tag->headerCRC[0]), headerCRC); *(uint32_t *)(&tag->header_crc), headerCRC);
fprintf(stderr, "This is not the correct file format; refusing to flash.\n" fprintf(stderr, "This is not the correct file format; refusing to flash.\n"
"Please specify the correct file or use -f to force.\n"); "Please specify the correct file or use -f to force.\n");
} }
@ -183,7 +184,7 @@ trx_check(int imagefd, const char *mtd, char *buf, int *len)
exit(1); exit(1);
} }
imageLen = strntoul(&tag->totalLength[0], NULL, 10, IMAGE_LEN); imageLen = strntoul(&tag->total_length[0], NULL, 10, IMAGE_LEN);
if(mtdsize < imageLen) { if(mtdsize < imageLen) {
fprintf(stderr, "Image too big for partition: %s\n", mtd); fprintf(stderr, "Image too big for partition: %s\n", mtd);
@ -238,7 +239,7 @@ mtd_fixtrx(const char *mtd, size_t offset)
tag = (struct bcm_tag *) (buf + offset); tag = (struct bcm_tag *) (buf + offset);
cfelen = strntoul(&tag->cfeLength[0], NULL, 10, IMAGE_LEN); cfelen = strntoul(tag->cfe_length, NULL, 10, IMAGE_LEN);
if (cfelen) { if (cfelen) {
fprintf(stderr, "Non-zero CFE length. This is currently unsupported.\n"); fprintf(stderr, "Non-zero CFE length. This is currently unsupported.\n");
exit(1); exit(1);
@ -248,8 +249,8 @@ mtd_fixtrx(const char *mtd, size_t offset)
fprintf(stderr, "Verifying we actually have an imagetag.\n"); fprintf(stderr, "Verifying we actually have an imagetag.\n");
} }
headercrc = compute_crc32(CRC_START, offset, offsetof(struct bcm_tag, headerCRC), fd); headercrc = compute_crc32(CRC_START, offset, offsetof(struct bcm_tag, header_crc), fd);
if (headercrc != *(uint32_t *)(&tag->headerCRC[0])) { if (headercrc != *(uint32_t *)(&tag->header_crc)) {
fprintf(stderr, "Tag verify failed. This may not be a valid image.\n"); fprintf(stderr, "Tag verify failed. This may not be a valid image.\n");
exit(1); exit(1);
} }
@ -258,7 +259,7 @@ mtd_fixtrx(const char *mtd, size_t offset)
fprintf(stderr, "Checking current fixed status.\n"); fprintf(stderr, "Checking current fixed status.\n");
} }
rootfslen = strntoul(&tag->flashRootLength[0], NULL, 10, IMAGE_LEN); rootfslen = strntoul(&tag->root_length[0], NULL, 10, IMAGE_LEN);
if (rootfslen == 0) { if (rootfslen == 0) {
if (quiet < 2) if (quiet < 2)
fprintf(stderr, "Header already fixed, exiting\n"); fprintf(stderr, "Header already fixed, exiting\n");
@ -270,20 +271,20 @@ mtd_fixtrx(const char *mtd, size_t offset)
fprintf(stderr, "Setting root length to 0.\n"); fprintf(stderr, "Setting root length to 0.\n");
} }
sprintf(&tag->flashRootLength[0], "%lu", 0); sprintf(&tag->root_length[0], "%u", 0);
strncpy(&tag->totalLength[0], &tag->kernelLength[0], IMAGE_LEN); strncpy(&tag->total_length[0], &tag->kernel_length[0], IMAGE_LEN);
if (quiet < 2) { if (quiet < 2) {
fprintf(stderr, "Recalculating CRCs.\n"); fprintf(stderr, "Recalculating CRCs.\n");
} }
imagestart = sizeof(tag); imagestart = sizeof(tag);
memcpy(&tag->imageCRC[0], &tag->kernelCRC[0], CRC_LEN); memcpy(&tag->image_crc, &tag->kernel_crc, sizeof(uint32_t));
memcpy(&tag->fskernelCRC[0], &tag->kernelCRC[0], CRC_LEN); memcpy(&tag->fskernel_crc, &tag->kernel_crc, sizeof(uint32_t));
rootfscrc = CRC_START; rootfscrc = CRC_START;
memcpy(&tag->rootfsCRC[0], &rootfscrc, sizeof(uint32_t)); memcpy(&tag->rootfs_crc, &rootfscrc, sizeof(uint32_t));
headercrc = crc32(CRC_START, tag, offsetof(struct bcm_tag, headerCRC)); headercrc = crc32(CRC_START, tag, offsetof(struct bcm_tag, header_crc));
memcpy(&tag->headerCRC[0], &headercrc, sizeof(uint32_t)); memcpy(&tag->header_crc, &headercrc, sizeof(uint32_t));
if (quiet < 2) { if (quiet < 2) {
fprintf(stderr, "Erasing imagetag block\n"); fprintf(stderr, "Erasing imagetag block\n");
@ -296,7 +297,7 @@ mtd_fixtrx(const char *mtd, size_t offset)
if (quiet < 2) { if (quiet < 2) {
fprintf(stderr, "New image crc32: 0x%x, rewriting block\n", fprintf(stderr, "New image crc32: 0x%x, rewriting block\n",
*(uint32_t *)(&tag->imageCRC[0])); *(uint32_t *)(&tag->image_crc));
fprintf(stderr, "New header crc32: 0x%x, rewriting block\n", headercrc); fprintf(stderr, "New header crc32: 0x%x, rewriting block\n", headercrc);
} }