summaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2016-01-25 13:24:35 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2016-02-02 15:41:04 +0100
commitbe6b5cf74ccb6e4855f2f143c0ad55b89ce4097f (patch)
tree7ed0edfc1f682a25c8b6dd17306016b845007157 /scripts
parent24315db71747792e47f1b4da771f5d6954bdea2f (diff)
downloadbarebox-be6b5cf74ccb6e4855f2f143c0ad55b89ce4097f.tar.gz
barebox-be6b5cf74ccb6e4855f2f143c0ad55b89ce4097f.tar.xz
scripts: imx: Consolidate flash headers in imx tools
Both imx-image and imx-usb-loader use their own variants of the i.MX flash header definitions. Consolidate them to avoid code duplication. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'scripts')
-rw-r--r--scripts/imx/imx-image.c49
-rw-r--r--scripts/imx/imx-usb-loader.c89
-rw-r--r--scripts/imx/imx.h52
3 files changed, 84 insertions, 106 deletions
diff --git a/scripts/imx/imx-image.c b/scripts/imx/imx-image.c
index 788fa81a7e..162e710ed9 100644
--- a/scripts/imx/imx-image.c
+++ b/scripts/imx/imx-image.c
@@ -27,6 +27,9 @@
#include <fcntl.h>
#include <endian.h>
#include <linux/kernel.h>
+
+#include "imx.h"
+
#include <include/filetype.h>
#define MAX_DCD 1024
@@ -47,20 +50,8 @@ static int prepare_sign;
* i.MX flash header v1 handling. Found on i.MX35 and i.MX51
* ============================================================================
*/
-struct imx_flash_header {
- uint32_t app_code_jump_vector;
- uint32_t app_code_barker;
- uint32_t app_code_csf;
- uint32_t dcd_ptr_ptr;
- uint32_t super_root_key;
- uint32_t dcd;
- uint32_t app_dest;
- uint32_t dcd_barker;
- uint32_t dcd_block_len;
-} __attribute__((packed));
#define FLASH_HEADER_OFFSET 0x400
-#define DCD_BARKER 0xb17219e9
static uint32_t bb_header[] = {
0xea0003fe, /* b 0x1000 */
@@ -140,40 +131,6 @@ static int write_mem_v1(uint32_t addr, uint32_t val, int width)
* ============================================================================
*/
-struct imx_boot_data {
- uint32_t start;
- uint32_t size;
- uint32_t plugin;
-} __attribute__((packed));
-
-#define TAG_IVT_HEADER 0xd1
-#define IVT_VERSION 0x40
-#define TAG_DCD_HEADER 0xd2
-#define DCD_VERSION 0x40
-#define TAG_WRITE 0xcc
-#define TAG_CHECK 0xcf
-
-struct imx_ivt_header {
- uint8_t tag;
- uint16_t length;
- uint8_t version;
-} __attribute__((packed));
-
-struct imx_flash_header_v2 {
- struct imx_ivt_header header;
-
- uint32_t entry;
- uint32_t reserved1;
- uint32_t dcd_ptr;
- uint32_t boot_data_ptr;
- uint32_t self;
- uint32_t csf;
- uint32_t reserved2;
-
- struct imx_boot_data boot_data;
- struct imx_ivt_header dcd_header;
-} __attribute__((packed));
-
static int add_header_v2(void *buf, int offset, uint32_t loadaddr, uint32_t imagesize)
{
struct imx_flash_header_v2 *hdr;
diff --git a/scripts/imx/imx-usb-loader.c b/scripts/imx/imx-usb-loader.c
index dae49a132e..a398386a9e 100644
--- a/scripts/imx/imx-usb-loader.c
+++ b/scripts/imx/imx-usb-loader.c
@@ -34,6 +34,8 @@
#include <getopt.h>
#include <linux/kernel.h>
+#include "imx.h"
+
#define get_min(a, b) (((a) < (b)) ? (a) : (b))
#define FT_APP 0xaa
@@ -404,39 +406,6 @@ int do_status(libusb_device_handle *h, struct usb_id *p_id)
return err;
}
-struct boot_data {
- uint32_t dest;
- uint32_t image_len;
- uint32_t plugin;
-};
-
-struct imx_flash_header_v2 {
-#define IVT_BARKER 0x402000d1
- uint32_t barker;
- uint32_t start_addr;
- uint32_t reserv1;
- uint32_t dcd_ptr;
- uint32_t boot_data_ptr; /* struct boot_data * */
- uint32_t self_ptr; /* struct imx_flash_header_v2 *, this - boot_data.start = offset linked at */
- uint32_t app_code_csf;
- uint32_t reserv2;
-};
-
-/*
- * MX51 header type
- */
-struct imx_flash_header_v1 {
- uint32_t app_start_addr;
-#define APP_BARKER 0xb1
-#define DCD_BARKER 0xb17219e9
- uint32_t app_barker;
- uint32_t csf_ptr;
- uint32_t dcd_ptr_ptr;
- uint32_t srk_ptr;
- uint32_t dcd_ptr;
- uint32_t app_dest_ptr;
-};
-
#define V(a) (((a) >> 24) & 0xff), (((a) >> 16) & 0xff), (((a) >> 8) & 0xff), ((a) & 0xff)
static int read_memory(struct libusb_device_handle *h, struct usb_id *p_id,
@@ -676,13 +645,13 @@ static int write_dcd_table_ivt(struct libusb_device_handle *h, struct usb_id *p_
{
unsigned char *dcd_end;
unsigned m_length;
-#define cvt_dest_to_src (((unsigned char *)hdr) - hdr->self_ptr)
+#define cvt_dest_to_src (((unsigned char *)hdr) - hdr->self)
unsigned char* dcd;
unsigned char* file_end = file_start + cnt;
int err = 0;
if (!hdr->dcd_ptr) {
- printf("No dcd table, barker=%x\n", hdr->barker);
+ printf("No dcd table in this ivt\n");
return 0; /* nothing to do */
}
@@ -742,27 +711,27 @@ static int write_dcd_table_ivt(struct libusb_device_handle *h, struct usb_id *p_
return err;
}
-static int get_dcd_range_old(struct imx_flash_header_v1 *hdr,
+static int get_dcd_range_old(struct imx_flash_header *hdr,
unsigned char *file_start, unsigned cnt,
unsigned char **pstart, unsigned char **pend)
{
unsigned char *dcd_end;
unsigned m_length;
-#define cvt_dest_to_src_old (((unsigned char *)&hdr->dcd_ptr) - hdr->dcd_ptr_ptr)
+#define cvt_dest_to_src_old (((unsigned char *)&hdr->dcd) - hdr->dcd_ptr_ptr)
unsigned char* dcd;
unsigned val;
unsigned char* file_end = file_start + cnt;
- if (!hdr->dcd_ptr) {
- printf("No dcd table, barker=%x\n", hdr->app_barker);
- *pstart = *pend = ((unsigned char *)hdr) + sizeof(struct imx_flash_header_v1);
+ if (!hdr->dcd) {
+ printf("No dcd table, barker=%x\n", hdr->app_code_barker);
+ *pstart = *pend = ((unsigned char *)hdr) + sizeof(struct imx_flash_header);
return 0; /* nothing to do */
}
- dcd = hdr->dcd_ptr + cvt_dest_to_src_old;
+ dcd = hdr->dcd + cvt_dest_to_src_old;
if ((dcd < file_start) || ((dcd + 8) > file_end)) {
- printf("bad dcd_ptr %08x\n", hdr->dcd_ptr);
+ printf("bad dcd_ptr %08x\n", hdr->dcd);
return -1;
}
@@ -790,7 +759,7 @@ static int get_dcd_range_old(struct imx_flash_header_v1 *hdr,
}
static int write_dcd_table_old(struct libusb_device_handle *h, struct usb_id *p_id,
- struct imx_flash_header_v1 *hdr, unsigned char *file_start, unsigned cnt)
+ struct imx_flash_header *hdr, unsigned char *file_start, unsigned cnt)
{
unsigned val;
unsigned char *dcd_end;
@@ -876,16 +845,16 @@ err:
static int is_header(struct usb_id *p_id, unsigned char *p)
{
- struct imx_flash_header_v1 *ohdr = (struct imx_flash_header_v1 *)p;
+ struct imx_flash_header *ohdr = (struct imx_flash_header *)p;
struct imx_flash_header_v2 *hdr = (struct imx_flash_header_v2 *)p;
switch (p_id->mach_id->header_type) {
case HDR_MX51:
- if (ohdr->app_barker == 0xb1)
+ if (ohdr->app_code_barker == 0xb1)
return 1;
break;
case HDR_MX53:
- if (hdr->barker == IVT_BARKER)
+ if (hdr->header.tag == TAG_IVT_HEADER && hdr->header.version == IVT_VERSION)
return 1;
}
@@ -895,14 +864,14 @@ static int is_header(struct usb_id *p_id, unsigned char *p)
static int perform_dcd(struct libusb_device_handle *h, struct usb_id *p_id, unsigned char *p,
unsigned char *file_start, unsigned cnt)
{
- struct imx_flash_header_v1 *ohdr = (struct imx_flash_header_v1 *)p;
+ struct imx_flash_header *ohdr = (struct imx_flash_header *)p;
struct imx_flash_header_v2 *hdr = (struct imx_flash_header_v2 *)p;
int ret = 0;
switch (p_id->mach_id->header_type) {
case HDR_MX51:
ret = write_dcd_table_old(h, p_id, ohdr, file_start, cnt);
- ohdr->dcd_ptr = 0;
+ ohdr->dcd = 0;
break;
case HDR_MX53:
@@ -918,13 +887,13 @@ static int perform_dcd(struct libusb_device_handle *h, struct usb_id *p_id, unsi
static int clear_dcd_ptr(struct libusb_device_handle *h, struct usb_id *p_id,
unsigned char *p, unsigned char *file_start, unsigned cnt)
{
- struct imx_flash_header_v1 *ohdr = (struct imx_flash_header_v1 *)p;
+ struct imx_flash_header *ohdr = (struct imx_flash_header *)p;
struct imx_flash_header_v2 *hdr = (struct imx_flash_header_v2 *)p;
switch (p_id->mach_id->header_type) {
case HDR_MX51:
- printf("clear dcd_ptr=0x%08x\n", ohdr->dcd_ptr);
- ohdr->dcd_ptr = 0;
+ printf("clear dcd_ptr=0x%08x\n", ohdr->dcd);
+ ohdr->dcd = 0;
break;
case HDR_MX53:
printf("clear dcd_ptr=0x%08x\n", hdr->dcd_ptr);
@@ -942,13 +911,13 @@ static int get_dl_start(struct usb_id *p_id, unsigned char *p, unsigned char *fi
switch (p_id->mach_id->header_type) {
case HDR_MX51:
{
- struct imx_flash_header_v1 *ohdr = (struct imx_flash_header_v1 *)p;
+ struct imx_flash_header *ohdr = (struct imx_flash_header *)p;
unsigned char *dcd_end;
unsigned char* dcd;
int err = get_dcd_range_old(ohdr, file_start, cnt, &dcd, &dcd_end);
- *dladdr = ohdr->app_dest_ptr;
- *header_addr = ohdr->dcd_ptr_ptr - offsetof(struct imx_flash_header_v1, dcd_ptr);
+ *dladdr = ohdr->app_dest;
+ *header_addr = ohdr->dcd_ptr_ptr - offsetof(struct imx_flash_header, dcd);
*plugin = 0;
if (err >= 0)
*max_length = dcd_end[0] | (dcd_end[1] << 8) | (dcd_end[2] << 16) | (dcd_end[3] << 24);
@@ -960,18 +929,18 @@ static int get_dl_start(struct usb_id *p_id, unsigned char *p, unsigned char *fi
unsigned char *bd;
struct imx_flash_header_v2 *hdr = (struct imx_flash_header_v2 *)p;
- *dladdr = hdr->self_ptr;
- *header_addr = hdr->self_ptr;
+ *dladdr = hdr->self;
+ *header_addr = hdr->self;
bd = hdr->boot_data_ptr + cvt_dest_to_src;
if ((bd < file_start) || ((bd + 4) > file_end)) {
printf("bad boot_data_ptr %08x\n", hdr->boot_data_ptr);
return -1;
}
- *dladdr = ((struct boot_data *)bd)->dest;
- *max_length = ((struct boot_data *)bd)->image_len;
- *plugin = ((struct boot_data *)bd)->plugin;
- ((struct boot_data *)bd)->plugin = 0;
+ *dladdr = ((struct imx_boot_data *)bd)->start;
+ *max_length = ((struct imx_boot_data *)bd)->size;
+ *plugin = ((struct imx_boot_data *)bd)->plugin;
+ ((struct imx_boot_data *)bd)->plugin = 0;
hdr->boot_data_ptr = 0;
diff --git a/scripts/imx/imx.h b/scripts/imx/imx.h
new file mode 100644
index 0000000000..e986545e86
--- /dev/null
+++ b/scripts/imx/imx.h
@@ -0,0 +1,52 @@
+/*
+ * ============================================================================
+ * i.MX flash header v1 handling. Found on i.MX35 and i.MX51
+ * ============================================================================
+ */
+#define DCD_BARKER 0xb17219e9
+
+struct imx_flash_header {
+ uint32_t app_code_jump_vector;
+ uint32_t app_code_barker;
+ uint32_t app_code_csf;
+ uint32_t dcd_ptr_ptr;
+ uint32_t super_root_key;
+ uint32_t dcd;
+ uint32_t app_dest;
+ uint32_t dcd_barker;
+ uint32_t dcd_block_len;
+} __attribute__((packed));
+
+struct imx_boot_data {
+ uint32_t start;
+ uint32_t size;
+ uint32_t plugin;
+} __attribute__((packed));
+
+#define TAG_IVT_HEADER 0xd1
+#define IVT_VERSION 0x40
+#define TAG_DCD_HEADER 0xd2
+#define DCD_VERSION 0x40
+#define TAG_WRITE 0xcc
+#define TAG_CHECK 0xcf
+
+struct imx_ivt_header {
+ uint8_t tag;
+ uint16_t length;
+ uint8_t version;
+} __attribute__((packed));
+
+struct imx_flash_header_v2 {
+ struct imx_ivt_header header;
+
+ uint32_t entry;
+ uint32_t reserved1;
+ uint32_t dcd_ptr;
+ uint32_t boot_data_ptr;
+ uint32_t self;
+ uint32_t csf;
+ uint32_t reserved2;
+
+ struct imx_boot_data boot_data;
+ struct imx_ivt_header dcd_header;
+} __attribute__((packed)); \ No newline at end of file