obj-$(CONFIG_SOFT_I2C_MULTI_BUS) += multi_i2c.o
obj-$(CONFIG_USBDOWNLOAD_GADGET) += gadget.o
obj-$(CONFIG_MISC_COMMON) += misc.o
+obj-$(CONFIG_SIG) += sig_header.o
ifndef CONFIG_SPL_BUILD
obj-$(CONFIG_BOARD_COMMON) += board.o
--- /dev/null
+#include <common.h>
+#include <samsung/sighdr.h>
+
+//static struct sig_header *
+
+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) {
+ printf("no sign found\n");
+ debug("can't found signature\n");
+ return 1;
+ }
+
+ 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 (strcmp(fname, "u-boot-mmc.bin"))
+ return 0;
+
+ /* can't found signature in target - download continue */
+ ret = get_image_signature(&bh_target, (phys_addr_t)CONFIG_SYS_TEXT_BASE,
+ size);
+ if (ret)
+ return 0;
+
+ /* can't found signature in address - download stop */
+ ret = get_image_signature(&bh_addr, dn_addr, size);
+ if (ret)
+ return -1;
+
+ if (strncmp(bh_target.bd_name, bh_addr.bd_name,
+ ARRAY_SIZE(bh_target.bd_name))) {
+ debug("board name Inconsistency\n");
+ return -1;
+ }
+
+ debug("board signature check OK\n");
+
+ return 0;
+}
#include <linux/usb/cdc.h>
#include <g_dnl.h>
#include <dfu.h>
+#include <samsung/sighdr.h>
#include <libtizen.h>
#include <samsung/misc.h>
#include <linux/input.h>
debug("%s: left: %llu cnt: %d\n", __func__, left, cnt);
+#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) {
+ printf("Wrong board signature in file: %s.\n", f_name);
+ 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)
+
+/* 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