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