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:
parent
24315db717
commit
be6b5cf74c
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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));
|
Loading…
Reference in New Issue