mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-08-21 17:38:51 +09:00
![Stefano Babic](/assets/img/avatar_default.png)
Add support for setting the CSF (Command Sequence File) pointer which is used for HAB (High Assurance Boot) in the imximage by adding e.g. CSF 0x2000 in the imximage.cfg file. This will set the CSF pointer accordingly just after the padded data image area. The boot_data.length is adjusted with the value from the imximage.cfg config file. The resulting u-boot.imx can be signed with the FSL HAB tooling. The generated CSF block needs to be appended to the u-boot.imx. Signed-off-by: Stefano Babic <sbabic@denx.de>
240 lines
7.4 KiB
Plaintext
240 lines
7.4 KiB
Plaintext
---------------------------------------------
|
|
Imximage Boot Image generation using mkimage
|
|
---------------------------------------------
|
|
|
|
This document describes how to set up a U-Boot image that can be booted
|
|
by Freescale MX25, MX35, MX51, MX53 and MX6 processors via internal boot
|
|
mode.
|
|
|
|
These processors can boot directly from NAND, SPI flash and SD card flash
|
|
using its internal boot ROM support. MX6 processors additionally support
|
|
boot from NOR flash and SATA disks. All processors can boot from an internal
|
|
UART, if booting from device media fails.
|
|
Booting from NOR flash does not require to use this image type.
|
|
|
|
For more details refer Chapter 2 - System Boot and section 2.14
|
|
(flash header description) of the processor's manual.
|
|
|
|
Command syntax:
|
|
--------------
|
|
./tools/mkimage -l <mx u-boot_file>
|
|
to list the imx image file details
|
|
|
|
./tools/mkimage -T imximage \
|
|
-n <board specific configuration file> \
|
|
-e <execution address> -d <u-boot binary> <output image file>
|
|
|
|
For example, for the mx51evk board:
|
|
./tools/mkimage -n ./board/freescale/mx51evk/imximage.cfg \
|
|
-T imximage -e 0x97800000 \
|
|
-d u-boot.bin u-boot.imx
|
|
|
|
You can generate directly the image when you compile u-boot with:
|
|
|
|
$ make u-boot.imx
|
|
|
|
The output image can be flashed on the board SPI flash or on a SD card.
|
|
In both cases, you have to copy the image at the offset required for the
|
|
chosen media devices (0x400 for both SPI flash or SD card).
|
|
|
|
Please check Freescale documentation for further details.
|
|
|
|
Board specific configuration file specifications:
|
|
-------------------------------------------------
|
|
1. This file must present in the $(BOARDDIR) and the name should be
|
|
imximage.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 is 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
|
|
-------------- -----------
|
|
IMXIMAGE_VERSION 1/2
|
|
1 is for mx25/mx35/mx51 compatible,
|
|
2 is for mx53/mx6 compatible,
|
|
others is invalid and error is generated.
|
|
This command need appear the fist before
|
|
other valid commands in configuration file.
|
|
|
|
BOOT_OFFSET value
|
|
|
|
This command is parallel to BOOT_FROM and
|
|
is preferred over BOOT_FROM.
|
|
|
|
value: Offset of the image header, this
|
|
value shall be set to one of the
|
|
values found in the file:
|
|
arch/arm/include/asm/\
|
|
imx-common/imximage.cfg
|
|
Example:
|
|
BOOT_OFFSET FLASH_OFFSET_STANDARD
|
|
|
|
BOOT_FROM nand/spi/sd/onenand/nor/sata
|
|
|
|
This command is parallel to BOOT_OFFSET and
|
|
is to be deprecated in favor of BOOT_OFFSET.
|
|
|
|
Example:
|
|
BOOT_FROM spi
|
|
|
|
CSF value
|
|
|
|
Total size of CSF (Command Sequence File)
|
|
used for Secure Boot/ High Assurance Boot
|
|
(HAB).
|
|
|
|
Using this command will populate the IVT
|
|
(Initial Vector Table) CSF pointer and adjust
|
|
the length fields only. The CSF itself needs
|
|
to be generated with Freescale tools and
|
|
'manually' appended to the u-boot.imx file.
|
|
|
|
The CSF is then simply concatenated
|
|
to the u-boot image, making a signed bootloader,
|
|
that the processor can verify
|
|
if the fuses for the keys are burned.
|
|
|
|
Further infos how to configure the SOC to verify
|
|
the bootloader can be found in the "High
|
|
Assurance Boot Version Application Programming
|
|
Interface Reference Manual" as part of the
|
|
Freescale Code Signing Tool, available on the
|
|
manufacturer's website.
|
|
|
|
Example:
|
|
CSF 0x2000
|
|
|
|
DATA type address value
|
|
|
|
type: word=4, halfword=2, byte=1
|
|
address: physycal register address
|
|
value: value to be set in register
|
|
All values are in in hexadecimal.
|
|
Example (write to IOMUXC):
|
|
DATA 4 0x73FA88a0 0x200
|
|
|
|
The processor support up to 60 register programming commands for IMXIMAGE_VERSION 1
|
|
and 121 register programming commands for IMXIMAGE_VERSION 2.
|
|
An error is generated if more commands are found in the configuration file.
|
|
|
|
3. All commands are optional to program.
|
|
|
|
Setup a SD Card for booting
|
|
--------------------------------
|
|
|
|
The following example prepare a SD card with u-boot and a FAT partition
|
|
to be used to stored the kernel to be booted.
|
|
I will set the SD in the most compatible mode, setting it with
|
|
255 heads and 63 sectors, as suggested from several documentation and
|
|
howto on line (I took as reference the preparation of a SD Card for the
|
|
Beagleboard, running u-boot as bootloader).
|
|
|
|
You should start clearing the partitions table on the SD card. Because
|
|
the u-boot image must be stored at the offset 0x400, it must be assured
|
|
that there is no partition at that address. A new SD card is already
|
|
formatted with FAT filesystem and the partition starts from the first
|
|
cylinder, so we need to change it.
|
|
|
|
You can do all steps with fdisk. If the device for the SD card is
|
|
/dev/mmcblk0, the following commands make the job:
|
|
|
|
1. Start the fdisk utility (as superuser)
|
|
fdisk /dev/mmcblk0
|
|
|
|
2. Clear the actual partition
|
|
|
|
Command (m for help): o
|
|
|
|
3. Print card info:
|
|
|
|
Command (m for help): p
|
|
Disk /dev/mmcblk0: 1981 MB, 1981284352 bytes
|
|
|
|
In my case, I have a 2 GB card. I need the size to set later the correct value
|
|
for the cylinders.
|
|
|
|
4. Go to expert mode:
|
|
|
|
Command (m for help): x
|
|
|
|
5. Set card geometry
|
|
|
|
Expert command (m for help): h
|
|
Number of heads (1-256, default 4): 255
|
|
|
|
Expert command (m for help): s
|
|
Number of sectors (1-63, default 16): 63
|
|
Warning: setting sector offset for DOS compatiblity
|
|
|
|
We have set 255 heads, 63 sector. We have to set the cylinder.
|
|
The value to be set can be calculated with:
|
|
|
|
cilynder = <total size> / <heads> / <sectors> / <blocksize>
|
|
|
|
in this example,
|
|
1981284352 / 255 / 63 / 512 = 239.x = 239
|
|
|
|
|
|
Expert command (m for help): c
|
|
Number of cylinders (1-1048576, default 60032): 239
|
|
|
|
6. Leave the expert mode
|
|
Expert command (m for help): r
|
|
|
|
7. Set up a partition
|
|
|
|
Now set a partition table to store the kernel or whatever you want. Of course,
|
|
you can set additional partitions to store rootfs, data, etc.
|
|
In my example I want to set a single partition. I must take care
|
|
to not overwrite the space where I will put u-boot.
|
|
|
|
Command (m for help): n
|
|
Command action
|
|
e extended
|
|
p primary partition (1-4)
|
|
p
|
|
Partition number (1-4): 1
|
|
First cylinder (1-239, default 1): 3
|
|
Last cylinder, +cylinders or +size{K,M,G} (3-239, default 239): +100M
|
|
|
|
Command (m for help): p
|
|
|
|
Disk /dev/mmcblk0: 1967 MB, 1967128576 bytes
|
|
255 heads, 63 sectors/track, 239 cylinders
|
|
Units = cylinders of 16065 * 512 = 8225280 bytes
|
|
Disk identifier: 0xb712a870
|
|
|
|
Device Boot Start End Blocks Id System
|
|
/dev/mmcblk0p1 3 16 112455 83 Linux
|
|
|
|
I have set 100MB, leaving the first 2 sectors free. I will copy u-boot
|
|
there.
|
|
|
|
8. Write the partition table and exit.
|
|
|
|
Command (m for help): w
|
|
The partition table has been altered!
|
|
|
|
Calling ioctl() to re-read partition table.
|
|
|
|
9. Copy u-boot.imx on the SD card
|
|
|
|
I use dd:
|
|
|
|
dd if=u-boot.imx of=/dev/mmcblk0 bs=512 seek=2
|
|
|
|
This command copies the u-boot image at the address 0x400, as required
|
|
by the processor.
|
|
|
|
Now remove your card from the PC and go to the target. If evrything went right,
|
|
the u-boot prompt should come after power on.
|
|
|
|
------------------------------------------------
|
|
Author: Stefano babic <sbabic@denx.de>
|