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

Lukasz Majewski lukma at denx.de
Tue Aug 18 14:42:26 CEST 2020


Hi Peng,

> > 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.

Yes.

> 
> For i.MX8*, the major stuff is just uuu only support flash.bin which
> is packed by imx-mkimage. 

Ok. So support to mkimage is not yet added.

> For using upstream U-Boot to generate
> flash.bin, there are still features not ported.

Ok.

> 
> What kind documentation do you expect?

I would like to have documentation entries being added with every bit
of code ported from downstream to upstream.

As I do know that it is very handy to have it around - not in NXP's
forum or webpage, which can disappear - like pdfs for i.MX28.

> 
> There are still lots stuff in downstream.. I am trying to upstream
> every bit to make it work,

Great :-)

> but without usb in upstream, it would not
> work.

Ok.

> 
> 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  




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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20200818/72a3431f/attachment.sig>


More information about the U-Boot mailing list