[PATCH v2 4/7] f_sdp: Support searching and loading FIT or container image

Peng Fan peng.fan at nxp.com
Tue Aug 18 14:38:01 CEST 2020


> Subject: Re: [PATCH v2 4/7] f_sdp: Support searching and loading FIT or
> container image
> 
> Hi Peng,
> 
> > Add support to f_sdp to search and load iMX8 container image or iMX8M
> > FIT image by new UUU command SDPV.
> >
> > When using the SDPV, the uuu will continue to send out data after
> > first level boot loader used by ROM. This means uuu won't skip to the
> > offset of the second boot loader, and the padding data before second
> > boot loader will be sent out. So we have to search the FIT header or
> > container header in the buffer that SDP received.
> >
> 
> Please correct me if I'm wrong, but is there any documentation entry on using
> uuu with i.MX8* and this feature? If not - I would be very grateful if you could
> add a good tutorial/explanation for it.

uuu code is here: https://github.com/NXPmicro/mfgtools 

It has documentation on using it.

For i.MX8*, the major stuff is just uuu only support flash.bin which is packed
by imx-mkimage. For using upstream U-Boot to generate flash.bin, there
are still features not ported.

What kind documentation do you expect?

There are still lots stuff in downstream.. I am trying to upstream every bit
to make it work, but without usb in upstream, it would not work.

Thanks,
Peng.

> 
> (as I personally use uuu for iMX28 and iMX6Q).
> 
> Thanks in advance.
> 
> > Also change to more common method to exit f_sdp handler not depending
> > on SPL_FIT_FOUND flag because container loader won't set this.
> >
> > Signed-off-by: Peng Fan <peng.fan at nxp.com>
> > ---
> >  drivers/usb/gadget/f_sdp.c | 70
> > ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 58
> > insertions(+), 12 deletions(-)
> >
> > diff --git a/drivers/usb/gadget/f_sdp.c b/drivers/usb/gadget/f_sdp.c
> > index eec7560fc2..9b7372815d 100644
> > --- a/drivers/usb/gadget/f_sdp.c
> > +++ b/drivers/usb/gadget/f_sdp.c
> > @@ -71,6 +71,8 @@ struct hid_report {
> >
> >  #define SDP_COMMAND_LEN		16
> >
> > +#define SDP_EXIT 1
> > +
> >  struct sdp_command {
> >  	u16 cmd;
> >  	u32 addr;
> > @@ -667,19 +669,43 @@ static u32 sdp_jump_imxheader(void
> *address)  }
> >
> >  #ifdef CONFIG_SPL_BUILD
> > -#ifdef CONFIG_SPL_LOAD_FIT
> > -static ulong sdp_fit_read(struct spl_load_info *load, ulong sector,
> > -			  ulong count, void *buf)
> > +static ulong sdp_load_read(struct spl_load_info *load, ulong sector,
> > +			   ulong count, void *buf)
> >  {
> >  	debug("%s: sector %lx, count %lx, buf %lx\n",
> >  	      __func__, sector, count, (ulong)buf);
> >  	memcpy(buf, (void *)(load->dev + sector), count);
> >  	return count;
> >  }
> > -#endif
> > +
> > +static ulong search_fit_header(ulong p, int size) {
> > +	int i;
> > +
> > +	for (i = 0; i < size; i += 4) {
> > +		if (genimg_get_format((const void *)(p + i)) ==
> > IMAGE_FORMAT_FIT)
> > +			return p + i;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> > +static ulong search_container_header(ulong p, int size) {
> > +	int i;
> > +	u8 *hdr;
> > +
> > +	for (i = 0; i < size; i += 4) {
> > +		hdr = (u8 *)(p + i);
> > +		if (*(hdr + 3) == 0x87 && *hdr == 0)
> > +			if (*(hdr + 1) != 0 || *(hdr + 2) != 0)
> > +				return p + i;
> > +	}
> > +	return 0;
> > +}
> >  #endif
> >
> > -static void sdp_handle_in_ep(struct spl_image_info *spl_image)
> > +static int sdp_handle_in_ep(struct spl_image_info *spl_image)
> >  {
> >  	u8 *data = sdp_func->in_req->buf;
> >  	u32 status;
> > @@ -731,6 +757,15 @@ static void sdp_handle_in_ep(struct
> > spl_image_info *spl_image) /* If imx header fails, try some U-Boot
> > specific headers */ if (status) {  #ifdef CONFIG_SPL_BUILD
> > +			if
> > (IS_ENABLED(CONFIG_SPL_LOAD_IMX_CONTAINER))
> > +				sdp_func->jmp_address =
> > (u32)search_container_header((ulong)sdp_func->jmp_address,
> > sdp_func->dnl_bytes);
> > +			else if (IS_ENABLED(CONFIG_SPL_LOAD_FIT))
> > +				sdp_func->jmp_address =
> > (u32)search_fit_header((ulong)sdp_func->jmp_address,
> > sdp_func->dnl_bytes);
> > +			if (sdp_func->jmp_address == 0)
> > +				panic("Error in search header,
> > failed to jump\n"); +
> > +			printf("Found header at 0x%08x\n",
> > sdp_func->jmp_address); +
> >  			image_header_t *header =
> >  				sdp_ptr(sdp_func->jmp_address);
> >  #ifdef CONFIG_SPL_LOAD_FIT
> > @@ -740,13 +775,23 @@ static void sdp_handle_in_ep(struct
> > spl_image_info *spl_image) debug("Found FIT\n");
> >  				load.dev = header;
> >  				load.bl_len = 1;
> > -				load.read = sdp_fit_read;
> > +				load.read = sdp_load_read;
> >  				spl_load_simple_fit(spl_image,
> > &load, 0, header);
> >
> > -				return;
> > +				return SDP_EXIT;
> >  			}
> >  #endif
> > +			if
> > (IS_ENABLED(CONFIG_SPL_LOAD_IMX_CONTAINER)) {
> > +				struct spl_load_info load;
> > +
> > +				load.dev = header;
> > +				load.bl_len = 1;
> > +				load.read = sdp_load_read;
> > +				spl_load_imx_container(spl_image,
> > &load, 0);
> > +				return SDP_EXIT;
> > +			}
> > +
> >  			/* In SPL, allow jumps to U-Boot images */
> >  			struct spl_image_info spl_image = {};
> >  			spl_parse_image_header(&spl_image, header); @@ -769,6
> +814,8 @@
> > static void sdp_handle_in_ep(struct spl_image_info *spl_image)
> > default:
> >  		break;
> >  	};
> > +
> > +	return 0;
> >  }
> >
> >  #ifndef CONFIG_SPL_BUILD
> > @@ -777,6 +824,7 @@ int sdp_handle(int controller_index)  int
> > spl_sdp_handle(int controller_index, struct spl_image_info
> > *spl_image) #endif
> >  {
> > +	int flag = 0;
> >  	printf("SDP: handle requests...\n");
> >  	while (1) {
> >  		if (ctrlc()) {
> > @@ -784,18 +832,16 @@ int spl_sdp_handle(int controller_index, struct
> > spl_image_info *spl_image) return -EINVAL;
> >  		}
> >
> > -#ifdef CONFIG_SPL_BUILD
> > -		if (spl_image->flags & SPL_FIT_FOUND)
> > +		if (flag == SDP_EXIT)
> >  			return 0;
> > -#endif
> >
> >  		WATCHDOG_RESET();
> >  		usb_gadget_handle_interrupts(controller_index);
> >
> >  #ifdef CONFIG_SPL_BUILD
> > -		sdp_handle_in_ep(spl_image);
> > +		flag = sdp_handle_in_ep(spl_image);
> >  #else
> > -		sdp_handle_in_ep(NULL);
> > +		flag = sdp_handle_in_ep(NULL);
> >  #endif
> >  	}
> >  }
> 
> 
> 
> 
> Best regards,
> 
> Lukasz Majewski
> 
> --
> 
> DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email:
> lukma at denx.de


More information about the U-Boot mailing list