Эх сурвалжийг харах

Include new ivt entry without DCD table

Vybrid's u-boot updater don't have DCD table on its IVT entry.
Set to NULL dcd_ptr under vybrid configuration.
Alejandro Sierra 11 жил өмнө
parent
commit
5df88a90f9

+ 1 - 1
board/freescale/vf610twr/imximage.cfg

@@ -27,7 +27,7 @@
 #include <asm/imx-common/imximage.cfg>
 
 /* image version */
-IMAGE_VERSION	2
+IMAGE_VERSION	3
 
 /* Boot Offset 0x400, valid for both SD and NAND boot */
 BOOT_OFFSET	FLASH_OFFSET_STANDARD

+ 32 - 1
tools/imximage.c

@@ -63,6 +63,7 @@ static table_entry_t imximage_bootops[] = {
 static table_entry_t imximage_versions[] = {
 	{IMXIMAGE_V1,	"",	" (i.MX25/35/51 compatible)", },
 	{IMXIMAGE_V2,	"",	" (i.MX53/6 compatible)",     },
+	{IMXIMAGE_V3,   "",     " (Vybrid no DCD compatible)",},
 	{-1,            "",     " (Invalid)",                 },
 };
 
@@ -237,7 +238,6 @@ static void set_imx_hdr_v2(struct imx_header *imxhdr, uint32_t dcd_len,
 	fhdr_v2->entry = entry_point;
 	fhdr_v2->reserved1 = fhdr_v2->reserved2 = 0;
 	fhdr_v2->self = hdr_base = entry_point - sizeof(struct imx_header);
-
 	fhdr_v2->dcd_ptr = hdr_base + offsetof(imx_header_v2_t, dcd_table);
 	fhdr_v2->boot_data_ptr = hdr_base
 			+ offsetof(imx_header_v2_t, boot_data);
@@ -247,6 +247,30 @@ static void set_imx_hdr_v2(struct imx_header *imxhdr, uint32_t dcd_len,
 	fhdr_v2->csf = 0;
 	header_size_ptr = &hdr_v2->boot_data.size;
 }
+static void set_imx_hdr_v3(struct imx_header *imxhdr, uint32_t dcd_len,
+		uint32_t entry_point, uint32_t flash_offset)
+{
+	imx_header_v2_t *hdr_v2 = &imxhdr->header.hdr_v2;
+	flash_header_v2_t *fhdr_v2 = &hdr_v2->fhdr;
+	uint32_t hdr_base;
+
+	/* Set magic number */
+	fhdr_v2->header.tag = IVT_HEADER_TAG; /* 0xD1 */
+	fhdr_v2->header.length = cpu_to_be16(sizeof(flash_header_v2_t));
+	fhdr_v2->header.version = IVT_VERSION; /* 0x40 */
+
+	fhdr_v2->entry = entry_point;
+	fhdr_v2->reserved1 = fhdr_v2->reserved2 = 0;
+	fhdr_v2->self = hdr_base = entry_point - sizeof(struct imx_header);
+	fhdr_v2->dcd_ptr = 0x00000000;
+	fhdr_v2->boot_data_ptr = hdr_base
+			+ offsetof(imx_header_v2_t, boot_data);
+	hdr_v2->boot_data.start = hdr_base - flash_offset;
+
+	/* Security feature are not supported */
+	fhdr_v2->csf = 0;
+	header_size_ptr = &hdr_v2->boot_data.size;
+}
 
 static void set_hdr_func(struct imx_header *imxhdr)
 {
@@ -263,6 +287,12 @@ static void set_hdr_func(struct imx_header *imxhdr)
 		set_imx_hdr = set_imx_hdr_v2;
 		max_dcd_entries = MAX_HW_CFG_SIZE_V2;
 		break;
+        case IMXIMAGE_V3:
+                set_dcd_val = set_dcd_val_v2;
+                set_dcd_rst = set_dcd_rst_v2;
+                set_imx_hdr = set_imx_hdr_v3;
+                max_dcd_entries = MAX_HW_CFG_SIZE_V2;
+                break;
 	default:
 		err_imximage_version(imximage_version);
 		break;
@@ -492,6 +522,7 @@ static void imximage_print_header(const void *ptr)
 		print_hdr_v1(imx_hdr);
 		break;
 	case IMXIMAGE_V2:
+	case IMXIMAGE_V3:
 		print_hdr_v2(imx_hdr);
 		break;
 	default:

+ 2 - 1
tools/imximage.h

@@ -72,7 +72,8 @@ enum imximage_fld_types {
 enum imximage_version {
 	IMXIMAGE_VER_INVALID = -1,
 	IMXIMAGE_V1 = 1,
-	IMXIMAGE_V2
+	IMXIMAGE_V2,
+	IMXIMAGE_V3
 };
 
 typedef struct {