[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