| --------------------------------------------- | |
| 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> |