142 lines
4.4 KiB
Plaintext
142 lines
4.4 KiB
Plaintext
|
---------------------------------------------
|
||
|
UBL image Boot Image generation using mkimage
|
||
|
---------------------------------------------
|
||
|
|
||
|
This document describes how to set up an U-Boot image that can be directly
|
||
|
booted by a DaVinci processor via NAND boot mode, using an UBL header,
|
||
|
but without need for UBL.
|
||
|
|
||
|
For more details see section 11.2 "ARM ROM Boot Modes" of
|
||
|
http://focus.ti.com/lit/ug/sprufg5a/sprufg5a.pdf
|
||
|
|
||
|
Command syntax:
|
||
|
--------------
|
||
|
./tools/mkimage -l <u-boot_file>
|
||
|
to list the UBL image file details
|
||
|
|
||
|
./tools/mkimage -T ublimage \
|
||
|
-n <board specific configuration file> \
|
||
|
-d <u-boot binary> <output image file>
|
||
|
|
||
|
For example, for the davinci dm365evm board:
|
||
|
./tools/mkimage -n ./board/davinci/dm365evm/ublimage.cfg \
|
||
|
-T ublimage \
|
||
|
-d u-boot-nand.bin u-boot.ubl
|
||
|
|
||
|
You can generate the image directly when you compile u-boot with:
|
||
|
|
||
|
$ make u-boot.ubl
|
||
|
|
||
|
The output image can be flashed into the NAND.
|
||
|
|
||
|
Please check the DaVinci documentation for further details.
|
||
|
|
||
|
Board specific configuration file specifications:
|
||
|
-------------------------------------------------
|
||
|
1. This file must present in the $(BOARDDIR) and the name should be
|
||
|
ublimage.cfg (since this is used in Makefile).
|
||
|
2. This file can have empty lines and lines starting with "#" as first
|
||
|
character to put comments.
|
||
|
3. This file can have configuration command lines as mentioned below,
|
||
|
any other information in this file is treated as invalid.
|
||
|
|
||
|
Configuration command line syntax:
|
||
|
---------------------------------
|
||
|
1. Each command line must have two strings, first one command or address
|
||
|
and second one data string
|
||
|
2. Following are the valid command strings and associated data strings:-
|
||
|
Command string data string
|
||
|
-------------- -----------
|
||
|
MODE UBL special mode, on of:
|
||
|
safe
|
||
|
Example:
|
||
|
MODE safe
|
||
|
|
||
|
ENTRY Entry point address for the user
|
||
|
bootloader (absolute address) = TEXT_BASE
|
||
|
nand_spl loader.
|
||
|
Example:
|
||
|
ENTRY 0x00000020
|
||
|
|
||
|
PAGES Number of pages (size of user bootloader
|
||
|
in number of pages)
|
||
|
Example:
|
||
|
PAGES 27
|
||
|
|
||
|
START_BLOCK Block number where user bootloader is present
|
||
|
Example:
|
||
|
START_BLOCK 5
|
||
|
|
||
|
START_PAGE Page number where user bootloader is present
|
||
|
(for RBL always 0)
|
||
|
Example:
|
||
|
START_PAGE 0
|
||
|
|
||
|
------------------------------------------------
|
||
|
|
||
|
Structure of the u-boot.ubl binary:
|
||
|
|
||
|
compile steps:
|
||
|
|
||
|
1) nand_spl code compile, with pad_to = (TEXT_BASE +
|
||
|
(CONFIG_SYS_NROF_PAGES_NAND_SPL * pagesize))
|
||
|
Example: cam_enc_4xx pad_to = 0x20 + (6 * 0x800) = 0x3020 = 12320
|
||
|
-> u-boot-spl-16k.bin
|
||
|
|
||
|
!! TEXT_BASE = 0x20, as the RBL starts at 0x20
|
||
|
|
||
|
2) compile u-boot.bin ("normal" u-boot)
|
||
|
-> u-boot.bin
|
||
|
|
||
|
3) create u-boot-nand.bin = u-boot-spl-16k.bin + u-boot.bin
|
||
|
|
||
|
4) create u-boot.ubl, size = 1 page size NAND
|
||
|
create UBL header and paste it before u-boot.bin
|
||
|
|
||
|
This steps are done automagically if you do a "make all"
|
||
|
|
||
|
-> You get an u-boot.ubl binary, which you can flash
|
||
|
into your NAND.
|
||
|
|
||
|
Structure of this binary (Example for the cam_enc_4xx board with a NAND
|
||
|
page size = 0x800):
|
||
|
|
||
|
offset : 0x00000 | 0x800 | 0x3800
|
||
|
content: UBL | nand_spl | u-boot code
|
||
|
Header | code |
|
||
|
|
||
|
The NAND layout looks for example like this:
|
||
|
|
||
|
(Example for the cam_enc_4xx board with a NAND page size = 0x800, block
|
||
|
size = 0x20000 and CONFIG_SYS_NROF_UBL_HEADER 5):
|
||
|
|
||
|
offset : 0x80000 | 0xa0000 | 0xa3000
|
||
|
content: UBL | nand_spl | u-boot code
|
||
|
Header | code |
|
||
|
^ ^
|
||
|
^ 0xa0000 = CONFIG_SYS_NROF_UBL_HEADER * 0x20000
|
||
|
^
|
||
|
0x80000 = Block 4 * 0x20000
|
||
|
|
||
|
If the cpu starts in NAND boot mode, it checks the UBL descriptor
|
||
|
starting with block 1 (page 0). When a valid UBL signature is found,
|
||
|
the corresponding block number (from 1 to 24) is written to the last 32
|
||
|
bits of ARM internal memory (0x7ffc-0x8000). This feature is provided
|
||
|
as a basic debug mechanism. If not found, it continues with block 2
|
||
|
... last possible block is 24
|
||
|
|
||
|
If a valid UBL descriptor is found, the UBL descriptor is read and
|
||
|
processed. The descriptor gives the information required for loading
|
||
|
and control transfer to the nand_spl code. The nand_spl code is then
|
||
|
read and processed.
|
||
|
|
||
|
Once the user-specified start-up conditions are set, the RBL copies the
|
||
|
nand_spl into ARM internal RAM, starting at address 0x0000: 0020.
|
||
|
^^^^
|
||
|
|
||
|
The nand_spl code itself now does necessary intializations, and at least,
|
||
|
copies the u-boot code from NAND into RAM, and jumps to it ...
|
||
|
|
||
|
------------------------------------------------
|
||
|
Author: Heiko Schocher <hs@denx.de>
|