[U-Boot] Porting u-boot to flash micro with proprietary (non-GPL) flash programming library
Ulf Samuelsson
u-boot at emagii.com
Mon Jan 14 16:55:56 UTC 2019
I am working in a project where we are considering using U-Boot as a
bootloader for a flash microcontroller with an ARM Cortex-Rx core.
The chip is currently not supported by U-Boot.
The processor will not be running linux.
Our board will use
• On Chip Flash
• External Parallel Flash
• External SPI Flash
Problem:
To program the internal flash, we need to use the a library from the CPU
vendor which is only supplied to us in binary form.
Their license forbids us to link that library to open source code in a
way that “contaminates” their code with GPL.
GPL forbids code to be linked with non-GPL code.
There are a few common exceptions to GPL when running linux.
1. Linking with a shared library is OK.
2. Using a device driver which was originally written for another
OS. (I think this has been primarily used for graphics drivers)
Right now, our idea is to do runtime linking to the flash programming
library similar to a shared library.
For various reasons, we plan to have our own first level bootloader
which has very simple functionality, and this will be contain the vendor
flash programming library.
U-boot, can when started, query the first level bootloader for the
location of the entry points in the library and use the result to fill
in a struct containing the address of the entry points. As far as I
understand, this will not be static linking, so this should be allowed
in GPL.
Q: Is this a reasonable approach to the problem?
Even if acceptable, there may be several ways of implementing this.
Here is what I can think of:
======================================================================
1) CALLING THROUGH AN EXTERNAL CALL TABLE
The first level bootloader has a call table containing the absolute
addresses of the flash library entry points.
The u-boot driver will declare the table external, and define the table
in the linker command file.
u-boot needs a header file describing the call table (probably
implemented as a struct)
======================================================================
2) COPYING A STRUCT FROM A KNOWN ADDRESS IN THE FIRST LEVEL BOOTLOADER
The simplest way I can envision, is that the first level bootloader has
a struct containing an field for each entrypoint. The field contains the
absolute address of the entry point.
The struct is copied into an u-boot datastructure as is.
u-boot can call any entry by an indirect call.
(*externallib.function1)(<parameters>);
For this to work, u-boot needs to know the absolute address of the table
inside the first level bootloader.
Both u-boot and the first level bootloader will contain a definition of
the struct in a header file.
======================================================================
3) COPYING A STRUCT FROM AN UNKNOWN ADDRESS THROUGH A SUPERVISOR CALL.
The first level bootloader will reside in flash at the reset address. It
has a supervisor call exception vector. A specific supervisor call can
return the address of the struct above.
With this method, U-boot does not need to have internal knowledge of
where the struct is located in the first level bootloader.
It does need to have a header file describing the struct.
======================================================================
4) CREATING A CALL TABLE BY QUERYING FOR EACH ENTRY.
This assumes that u-boot should not have any knowledge of a struct.
Instead a supervisor call is implemented which sends a parameter
defining which entry point of interest. The supervisor call returns the
absolute address of the entry point.
======================================================================
Q: Are any of the methods above violating the GPL license?
======================================================================
Q: Is there another method which is recommended to handle the problem
with proprietary vendor flash libraries?
======================================================================
Q: If a processor contains functionality in a bootROM, for which source
is not available. How can that be used in u-boot?
--
Best Regards
Ulf Samuelsson
More information about the U-Boot
mailing list