[U-Boot] [PATCH] mx28: fix SPL code to make USB booting work
Marek Vasut
marek.vasut at gmail.com
Fri Feb 3 15:31:12 CET 2012
> On 03.02.2012 14:22, Marek Vasut wrote:
> >> This patch fixes booting i.MX28 CPUs via USB download.
> >> In this mode the CPU's bootrom implements a USB HID device that
> >> accepts a bootstream.
> >>
> >> When downloading the bootstream via USB, first the SPL code is
> >> received and executed. Then the u-boot image is received and
> >> called.
> >>
> >> The USB bootmode is interrupt driven.
> >>
> >> This patch fixes two things:
> >>
> >> 1) The ARM's fast interrupt mode is disabled when the SPL code
> >> has been run. This is the default state when called by the bootrom.
> >>
> >> 2) The exception vector location is set back to bootrom space to
> >> make the USB interrupts work again. The SPL code needs to change this
> >> option for the ram size probing.
> >>
> >> Signed-off-by: Matthias Fuchs <matthias.fuchs at esd.eu>
> >> ---
> >>
> >> arch/arm/cpu/arm926ejs/mx28/start.S | 17 +++++++++++++++++
> >> 1 files changed, 17 insertions(+), 0 deletions(-)
> >>
> >> diff --git a/arch/arm/cpu/arm926ejs/mx28/start.S
> >> b/arch/arm/cpu/arm926ejs/mx28/start.S index 2cd4d73..4116bb1 100644
> >> --- a/arch/arm/cpu/arm926ejs/mx28/start.S
> >> +++ b/arch/arm/cpu/arm926ejs/mx28/start.S
> >>
> >> @@ -185,6 +185,23 @@ _reset:
> >> bl board_init_ll
> >>
> >> + /*
> >> + * turn of fast interrupt mode (required by bootrom for USB boot)
> >> + */
> >> + mrs r0,cpsr
> >> + bic r0,r0,#0x80
> >> + msr cpsr,r0
> >
> > Add this section just past _reset into:
> >
> > 170 /*
> > 171 * set the cpu to SVC32 mode
> > 172 */
> > 173 mrs r0,cpsr
> > 174 bic r0,r0,#0x1f
> > 175 orr r0,r0,#0xd3
> > 176 msr cpsr,r0
> >
> > And only if you really need this. Why do you need to disable FIQ?
>
> First: my commit message was not very clear in ths concern.
> When the SPL is called from the bootrom FIQ is turned off. When the SPL
> has run and control is passed back to the bootrom (!), the bootrom
> crashes, stalls or stops when FIQ is on. So we need to turn FIQ
> off when the SPL has done it's job. So that's why I added the code after
> board_init_ll(). I also noticed that the SPL runs fine when FIQ is never
> turned on. So I could think of never turning it on at all in SPL:
> 170 /*
> 171 * set the cpu to SVC32 mode
> 172 */
> 173 mrs r0,cpsr
> 174 bic r0,r0,#0x1f
> - 175 orr r0,r0,#0xd3
> + 175 orr r0,r0,#0x53
> 176 msr cpsr,r0
>
> This will result in CPSR = 0x53 which is the register content when
> the SPL is called (setup by bootrom). So we could completely get rid of
> this sequence.
>
> And yes, for USB boot the FIQ must be turned off when SPL has done it's
> work. Other boot modes do not care as far as I noticed.
>
> >> +
> >> +#ifndef CONFIG_SKIP_LOWLEVEL_INIT
> >> + /*
> >> + * set exception vector location back to bootrom space.
> >> + * (required by bootrom for USB boot)
> >> + */
> >> + mrc p15, 0, r0, c1, c0, 0
> >> + orr r0, r0, #0x00002000 /* set bit 13 'V' */
> >> + mcr p15, 0, r0, c1, c0, 0
> >> +#endif
> >
> > High-vectors break the current implementation. That IS WRONG. The RAM
> > memory detection routine will not work if you enable high vectors since
> > it depends on adjusting the jumptable at 0x0 (aka. low vectors).
>
> Right. That's why the SPL code clears the 'V' bit and we got 'low
> vectors'. But when the SPL code has done it's work we need to return to
> 'high vectors' (... in bootrom space) to keep USB from bootrom alive.
> That's what my patch does. SPL run with low vectors and before it
> returns to bootrom it switches back to high vectors.
>
> > Why do you need to enable high vectors? Can't you detect that USB boot is
> > happening (can mx28 report boot reason like mxc chips do?)
>
> Yes, by checking some GPIOs (I send an RFC/PATCH some days ago). But
> there's no need to only do this when using USB boot.
>
> > and enable high-
> > vectors just before passing control back to bootrom only then?
>
> That's what I do! Please take a look at my patch.
I just noticed where you put it. OK. Why that CONFIG_SKIP_LOWLEVEL_INIT there
anyway?
And about FIQ, do it like you outlined it, disable it altogether and be done
with it.
M
>
> > Though now that I think of it, high-vectors should probably be
> > unconditionally re-enabled upon entering bootrom. Can you investigate?
>
> That's what my patch does!
>
>
> Matthias
More information about the U-Boot
mailing list