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