--- /dev/null
+#include <common.h>
+#include <errno.h>
+#include <samsung/sighdr.h>
+
+static int get_image_signature(struct sig_header *hdr,
+ phys_addr_t base_addr,
+ phys_size_t size)
+{
+ memcpy((void *)hdr, (const void *)(base_addr + size - HDR_SIZE),
+ HDR_SIZE);
+
+ if (hdr->magic != HDR_BOOT_MAGIC)
+ return -EFAULT;
+
+ return 0;
+}
+
+int check_board_signature(char *fname, phys_addr_t dn_addr, phys_size_t size)
+{
+ struct sig_header bh_target;
+ struct sig_header bh_addr;
+ int ret;
+
+ /* u-boot-mmc.bin */
+ if (strncmp(fname, "u-boot-mmc.bin", 14))
+ return 0;
+
+ /* can't found signature in target - download continue */
+ ret = get_image_signature(&bh_target, (phys_addr_t)CONFIG_SYS_TEXT_BASE,
+ CONFIG_SIG_IMAGE_SIZE);
+ if (ret)
+ return 0;
+
+ printf("U-Boot signature: \"%.*s\"\n", 16, bh_target.bd_name);
+
+ if (size != CONFIG_SIG_IMAGE_SIZE) {
+ printf("Bad file size for: %s.\n", fname);
+ printf("Expected: %#x bytes, has: %#x bytes.\n",
+ CONFIG_SIG_IMAGE_SIZE, (unsigned)size);
+ return -EINVAL;
+ }
+ printf("%s ", fname);
+ /* can't found signature in address - download stop */
+ ret = get_image_signature(&bh_addr, dn_addr, CONFIG_SIG_IMAGE_SIZE);
+ if (ret) {
+ printf("signature not found.\n");
+ return -EFAULT;
+ }
+ printf("signature: \"%.*s\". ", 16, bh_addr.bd_name);
+
+ if (strncmp(bh_target.bd_name, bh_addr.bd_name,
+ ARRAY_SIZE(bh_target.bd_name))) {
+ printf("Invalid!\n");
+ return -EPERM;
+ }
+
+ printf("OK!\n");
+ return 0;
+}
#include <linux/usb/gadget.h>
#include <linux/usb/composite.h>
#include <linux/usb/cdc.h>
+#include <samsung/sighdr.h>
#include <g_dnl.h>
#include <dfu.h>
return -ENXIO;
}
+#ifdef CONFIG_SIG
+ /* check board signature when download u-boot-mmc.bin */
+ ret = check_board_signature(f_name, (phys_addr_t)transfer_buffer,
+ (phys_size_t)thor_file_size);
+ if (ret)
+ return ret;
+#endif
+
if (left) {
ret = dfu_write(dfu_entity, transfer_buffer, left, cnt++);
if (ret) {
--- /dev/null
+#ifndef __HEADER_H__
+#define __HEADER_H__
+
+#define HDR_BOOT_MAGIC 0x744f6f42 /* BoOt */
+
+#define HDR_SIZE sizeof(struct sig_header)
+
+/* Size of u-boot-mmc.bin - should be always padded to 1MB */
+#define CONFIG_SIG_IMAGE_SIZE SZ_1M
+
+/* HDR_SIZE - 512 */
+struct sig_header {
+ uint32_t magic; /* image magic number */
+ uint32_t size; /* image data size */
+ uint32_t valid; /* valid flag */
+ char date[12]; /* image creation timestamp - YYMMDDHH */
+ char version[24]; /* image version */
+ char bd_name[16]; /* target board name */
+ char reserved[448]; /* reserved */
+};
+
+int check_board_signature(char *fname, phys_addr_t dn_addr, phys_size_t size);
+#endif