@ -365,6 +365,13 @@ static void parse_cfg_cmd(struct imx_header *imxhdr, int32_t cmd, char *token,
name , lineno , token ) ;
exit ( EXIT_FAILURE ) ;
}
/*
* The SOC loads from the storage starting at address 0
* then ensures that the load size contains the offset
*/
if ( imximage_init_loadsize < imximage_ivt_offset )
imximage_init_loadsize = imximage_ivt_offset ;
if ( unlikely ( cmd_ver_first ! = 1 ) )
cmd_ver_first = 0 ;
break ;
@ -439,7 +446,8 @@ static uint32_t parse_cfg_file(struct imx_header *imxhdr, char *name)
exit ( EXIT_FAILURE ) ;
}
/* Very simple parsing, line starting with # are comments
/*
* Very simple parsing , line starting with # are comments
* and are dropped
*/
while ( ( getline ( & line , & len , fd ) ) > 0 ) {
@ -571,18 +579,92 @@ int imximage_check_params(struct mkimage_params *params)
( params - > xflag ) | | ! ( strlen ( params - > imagename ) ) ;
}
static int imximage_generate ( struct mkimage_params * params ,
struct image_type_params * tparams )
{
struct imx_header * imxhdr ;
size_t alloc_len ;
struct stat sbuf ;
char * datafile = params - > datafile ;
uint32_t pad_len ;
memset ( & imximage_header , 0 , sizeof ( imximage_header ) ) ;
/*
* In order to not change the old imx cfg file
* by adding VERSION command into it , here need
* set up function ptr group to V1 by default .
*/
imximage_version = IMXIMAGE_V1 ;
/* Be able to detect if the cfg file has no BOOT_FROM tag */
imximage_ivt_offset = FLASH_OFFSET_UNDEFINED ;
imximage_csf_size = 0 ;
set_hdr_func ( imxhdr ) ;
/* Parse dcd configuration file */
parse_cfg_file ( & imximage_header , params - > imagename ) ;
/* TODO: check i.MX image V1 handling, for now use 'old' style */
if ( imximage_version = = IMXIMAGE_V1 ) {
alloc_len = 4096 ;
} else {
if ( imximage_init_loadsize < imximage_ivt_offset +
sizeof ( imx_header_v2_t ) )
imximage_init_loadsize = imximage_ivt_offset +
sizeof ( imx_header_v2_t ) ;
alloc_len = imximage_init_loadsize - imximage_ivt_offset ;
}
if ( alloc_len < sizeof ( struct imx_header ) ) {
fprintf ( stderr , " %s: header error \n " ,
params - > cmdname ) ;
exit ( EXIT_FAILURE ) ;
}
imxhdr = malloc ( alloc_len ) ;
if ( ! imxhdr ) {
fprintf ( stderr , " %s: malloc return failure: %s \n " ,
params - > cmdname , strerror ( errno ) ) ;
exit ( EXIT_FAILURE ) ;
}
memset ( imxhdr , 0 , alloc_len ) ;
tparams - > header_size = alloc_len ;
tparams - > hdr = imxhdr ;
/* determine data image file length */
if ( stat ( datafile , & sbuf ) < 0 ) {
fprintf ( stderr , " %s: Can't stat %s: %s \n " ,
params - > cmdname , datafile , strerror ( errno ) ) ;
exit ( EXIT_FAILURE ) ;
}
pad_len = ROUND ( sbuf . st_size , 4096 ) - sbuf . st_size ;
/* TODO: check i.MX image V1 handling, for now use 'old' style */
if ( imximage_version = = IMXIMAGE_V1 )
return 0 ;
else
return pad_len ;
}
/*
* imximage parameters
*/
static struct image_type_params imximage_params = {
. name = " Freescale i.MX Boot Image support " ,
. header_size = sizeof ( struct imx_header ) ,
. hdr = ( void * ) & imximage_header ,
. header_size = 0 ,
. hdr = NULL ,
. check_image_type = imximage_check_image_types ,
. verify_header = imximage_verify_header ,
. print_header = imximage_print_header ,
. set_header = imximage_set_header ,
. check_params = imximage_check_params ,
. vrec_header = imximage_generate ,
} ;
void init_imx_image_type ( void )