> 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....@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: > lu...@denx.de