From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hans de Goede Date: Fri, 10 Jun 2016 21:31:00 +0200 Subject: [U-Boot] [U-Boot, v3] sunxi: FEL - Add the ability to recognize and auto-import uEnv-style data In-Reply-To: <1465450655-2477-1-git-send-email-bernhard.nortmann@web.de> References: <1465450655-2477-1-git-send-email-bernhard.nortmann@web.de> Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi, On 09-06-16 07:37, Bernhard Nortmann wrote: > The patch converts one of the "reserved" fields in the sunxi SPL > header to a fel_uEnv_length entry. When booting over USB ("FEL > mode"), this enables the sunxi-fel utility to pass the string > length of uEnv.txt compatible data; at the same time requesting > that this data be imported into the U-Boot environment. > > If parse_spl_header() in the sunxi board.c encounters a non-zero > value in this header field, it will therefore call himport_r() to > merge the string (lines) passed via FEL into the default settings. > Environment vars can be changed this way even before U-Boot will > attempt to autoboot - specifically, this also allows overriding > "bootcmd". > > With fel_script_addr set and a zero fel_uEnv_length, U-Boot is > safe to assume that data in .scr format (a mkimage-type script) > was passed at fel_script_addr, and will handle it using the > existing mechanism ("bootcmd_fel"). > > Signed-off-by: Bernhard Nortmann > Acked-by: Siarhei Siamashka Thanks, I've added this to u-boot-sunxi/next for merging into v2016.09 as soon as the merge window for that opens. Regards, Hans > --- > A corresponding proof-of-concept version of sunxi-fel is available > from my https://github.com/n1tehawk/sunxi-tools/tree/20160608_uEnv-magic > branch. I've picked up the suggestion to use a "#=uEnv" magic string > to request that a file be treated as uEnv.txt-style data. > > For example, use your text editor to save a my.env file with > > #=uEnv > myvar=world > bootcmd=echo "Hello $myvar." > > and then test it with > ./sunxi-fel uboot u-boot-sunxi-with-spl.bin write 0x43100000 my.env > > You should see U-Boot's autoboot print the corresponding message > and drop you to the prompt, proving that you have successfully > overwritten the "bootcmd". > > Changes in v3: > - Dropped a surplus "return;" at the end of parse_spl_header() > - Have "FEL" in the subject line to clarify the scope > - Added "Acked-by" line > > Changes in v2: > - Patch renamed to something more suitable (was "sunxi: Add the > ability to pass (script) filesize in the SPL header") > - The data field is now named fel_uEnv_length, and comes with > a corresponding description in spl.h > - Instead of simply passing file size, fel_uEnv_length is now > associated with uEnv.txt format. The patch modifies U-Boot's > sunxi parse_spl_header() to auto-import such data. > > arch/arm/include/asm/arch-sunxi/spl.h | 9 ++++++++- > board/sunxi/board.c | 29 +++++++++++++++++++++-------- > 2 files changed, 29 insertions(+), 9 deletions(-) > > diff --git a/arch/arm/include/asm/arch-sunxi/spl.h b/arch/arm/include/asm/arch-sunxi/spl.h > index a0f33b0..a966a88 100644 > --- a/arch/arm/include/asm/arch-sunxi/spl.h > +++ b/arch/arm/include/asm/arch-sunxi/spl.h > @@ -49,7 +49,14 @@ struct boot_file_head { > uint8_t spl_signature[4]; > }; > uint32_t fel_script_address; > - uint32_t reserved1[3]; > + /* > + * If the fel_uEnv_length member below is set to a non-zero value, > + * it specifies the size (byte count) of data at fel_script_address. > + * At the same time this indicates that the data is in uEnv.txt > + * compatible format, ready to be imported via "env import -t". > + */ > + uint32_t fel_uEnv_length; > + uint32_t reserved1[2]; > uint32_t boot_media; /* written here by the boot ROM */ > uint32_t reserved2[5]; /* padding, align to 64 bytes */ > }; > diff --git a/board/sunxi/board.c b/board/sunxi/board.c > index d09cf6d..b5a50f4 100644 > --- a/board/sunxi/board.c > +++ b/board/sunxi/board.c > @@ -573,6 +573,7 @@ void get_board_serial(struct tag_serialnr *serialnr) > > #if !defined(CONFIG_SPL_BUILD) > #include > +#include > > /* > * Check the SPL header for the "sunxi" variant. If found: parse values > @@ -582,17 +583,29 @@ void get_board_serial(struct tag_serialnr *serialnr) > static void parse_spl_header(const uint32_t spl_addr) > { > struct boot_file_head *spl = (void *)(ulong)spl_addr; > - if (memcmp(spl->spl_signature, SPL_SIGNATURE, 3) == 0) { > - uint8_t spl_header_version = spl->spl_signature[3]; > - if (spl_header_version == SPL_HEADER_VERSION) { > - if (spl->fel_script_address) > - setenv_hex("fel_scriptaddr", > - spl->fel_script_address); > - return; > - } > + if (memcmp(spl->spl_signature, SPL_SIGNATURE, 3) != 0) > + return; /* signature mismatch, no usable header */ > + > + uint8_t spl_header_version = spl->spl_signature[3]; > + if (spl_header_version != SPL_HEADER_VERSION) { > printf("sunxi SPL version mismatch: expected %u, got %u\n", > SPL_HEADER_VERSION, spl_header_version); > + return; > + } > + if (!spl->fel_script_address) > + return; > + > + if (spl->fel_uEnv_length != 0) { > + /* > + * data is expected in uEnv.txt compatible format, so "env > + * import -t" the string(s) at fel_script_address right away. > + */ > + himport_r(&env_htab, (char *)spl->fel_script_address, > + spl->fel_uEnv_length, '\n', H_NOCLEAR, 0, 0, NULL); > + return; > } > + /* otherwise assume .scr format (mkimage-type script) */ > + setenv_hex("fel_scriptaddr", spl->fel_script_address); > } > #endif > >