9
0
Fork 0

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>
This commit is contained in:
Sascha Hauer 2016-01-25 13:24:35 +01:00
parent 24315db717
commit be6b5cf74c
3 changed files with 84 additions and 106 deletions

View File

@ -27,6 +27,9 @@
#include <fcntl.h> #include <fcntl.h>
#include <endian.h> #include <endian.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include "imx.h"
#include <include/filetype.h> #include <include/filetype.h>
#define MAX_DCD 1024 #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 * 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 FLASH_HEADER_OFFSET 0x400
#define DCD_BARKER 0xb17219e9
static uint32_t bb_header[] = { static uint32_t bb_header[] = {
0xea0003fe, /* b 0x1000 */ 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) static int add_header_v2(void *buf, int offset, uint32_t loadaddr, uint32_t imagesize)
{ {
struct imx_flash_header_v2 *hdr; struct imx_flash_header_v2 *hdr;

View File

@ -34,6 +34,8 @@
#include <getopt.h> #include <getopt.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include "imx.h"
#define get_min(a, b) (((a) < (b)) ? (a) : (b)) #define get_min(a, b) (((a) < (b)) ? (a) : (b))
#define FT_APP 0xaa #define FT_APP 0xaa
@ -404,39 +406,6 @@ int do_status(libusb_device_handle *h, struct usb_id *p_id)
return err; 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) #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, 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 char *dcd_end;
unsigned m_length; 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* dcd;
unsigned char* file_end = file_start + cnt; unsigned char* file_end = file_start + cnt;
int err = 0; int err = 0;
if (!hdr->dcd_ptr) { 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 */ 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; 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 *file_start, unsigned cnt,
unsigned char **pstart, unsigned char **pend) unsigned char **pstart, unsigned char **pend)
{ {
unsigned char *dcd_end; unsigned char *dcd_end;
unsigned m_length; 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 char* dcd;
unsigned val; unsigned val;
unsigned char* file_end = file_start + cnt; unsigned char* file_end = file_start + cnt;
if (!hdr->dcd_ptr) { if (!hdr->dcd) {
printf("No dcd table, barker=%x\n", hdr->app_barker); printf("No dcd table, barker=%x\n", hdr->app_code_barker);
*pstart = *pend = ((unsigned char *)hdr) + sizeof(struct imx_flash_header_v1); *pstart = *pend = ((unsigned char *)hdr) + sizeof(struct imx_flash_header);
return 0; /* nothing to do */ 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)) { 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; 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, 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 val;
unsigned char *dcd_end; unsigned char *dcd_end;
@ -876,16 +845,16 @@ err:
static int is_header(struct usb_id *p_id, unsigned char *p) 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; struct imx_flash_header_v2 *hdr = (struct imx_flash_header_v2 *)p;
switch (p_id->mach_id->header_type) { switch (p_id->mach_id->header_type) {
case HDR_MX51: case HDR_MX51:
if (ohdr->app_barker == 0xb1) if (ohdr->app_code_barker == 0xb1)
return 1; return 1;
break; break;
case HDR_MX53: case HDR_MX53:
if (hdr->barker == IVT_BARKER) if (hdr->header.tag == TAG_IVT_HEADER && hdr->header.version == IVT_VERSION)
return 1; 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, static int perform_dcd(struct libusb_device_handle *h, struct usb_id *p_id, unsigned char *p,
unsigned char *file_start, unsigned cnt) 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; struct imx_flash_header_v2 *hdr = (struct imx_flash_header_v2 *)p;
int ret = 0; int ret = 0;
switch (p_id->mach_id->header_type) { switch (p_id->mach_id->header_type) {
case HDR_MX51: case HDR_MX51:
ret = write_dcd_table_old(h, p_id, ohdr, file_start, cnt); ret = write_dcd_table_old(h, p_id, ohdr, file_start, cnt);
ohdr->dcd_ptr = 0; ohdr->dcd = 0;
break; break;
case HDR_MX53: 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, static int clear_dcd_ptr(struct libusb_device_handle *h, struct usb_id *p_id,
unsigned char *p, unsigned char *file_start, unsigned cnt) 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; struct imx_flash_header_v2 *hdr = (struct imx_flash_header_v2 *)p;
switch (p_id->mach_id->header_type) { switch (p_id->mach_id->header_type) {
case HDR_MX51: case HDR_MX51:
printf("clear dcd_ptr=0x%08x\n", ohdr->dcd_ptr); printf("clear dcd_ptr=0x%08x\n", ohdr->dcd);
ohdr->dcd_ptr = 0; ohdr->dcd = 0;
break; break;
case HDR_MX53: case HDR_MX53:
printf("clear dcd_ptr=0x%08x\n", hdr->dcd_ptr); 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) { switch (p_id->mach_id->header_type) {
case HDR_MX51: 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_end;
unsigned char* dcd; unsigned char* dcd;
int err = get_dcd_range_old(ohdr, file_start, cnt, &dcd, &dcd_end); int err = get_dcd_range_old(ohdr, file_start, cnt, &dcd, &dcd_end);
*dladdr = ohdr->app_dest_ptr; *dladdr = ohdr->app_dest;
*header_addr = ohdr->dcd_ptr_ptr - offsetof(struct imx_flash_header_v1, dcd_ptr); *header_addr = ohdr->dcd_ptr_ptr - offsetof(struct imx_flash_header, dcd);
*plugin = 0; *plugin = 0;
if (err >= 0) if (err >= 0)
*max_length = dcd_end[0] | (dcd_end[1] << 8) | (dcd_end[2] << 16) | (dcd_end[3] << 24); *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; unsigned char *bd;
struct imx_flash_header_v2 *hdr = (struct imx_flash_header_v2 *)p; struct imx_flash_header_v2 *hdr = (struct imx_flash_header_v2 *)p;
*dladdr = hdr->self_ptr; *dladdr = hdr->self;
*header_addr = hdr->self_ptr; *header_addr = hdr->self;
bd = hdr->boot_data_ptr + cvt_dest_to_src; bd = hdr->boot_data_ptr + cvt_dest_to_src;
if ((bd < file_start) || ((bd + 4) > file_end)) { if ((bd < file_start) || ((bd + 4) > file_end)) {
printf("bad boot_data_ptr %08x\n", hdr->boot_data_ptr); printf("bad boot_data_ptr %08x\n", hdr->boot_data_ptr);
return -1; return -1;
} }
*dladdr = ((struct boot_data *)bd)->dest; *dladdr = ((struct imx_boot_data *)bd)->start;
*max_length = ((struct boot_data *)bd)->image_len; *max_length = ((struct imx_boot_data *)bd)->size;
*plugin = ((struct boot_data *)bd)->plugin; *plugin = ((struct imx_boot_data *)bd)->plugin;
((struct boot_data *)bd)->plugin = 0; ((struct imx_boot_data *)bd)->plugin = 0;
hdr->boot_data_ptr = 0; hdr->boot_data_ptr = 0;

52
scripts/imx/imx.h Normal file
View File

@ -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));