README.mxs 10.6 KB
Newer Older
Bin Meng's avatar
Bin Meng committed
1
Booting U-Boot on a MXS processor
2
=================================
3

4 5
This document describes the MXS U-Boot port. This document mostly covers topics
related to making the module/board bootable.
6 7 8 9

Terminology
-----------

10 11 12
The term "MXS" refers to a family of Freescale SoCs that is composed by MX23
and MX28.

13 14 15 16 17 18 19 20 21 22
The dollar symbol ($) introduces a snipped of shell code. This shall be typed
into the unix command prompt in U-Boot source code root directory.

The (=>) introduces a snipped of code that should by typed into U-Boot command
prompt

Contents
--------

1) Prerequisites
23 24 25
2) Compiling U-Boot for a MXS based board
3) Installation of U-Boot for a MXS based board to SD card
4) Installation of U-Boot into NAND flash on a MX28 based board
Bin Meng's avatar
Bin Meng committed
26
5) Installation of U-Boot into SPI NOR flash on a MX28 based board
27 28 29 30

1) Prerequisites
----------------

31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
To make a MXS based board bootable, some tools are necessary. The only
mandatory tool is the "mxsboot" tool found in U-Boot source tree. The
tool is built automatically when compiling U-Boot for i.MX23 or i.MX28.

The production of BootStream image is handled via "mkimage", which is
also part of the U-Boot source tree. The "mkimage" requires OpenSSL
development libraries to be installed. In case of Debian and derivates,
this is installed by running:

	$ sudo apt-get install libssl-dev

NOTE: The "elftosb" tool distributed by Freescale Semiconductor is no
      longer necessary for general use of U-Boot on i.MX23 and i.MX28.
      The mkimage supports generation of BootStream images encrypted
      with a zero key, which is the vast majority of use-cases. In
      case you do need to produce image encrypted with non-zero key
      or other special features, please use the "elftosb" tool,
      otherwise continue to section 2). The installation procedure of
      the "elftosb" is outlined below:
50 51 52

Firstly, obtain the elftosb archive from the following location:

53
	ftp://ftp.denx.de/pub/tools/elftosb-10.12.01.tar.gz
54 55 56 57 58 59

We use a $VER variable here to denote the current version. At the time of
writing of this document, that is "10.12.01". To obtain the file from command
line, use:

	$ VER="10.12.01"
60
	$ wget ftp://ftp.denx.de/pub/tools/elftosb-${VER}.tar.gz
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82

Extract the file:

	$ tar xzf elftosb-${VER}.tar.gz

Compile the file. We need to manually tell the linker to use also libm:

	$ cd elftosb-${VER}/
	$ make LIBS="-lstdc++ -lm" elftosb

Optionally, remove debugging symbols from elftosb:

	$ strip bld/linux/elftosb

Finally, install the "elftosb" binary. The "install" target is missing, so just
copy the binary by hand:

	$ sudo cp bld/linux/elftosb /usr/local/bin/

Make sure the "elftosb" binary can be found in your $PATH, in this case this
means "/usr/local/bin/" has to be in your $PATH.

83
2) Compiling U-Boot for a MXS based board
84 85
-------------------------------------------

86
Compiling the U-Boot for a MXS board is straightforward and done as compiling
87 88
U-Boot for any other ARM device. For cross-compiler setup, please refer to
ELDK5.0 documentation. First, clean up the source code:
89 90 91

	$ make mrproper

92
Next, configure U-Boot for a MXS based board
93

94
	$ make <mxs_based_board_name>_config
95 96 97

Examples:

Bin Meng's avatar
Bin Meng committed
98
1. For building U-Boot for Denx M28EVK board:
99 100 101

	$ make m28evk_config

Bin Meng's avatar
Bin Meng committed
102
2. For building U-Boot for Freescale MX28EVK board:
103 104 105

	$ make mx28evk_config

Bin Meng's avatar
Bin Meng committed
106
3. For building U-Boot for Freescale MX23EVK board:
107 108 109

	$ make mx23evk_config

Bin Meng's avatar
Bin Meng committed
110
4. For building U-Boot for Olimex MX23 Olinuxino board:
111 112 113

	$ make mx23_olinuxino_config

114
Lastly, compile U-Boot and prepare a "BootStream". The "BootStream" is a special
115
type of file, which MXS CPUs can boot. This is handled by the following
116 117 118 119 120 121 122 123 124 125 126
command:

	$ make u-boot.sb

HINT: To speed-up the build process, you can add -j<N>, where N is number of
      compiler instances that'll run in parallel.

The code produces "u-boot.sb" file. This file needs to be augmented with a
proper header to allow successful boot from SD or NAND. Adding the header is
discussed in the following chapters.

127 128 129 130 131 132 133 134 135 136 137 138
NOTE: The process that produces u-boot.sb uses the mkimage to generate the
      BootStream. The BootStream is encrypted with zero key. In case you need
      some special features of the BootStream and plan on using the "elftosb"
      tool instead, the invocation to produce a compatible BootStream with the
      one produced by mkimage is outlined below. For further details, refer to
      the documentation bundled with the "elftosb" package.

	$ elftosb -zf imx23 -c arch/arm/cpu/arm926ejs/mxs/u-boot-imx23.bd \
		-o u-boot.sb
	$ elftosb -zf imx28 -c arch/arm/cpu/arm926ejs/mxs/u-boot-imx28.bd \
		-o u-boot.sb

139 140
3) Installation of U-Boot for a MXS based board to SD card
----------------------------------------------------------
141

142 143 144
To boot a MXS based board from SD, set the boot mode DIP switches according to
to MX28 manual, section 12.2.1 (Table 12-2) or MX23 manual, section 35.1.2
(Table 35-3).
145

146 147 148
The SD card used to boot U-Boot must contain a DOS partition table, which in
turn carries a partition of special type and which contains a special header.
The rest of partitions in the DOS partition table can be used by the user.
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181

To prepare such partition, use your favourite partitioning tool. The partition
must have the following parameters:

	* Start sector .......... sector 2048
	* Partition size ........ at least 1024 kb
	* Partition type ........ 0x53 (sometimes "OnTrack DM6 Aux3")

For example in Linux fdisk, the sequence for a clear card follows. Be sure to
run fdisk with the option "-u=sectors" to set units to sectors:

	* o ..................... create a clear partition table
	* n ..................... create new partition
		* p ............. primary partition
		* 1 ............. first partition
		* 2048 .......... first sector is 2048
		* +1M ........... make the partition 1Mb big
	* t 1 ................... change first partition ID
		* 53 ............ change the ID to 0x53 (OnTrack DM6 Aux3)
	* <create other partitions>
	* w ..................... write partition table to disk

The partition layout is ready, next the special partition must be filled with
proper contents. The contents is generated by running the following command
(see chapter 2)):

	$ ./tools/mxsboot sd u-boot.sb u-boot.sd

The resulting file, "u-boot.sd", shall then be written to the partition. In this
case, we assume the first partition of the SD card is /dev/mmcblk0p1:

	$ dd if=u-boot.sd of=/dev/mmcblk0p1

182
Last step is to insert the card into the MXS based board and boot.
183 184 185 186 187

NOTE: If the user needs to adjust the start sector, the "mxsboot" tool contains
      a "-p" switch for that purpose. The "-p" switch takes the sector number as
      an argument.

188 189
4) Installation of U-Boot into NAND flash on a MX28 based board
---------------------------------------------------------------
190

191
To boot a MX28 based board from NAND, set the boot mode DIP switches according
192
to MX28 manual section 12.2.1 (Table 12-2), PORT=GPMI, NAND 1.8 V.
193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221

There are two possibilities when preparing an image writable to NAND flash.

	I) The NAND wasn't written at all yet or the BCB is broken
	----------------------------------------------------------
	   In this case, both BCB (FCB and DBBT) and firmware needs to be
	   written to NAND. To generate NAND image containing all these,
	   there is a tool called "mxsboot" in the "tools/" directory. The tool
	   is invoked on "u-boot.sb" file from chapter 2):

		 $ ./tools/mxsboot nand u-boot.sb u-boot.nand

	   NOTE: The above invokation works for NAND flash with geometry of
		 2048b per page, 64b OOB data, 128kb erase size. If your chip
		 has a different geometry, please use:

		 -w <size>	change page size (default 2048 b)
		 -o <size>	change oob size (default 64 b)
		 -e <size>	change erase size (default 131072 b)

		 The geometry information can be obtained from running U-Boot
		 on the MX28 board by issuing the "nand info" command.

	   The resulting file, "u-boot.nand" can be written directly to NAND
	   from the U-Boot prompt. To simplify the process, the U-Boot default
	   environment contains script "update_nand_full" to update the system.

	   This script expects a working TFTP server containing the file
	   "u-boot.nand" in it's root directory. This can be changed by
222
	   adjusting the "update_nand_full_filename" variable.
223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244

	   To update the system, run the following in U-Boot prompt:

		 => run update_nand_full

	   In case you would only need to update the bootloader in future,
	   see II) below.

	II) The NAND was already written with a good BCB
	------------------------------------------------
	   This part applies after the part I) above was done at least once.

	   If part I) above was done correctly already, there is no need to
	   write the FCB and DBBT parts of NAND again. It's possible to upgrade
	   only the bootloader image.

	   To simplify the process of firmware update, the U-Boot default
	   environment contains script "update_nand_firmware" to update only
	   the firmware, without rewriting FCB and DBBT.

	   This script expects a working TFTP server containing the file
	   "u-boot.sb" in it's root directory. This can be changed by
245
	   adjusting the "update_nand_firmware_filename" variable.
246 247 248 249 250 251 252 253 254

	   To update the system, run the following in U-Boot prompt:

		 => run update_nand_firmware

	III) Special settings for the update scripts
	--------------------------------------------
	   There is a slight possibility of the user wanting to adjust the
	   STRIDE and COUNT options of the NAND boot. For description of these,
255
	   see MX28 manual section 12.12.1.2 and 12.12.1.3.
256 257 258 259 260 261 262 263 264 265

	   The update scripts take this possibility into account. In case the
	   user changes STRIDE by blowing fuses, the user also has to change
	   "update_nand_stride" variable. In case the user changes COUNT by
	   blowing fuses, the user also has to change "update_nand_count"
	   variable for the update scripts to work correctly.

	   In case the user needs to boot a firmware image bigger than 1Mb, the
	   user has to adjust the "update_nand_firmware_maxsz" variable for the
	   update scripts to work properly.
266 267 268 269

5) Installation of U-Boot into SPI NOR flash on a MX28 based board
------------------------------------------------------------------

Bin Meng's avatar
Bin Meng committed
270
The u-boot.sb file can be directly written to SPI NOR from U-Boot prompt.
271 272 273 274 275 276 277 278 279 280

Load u-boot.sb into RAM, this can be done in several ways and one way is to use
tftp:
       => tftp u-boot.sb 0x42000000

Probe the SPI NOR flash:
       => sf probe

(SPI NOR should be succesfully detected in this step)

Bin Meng's avatar
Bin Meng committed
281
Erase the blocks where U-Boot binary will be written to:
282 283 284 285 286 287 288 289
       => sf erase 0x0 0x80000

Write u-boot.sb to SPI NOR:
       => sf write 0x42000000 0 0x80000

Power off the board and set the boot mode DIP switches to boot from the SPI NOR
according to MX28 manual section 12.2.1 (Table 12-2)

Bin Meng's avatar
Bin Meng committed
290
Last step is to power up the board and U-Boot should start from SPI NOR.