[U-Boot] Separately compile Master boot loader

Albert ARIBAUD albert.u.boot at aribaud.net
Thu Jul 11 10:35:07 CEST 2013


Hi Rajdeep,

On Thu, 11 Jul 2013 10:57:44 +0530, Rajdeep Vaghasia
<rajdeep.vaghasia at gmail.com> wrote:

> Hi Albert,
> 
> I would like to explain you my exact idea.
> For that, The Partition layout is:
> 1) Master u-boot
> 2) u-boot-1
> 3) u-boot-2
> 4) kernel
> 5) filesystem
> 6) data
> 
> Sometimes, When we may require to update with a new u-boot(to provide some
> additional support), we have to overwrite the existing u-boot.
> I don't want to overwrite the existing u-boot.
> Instead, I want to keep a separate partition for new u-boot.
> 
> *Here is the whole procedure:*
> I will maintain one environment variable(say "*safe_u-boot*"), which will
> be used to point to the current 'working u-boot' partition(means, *u-boot-1*
> ).
> 
> I will develop one simple user space application.
> Whenever a new u-boot is available, It will be first copied into the SDRAM
> by this application.
> Then, This application will check the environment variable "*new_u-boot*"
> which will be pointing to second u-boot partition("u-boot-2") in flash.
> And then, it will copy the new u-boot from SDRAM to *NOR flash* on the
> partition pointed to by the "*new_u-boot*" environment variable, and then
> mark one update flag(say, *u_boot_UPDATE*) as '*1*' and reboot the system.
> This update flag is readable/writable by u-boot, kernel and user
> application.
> 
> On reboot,
> master u-boot(on every reboot or system power-up) will check this *
> U_boot_UPDATE* flag  status.
> If it is *set*, then Master u-boot will *first clear* that flag and then,
> will load the u-boot from the partition pointed to by the "new_u-boot" env
> variable.
> 
> case-1:
> If the system is up successfully, the user space application will set the "*
> safe_u-boot*" env variable to point the new partition(which was pointed to
> by "*new_u-boot*") and set "*new_u-boot*" env variable to point to the
> first u-boot partition(which was pointed to by "*safe_u-boot*"). (In short,
> swapping of these environment variables). So, that on second time, when
> system reboots, Master u-boot will see the *U_boot_UPDATE* flag *cleared*,
> and will load the u-boot from the partition pointed to by "*safe_u-boot*",
> which now contains the updated new u-boot.
> 
> case-2:
> If the system fails and can not come up successfully with new u-boot, then
> on *manual reboot*, Master u-boot will check the "*U_boot_UPDATE*" flag,
> which will be in cleared state. (Because during update process, as soon as
> Master U-boot reads this flag as set, it clears the flag). So, Master
> U-boot will load the u-boot from the partition pointed to by the "*
> safe_u-boot*" env variable(which is the working u-boot not updated
> one.(say, u-boot-1)). As the swapping of these environment variables is
> done by user application on successful update, this will not be the case
> with this unsuccessful system up.
> 
> I hope everything is clear, now.
> *So, in this overall implementation*,

Thank you -- now your goals are clear and your question can be answered
in a more detailed manner.

> I want to keep a little code of Master u-boot, which initializes SDRAM, and
> copies secondary u-boot from flash to SDRAM. In addition to these, it keeps
> track of two env variables.
> 
> Is there any separate source code available for this kind of Master U-boot?
> *Or*
> Can we compile the existing u-boot source code such that it will generate
> only a small binary with these little functionalities?
> *Or*
> Can we compile the existing u-boot source code such that it will generate
> both the binaries separately(master u-boot+secondary u-boot)?
>
> Of course, even if Master u-boot is available, I will have to change that a
> bit to implement those environment variable stuff in Master u-boot.
> 
> But this will be very helpful to me, if I get help from you.
> 
> I would like to remind again that, I want to implement this on *NOR Flash*.

There is no separate source code for your "Master U-Boot" concept, nor
is there currently a way to build several U-Boots in one go. The best
match in U-Boot to your "small binary" is SPL, which is intended to be
run first when the whole of U-boot cannot be run directly.

But...

SPL has never been used for NOR FLASH booting, since basically if you
have NOR, then you can start U-boot directly from there whatever its
size, and the first thing it does is setting up DDR and relocating
there; therefore there is (currently) no need for SPL with NOR.

So you would have to:

- make the SPL framework able to run from NOR and chain-load U-boot from
  NOR too;

- make SPL able to select the U-Boot it chainloads to, for instance
  through env variables that override the SPL defaults (maybe looking
  at the Falcon mode might give you ideas on how to best do this);

- configure your target to use SPL with NOR support, with a default
  environment that will load u-boot-1 rather than u-boot-2.

The very first build would produce SPL as your initial (and hopefully
final, too) "Master -U-Boot", and U-Boot as your initial, u-boot-1,
payload. This, flashed onto your target, should boot.

The subsequent builds would build newer SPL (arguably useless if same
as the previous one) and newer U-boot (which would be the "upgrade"
one). You could then, from the u-boot-1 prompt, manually flash this
'new' u-boot-2 and set the environment for an upgrade, then reboot and
test your upgrade procedure.

If rebuilding SPL when not needed is really a pain to you despite not
being the most time-critical task in your overall process, you could
also patch the U-boot build system to allow skipping the SPL build.
Maybe some other boards would be interested in that too, BTW.

> Regards,
> Rajdeep

Amicalement,
-- 
Albert.


More information about the U-Boot mailing list