U Boot Abcdge
U Boot Abcdge
U Boot Abcdge
canyonlands
Table of contents:
1. Abstract
2. Introduction
2.1. Copyright
2.2. Disclaimer
2.3. Availability
2.4. Credits
2.5. Translations
2.6. Feedback
2.7. Conventions
3. Embedded Linux Development Kit
3.1. ELDK Availability
3.2. ELDK Getting Help
3.3. Supported Host Systems
3.4. Supported Target Architectures
3.5. Installation
3.5.1. Product Packaging
3.5.2. Downloading the ELDK
3.5.3. Initial Installation
3.5.4. Installation and Removal of Individual Packages
3.5.5. Removal of the Entire Installation
3.6. Working with ELDK
3.6.1. Switching Between Multiple Installations
3.7. Mounting Target Components via NFS
3.8. Rebuilding ELDK Components
3.8.1. ELDK Source Distribution
3.8.2. Rebuilding Target Packages
3.8.3. Rebuilding ELDT Packages
3.9. ELDK Packages
3.9.1. List of ELDT Packages
3.9.2. List of Target Packages
3.10. Rebuilding the ELDK from Scratch
3.10.1. ELDK Build Process Overview
3.10.2. Setting Up ELDK Build Environment
3.10.3. build.sh Usage
3.10.4. Format of the cpkgs.lst and tpkgs.lst Files
3.11. Notes for Solaris 2.x Host Environment
4. System Setup
4.1. Serial Console Access
4.2. Configuring the "cu" command
4.3. Configuring the "kermit" command
4.4. Using the "minicom" program
4.5. Permission Denied Problems
4.6. Configuration of a TFTP Server
4.7. Configuration of a BOOTP / DHCP Server
4.8. Configuring a NFS Server
5. Das U-Boot
5.1. Current Versions
5.2. Unpacking the Source Code
The DENX U-Boot and Linux Guide (DULG) for canyonlands
5.3. Configuration
5.4. Installation
5.4.1. Before You Begin
5.4.1.1. Installation Requirements
5.4.1.2. Board Identification Data
5.4.2. Installation Using a BDM/JTAG Debugger
5.4.3. Installation using U-Boot
5.5. Tool Installation
5.6. Initialization
5.7. Initial Steps
5.8. The First Power-On
5.9. U-Boot Command Line Interface
5.9.1. Information Commands
5.9.1.1. bdinfo - print Board Info structure
5.9.1.2. coninfo - print console devices and informations
5.9.1.3. flinfo - print FLASH memory information
5.9.1.4. iminfo - print header information for application image
5.9.1.5. help - print online help
5.9.2. Memory Commands
5.9.2.1. base - print or set address offset
5.9.2.2. crc32 - checksum calculation
5.9.2.3. cmp - memory compare
5.9.2.4. cp - memory copy
5.9.2.5. md - memory display
5.9.2.6. mm - memory modify (auto-incrementing)
5.9.2.7. mtest - simple RAM test
5.9.2.8. mw - memory write (fill)
5.9.2.9. nm - memory modify (constant address)
5.9.2.10. loop - infinite loop on address range
5.9.3. Flash Memory Commands
5.9.3.1. cp - memory copy
5.9.3.2. flinfo - print FLASH memory information
5.9.3.3. erase - erase FLASH memory
5.9.3.4. protect - enable or disable FLASH write protection
5.9.3.5. mtdparts - define a Linux compatible MTD partition scheme
5.9.4. Execution Control Commands
5.9.4.1. source - run script from memory
5.9.4.2. bootm - boot application image from memory
5.9.4.3. go - start application at address 'addr'
5.9.5. Download Commands
5.9.5.1. bootp - boot image via network using BOOTP/TFTP protocol
5.9.5.2. dhcp - invoke DHCP client to obtain IP/boot params
5.9.5.3. loadb - load binary file over serial line (kermit mode)
5.9.5.4. loads - load S-Record file over serial line
5.9.5.5. rarpboot- boot image via network using RARP/TFTP protocol
5.9.5.6. tftpboot- boot image via network using TFTP protocol
5.9.6. Environment Variables Commands
5.9.6.1. printenv- print environment variables
5.9.6.2. saveenv - save environment variables to persistent storage
5.9.6.3. setenv - set environment variables
5.9.6.4. run - run commands in an environment variable
5.9.6.5. bootd - boot default, i.e., run 'bootcmd'
5.9.7. Flattened Device Tree support
5.9.7.1. fdt addr - select FDT to work on
The DENX U-Boot and Linux Guide (DULG) for canyonlands
1. Abstract
This is the DENX U-Boot and Linux Guide to Embedded PowerPC, ARM and MIPS Systems.
The document describes how to configure, build and use the firmware Das U-Boot (typically abbreviated as
just "U-Boot") and the operating system Linux for Embedded PowerPC, ARM and MIPS Systems.
The focus of this version of the document is on canyonlands boards.
This document was generated at 21 Jun 2016 - 16:45.
2. Introduction
2.1. Copyright
2.2. Disclaimer
2.3. Availability
2.4. Credits
2.5. Translations
2.6. Feedback
2.7. Conventions
1. Abstract
2. Introduction
This document describes how to use the firmware U-Boot and the operating system Linux in Embedded
Power Architecture, ARM and MIPS Systems.
There are many steps along the way, and it is nearly impossible to cover them all in depth, but we will try to
provide all necessary information to get an embedded system running from scratch. This includes all the tools
you will probably need to configure, build and run U-Boot and Linux.
First, we describe how to install the Cross Development Tools Embedded Linux Development Kit which you
probably need - at least when you use a standard x86 PC running Linux or a Sun Solaris 2.6 system as build
environment.
Then we describe what needs to be done to connect to the serial console port of your target: you will have to
configure a terminal emulation program like cu or kermit.
In most cases you will want to load images into your target using ethernet; for this purpose you need TFTP
and DHCP / BOOTP servers. A short description of their configuration is given.
A description follows of what needs to be done to configure and build the U-Boot for a specific board, and
how to install it and get it working on that board.
The configuration, building and installing of Linux in an embedded configuration is the next step. We use
SELF, our Simple Embedded Linux Framework, to demonstrate how to set up both a development system
(with the root filesystem mounted over NFS) and an embedded target configuration (running from a ramdisk
image based on busybox).
This document does not describe what needs to be done to port U-Boot or Linux to a new hardware platform.
Instead, it is silently assumed that your board is already supported by U-Boot and Linux.
The focus of this document is on canyonlands boards.
2.1. Copyright
Copyright (C) 2001 - 2011 by Wolfgang Denk, DENX Software Engineering.
Copyright (C) 2003 - 2011 by Detlev Zundel, DENX Software Engineering.
Copyright (C) 2003 - 2011 by contributing authors
You have the freedom to distribute copies of this document in any format or to create a derivative work of it
and distribute it provided that you:
Distribute this document or the derivative work at no charge at all. It is not permitted to sell this
document or the derivative work or to include it into any package or distribution that is not freely
available to everybody.
Send your derivative work (in the most suitable format such as sgml) to the author.
License the derivative work with this same license or use GPL. Include a copyright notice and at least
a pointer to the license used.
Give due credit to previous authors and major contributors.
It is requested that corrections and/or comments be forwarded to the author.
2. Introduction
If you are considering to create a derived work other than a translation, it is requested that you discuss your
plans with the author.
2.2. Disclaimer
Use the information in this document at your own risk. DENX disavows any potential liability for the contents
of this document. Use of the concepts, examples, and/or other content of this document is entirely at your own
risk. All copyrights are owned by their owners, unless specifically noted otherwise. Use of a term in this
document should not be regarded as affecting the validity of any trademark or service mark. Naming of
particular products or brands should not be seen as endorsements.
2.3. Availability
The latest version of this document is available in a number of formats:
HTML http://www.denx.de/wiki/publish/DULG/DULG-canyonlands.html
plain ASCII text http://www.denx.de/wiki/publish/DULG/DULG-canyonlands.txt
PostScript European A4 format http://www.denx.de/wiki/publish/DULG/DULG-canyonlands.ps
PDF European A4 format http://www.denx.de/wiki/publish/DULG/DULG-canyonlands.pdf
2.4. Credits
A lot of the information contained in this document was collected from several mailing lists. Thanks to
anybody who contributed in one form or another.
2.5. Translations
None yet.
2.6. Feedback
Any comments or suggestions can be mailed to the author: Wolfgang Denk at [email protected].
2.7. Conventions
Descriptions
Warnings
Hint
Notes
Information requiring special attention
File Names
Directory Names
Commands to be typed
Applications Names
Prompt of users command under bash shell
Prompt of root users command under bash shell
Prompt of users command under tcsh shell
Environment Variables
Emphasized word
2.1. Copyright
Appearance
Note.
Warning
file.extension
directory
a command
another application
bash$
bash#
tcsh$
VARIABLE
word
8
Code Example
ls -l
HTTP
9
ftp://ftp.denx.de/pub/eldk/
http://www.denx.de/ftp/pub/eldk/
HTTP
ftp://ftp-stud.hs-esslingen.de/pub/Mirrors/eldk/
http://ftp-stud.hs-esslingen.de/pub/Mirrors/eldk/
ftp://mirror.switch.ch/mirror/eldk/
http://mirror.switch.ch/ftp/mirror/eldk/
not available
http://mira.sunsite.utk.edu/eldk/
ftp://ftp.sunet.se/pub/Linux/distributions/eldk/
http://ftp.sunet.se/pub/Linux/distributions/eldk/
10
3.5. Installation
3.5.1. Product Packaging
Stable versions of the ELDK are distributed in the form of an ISO image, which can be either burned onto a
DVD or mounted directly, using the loopback Linux device driver (Linux host only).
For the Power Architecture target, the ELDK distribution was split into three independent ISO images: one
targeting the 4xx family of processors (AMCC), one targeting the ppc64 family of processors and another one
for the 8xx, 6xx, 74xx and 85xx families (Freescale). This makes the ISO images fit on standard DVDROM
media.
If you are not bound by the DVDROM size limitiation there is still a single image containing all 32-bit targets
(AMCC and Freescale).
Development versions of the ELDK are available as directory trees so it is easy to update individual packages;
instructions for download of these trees and creation of ISO images from it is described in section 3.5.2.
Downloading the ELDK.
The ELDK contains an installation utility and a number of RPM packages, which are installed onto the hard
disk of the cross development host by the installation procedure. The RPM packages can be logically divided
into two parts:
Embedded Linux Development Tools (ELDT)
Target components
The first part contains the cross development tools that are executed on the host system. Most notably, these
are the GNU cross compiler, binutils, and gdb. For a full list of the provided ELDT packages, refer to section
3.9.1. List of ELDT Packages below.
The target components are pre-built tools and libraries which are executed on the target system. The ELDK
includes necessary target components to provide a minimal working NFS-based environment for the target
system. For a list of the target packages included in the ELDK, refer to section 3.9.2. List of Target Packages
below.
The ELDK contains several independent sets of the target packages, one for each supported target architecture
CPU family. Each set has been built using compiler code generation and optimization options specific to the
respective target CPU family.
11
If you want to download the whole ELDK directory tree instead you can - for example - use the ncftp FTP
client:
bash$
...
ncftp
ncftp
ncftp
...
ncftp
ncftp ftp.sunet.se
/ > cd /pub/Linux/distributions/eldk/4.2
/pub/Linux/distributions/eldk/4.2 > bin
/pub/Linux/distributions/eldk/4.2 > get -R ppc-linux-x86/distribution
/pub/Linux/distributions/eldk/4.2 > bye
If you don't find the ncftp tool on your system you can download the NcFTP client from
http://www.ncftp.com/download/
There are a few executable files (binaries and scripts) in the ELDK tree. Make sure they have the execute
permissions set in your local copy:
bash$ for file in \
>
tools/bin/rpm \
>
tools/usr/lib/rpm/rpmd \
>
install \
>
ELDK_MAKEDEV \
>
ELDK_FIXOWNER
> do
> chmod +x ppc-linux-x86/distribution/$file
> done
This will create an ISO image eldk-ppc-linux-x86.iso in your local directory that can be burned on DVD or
mounted using the loopback device and used for installation as described above. Of course you can use the
local copy of the directory tree directly for the installation, too.
Please refer to section 3.10.2. Setting Up ELDK Build Environment for instructions on obtaining the build
environment needed to re-build the ELDK from scratch.
12
-d <dir>
Specifies the root directory of the ELDK being installed. If omitted, the ELDK goes into
the current directory.
<cpu_family> Specifies the target CPU family the user desires to install. If one or more
<cpu_family> parameters are specified, only the target components specific to the
respective CPU families are installed onto the host. If omitted, the target components for
all supported target architecture CPU families are installed.
Note: Make sure that the "exec" option to the mount command is in effect when mounting the ELDK ISO
image. Otherwise the install program cannot be executed. On some distributions, it may be necessary to
modify the /etc/fstab file, adding the "exec" mount option to the cdrom entry - it may also be the case that
other existing mount options, such as "user" prevent a particular configuration from mounting the ELDK
DVD with appropriate "exec" permission. In such cases, consult your distribution documentation or mount the
DVD explicitly using a command such as "sudo mount -o exec /dev/cdrom /mnt/cdrom" (sudo allows regular
users to run certain privileged commands but may not be configured - run the previous command as root
without "sudo" in the case that "sudo" has not been setup for use on your particular GNU/Linux system).
You can install the ELDK to any empty directory you wish, the only requirement being that you have to have
write and execute permissions on the directory. The installation process does not require superuser privileges.
Depending on the parameters the install utility is invoked with, it installs one or more sets of target
components. The ELDT packages are installed in any case.
Refer to section 3.6. Working with ELDK for a sample usage of the ELDK.
Note: If you intend to use the installation as a root filesystem exported over NFS, then you now have to
finish the configuration of the ELDK following the instructions in 3.7. Mounting Target Components via
NFS.
Note: Installation of the Glibc- and uClibc-based ELDK versions into one directory is not yet supported.
Note: Installation of the 32-bit and 64-bit ELDK versions into one directory is not yet supported.
13
For the above commands to work correctly, it is crucial that the correct rpm binary gets invoked. In case of
multiple ELDK installations and RedHat-based host system, there may well be several rpm tools installed on
the host system.
You must make sure, either by using an explicit path or by having set an appropriate PATH environment
variable, that when you invoke rpm to install/remove components of a ELDK installation, it is the ELDK's
rpm utility that gets actually invoked. The rpm utility is located in the bin subdirectory relative to the ELDK
root installation directory.
To avoid confusion with the host OS (RedHat) rpm utility, the ELDK creates symlinks to its rpm binary with
the names such that it could be invoked using the ${CROSS_COMPILE}rpm notation, for all supported
$CROSS_COMPILE values.
The standard (host OS) rpm utility allows various macros and configuration parameters to specified in
user-specific ~/.rpmrc and ~/.rpmmacros files. The ELDK rpm tool also has this capability, but the names of
the user-specific configuration files are ~/.eldk_rpmrc and ~/.eldk_rpmmacros, respectively.
Run the installation utility included on the distribution to install into that specified directory:
bash$ /mnt/cdrom/install -d /opt/eldk
14
The trailing '-' character in the CROSS_COMPILE variable value is optional and has no effect on
the cross tools behavior. However, it is required when building Linux kernel and U-Boot images.
Compile a file:
bash$ ${CROSS_COMPILE}gcc -o hello_world hello_world.c
You can also call the cross tools using the generic prefix ppc-linux- for example:
bash$ ppc-linux-gcc -o hello_world hello_world.c
or, equivalently:
bash$ /opt/eldk/usr/ppc-linux/bin/gcc -o hello_world hello_world.c
The value of the CROSS_COMPILE variable must correspond to the target CPU family you want the cross
tools to work for. Refer to the table below for the supported CROSS_COMPILE variable values:
3.6.A Table of possible values for $CROSS_COMPILE
CROSS_COMPILE Value Predefined Compiler Flag FPU present or not
ppc_4xx-mcpu=403
No
ppc_4xxFP-mcpu=405fp
Yes
ppc_6xx-mcpu=603
Yes
ppc_74xx-mcpu=7400
Yes
ppc_8xx-mcpu=860
No
ppc_85xx-mcpu=8540
Yes
ppc_85xxDP-mcpu=8540
Yes
ppc64-linux-mcpu=powerpc64
Yes
For compatibility with older versions of the ELDK and with other toolkits the following values for
$CROSS_COMPILE can be used, too: ppc_7xx- and ppc_82xx-. These are synonyms for ppc_6xx.
To load the correct include files, find the correct libraries, spec files, etc., the compiler needs to know the
ELDK root directory. The compiler determines this information by analyzing the shell command it was
invoked with ( ppc_8xx-gcc - without specifying the explicit path in this example) and, if needed, the
value of the PATH environment variable. Thus, the compiler knows that it has been executed from the
/work/denx_tools/usr/bin directory.
3.6.1. Switching Between Multiple Installations
15
Then, it knows that the compiler is installed in the usr/bin subdirectory of the root installation directory, so the
ELDK, the compiler is a part of, has been installed in the subdirectories of the /work/denx_tools directory.
This means that the target include files are in /work/denx_tools/<target_cpu_variant>/usr/include, and so on.
Before the NFS-mounted root file system can work, you must create necessary device nodes in the
<ELDK_root>/<target_cpu_variant>/dev directory. This process requires superuser privileges and thus
cannot be done by the installation procedure (which typically runs as non-root). To facilitate creation of the
device nodes, the ELDK provides a script named ELDK_MAKEDEV, which is located in the root of the ELDK
distribution ISO image. The script acccepts the following optional arguments:
-d <dir>
Specifies the root directory of the ELDK being installed. If omitted, then the current
directory is assumed.
-a <cpu_family> Specifies the target CPU family directory. If omitted, all installed target architecture
directories will be populated with the device nodes.
-h
Prints usage.
# /mnt/cdrom/ELDK_MAKEDEV -d /opt/eldk
NOTE: Compared to older versions of the ELDK, options and behaviour of this command have been changed
significantly. Please read the documentation.
Some of the target utilities included in the ELDK, such as mount and su, have the SUID bit set. This
means that when run, they will have privileges of the file owner of these utilities. That is, normally, they will
have the privileges of the user who installed the ELDK on the host system. However, for these utilities to
work properly, they must have superuser privileges. This means that if the ELDK was not installed by the
superuser, the file owner of the target ELDK utilities that have the SUID bit set must be changed to root
before a target component may be mounted as the root file system. The ELDK distribution image contains an
ELDK_FIXOWNER script, which you can use to change file owners of all the appropriate files of the ELDK
installation to root. The script accepts the same arguments as the ELDK_MAKEDEV script above. Please note
that you must have superuser privileges to run this script. For instance, if you have installed the ELDK in the
/opt/eldk directory, you can use the following commands:
# cd /opt/eldk
# /mnt/cdrom/ELDK_FIXOWNER
Please note, that in the case that the installation directory, where the new ELDK distribution is being installed,
is already populated with other ELDK distributions, the execution of the ELDK_FIXOWNER script without
arguments will make the script work with all installed ELDK target architecture directories. This could take
some time. To save the time, please use the -a argument to specify the appropriate target architecture. For
instance:
# cd /opt/eldk
# /mnt/cdrom/ELDK_FIXOWNER -a ppc_8xx
16
After an ELDK source RPM is installed using the above command, its spec file and sources can be found in
the subdirectories of the <ELDK_root>/usr/src/denx subdirectory.
The sections that follow provide detailed instructions on rebuilding ELDT and target components of the
ELDK.
Then you can rebuild the binary target RPM using the following command from the ELDK environment:
bash$ ${CROSS_COMPILE}rpmbuild -ba <package_name>.spec
In order for the rebuilding process to work correctly, the following conditions must be true:
The $CROSS_COMPILE environment variable must be set as appropriate for the target CPU family.
The <ELDK_root>/usr/ppc-linux/bin directory must be in PATH before the /usr/bin directory. This is
to make sure that the command gcc results in the fact that the ELDK cross compiler is invoked,
rather than the host gcc.
The newly built package can then be installed just as easily:
bash$ ${CROSS_COMPILE}rpm -i <package_name>.rpm
In order for the rebuilding process to work correctly, make sure all of the following is true:
The $CROSS_COMPILE environment variable must NOT be set.
17
Package Version
autoconf
2.61-8
automake
1.10-5
bison
2.3-3
crosstool-devel
0.43-3
dtc
20070802-1
elocaledef
1-1
ftdump
20070802-1
gdb
6.7-2
genext2fs
1.4.1-1
info
4.8-15
ldd
0.1-1
libtool
1.5.22-11
make
3.81-6
mkcramfs
1.1-1
mkimage
1.3.1-1
mtd-utils
1.0.1-2
rpm
4.4.2-46_2
rpm-build
4.4.2-46_2
sed
4.1.4-1
texinfo
4.8-15
Note: The crosstool 0.43 ELDT package provides the following packages: gcc 4.2.2, gcc-c++
4.2.2, gcc-java 4.2.2, cpp 4.2.2 and binutils 2.17.90. For more information about the
crosstool package please refer to http://kegel.com/crosstool.
18
Package Version
acl
2.2.39-3.1
appweb
2.2.2-5
attr
2.4.32-2
autoconf
2.61-8
bash
3.2-9
bc
1.06-26
bind
9.4.1-8.P1
binutils
2.17.90-1
binutils-devel
2.17.90-1
boa
0.94.14-0.5.rc21
busybox
1.7.1-2
byacc
1.9.20050813-1
bzip2
1.0.4-10
bzip2-devel
1.0.4-10
bzip2-libs
1.0.4-10
ccid
1.2.1-10
chkconfig
1.3.34-1
coreutils
6.9-3
cpio
2.6-27
cpp
4.2.2-2
cracklib
2.8.9-11
cracklib-dicts
2.8.9-11
crosstool-targetcomponents
0.43-3
curl
7.16.2-1
cyrus-sasl
2.1.22-6
cyrus-sasl-devel
2.1.22-6
cyrus-sasl-lib
2.1.22-6
db4
4.5.20-5_2
db4-devel
4.5.20-5_2
db4-utils
4.5.20-5_2
device-mapper
1.02.17-7
19
device-mapper-devel
1.02.17-7
device-mapper-libs
1.02.17-7
dhclient
3.0.5-38
dhcp
3.0.5-38
diffutils
2.8.1-16
directfb
1.0.0-1
dosfstools
2.11-8
dropbear
0.50-1
dtc
20070802-1
duma
2.5.8-2
e2fsprogs
1.39-11
e2fsprogs-devel
1.39-11
e2fsprogs-libs
1.39-11
ethtool
5-1
expat
1.95.8-9
expat-devel
1.95.8-9
file
4.21-1
file-libs
4.21-1
findutils
4.2.29-2
flex
2.5.33-9
freetype
2.3.4-3
freetype-devel
2.3.4-3
ftdump
20070802-1
ftp
0.17-40
gawk
3.1.5-15
gcc
4.2.2-2
gcc-c++
4.2.2-2
gcc-java
4.2.2-2
gdb
6.7-1
glib
1.2.10-26
glib2
2.12.13-1
glib2-devel
2.12.13-1
glib-devel
1.2.10-26
gmp
4.1.4-12.3
20
grep
2.5.1-57
groff
1.18.1.4-2
gzip
1.3.11-2
hdparm
6.9-3
httpd
2.2.4-4.1
httpd-devel
2.2.4-4.1
httpd-manual
2.2.4-4.1
initscripts
8.54.1-1
iproute
2.6.20-2
iptables
1.3.8-2
iputils
20070202-3
iscsitarget
0.4.15-1
kbd
1.12-22
kernel-headers
2.6.24-1
kernel-source
2.6.24-1
krb5-devel
1.6.1-2.1
krb5-libs
1.6.1-2.1
less
394-9
libattr
2.4.32-2
libattr-devel
2.4.32-2
libcap
1.10-29
libcap-devel
1.10-29
libpng
1.2.16-1
libpng-devel
1.2.16-1
libsysfs
2.1.0-1
libsysfs-devel
2.1.0-1
libtermcap
2.0.8-46.1
libtermcap-devel
2.0.8-46.1
libtirpc
0.1.7-7_2
libtirpc-devel
0.1.7-7_2
libtool
1.5.22-11
libtool-ltdl
1.5.22-11
libtool-ltdl-devel
1.5.22-11
libusb
0.1.12-7
21
libusb-devel
0.1.12-7
libuser
0.56.2-1
libuser-devel
0.56.2-1
libxml2
2.6.29-1
logrotate
3.7.5-3.1
lrzsz
0.12.20-22.1
lsof
4.78-5
ltp
20080131-eldk2
lvm2
2.02.24-1
m4
1.4.8-2
mailcap
2.1.23-1
make
3.81-6
MAKEDEV
3.23-1.2
man
1.6e-3
mdadm
2.6.2-4
microwindows
0.91-2
microwindows-fonts
0.91-1
mingetty
1.07-5.2.2
mktemp
1.5-25
module-init-tools
3.3-0.pre11.1.0
mtd-utils
1.0.1-2
ncompress
4.2.4-49
ncurses
5.6-17
ncurses-devel
5.6-17
net-snmp
5.4-14
net-snmp-devel
5.4-14
net-snmp-libs
5.4-14
net-snmp-utils
5.4-14
net-tools
1.60-82
newt
0.52.6-30
newt-devel
0.52.6-30
nfs-utils
1.1.0-1
ntp
4.2.4p2-1
open-iscsi
2.0-865.15
22
openldap
2.3.34-3
openldap-devel
2.3.34-3
openssl
0.9.8b-12_2
openssl-devel
0.9.8b-12_2
oprofile
0.9.2-8_2
pam
0.99.7.1-5.1
pam-devel
0.99.7.1-5.1
passwd
0.74-3
patch
2.5.4-29.2.2
pciutils
2.2.4-3_2
pciutils-devel
2.2.4-3_2
pcmciautils
014-9_2
pcre
7.0-2
pcsc-lite
1.3.3-1.0
pcsc-lite-devel
1.3.3-1.0
pcsc-lite-libs
1.3.3-1.0
perl
5.8.8-18_2
perl-libs
5.8.8-18_2
popt
1.12-1
portmap
4.0-65_2
postgresql
8.2.4-1_2
postgresql-devel
8.2.4-1_2
postgresql-libs
8.2.4-1_2
ppp
2.4.4-7
procps
3.2.7-14
psmisc
22.3-2
python
2.5.1-1
rdate
1.4-6
readline
5.2-4
readline-devel
5.2-4
routed
0.17-12_1
rpcbind
0.1.4-6
rpm
4.4.2-46_2
rpm-build
4.4.2-46_2
23
rpm-devel
4.4.2-46_2
rpm-libs
4.4.2-46_2
rsh
0.17-40
rsh-server
0.17-40
screen
4.0.3-50
sed
4.1.5-7
SELF
1.0-13
setup
2.6.4-1_2
shadow-utils
4.0.18.1-15
slang
2.0.7-17
slang-devel
2.0.7-17
smartmontools
5.38-2
strace
4.5.15-1
sysfsutils
2.1.0-1
sysklogd
1.4.2-9
sysvinit
2.86-17
tar
1.15.1-26
tcp_wrappers
7.6-48
tcp_wrappers-devel
7.6-48
tcp_wrappers-libs
7.6-48
telnet
0.17-38
telnet-server
0.17-38
termcap
5.5-1.20060701.1
tftp
0.42-4
tftp-server
0.42-4
thttpd
2.25b-13
time
1.7-29
u-boot
1.3.1-1
udev
106-4.1
unixODBC
2.2.12-2
unzip
5.52-4
util-linux
2.13-0.52_2
vim-common
7.1.12-1
vim-minimal
7.1.12-1
24
vixie-cron
4.1-82
vsftpd
2.0.5-16_2
which
2.16-8
wireless-tools
28-4
wpa_supplicant
0.5.7-3
wu-ftpd
2.6.2-1
xdd
65.013007-1
xenomai
2.4.2-1
xinetd
2.3.14-12
zip
2.31-3
zlib
1.2.3-10
zlib-devel
1.2.3-10
Note 1: Not all packages will be installed automatically; for example the boa and thttpd web servers
are mutually exclusive - you will have to remove one package before you can (manually) install the other one.
Note 2: The crosstool 0.43 target package provides the following packages: glibc 2.6,
glibc-common 2.6, glibc-devel 2.6, libstdc++ 4.2.2, libgcj 4.2.2, libgcj-devel
4.2.2 and libstdc++-devel 4.2.2. For more information about the crosstool package please
refer to http://kegel.com/crosstool
Note 3: The Xenomai and gcc-java packages are unavailable in ARM ELDK version.
25
Please use the following commands to check out a copy of one of the modules:
git-clone git://www.denx.de/git/eldk/module
Contents
tarballs
Source tarballs
build
SRPMS
Fedora 7 sources
Then you may switch to a specific release of the ELDK using the "git-checkout" command; for example, to
get the files for ELDK release 4.1, please do the following from the module directory:
git-checkout ELDK_4_2
It must be noted that some of the packages which are included in the ELDK are not included in Fedora.
Examples of such packages are appWeb, microwindows, and wu-ftpd. For these packages tarballs are
provided in the DENX GIT repository.
To facilitate building of the ELDK, a build infrastructure has been developed. The infrastructure is composed
of the following components:
ELDK_BUILD script
build.sh script
cpkgs.lst file
tpkgs.lst file
SRPMS.lst file
tarballs.lst file
The ELDK_BUILD script is the main script of the ELDK build procedure. It is the tool that you would
normally use to build the ELDK from scratch. In the simplest case, the script may be invoked without
arguments, and it will perform all necessary steps to build the ELDK in a fully automated way. You may pass
the following optional arguments to the ELDK_BUILD script:
-a <arch>
-n <build_name>
an identification string for the build. Defaults to the value based on the build
architecture and current date, and has the following format: <arch>-YYYY-MM-DD
-v <version>
-u
build the uClibc-based ELDK version (on the platforms and versions where this is
available).
-p <builddir>
Optional build directory. By default, build will place the work files and results in the
current directory.
Warning: The ELDK build scripts rely on standard behaviour of the RPM tool. Make sure you don't use
non-standard settings in your personal ~/.rpmmacros file that might cause conflicts.
build.sh is a supplementary script that is called by ELDK_BUILD to accomplish certain steps of the build.
Refer to section 3.10.3. build.sh Usage below for more details.
The cpkgs.lst and tpkgs.lst files are read by build.sh and must contain lines describing sub-steps of the eldt
and trg build procedure steps. Essentially, the files contain the list of the ELDT and target packages to be
3.10.1. ELDK Build Process Overview
26
included in the ELDK. The SRPMS.lst file contains the list of the Fedora source RPM packages used during
the ELDK build. The tarballs.lst file contains the list of source tarballs of the packages that are included in the
ELDK but are not present in Fedora 7.
For the ELDK_BUILD script to work correctly, it must be invoked from a certain build environment created
on the host system. The build environment can be either checked out from the DENX GIT repository (see
section 3.10.2. Setting Up ELDK Build Environment below for details) or copied from the ELDK build
environment CD-ROM.
To be more specific, the following diagram outlines the build environment needed for correct operation of the
ELDK_BUILD script:
<some_directory>/
build/cross_rpms/<package_name>/SPECS/...
SOURCES/...
target_rpms/<package_name>/SPECS/...
SOURCES/...
install/install.c
Makefile
misc/ELDK_MAKEDEV
ELDK_FIXOWNER
README.html
cpkgs.lst
tpkgs.lst
build.sh
ELDK_BUILD
SRPMS.lst
tarballs.lst
tarballs/....
SRPMS/....
SRPMS-updates/....
In subdirectories of the cross_rpms and target_rpms directories, the sources and RPM spec files of,
respectively, the ELDT and target packages are stored. The install subdirectory contains the sources of the
installation utility which will be built and placed in the root of the ISO image. tarballs directory contains the
source tarballs of the packages that are included in the ELDK but are not present in Fedora 7.
The SRPMS and SRPMS-updates directories may contain the source RPM packages of Fedora 7. The
ELDK_BUILD script looks for a package in the SRPMS directory and then, if the package is not found, in the
SRPMS-updates directory. If some (or all) of the Fedora SRPMs needed for the build are missing in the
directories, the ELDK_BUILD script will download the source RPMs automatically from the Internet.
The ELDK build environment CD-ROM provides a ready-to-use ELDK build environment. Please refer to
section 3.10.2. Setting Up ELDK Build Environment below for detailed instructions on setting up the build
environment.
The ELDK_BUILD script examines the contents of the ELDK_PREFIX environment variable to determine
the root directory of the ELDK build environment. If the variable is not set when the script is invoked, it is
assumed that the root directory of the ELDK build environment is /opt/eldk. To build the ELDK in the
example directory layout given above, you must set and export the ELDK_PREFIX variable
<some_directory> prior to invoking ELDK_BUILD.
After all the build steps are complete, the following subdirectories are created in the ELDK build
environment:
3.10.1. ELDK Build Process Overview
27
build/<build_name>/work/
build/<build_name>/logs/
build/<build_name>/results/b_cdrom/
results/s_cdrom/
results/d_cdrom/
On Linux hosts, the binary and source ISO images are created automatically by the ELDK_BUILD script and
placed in the results directory. On Solaris hosts, creating the ISO images is a manual step. Use the contents of
the b_cdrom and s_cdrom directories for the contents of the ISO images.
These commands will create the directory structure as described in section 3.10.1. ELDK Build Process
Overview above. All necessary scripts and ELDK specific source files will be placed in the build
subdirectory, and the required tarballs can be found in the tarballs subdirectory. In the SRPMS subdirectory,
you will find all the Fedora 7 SRPMS needed to build the ELDK.
Alternatively, you can obtain the ELDK build environment from the DENX GIT repository. Two modules are
provided for check out: build and tarballs. The first one contains the files for the build subdirectory in the
build environment, and the second one contains source tarballs of the packages that are included in the ELDK
but are not present in Fedora 7. To create the ELDK build environment from the DENX GIT repository, use
the following commands (the example below assumes that the root directory of the build environment is
/opt/eldk):
bash$
bash$
bash$
bash$
cd /opt/eldk
git-clone git://www.denx.de/git/eldk/build
git-clone git://www.denx.de/git/eldk/tarballs
git-clone git://www.denx.de/git/eldk/SRPMS
Note: To allow to install the ELDK on as many as possible Linux distributions (including old systems), we
use a Red Hat 7.3 host system for building. Also, Fedora Core 5 is known to work as a build environment.
Other, especially more recent Linux distributions, will most likely have problems. We therefor provide a Red
Hat 7.3 based root file system image than can run in some virtualization environment (like qemu etc.). Here is
an application note with detailed instructions:
http://www.denx.de/wiki/DULG/AN2009_02_EldkReleaseBuildEnvironment
28
-a <arch>
-n <build_name>
an identification string for the build. It is used as a name for some directories
created during the build. You may use for example the current date as the build
name.
-p <prefix>
is the name of the directory that contains the build environment. Refer to build
overview above for description of the build environment.
-r <result>
is the name of the directory where the resulting RPMs and SRPMs created on this
step will be placed.
-w <work>
<stepname>
is the name of the build step that is to be performed. Refer to the list of the build
procedure steps above.
<sub_step_number> is an optional parameter which identifies sub-steps of the step which are to be
performed. This is useful when you want to re-build only some specific packages.
The numbers are defined in the cpkgs.lst and tpkgs.lst files discussed below. You
can specify a range of numbers here. For instance, "2 5" means do steps from 2 to
5, while simply "2" means do all steps starting at 2.
Please note that you must never use build.sh to build the ELDK from scratch. For build.sh to work
correctly, the script must be invoked from the build environment after a successful build using the
ELDK_BUILD script. A possible scenario of build.sh usage is such that you have a build environment
with results of a build performed using the ELDK_BUILD script and want to re-build certain ELDT and target
packages, for instance, because you have updated sources of a package or added a new package to the build.
When building the target packages (during the trg buildstep), build.sh examines the contents of the
TARGET_CPU_FAMILY_LIST environment variable, which may contain a list indicating which target CPU
variants the packages must be built for. Possible CPU variants are 4xx, 4xxFP, 6xx, 74xx, 8xx, 85xx and
ppc64. For example, the command below rebuilds the target RPM listed in the tpckgs.lst file under the number
of 47 (see section 3.10.4. Format of the cpkgs.lst and tpkgs.lst Files for description of the tpckgs.lst and
cpkgs.lst files), for the 8xx and 85xx CPUs:
bash$ TARGET_CPU_FAMILY_LIST="8xx 85xx" \
> /opt/eldk/build.sh -a ppc \
>
-n 2007-01-19 \
>
-p /opt/eldk/build/ppc-2007-01-19 \
>
-r /opt/eldk/build/ppc-2007-01-19/results \
>
-w /opt/eldk/build/ppc-2007-01-19/work \
>
trg 47 47
29
Note: If you are going to invoke build.sh to re-build a package that has already been built in the build
environment by the ELDK_BUILD script, then you must first manually uninstall the package from ELDK
installation created by the build procedure under the work directory of the build environment.
Note: It is recommended that you use the build.sh script only at the final stage of adding/updating a
package to the ELDK. For debugging purposes, it is much more convenient and efficient to build both ELDT
and target packages using a working ELDK installation, as described in the sections 3.8.2. Rebuilding Target
Packages and 3.8.3. Rebuilding ELDT Packages above.
The ELDK source CD-ROM contains the cpkgs.lst and tpkgs.lst files used to build this version of the ELDK
distribution. Use them as reference if you want to include any additional packages into the ELDK, or remove
unneeded packages.
To add a package to the ELDK you must add a line to either the cpkgs.lst file, if you are adding a ELDT
package, or to the tpkgs.lst file, if it is a target package. Keep in mind that the relative positions of packages in
the cpkgs.lst and tpkgs.lst files (the sub-step numbers) are very important. The build procedure builds the
packages sequentially as defined in the *.lst files and installs the packages in the "work" environment as they
are built. This implies that if a package depends on other packages, those packages must be specified earlier
(with smaller sub-step numbers) in the *.lst files.
Note: For cpkgs.lst, the package_version may be replaced by the special keyword "RHAUX". Such packages
are used as auxiliary when building ELDK 4.2 on non-Fedora hosts. These packages will be built and used
during the build process, but will not be put into the ELDK 4.2 distribution ISO images.
Version
2.13
1.4
2.05
2.11.2
1.28
1.0.1
3.0
2.7
Instance
SMCautoc
SMCautom
SMCbash
SMCbinut
SMCbison
SMCbzip2
TUBddd
GNUdiffut
File Name
autoconf-2.13-sol26-sparc-local.gz
automake-1.4-sol26-sparc-local.gz
bash-2.05-sol26-sparc-local.gz
binutils-2.11.2-sol26-sparc-local.gz
bison-1.28-sol26-sparc-local.gz
bzip2-1.0.1-sol26-sparc-local.gz
ddd-3.0-sol26-sparc-local.gz
diffutils-2.7-sol26-sparc-local.gz
30
expect(*)
5.25
NTexpect expect-5.25-sol26-sparc-local.gz
fileutils
4.0
SMCfileu fileutils-4.0-sol26-sparc-local.gz
flex
2.5.4a
FSFflex
flex-2.5.4a-sol26-sparc-local.gz
gawk
3.1.0
SMCgawk gawk-3.1.0-sol26-sparc-local.gz
gcc
2.95.3
SMCgcc
gcc-2.95.3-sol26-sparc-local.gz
gettext
0.10.37 SMCgtext gettext-0.10.37-sol26-sparc-local.gz
gzip
1.3
SMCgzip
gzip-1.3-sol26-sparc-local
libiconv
1.6.1
SMClibi
libiconv-1.6.1-sol26-sparc-local.gz
libtool
1.4
SMClibt
libtool-1.4-sol26-sparc-local.gz
m4
1.4
SMCm4
m4-1.4-sol26-sparc-local.gz
make(**)
3.79.1
SMCmake make-3.79.1-sol26-sparc-local.gz
ncurses
5.2
SMCncurs ncurses-5.2-sol26-sparc-local.gz
patch
2.5
FSFpatch
patch-2.5-sol26-sparc-local.gz
perl(**)
5.005_03 SMCperl
perl-5.005_03-sol26-sparc-local.gz
python
1.5.2
SMCpython python-1.5.2-sol26-sparc-local.gz
rpm
2.5.2
RPM
rpm-2.5.2.pkg
sed
3.02
SMCsed
sed-3.02-sol26-sparc-local.gz
tar
1.13.19 SMCtar
tar-1.13.19-sol26-sparc-local.gz
tcl(*)
8.3.3
SMCtcl
tcl-8.3.3-sol26-sparc-local.gz
texinfo
4.0
SMCtexi
texinfo-4.0-sol26-sparc-local.gz
textutils
2.0
SMCtextu textutils-2.0-sol26-sparc-local.gz
unzip
5.32
IZunzip
unzip-5.32-sol26-sparc-local.gz
wget
1.7
SMCwget wget-1.7-sol26-sparc-local.gz
zlib(**)
1.0.4
SMCzlib
zlib-1.0.4-sol26-sparc-local.gz
zlib
1.1.2
zlib-1.1.2.tar.gz
The packages marked "(*)" are not absolutely required, but sooner or later you will need them anyway so we
recommend to install them.
The packages marked "(**)" are older versions of the ones currently available at
ftp://ftp.sunfreeware.com/pub/freeware/sparc/2.6/. You can obtain them from the DENX public FTP server.
The following symbolic links must be created in order to be able to build the ELDK on a Solaris machine:
/usr/local/bin/cc --> /usr/local/bin/gcc
/usr/lib/libiconv.so.2 --> /usr/local/lib/libiconv.so.2
/usr/lib/libncurses.so.5 --> /usr/local/lib/libncurses.so.5
Additionally, to be able to build the ELDK on Solaris, you must place newer GNU gettext macros to the
/usr/local/share/aclocal directory. This can be accomplished as follows:
Download the
http://www.ibiblio.org/pub/packages/solaris/sparc/GNUgettext.0.10.40.SPARC.32bit.Solaris.8.pkg.tgz
package.
Untar the package to a temporary directory and copy the macros to the /usr/local/share/aclocal
directory:
$ cp GNUgettext/root/usr/local/share/aclocal/*.m4 /usr/local/share/aclocal
4. System Setup
4.1. Serial Console Access
3.11. Notes for Solaris 2.x Host Environment
31
4. System Setup
Some tools are needed to install and configure U-Boot and Linux on the target system. Also, especially during
development, you will want to be able to interact with the target system. This section describes how to
configure your host system for this purpose.
/etc/uucp/port:
#
# /dev/ttyS0 at 115200 bps:
4. System Setup
32
#
port
type
device
speed
hardflow
serial0_115200
direct
/dev/ttyS0
115200
false
You can then connect to the serial line using the command
$ cu S0@115200
Connected.
To disconnect, type the escape character '~' followed by '.' at the beginning of a line.
See also: cu(1), info uucp.
This example assumes that you use the first serial port of your host system (/dev/ttyS0) at a baudrate of
115200 to connect to the target's serial console port.
You can then connect to the serial line:
$ kermit -c
Connecting to /dev/ttyS0, speed 115200.
The escape character is Ctrl-\ (ASCII 28, FS)
Type the escape character followed by C to get back,
or followed by ? to see other options.
----------------------------------------------------
Due to licensing conditions you will often find two kermit packages in your GNU/Linux distribution. In
this case you will want to install the ckermit package. The gkermit package is only a command line tool
implementing the kermit transfer protocol.
33
If you cannot find kermit on the distribution media for your Linux host system, you can download it
from the kermit project home page: http://www.columbia.edu/kermit/
If necessary, install the TFTP daemon program from your distribution media.
Most Linux distributions disable the TFTP service by default. To enable it for example on RedHat systems,
edit the file /etc/xinetd.d/tftp and remove the line
disable = yes
34
user
server
server_args
disable
per_source
cps
=
=
=
=
=
=
root
/usr/sbin/in.tftpd
-s /tftpboot
yes
11
100 2
Also, make sure that the /tftpboot directory exists and is world-readable (permissions at least "dr-xr-xr-x").
hardware ethernet
fixed-address
option root-path
option host-name
next-server
filename
00:30:BF:01:02:D0;
192.168.100.6;
"/opt/eldk-4.2/ppc_4xx";
"canyonlands";
192.168.1.1;
"/tftpboot/canyonlands/uImage";
}
}
With this configuration, the DHCP server will reply to a request from the target with the ethernet address
00:30:BF:01:02:D0 with the following information:
The target is located in the subnet 192.168.0.0 which uses the netmask 255.255.0.0.
The target has the hostname canyonlands and the IP address 192.168.100.6.
The host with the IP address 192.168.1.1 will provide the boot image for the target and provide
NFS server function in cases when the target mounts it's root filesystem over NFS.
The host listed with the next-server option can be different from the host that is running the
DHCP server.
The host provides the file /tftpboot/canyonlands/uImage as boot image for the target.
The target can mount the directory /opt/eldk-4.2/ppc_4xx on the NFS server as root filesystem.
35
192.168.0.0/255.255.0.0(rw,no_root_squash,sync)
This line exports the /opt/eldk-4.2/ppc_4xx directory with read and write permissions to all hosts on the
192.168.0.0 subnet.
After modifying the /etc/exports file you must make sure the NFS system is notified about the change, for
instance by issuing the command:
# /sbin/service nfs restart
5. Das U-Boot
5.1. Current Versions
5.2. Unpacking the Source Code
5.3. Configuration
5.4. Installation
5.4.1. Before You Begin
5.4.1.1. Installation Requirements
5.4.1.2. Board Identification Data
5.4.2. Installation Using a BDM/JTAG Debugger
5.4.3. Installation using U-Boot
5.5. Tool Installation
5.6. Initialization
5.7. Initial Steps
5.8. The First Power-On
5.9. U-Boot Command Line Interface
5.9.1. Information Commands
5.9.1.1. bdinfo - print Board Info structure
5.9.1.2. coninfo - print console devices and informations
5.9.1.3. flinfo - print FLASH memory information
5.9.1.4. iminfo - print header information for application image
5.9.1.5. help - print online help
5.9.2. Memory Commands
5.9.2.1. base - print or set address offset
5.9.2.2. crc32 - checksum calculation
5.9.2.3. cmp - memory compare
5.9.2.4. cp - memory copy
5.9.2.5. md - memory display
5.9.2.6. mm - memory modify (auto-incrementing)
5.9.2.7. mtest - simple RAM test
5.9.2.8. mw - memory write (fill)
5.9.2.9. nm - memory modify (constant address)
5.9.2.10. loop - infinite loop on address range
5.9.3. Flash Memory Commands
5.9.3.1. cp - memory copy
4.8. Configuring a NFS Server
36
5. Das U-Boot
5. Das U-Boot
37
cd /opt/eldk/usr/src
wget ftp://ftp.denx.de/pub/u-boot/u-boot-1.3.2.tar.bz2
rm -f u-boot
bunzip2 < u-boot-1.3.2.tar.bz2 | tar xf ln -s u-boot-1.3.2 u-boot
cd u-boot
5.3. Configuration
After changing to the directory with the U-Boot source code you should make sure that there are no build
results from any previous configurations left:
$ make distclean
The following (model) command configures U-Boot for the canyonlands board:
$ make canyonlands_config
By default the build is performed locally and the objects are saved in the source directory. One of the two
5.3. Configuration
38
methods can be used to change this behaviour and build U-Boot to some external directory:
1. Add O= to the make command line invocations:
make O=/tmp/build distclean
make O=/tmp/build canyonlands_config
make O=/tmp/build all
Note that if the 'O=output/dir' option is used then it must be used for all invocations of make.
2. Set environment variable BUILD_DIR to point to the desired location:
export BUILD_DIR=/tmp/build
make distclean
make canyonlands_config
make all
Note that the command line "O=" setting overrides the BUILD_DIR environment variable.
5.4. Installation
5.4.1. Before You Begin
5.4.1.1. Installation Requirements
The following section assumes that flash memory is used as the storage device for the firmware on your
board. If this is not the case, the following instructions will not work - you will probably have to replace the
storage device (probably ROM or EPROM) on such systems to install or update U-Boot.
39
40
mkimage is ready available in several distributions; for example, in Ubuntu it is part of the u-boot-tools
package, so so it can be installed like that:
$ sudo apt-get install u-boot-tools
In Fedora the package name is uboot-tools, and the command to install it is:
$ sudo yum install uboot-tools
5.6. Initialization
To initialize the U-Boot firmware running on your canyonlands board, you have to connect a terminal to the
board's serial console port.
The default configuration of the console port on the canyonlands board uses a baudrate of 115200/8N1
(115200 bps, 8 Bit per character, no parity, 1 stop bit, no handshake).
If you are running Linux on your host system we recommend either kermit or cu as terminal emulation
programs. Do not use minicom, since this has caused problems for many users, especially for software
download over the serial port.
For the configuration of your terminal program see section 4.1. Serial Console Access
Make sure that both hardware and software flow control are disabled.
41
To see a list of the available U-Boot commands, you can type help (or simply ?). This will print a list of all
commands that are available in your current configuration. [Please note that U-Boot provides a lot of
configuration options; not all options are available for all processors and boards, and some options might be
simply not selected for your configuration.]
=>
=> hel
With the command help <command> you can get additional information about most commands:
=> help tftpboot
tftpboot - boot image via network using TFTP protocol
Usage:
tftpboot [loadAddress] [[hostIPaddr:]bootfilename]
=> help setenv printenv
setenv - set environment variables
Usage:
setenv name value ...
- set environment variable 'name' to 'value ...'
setenv name
- delete environment variable 'name'
printenv - print environment variables
Usage:
printenv
- print values of all environment variables
printenv name ...
- print value of environment variable 'name'
=>
Most commands can be abbreviated as long as the string remains unambiguous (and notice how you can ask
for help for more than one command at a time):
=> help fli tftp
flinfo - print FLASH memory information
Usage:
flinfo
- print information for all FLASH memory banks
flinfo N
- print information for FLASH memory bank # N
tftpboot - boot image via network using TFTP protocol
Usage:
tftpboot [loadAddress] [[hostIPaddr:]bootfilename]
=>
42
=> reset
You can interrupt the "Count-Down" by pressing any key. If you don't you will probably see some (harmless)
error messages because the system has not been initialized yet.
In some cases you may see a message
*** Warning - bad CRC, using default environment
This is harmless and will go away as soon as you have initialized and saved the environment variables.
At first you have to enter the serial number and the ethernet address of your board. Pay special attention here
since these parameters are write protected and cannot be changed once saved (usually this is done by the
manufacturer of the board). To enter the data you have to use the U-Boot command setenv, followed by the
variable name and the data, all separated by white space (blank and/or TAB characters). Use the variable
name serial# for the board ID and/or serial number, and ethaddr for the ethernet address, for instance:
=> setenv ethaddr !!!!!!FILL_THIS!!!!!!
=> setenv serial# 86BA-5AA1-BD9
Use the printenv command to verify that you have entered the correct values:
=> printenv serial# ethaddr
## Error: "serial#" not defined
ethaddr=00:10:ec:01:08:84
=>
Please double check that the printed values are correct! You will not be able to correct any errors later! If
there is something wrong, reset the board and restart from the beginning; otherwise you can store the
parameters permanently using the saveenv command:
=> saveenv
Saving Environment to Flash...
Un-Protected 1 sectors
Un-Protected 1 sectors
Erasing Flash...
. done
Erased 1 sectors
43
The bdinfo command (short: bdi) prints the information that U-Boot passes about the board such as
memory addresses and sizes, clock frequencies, MAC address, etc. This information is mainly needed to be
passed to the Linux kernel.
=> bdi
memstart
memsize
flashstart
flashsize
flashoffset
sramstart
sramsize
bootflags
intfreq
busfreq
ethaddr
eth1addr
IP addr
baudrate
=>
= 0x00000000
= 0x20000000
= 0xFC000000
= 0x04000000
= 0x00000000
= 0x00000000
= 0x00000000
= 0xFFFE6530
= 1066.667 MHz
= 266.667 MHz
= 00:10:ec:01:08:84
= 00:10:ec:81:08:84
= 192.168.100.6
= 115200 bps
44
The coninfo command (short: conin) displays information about the available console I/O devices.
=> conin
List of available devices:
serial
80000003 SIO stdin stdout stderr
serial1
00000003 .IO
serial0
00000003 .IO
nc
80000003 SIO
=>
The output contains the device name, flags, and the current usage. For example, the output
serial
means that the serial device is a system device (flag 'S') which provides input (flag 'I') and output
(flag 'O') functionality and is currently assigned to the 3 standard I/O streams stdin, stdout and
stderr.
The command flinfo (short: fli) can be used to get information about the available flash memory (see
Flash Memory Commands below).
=> fli
Bank # 1: CFI conformant FLASH (16 x 16) Size: 64 MB in 512 Sectors
AMD Standard command set, Manufacturer ID: 0x01, Device ID: 0x227E
Erase timeout: 16384 ms, write timeout: 2 ms
Buffer write timeout: 5 ms, buffer size: 32 bytes
Sector Start
FC000000
FC0A0000
FC140000
FC1E0000
FC280000
FC320000
FC3C0000 E
FC460000 E
FC500000 E
FC5A0000 E
FC640000 E
Addresses:
FC020000
FC0C0000
FC160000
FC200000
FC2A0000
FC340000
FC3E0000
FC480000
FC520000
FC5C0000
FC660000
E
E
E
E
E
FC040000
FC0E0000
FC180000
FC220000
FC2C0000
FC360000
FC400000
FC4A0000
FC540000
FC5E0000
FC680000
FC060000
FC080000
FC100000
FC120000
FC1A0000
FC1C0000 E
FC240000
FC260000
FC2E0000
FC300000
FC380000
FC3A0000
E
FC420000 E
FC440000
E
FC4C0000 E
FC4E0000
E
FC560000 E
FC580000
E
FC600000 E
FC620000
E
FC6A0000 E
FC6C0000
E
E
E
E
E
45
FC6E0000
FC780000
FC820000
FC8C0000
FC960000
FCA00000
FCAA0000
FCB40000
FCBE0000
FCC80000
FCD20000
FCDC0000
FCE60000
FCF00000
FCFA0000
FD040000
FD0E0000
FD180000
FD220000
FD2C0000
FD360000
FD400000
FD4A0000
FD540000
FD5E0000
FD680000
FD720000
FD7C0000
FD860000
FD900000
FD9A0000
FDA40000
FDAE0000
FDB80000
FDC20000
FDCC0000
FDD60000
FDE00000
FDEA0000
FDF40000
FDFE0000
FE080000
FE120000
FE1C0000
FE260000
FE300000
FE3A0000
FE440000
FE4E0000
FE580000
FE620000
FE6C0000
FE760000
FE800000
FE8A0000
FE940000
FE9E0000
FEA80000
FEB20000
FEBC0000
FEC60000
FED00000
FEDA0000
FEE40000
FEEE0000
FEF80000
FF020000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
FC700000
FC7A0000
FC840000
FC8E0000
FC980000
FCA20000
FCAC0000
FCB60000
FCC00000
FCCA0000
FCD40000
FCDE0000
FCE80000
FCF20000
FCFC0000
FD060000
FD100000
FD1A0000
FD240000
FD2E0000
FD380000
FD420000
FD4C0000
FD560000
FD600000
FD6A0000
FD740000
FD7E0000
FD880000
FD920000
FD9C0000
FDA60000
FDB00000
FDBA0000
FDC40000
FDCE0000
FDD80000
FDE20000
FDEC0000
FDF60000
FE000000
FE0A0000
FE140000
FE1E0000
FE280000
FE320000
FE3C0000
FE460000
FE500000
FE5A0000
FE640000
FE6E0000
FE780000
FE820000
FE8C0000
FE960000
FEA00000
FEAA0000
FEB40000
FEBE0000
FEC80000
FED20000
FEDC0000
FEE60000
FEF00000
FEFA0000
FF040000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
FC720000
FC7C0000
FC860000
FC900000
FC9A0000
FCA40000
FCAE0000
FCB80000
FCC20000
FCCC0000
FCD60000
FCE00000
FCEA0000
FCF40000
FCFE0000
FD080000
FD120000
FD1C0000
FD260000
FD300000
FD3A0000
FD440000
FD4E0000
FD580000
FD620000 E
FD6C0000
FD760000
FD800000
FD8A0000
FD940000
FD9E0000
FDA80000
FDB20000
FDBC0000
FDC60000
FDD00000
FDDA0000
FDE40000
FDEE0000
FDF80000
FE020000
FE0C0000
FE160000
FE200000
FE2A0000
FE340000
FE3E0000
FE480000
FE520000
FE5C0000
FE660000
FE700000
FE7A0000
FE840000
FE8E0000
FE980000
FEA20000
FEAC0000
FEB60000
FEC00000
FECA0000
FED40000
FEDE0000
FEE80000
FEF20000
FEFC0000
FF060000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
FC740000
FC7E0000
FC880000
FC920000
FC9C0000
FCA60000
FCB00000
FCBA0000
FCC40000
FCCE0000
FCD80000
FCE20000
FCEC0000
FCF60000
FD000000
FD0A0000
FD140000
FD1E0000
FD280000
FD320000
FD3C0000
FD460000
FD500000
FD5A0000
FD640000 E
FD6E0000
FD780000
FD820000
FD8C0000
FD960000
FDA00000
FDAA0000
FDB40000
FDBE0000
FDC80000
FDD20000
FDDC0000
FDE60000
FDF00000
FDFA0000
FE040000
FE0E0000
FE180000
FE220000
FE2C0000
FE360000
FE400000
FE4A0000
FE540000
FE5E0000
FE680000
FE720000
FE7C0000
FE860000
FE900000
FE9A0000
FEA40000
FEAE0000
FEB80000
FEC20000
FECC0000
FED60000
FEE00000
FEEA0000
FEF40000
FEFE0000
FF080000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
FC760000
FC800000
FC8A0000
FC940000
FC9E0000
FCA80000
FCB20000
FCBC0000
FCC60000
FCD00000
FCDA0000
FCE40000
FCEE0000
FCF80000
FD020000
FD0C0000
FD160000
FD200000
FD2A0000
FD340000
FD3E0000
FD480000
FD520000
FD5C0000
FD660000 E
FD700000
FD7A0000
FD840000
FD8E0000
FD980000
FDA20000
FDAC0000
FDB60000
FDC00000
FDCA0000
FDD40000
FDDE0000
FDE80000
FDF20000
FDFC0000
FE060000
FE100000
FE1A0000
FE240000
FE2E0000
FE380000
FE420000
FE4C0000
FE560000
FE600000
FE6A0000
FE740000
FE7E0000
FE880000
FE920000
FE9C0000
FEA60000
FEB00000
FEBA0000
FEC40000
FECE0000
FED80000
FEE20000
FEEC0000
FEF60000
FF000000
FF0A0000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
46
FF0C0000
FF160000
FF200000
FF2A0000
FF340000
FF3E0000
FF480000
FF520000
FF5C0000
FF660000
FF700000
FF7A0000
FF840000
FF8E0000
FF980000
FFA20000
FFAC0000
FFB60000
FFC00000
FFCA0000
FFD40000
FFDE0000
FFE80000
FFF20000
FFFC0000
=>
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
RO
FF0E0000 E
FF180000 E
FF220000 E
FF2C0000 E
FF360000 E
FF400000 E
FF4A0000 E
FF540000 E
FF5E0000 E
FF680000 E
FF720000 E
FF7C0000 E
FF860000 E
FF900000 E
FF9A0000 E
FFA40000 E
FFAE0000 E
FFB80000 E
FFC20000 E
FFCC0000 E
FFD60000 E
FFE00000 E
FFEA0000 E
FFF40000 E
FFFE0000
FF100000
FF1A0000
FF240000
FF2E0000
FF380000
FF420000
FF4C0000
FF560000
FF600000
FF6A0000
FF740000
FF7E0000
FF880000
FF920000
FF9C0000
FFA60000
FFB00000
FFBA0000
FFC40000
FFCE0000
FFD80000
FFE20000
FFEC0000
FFF60000
RO
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
RO
FF120000 E
FF1C0000 E
FF260000 E
FF300000 E
FF3A0000 E
FF440000 E
FF4E0000 E
FF580000 E
FF620000 E
FF6C0000 E
FF760000 E
FF800000 E
FF8A0000 E
FF940000 E
FF9E0000 E
FFA80000 E
FFB20000 E
FFBC0000 E
FFC60000 E
FFD00000 E
FFDA0000 E
FFE40000 E
FFEE0000 E
FFF80000
FF140000 E
FF1E0000 E
FF280000 E
FF320000 E
FF3C0000 E
FF460000 E
FF500000 E
FF5A0000 E
FF640000 E
FF6E0000 E
FF780000 E
FF820000 E
FF8C0000 E
FF960000 E
FFA00000 E
FFAA0000 E
FFB40000 E
FFBE0000 E
FFC80000 E
FFD20000 E
FFDC0000 E
FFE60000 E
FFF00000 E
RO
FFFA0000
RO
iminfo (short: imi) is used to print the header information for images like Linux kernels or ramdisks. It
prints (among other information) the image name, type and size and verifies that the CRC32 checksums stored
within the image are OK.
=> tftp ${ram_ws} ${bootfile}
Waiting for PHY auto negotiation to complete.... done
ENET Speed is 1000 Mbps - FULL duplex connection (EMAC0)
Using ppc_4xx_eth0 device
TFTP from server 192.168.1.1; our IP address is 192.168.100.6
Filename '/tftpboot/duts/canyonlands/uImage'.
Load address: 0x100000
Loading: T #################################################################
#################################################################
####
done
Bytes transferred = 1958609 (1de2d1 hex)
=> imi ${ram_ws}
## Checking Image at 00100000 ...
Legacy image found
Image Name:
Linux-2.6.32.7-00007-g08eba26
Created:
2010-02-04 17:54:22 UTC
Image Type:
PowerPC Linux Kernel Image (gzip compressed)
Data Size:
1958545 Bytes = 1.9 MB
47
Like with many other commands, the exact operation of this command can be controlled by the settings of
some U-Boot environment variables (here: the verify variable). See below for details.
The help command (short: h or ?) prints online help. Without any arguments, it prints a list of all U-Boot
commands that are available in your configuration of U-Boot. You can get detailed information for a specific
command by typing its name as argument to the help command:
=> help protect
protect - enable or disable FLASH write protection
Usage:
protect on start end
- protect FLASH from addr 'start' to addr 'end'
protect on start +len
- protect FLASH from addr 'start' to end of sect w/addr 'start'+'len'-1
protect on N:SF[-SL]
- protect sectors SF-SL in FLASH bank # N
protect on bank N
- protect FLASH bank # N
protect on all
- protect all FLASH banks
protect off start end
- make FLASH from addr 'start' to addr 'end' writable
protect off start +len
- make FLASH from addr 'start' to end of sect w/addr 'start'+'len'-1 wrtable
protect off N:SF[-SL]
- make sectors SF-SL writable in FLASH bank # N
protect off bank N
- make FLASH bank # N writable
protect off all
- make all FLASH banks writable
=>
48
Usage:
base
- print address offset for memory commands
base off
- set address offset for memory commands to 'off'
=>
You can use the base command (short: ba) to print or set a "base address" that is used as address offset for
all memory commands; the default value of the base address is 0, so all addresses you enter are used
unmodified. However, when you repeatedly have to access a certain memory region (like the internal memory
of some embedded Power Architecture processors) it can be very convenient to set the base address to the
start of this area and then use only the offsets:
=> base
Base Address: 0x00000000
=> md 0 0xc
00000000: 00ff43a6 00000000
00000010: 00ff43a6 00000000
00000020: 0c904d01 320b4481
=> base 0x100000
Base Address: 0x00100000
=> md 0 0xc
00100000: 0e0a0e81 bd86200a
00100010: c101d028 00438198
00100020: 0c900d05 320b4581
=>
ffffffff ffffffff
ffffffff ffffffff
1ea3d0a2 c498293a
..C.............
..C.............
..M.2.D.......):
60a19054 2c12c402
7ab01239 62406128
1ca3d0a2 c498293a
...... .`..T,...
...(.C..z..9b@a(
....2.E.......):
When used with 3 arguments, the command stores the calculated checksum at the given address:
=> crc 0x100004 0x3FC 0x100000
CRC32 for 00100004 ... 001003ff ==> 8083764e
=> md 0x100000 4
00100000: 8083764e bd86200a 60a19054 2c12c402
=>
..vN.. .`..T,...
As you can see, the CRC32 checksum was not only printed, but also stored at address 0x100000.
With the cmp command you can test of the contents of two memory areas is identical or not. The command
will either test the whole area as specified by the 3rd (length) argument, or stop at the first difference.
=> cmp 0x100000 0x200000 0x400
word at 0x00100000 (0x8083764e) != word at 0x00200000 (0x27051956)
49
2c12c402
62406128
c498293a
..vN.. .`..T,...
...(.C..z..9b@a(
....2.E.......):
3030392e
20323031
29000000
'..VU-Boot 2009.
11.1 (Feb 05 201
0 - 08:57:12)...
Like most memory commands the cmp can access the memory in different sizes: as 32 bit (long word), 16 bit
(word) or 8 bit (byte) data. If invoked just as cmp the default size (32 bit or long words) is used; the same can
be selected explicitely by typing cmp.l instead. If you want to access memory as 16 bit or word data, you
can use the variant cmp.w instead; and to access memory as 8 bit or byte data please use cmp.b.
Please note that the count argument specifies the number of data items to process, i. e. the number of long
words or words or bytes to compare.
=> cmp.l 0x100000 0x200000 0x400
word at 0x00100000 (0x8083764e) != word at 0x00200000 (0x27051956)
Total of 0 words were the same
=> cmp.w 0x100000 0x200000 0x800
halfword at 0x00100000 (0x8083) != halfword at 0x00200000 (0x2705)
Total of 0 halfwords were the same
=> cmp.b 0x100000 0x200000 0x1000
byte at 0x00100000 (0x80) != byte at 0x00200000 (0x27)
Total of 0 bytes were the same
=>
50
Usage:
md [.b, .w, .l] address [# of objects]
=>
The md can be used to display memory contents both as hexadecimal and ASCII data.
=> md 0x100000
00100000: 8083764e
00100010: c101d028
00100020: 0c900d05
=>
00100030: 58f5c828
00100040: 9019a424
00100050: d0809820
=>
..vN.. .`..T,...
...(.C..z..9b@a(
....2.E.......):
X..(`)...q.1.K.[
...$t#...d.<.j.p
... [email protected]..
This command, too, can be used with the type extensions .l, .w and .b :
=>
=> md.w 0x100000
00100000: 8083 764e bd86 200a 60a1 9054 2c12 c402
00100010: c101 d028 0043 8198
...(.C..
=> md.b 0x10000
..vN.. .`..T,...
The last displayed memory address and the value of the count argument are remembered, so when you enter
md again without arguments it will automatically continue at the next address, and use the same count again.
=> md.b 0x100000 0x20
00100000: 2f 83 00 00 40 9e ff 38 38 60 00 00 4b ff ff 3c
/[email protected]`..K..<
00100010: 83 5e 00 0c 80 9e 00 08 2b 9a 00 ff 82 9e 00 10
.^......+.......
=> md.w 0x100000
00100000: 2f83 0000 409e ff38 3860 0000 4bff ff3c
/[email protected]`..K..<
00100010: 835e 000c 809e 0008 2b9a 00ff 829e 0010
.^......+.......
00100020: 82be 0014 7f45 d378 409d 000c 3b40 00ff
.....E.x@...;@..
00100030: 38a0 00ff 2b95 00ff 409d 0008 3aa0 00ff
8...+...@...:...
=> md 0x100000
00100000: 2f830000 409eff38 38600000 4bffff3c
/[email protected]`..K..<
00100010: 835e000c 809e0008 2b9a00ff 829e0010
.^......+.......
00100020: 82be0014 7f45d378 409d000c 3b4000ff
.....E.x@...;@..
00100030: 38a000ff 2b9500ff 409d0008 3aa000ff
8...+...@...:...
00100040: 8002021c 3bfb000a 7f9f0040 419d002c
....;......@A..,
00100050: 2f9a0000 419e0014 7c1f0050 3925ffff
/...A...|..P9%..
00100060: 7f890040 419d0014 7fe3fb78 4bf1401d
[email protected].@.
00100070: 7c651b78 48000014 3c00bfff 6000ffff
|e.xH...<...`...
=>
The mm is a method to interactively modify memory contents. It will display the address and current contents
and then prompt for user input. If you enter a legal hexadecimal number, this new value will be written to the
address. Then the next address will be prompted. If you don't enter any value and just press ENTER, then the
contents of this address will remain unchanged. The command stops as soon as you enter any data that is not a
hex number (like .):
=>
51
=> mm 0x100000
00100000: 8083764e ? 0
00100004: bd86200a ? 0xaabbccdd
00100008: 60a19054 ? 0x01234567
0010000c: 2c12c402 ? .
=> md 0x100000 0x10
00100000: 00000000 aabbccdd 01234567
00100010: c101d028 00438198 7ab01239
00100020: 0c900d05 320b4581 1ca3d0a2
00100030: 58f5c828 6029e009 d0718131
=>
2c12c402
62406128
c498293a
154b105b
.........#Eg,...
...(.C..z..9b@a(
....2.E.......):
X..(`)...q.1.K.[
Again this command can be used with the type extensions .l, .w and .b :
=>
=> mm.w 0x100000
00100000: 0000 ? 0x0101
00100002: 0000 ? 0x0202
00100004: aabb ? 0x4321
00100006: ccdd ? 0x8765
00100008: 0123 ? .
=> md 0x100000 0x10
00100000: 01010202 43218765
00100010: c101d028 00438198
00100020: 0c900d05 320b4581
00100030: 58f5c828 6029e009
=>
2c12c402
62406128
c498293a
154b105b
....C!.e.#Eg,...
...(.C..z..9b@a(
....2.E.......):
X..(`)...q.1.K.[
01234567
7ab01239
1ca3d0a2
d0718131
2c12c402
62406128
c498293a
154b105b
Hello
.#Eg,...
...(.C..z..9b@a(
....2.E.......):
X..(`)...q.1.K.[
=>
=> mm.b 0x100000
00100000: 01 ? 0x48
00100001: 01 ? 0x65
00100002: 02 ? 0x6c
00100003: 02 ? 0x6c
00100004: 43 ? 0x6f
00100005: 21 ? 0x20
00100006: 87 ? 0x20
00100007: 65 ? 0x20
00100008: 01 ? .
=> md 0x100000 0x10
00100000: 48656c6c 6f202020
00100010: c101d028 00438198
00100020: 0c900d05 320b4581
00100030: 58f5c828 6029e009
=>
01234567
7ab01239
1ca3d0a2
d0718131
Reading...Pattern FFFFFFFF
Writing...
Reading...Pattern 00000001
52
This tests writes to memory, thus modifying the memory contents. It will fail when applied to ROM or
flash memory.
This command may crash the system when the tested memory range includes areas that are needed for the
operation of the U-Boot firnware (like exception vector code, or U-Boot's internal program code, stack or
heap memory areas).
The mw is a way to initialize (fill) memory with some value. When called without a count argument, the value
will be written only to the specified address. When used with a count, then a whole memory areas will be
initialized with this value:
=> md 0x100000 0x10
00100000: 0000000f 00000010
00100010: 00000013 00000014
00100020: 00000017 00000018
00100030: 0000001b 0000001c
=> mw 0x100000 0xaabbccdd
=> md 0x100000 0x10
00100000: aabbccdd 00000010
00100010: 00000013 00000014
00100020: 00000017 00000018
00100030: 0000001b 0000001c
=> mw 0x100000 0 6
=> md 0x100000 0x10
00100000: 00000000 00000000
00100010: 00000000 00000000
00100020: 00000017 00000018
00100030: 0000001b 0000001c
=>
00000011
00000015
00000019
0000001d
00000012
00000016
0000001a
0000001e
................
................
................
................
00000011
00000015
00000019
0000001d
00000012
00000016
0000001a
0000001e
................
................
................
................
00000000
00000015
00000019
0000001d
00000000
00000016
0000001a
0000001e
................
................
................
................
This is another command that accepts the type extensions .l, .w and .b :
=> mw.w 0x100004 0x1155 6
=> md 0x100000 0x10
00100000: 00000000 11551155
00100010: 00000000 00000000
00100020: 00000017 00000018
00100030: 0000001b 0000001c
=> mw.b 0x100007 0xff 7
=> md 0x100000 0x10
00100000: 00000000 115511ff
00100010: 00000000 00000000
00100020: 00000017 00000018
00100030: 0000001b 0000001c
=>
11551155
00000015
00000019
0000001d
11551155
00000016
0000001a
0000001e
.....U.U.U.U.U.U
................
................
................
ffffffff
00000015
00000019
0000001d
ffff1155
00000016
0000001a
0000001e
.....U.........U
................
................
................
53
The nm command (non-incrementing memory modify) can be used to interactively write different data several
times to the same address. This can be useful for instance to access and modify device registers:
=>
=> nm.b 0x100000
00100000: 00 ? 0x48
00100000: 48 ? 0x65
00100000: 65 ? 0x6c
00100000: 6c ? 0x6c
00100000: 6c ? 0x6f
00100000: 6f ? .
=> md 0x100000 8
00100000: 6f000000 115511ff ffffffff ffff1155
00100010: 00000000 00000000 00000015 00000016
=>
o....U.........U
................
The nm command too accepts the type extensions .l, .w and .b.
The loop command reads in a tight loop from a range of memory. This is intended as a special form of a
memory test, since this command tries to read the memory as fast as possible.
This command will never terminate. There is no way to stop it but to reset the board!
=> loop 100000 8
The cp command "knows" about flash memory areas and will automatically invoke the necessary flash
programming algorithm when the target area is in flash memory.
=> cp.b 0x100000 0xFF900000 0x40000
Copy to Flash... done
54
=>
Writing to flash memory may fail when the target area has not been erased (see erase below), or if it is
write-protected (see protect below).
=> cp.b 0x100000 0xFF900000 0x40000
Copy to Flash... Can't write to protected Flash sectors
=>
Remember that the count argument specifies the number of items to copy. If you have a "length" instead (=
byte count) you should use cp.b or you will have to calculate the correct number of items.
If the source address range and the target address range are both in the same NOR flash device,please use a
two step approach intstead: first copy the data to RAM,then copy from RAM to NOR.
Addresses:
FC020000
FC0C0000
FC160000
FC200000
FC2A0000
FC340000
FC3E0000
FC480000
FC520000
FC5C0000
FC660000
FC700000
FC7A0000
FC840000
FC8E0000
FC980000
FCA20000
FCAC0000
FCB60000
FCC00000
FCCA0000
FCD40000
FCDE0000
FCE80000
FCF20000
FCFC0000
FD060000
FD100000
FD1A0000
FD240000
FD2E0000
FD380000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
FC040000
FC0E0000
FC180000
FC220000
FC2C0000
FC360000
FC400000
FC4A0000
FC540000
FC5E0000
FC680000
FC720000
FC7C0000
FC860000
FC900000
FC9A0000
FCA40000
FCAE0000
FCB80000
FCC20000
FCCC0000
FCD60000
FCE00000
FCEA0000
FCF40000
FCFE0000
FD080000
FD120000
FD1C0000
FD260000
FD300000
FD3A0000
FC060000
FC080000
FC100000
FC120000
FC1A0000
FC1C0000 E
FC240000
FC260000
FC2E0000
FC300000
FC380000
FC3A0000
E
FC420000 E
FC440000
E
FC4C0000 E
FC4E0000
E
FC560000 E
FC580000
E
FC600000 E
FC620000
E
FC6A0000 E
FC6C0000
E
FC740000 E
FC760000
E
FC7E0000 E
FC800000
E
FC880000 E
FC8A0000
E
FC920000 E
FC940000
E
FC9C0000 E
FC9E0000
E
FCA60000 E
FCA80000
E
FCB00000 E
FCB20000
E
FCBA0000 E
FCBC0000
E
FCC40000 E
FCC60000
E
FCCE0000 E
FCD00000
E
FCD80000 E
FCDA0000
E
FCE20000 E
FCE40000
E
FCEC0000 E
FCEE0000
E
FCF60000 E
FCF80000
E
FD000000 E
FD020000
E
FD0A0000 E
FD0C0000
E
FD140000 E
FD160000
E
FD1E0000 E
FD200000
E
FD280000 E
FD2A0000
E
FD320000 E
FD340000
E
FD3C0000 E
FD3E0000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
55
FD400000
FD4A0000
FD540000
FD5E0000
FD680000
FD720000
FD7C0000
FD860000
FD900000
FD9A0000
FDA40000
FDAE0000
FDB80000
FDC20000
FDCC0000
FDD60000
FDE00000
FDEA0000
FDF40000
FDFE0000
FE080000
FE120000
FE1C0000
FE260000
FE300000
FE3A0000
FE440000
FE4E0000
FE580000
FE620000
FE6C0000
FE760000
FE800000
FE8A0000
FE940000
FE9E0000
FEA80000
FEB20000
FEBC0000
FEC60000
FED00000
FEDA0000
FEE40000
FEEE0000
FEF80000
FF020000
FF0C0000
FF160000
FF200000
FF2A0000
FF340000
FF3E0000
FF480000
FF520000
FF5C0000
FF660000
FF700000
FF7A0000
FF840000
FF8E0000
FF980000
FFA20000
FFAC0000
FFB60000
FFC00000
FFCA0000
FFD40000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
FD420000
FD4C0000
FD560000
FD600000
FD6A0000
FD740000
FD7E0000
FD880000
FD920000
FD9C0000
FDA60000
FDB00000
FDBA0000
FDC40000
FDCE0000
FDD80000
FDE20000
FDEC0000
FDF60000
FE000000
FE0A0000
FE140000
FE1E0000
FE280000
FE320000
FE3C0000
FE460000
FE500000
FE5A0000
FE640000
FE6E0000
FE780000
FE820000
FE8C0000
FE960000
FEA00000
FEAA0000
FEB40000
FEBE0000
FEC80000
FED20000
FEDC0000
FEE60000
FEF00000
FEFA0000
FF040000
FF0E0000
FF180000
FF220000
FF2C0000
FF360000
FF400000
FF4A0000
FF540000
FF5E0000
FF680000
FF720000
FF7C0000
FF860000
FF900000
FF9A0000
FFA40000
FFAE0000
FFB80000
FFC20000
FFCC0000
FFD60000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
FD440000
FD4E0000
FD580000
FD620000 E
FD6C0000
FD760000
FD800000
FD8A0000
FD940000
FD9E0000
FDA80000
FDB20000
FDBC0000
FDC60000
FDD00000
FDDA0000
FDE40000
FDEE0000
FDF80000
FE020000
FE0C0000
FE160000
FE200000
FE2A0000
FE340000
FE3E0000
FE480000
FE520000
FE5C0000
FE660000
FE700000
FE7A0000
FE840000
FE8E0000
FE980000
FEA20000
FEAC0000
FEB60000
FEC00000
FECA0000
FED40000
FEDE0000
FEE80000
FEF20000
FEFC0000
FF060000
FF100000
FF1A0000
FF240000
FF2E0000
FF380000
FF420000
FF4C0000
FF560000
FF600000
FF6A0000
FF740000
FF7E0000
FF880000
FF920000
FF9C0000
FFA60000
FFB00000
FFBA0000
FFC40000
FFCE0000
FFD80000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
FD460000
FD500000
FD5A0000
FD640000 E
FD6E0000
FD780000
FD820000
FD8C0000
FD960000
FDA00000
FDAA0000
FDB40000
FDBE0000
FDC80000
FDD20000
FDDC0000
FDE60000
FDF00000
FDFA0000
FE040000
FE0E0000
FE180000
FE220000
FE2C0000
FE360000
FE400000
FE4A0000
FE540000
FE5E0000
FE680000
FE720000
FE7C0000
FE860000
FE900000
FE9A0000
FEA40000
FEAE0000
FEB80000
FEC20000
FECC0000
FED60000
FEE00000
FEEA0000
FEF40000
FEFE0000
FF080000
FF120000
FF1C0000
FF260000
FF300000
FF3A0000
FF440000
FF4E0000
FF580000
FF620000
FF6C0000
FF760000
FF800000
FF8A0000
FF940000
FF9E0000
FFA80000
FFB20000
FFBC0000
FFC60000
FFD00000
FFDA0000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
FD480000
FD520000
FD5C0000
FD660000 E
FD700000
FD7A0000
FD840000
FD8E0000
FD980000
FDA20000
FDAC0000
FDB60000
FDC00000
FDCA0000
FDD40000
FDDE0000
FDE80000
FDF20000
FDFC0000
FE060000
FE100000
FE1A0000
FE240000
FE2E0000
FE380000
FE420000
FE4C0000
FE560000
FE600000
FE6A0000
FE740000
FE7E0000
FE880000
FE920000
FE9C0000
FEA60000
FEB00000
FEBA0000
FEC40000
FECE0000
FED80000
FEE20000
FEEC0000
FEF60000
FF000000
FF0A0000
FF140000
FF1E0000
FF280000
FF320000
FF3C0000
FF460000
FF500000
FF5A0000
FF640000
FF6E0000
FF780000
FF820000
FF8C0000
FF960000
FFA00000
FFAA0000
FFB40000
FFBE0000
FFC80000
FFD20000
FFDC0000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
56
FFDE0000 E
FFE80000 E
FFF20000 E
FFFC0000
RO
=>
FFE00000 E
FFEA0000 E
FFF40000 E
FFFE0000
FFE20000 E
FFEC0000 E
FFF60000
RO
RO
FFE40000 E
FFEE0000 E
FFF80000
FFE60000 E
FFF00000 E
RO
FFFA0000
RO
The erase command (short: era) is used to erase the contents of one or more sectors of the flash memory. It
is one of the more complex commands; the help output shows this.
Probably the most frequent usage of this command is to pass the start and end addresses of the area to be
erased:
=> era 0xFF900000 0xFF95FFFF
... done
Erased 3 sectors
=>
Note that both the start and end addresses for this command must point exactly at the start resp. end
addresses of flash sectors. Otherwise the command will not be executed.
Another way to select certain areas of the flash memory for the erase command uses the notation of flash
banks and sectors:
Technically speaking, a bank is an area of memory implemented by one or more memory chips that are
connected to the same chip select signal of the CPU, and a flash sector or erase unit is the smallest area that
can be erased in one operation.
For practical purposes it is sufficient to remember that with flash memory a bank is something that eventually
may be erased as a whole in a single operation. This may be more efficient (faster) than erasing the same area
sector by sector.
[It depends on the actual type of flash chips used on the board if such a fast bank erase algorithm exists, and
on the implementation of the flash device driver if is actually used.]
In U-Boot, flash banks are numbered starting with 1, while flash sectors start with 0.
To erase the same flash area as specified using start and end addresses in the example above you could also
type:
=> era 1:455-456
57
To erase a whole bank of flash memory you can use a command like this one:
Note that a warning message is printed because some write protected sectors exist in this flash bank which
were not erased.
With the command:
the whole flash memory (except for the write-protected sectors) can be erased.
The protect command is another complex one. It is used to set certain parts of the flash memory to
read-only mode or to make them writable again. Flash memory that is "protected" (= read-only) cannot be
written (with the cp command) or erased (with the erase command). Protected areas are marked as (RO)
(for "read-only") in the output of the flinfo command:
=> fli
Bank # 1: CFI conformant FLASH (16 x 16) Size: 64 MB in 512 Sectors
AMD Standard command set, Manufacturer ID: 0x01, Device ID: 0x227E
Erase timeout: 16384 ms, write timeout: 2 ms
Buffer write timeout: 5 ms, buffer size: 32 bytes
58
FC040000
FC0E0000
FC180000
FC220000
FC2C0000
FC360000
FC400000
FC4A0000
FC540000
FC5E0000
FC680000
FC720000
FC7C0000
FC860000
FC900000
FC9A0000
FCA40000
FCAE0000
FCB80000
FCC20000
FCCC0000
FCD60000
FCE00000
FCEA0000
FCF40000
FCFE0000
FD080000
FD120000
FD1C0000
FD260000
FD300000
FD3A0000
FD440000
FD4E0000
FD580000
FD620000
FD6C0000
FD760000
FD800000
FD8A0000
FD940000
FD9E0000
FDA80000
FDB20000
FDBC0000
FDC60000
FDD00000
FDDA0000
FDE40000
FDEE0000
FDF80000
FE020000
FE0C0000
FE160000
FE200000
FE2A0000
FE340000
FE3E0000
FE480000
FE520000
FE5C0000
FE660000
FE700000
FE7A0000
FE840000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
FC060000
FC100000
FC1A0000
FC240000
FC2E0000
FC380000
FC420000
FC4C0000
FC560000
FC600000
FC6A0000
FC740000
FC7E0000
FC880000
FC920000
FC9C0000
FCA60000
FCB00000
FCBA0000
FCC40000
FCCE0000
FCD80000
FCE20000
FCEC0000
FCF60000
FD000000
FD0A0000
FD140000
FD1E0000
FD280000
FD320000
FD3C0000
FD460000
FD500000
FD5A0000
FD640000
FD6E0000
FD780000
FD820000
FD8C0000
FD960000
FDA00000
FDAA0000
FDB40000
FDBE0000
FDC80000
FDD20000
FDDC0000
FDE60000
FDF00000
FDFA0000
FE040000
FE0E0000
FE180000
FE220000
FE2C0000
FE360000
FE400000
FE4A0000
FE540000
FE5E0000
FE680000
FE720000
FE7C0000
FE860000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
FC080000
FC120000
FC1C0000
FC260000
FC300000
FC3A0000
FC440000
FC4E0000
FC580000
FC620000
FC6C0000
FC760000
FC800000
FC8A0000
FC940000
FC9E0000
FCA80000
FCB20000
FCBC0000
FCC60000
FCD00000
FCDA0000
FCE40000
FCEE0000
FCF80000
FD020000
FD0C0000
FD160000
FD200000
FD2A0000
FD340000
FD3E0000
FD480000
FD520000
FD5C0000
FD660000
FD700000
FD7A0000
FD840000
FD8E0000
FD980000
FDA20000
FDAC0000
FDB60000
FDC00000
FDCA0000
FDD40000
FDDE0000
FDE80000
FDF20000
FDFC0000
FE060000
FE100000
FE1A0000
FE240000
FE2E0000
FE380000
FE420000
FE4C0000
FE560000
FE600000
FE6A0000
FE740000
FE7E0000
FE880000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
59
FE8A0000 E
FE8C0000 E
FE8E0000
FE940000 E
FE960000 E
FE980000
FE9E0000 E
FEA00000 E
FEA20000
FEA80000 E
FEAA0000 E
FEAC0000
FEB20000 E
FEB40000 E
FEB60000
FEBC0000 E
FEBE0000 E
FEC00000
FEC60000 E
FEC80000 E
FECA0000
FED00000 E
FED20000 E
FED40000
FEDA0000 E
FEDC0000 E
FEDE0000
FEE40000 E
FEE60000 E
FEE80000
FEEE0000 E
FEF00000 E
FEF20000
FEF80000 E
FEFA0000 E
FEFC0000
FF020000 E
FF040000 E
FF060000
FF0C0000 E
FF0E0000 E
FF100000
FF160000 E
FF180000 E
FF1A0000
FF200000 E
FF220000 E
FF240000
FF2A0000 E
FF2C0000 E
FF2E0000
FF340000 E
FF360000 E
FF380000
FF3E0000 E
FF400000 E
FF420000
FF480000 E
FF4A0000 E
FF4C0000
FF520000 E
FF540000 E
FF560000
FF5C0000 E
FF5E0000 E
FF600000
FF660000 E
FF680000 E
FF6A0000
FF700000 E
FF720000 E
FF740000
FF7A0000 E
FF7C0000 E
FF7E0000
FF840000 E
FF860000 E
FF880000
FF8E0000 E
FF900000 E
FF920000
FF980000 E
FF9A0000 E
FF9C0000
FFA20000 E
FFA40000 E
FFA60000
FFAC0000 E
FFAE0000 E
FFB00000
FFB60000 E
FFB80000 E
FFBA0000
FFC00000 E
FFC20000 E
FFC40000
FFCA0000 E
FFCC0000 E
FFCE0000
FFD40000 E
FFD60000 E
FFD80000
FFDE0000 E
FFE00000 E
FFE20000
FFE80000 E
FFEA0000 E
FFEC0000
FFF20000 E
FFF40000 E
FFF60000
FFFC0000
RO
FFFE0000
RO
=> prot on 0xFF900000 0xFF97FFFF
Protected 4 sectors
=> fli
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
RO
FE900000 E
FE9A0000 E
FEA40000 E
FEAE0000 E
FEB80000 E
FEC20000 E
FECC0000 E
FED60000 E
FEE00000 E
FEEA0000 E
FEF40000 E
FEFE0000 E
FF080000 E
FF120000 E
FF1C0000 E
FF260000 E
FF300000 E
FF3A0000 E
FF440000 E
FF4E0000 E
FF580000 E
FF620000 E
FF6C0000 E
FF760000 E
FF800000 E
FF8A0000 E
FF940000 E
FF9E0000 E
FFA80000 E
FFB20000 E
FFBC0000 E
FFC60000 E
FFD00000 E
FFDA0000 E
FFE40000 E
FFEE0000 E
FFF80000
FE920000 E
FE9C0000 E
FEA60000 E
FEB00000 E
FEBA0000 E
FEC40000 E
FECE0000 E
FED80000 E
FEE20000 E
FEEC0000 E
FEF60000 E
FF000000 E
FF0A0000 E
FF140000 E
FF1E0000 E
FF280000 E
FF320000 E
FF3C0000 E
FF460000 E
FF500000 E
FF5A0000 E
FF640000 E
FF6E0000 E
FF780000 E
FF820000 E
FF8C0000 E
FF960000 E
FFA00000 E
FFAA0000 E
FFB40000 E
FFBE0000 E
FFC80000 E
FFD20000 E
FFDC0000 E
FFE60000 E
FFF00000 E
RO
FFFA0000
RO
FC040000
FC0E0000
FC180000
FC220000
FC2C0000
FC360000
FC400000
FC4A0000
FC540000
FC5E0000
FC680000
FC720000
FC7C0000
FC860000
FC900000
FC9A0000
FCA40000
FCAE0000
FCB80000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
FC060000
FC100000
FC1A0000
FC240000
FC2E0000
FC380000
FC420000
FC4C0000
FC560000
FC600000
FC6A0000
FC740000
FC7E0000
FC880000
FC920000
FC9C0000
FCA60000
FCB00000
FCBA0000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
FC080000
FC120000
FC1C0000
FC260000
FC300000
FC3A0000
FC440000
FC4E0000
FC580000
FC620000
FC6C0000
FC760000
FC800000
FC8A0000
FC940000
FC9E0000
FCA80000
FCB20000
FCBC0000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
60
FCBE0000
FCC80000
FCD20000
FCDC0000
FCE60000
FCF00000
FCFA0000
FD040000
FD0E0000
FD180000
FD220000
FD2C0000
FD360000
FD400000
FD4A0000
FD540000
FD5E0000
FD680000
FD720000
FD7C0000
FD860000
FD900000
FD9A0000
FDA40000
FDAE0000
FDB80000
FDC20000
FDCC0000
FDD60000
FDE00000
FDEA0000
FDF40000
FDFE0000
FE080000
FE120000
FE1C0000
FE260000
FE300000
FE3A0000
FE440000
FE4E0000
FE580000
FE620000
FE6C0000
FE760000
FE800000
FE8A0000
FE940000
FE9E0000
FEA80000
FEB20000
FEBC0000
FEC60000
FED00000
FEDA0000
FEE40000
FEEE0000
FEF80000
FF020000
FF0C0000
FF160000
FF200000
FF2A0000
FF340000
FF3E0000
FF480000
FF520000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
FCC00000
FCCA0000
FCD40000
FCDE0000
FCE80000
FCF20000
FCFC0000
FD060000
FD100000
FD1A0000
FD240000
FD2E0000
FD380000
FD420000
FD4C0000
FD560000
FD600000
FD6A0000
FD740000
FD7E0000
FD880000
FD920000
FD9C0000
FDA60000
FDB00000
FDBA0000
FDC40000
FDCE0000
FDD80000
FDE20000
FDEC0000
FDF60000
FE000000
FE0A0000
FE140000
FE1E0000
FE280000
FE320000
FE3C0000
FE460000
FE500000
FE5A0000
FE640000
FE6E0000
FE780000
FE820000
FE8C0000
FE960000
FEA00000
FEAA0000
FEB40000
FEBE0000
FEC80000
FED20000
FEDC0000
FEE60000
FEF00000
FEFA0000
FF040000
FF0E0000
FF180000
FF220000
FF2C0000
FF360000
FF400000
FF4A0000
FF540000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
FCC20000
FCCC0000
FCD60000
FCE00000
FCEA0000
FCF40000
FCFE0000
FD080000
FD120000
FD1C0000
FD260000
FD300000
FD3A0000
FD440000
FD4E0000
FD580000
FD620000
FD6C0000
FD760000
FD800000
FD8A0000
FD940000
FD9E0000
FDA80000
FDB20000
FDBC0000
FDC60000
FDD00000
FDDA0000
FDE40000
FDEE0000
FDF80000
FE020000
FE0C0000
FE160000
FE200000
FE2A0000
FE340000
FE3E0000
FE480000
FE520000
FE5C0000
FE660000
FE700000
FE7A0000
FE840000
FE8E0000
FE980000
FEA20000
FEAC0000
FEB60000
FEC00000
FECA0000
FED40000
FEDE0000
FEE80000
FEF20000
FEFC0000
FF060000
FF100000
FF1A0000
FF240000
FF2E0000
FF380000
FF420000
FF4C0000
FF560000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
FCC40000
FCCE0000
FCD80000
FCE20000
FCEC0000
FCF60000
FD000000
FD0A0000
FD140000
FD1E0000
FD280000
FD320000
FD3C0000
FD460000
FD500000
FD5A0000
FD640000
FD6E0000
FD780000
FD820000
FD8C0000
FD960000
FDA00000
FDAA0000
FDB40000
FDBE0000
FDC80000
FDD20000
FDDC0000
FDE60000
FDF00000
FDFA0000
FE040000
FE0E0000
FE180000
FE220000
FE2C0000
FE360000
FE400000
FE4A0000
FE540000
FE5E0000
FE680000
FE720000
FE7C0000
FE860000
FE900000
FE9A0000
FEA40000
FEAE0000
FEB80000
FEC20000
FECC0000
FED60000
FEE00000
FEEA0000
FEF40000
FEFE0000
FF080000
FF120000
FF1C0000
FF260000
FF300000
FF3A0000
FF440000
FF4E0000
FF580000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
FCC60000
FCD00000
FCDA0000
FCE40000
FCEE0000
FCF80000
FD020000
FD0C0000
FD160000
FD200000
FD2A0000
FD340000
FD3E0000
FD480000
FD520000
FD5C0000
FD660000
FD700000
FD7A0000
FD840000
FD8E0000
FD980000
FDA20000
FDAC0000
FDB60000
FDC00000
FDCA0000
FDD40000
FDDE0000
FDE80000
FDF20000
FDFC0000
FE060000
FE100000
FE1A0000
FE240000
FE2E0000
FE380000
FE420000
FE4C0000
FE560000
FE600000
FE6A0000
FE740000
FE7E0000
FE880000
FE920000
FE9C0000
FEA60000
FEB00000
FEBA0000
FEC40000
FECE0000
FED80000
FEE20000
FEEC0000
FEF60000
FF000000
FF0A0000
FF140000
FF1E0000
FF280000
FF320000
FF3C0000
FF460000
FF500000
FF5A0000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
61
FF5C0000 E
FF5E0000 E
FF600000 E
FF620000 E
FF640000 E
FF660000 E
FF680000 E
FF6A0000 E
FF6C0000 E
FF6E0000 E
FF700000 E
FF720000 E
FF740000 E
FF760000 E
FF780000 E
FF7A0000 E
FF7C0000 E
FF7E0000 E
FF800000 E
FF820000 E
FF840000 E
FF860000 E
FF880000 E
FF8A0000 E
FF8C0000 E
FF8E0000 E
FF900000 E RO
FF920000 E RO
FF940000 E RO
FF960000 E RO
FF980000 E
FF9A0000 E
FF9C0000 E
FF9E0000 E
FFA00000 E
FFA20000 E
FFA40000 E
FFA60000 E
FFA80000 E
FFAA0000 E
FFAC0000 E
FFAE0000 E
FFB00000 E
FFB20000 E
FFB40000 E
FFB60000 E
FFB80000 E
FFBA0000 E
FFBC0000 E
FFBE0000 E
FFC00000 E
FFC20000 E
FFC40000 E
FFC60000 E
FFC80000 E
FFCA0000 E
FFCC0000 E
FFCE0000 E
FFD00000 E
FFD20000 E
FFD40000 E
FFD60000 E
FFD80000 E
FFDA0000 E
FFDC0000 E
FFDE0000 E
FFE00000 E
FFE20000 E
FFE40000 E
FFE60000 E
FFE80000 E
FFEA0000 E
FFEC0000 E
FFEE0000 E
FFF00000 E
FFF20000 E
FFF40000 E
FFF60000
RO
FFF80000
RO
FFFA0000
RO
FFFC0000
RO
FFFE0000
RO
=> era 0xFF900000 0xFF97FFFF
- Warning: 4 protected sectors will not be erased!
done
Erased 4 sectors
=> prot off 1:455
Un-Protect Flash Sectors 455-455 in Bank # 1
=> fli
Bank # 1: CFI conformant FLASH (16 x 16) Size: 64 MB in 512 Sectors
AMD Standard command set, Manufacturer ID: 0x01, Device ID: 0x227E
Erase timeout: 16384 ms, write timeout: 2 ms
Buffer write timeout: 5 ms, buffer size: 32 bytes
Sector Start Addresses:
FC000000 E
FC020000 E
FC0A0000 E
FC0C0000 E
FC140000 E
FC160000 E
FC1E0000 E
FC200000 E
FC280000 E
FC2A0000 E
FC320000 E
FC340000 E
FC3C0000 E
FC3E0000 E
FC460000 E
FC480000 E
FC500000 E
FC520000 E
FC5A0000 E
FC5C0000 E
FC640000 E
FC660000 E
FC6E0000 E
FC700000 E
FC780000 E
FC7A0000 E
FC820000 E
FC840000 E
FC8C0000 E
FC8E0000 E
FC960000 E
FC980000 E
FCA00000 E
FCA20000 E
FCAA0000 E
FCAC0000 E
FCB40000 E
FCB60000 E
FCBE0000 E
FCC00000 E
FCC80000 E
FCCA0000 E
FCD20000 E
FCD40000 E
FCDC0000 E
FCDE0000 E
FCE60000 E
FCE80000 E
FCF00000 E
FCF20000 E
FCFA0000 E
FCFC0000 E
FD040000 E
FD060000 E
FD0E0000 E
FD100000 E
FD180000 E
FD1A0000 E
FD220000 E
FD240000 E
FD2C0000 E
FD2E0000 E
FD360000 E
FD380000 E
FD400000 E
FD420000 E
FD4A0000 E
FD4C0000 E
FD540000 E
FD560000 E
FD5E0000 E
FD600000 E
FC040000
FC0E0000
FC180000
FC220000
FC2C0000
FC360000
FC400000
FC4A0000
FC540000
FC5E0000
FC680000
FC720000
FC7C0000
FC860000
FC900000
FC9A0000
FCA40000
FCAE0000
FCB80000
FCC20000
FCCC0000
FCD60000
FCE00000
FCEA0000
FCF40000
FCFE0000
FD080000
FD120000
FD1C0000
FD260000
FD300000
FD3A0000
FD440000
FD4E0000
FD580000
FD620000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
FC060000
FC100000
FC1A0000
FC240000
FC2E0000
FC380000
FC420000
FC4C0000
FC560000
FC600000
FC6A0000
FC740000
FC7E0000
FC880000
FC920000
FC9C0000
FCA60000
FCB00000
FCBA0000
FCC40000
FCCE0000
FCD80000
FCE20000
FCEC0000
FCF60000
FD000000
FD0A0000
FD140000
FD1E0000
FD280000
FD320000
FD3C0000
FD460000
FD500000
FD5A0000
FD640000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
FC080000
FC120000
FC1C0000
FC260000
FC300000
FC3A0000
FC440000
FC4E0000
FC580000
FC620000
FC6C0000
FC760000
FC800000
FC8A0000
FC940000
FC9E0000
FCA80000
FCB20000
FCBC0000
FCC60000
FCD00000
FCDA0000
FCE40000
FCEE0000
FCF80000
FD020000
FD0C0000
FD160000
FD200000
FD2A0000
FD340000
FD3E0000
FD480000
FD520000
FD5C0000
FD660000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
62
FD680000
FD720000
FD7C0000
FD860000
FD900000
FD9A0000
FDA40000
FDAE0000
FDB80000
FDC20000
FDCC0000
FDD60000
FDE00000
FDEA0000
FDF40000
FDFE0000
FE080000
FE120000
FE1C0000
FE260000
FE300000
FE3A0000
FE440000
FE4E0000
FE580000
FE620000
FE6C0000
FE760000
FE800000
FE8A0000
FE940000
FE9E0000
FEA80000
FEB20000
FEBC0000
FEC60000
FED00000
FEDA0000
FEE40000
FEEE0000
FEF80000
FF020000
FF0C0000
FF160000
FF200000
FF2A0000
FF340000
FF3E0000
FF480000
FF520000
FF5C0000
FF660000
FF700000
FF7A0000
FF840000
FF8E0000
FF980000
FFA20000
FFAC0000
FFB60000
FFC00000
FFCA0000
FFD40000
FFDE0000
FFE80000
FFF20000
FFFC0000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
RO
FD6A0000 E
FD6C0000 E
FD6E0000 E
FD700000 E
FD740000 E
FD760000 E
FD780000 E
FD7A0000 E
FD7E0000 E
FD800000 E
FD820000 E
FD840000 E
FD880000 E
FD8A0000 E
FD8C0000 E
FD8E0000 E
FD920000 E
FD940000 E
FD960000 E
FD980000 E
FD9C0000 E
FD9E0000 E
FDA00000 E
FDA20000 E
FDA60000 E
FDA80000 E
FDAA0000 E
FDAC0000 E
FDB00000 E
FDB20000 E
FDB40000 E
FDB60000 E
FDBA0000 E
FDBC0000 E
FDBE0000 E
FDC00000 E
FDC40000 E
FDC60000 E
FDC80000 E
FDCA0000 E
FDCE0000 E
FDD00000 E
FDD20000 E
FDD40000 E
FDD80000 E
FDDA0000 E
FDDC0000 E
FDDE0000 E
FDE20000 E
FDE40000 E
FDE60000 E
FDE80000 E
FDEC0000 E
FDEE0000 E
FDF00000 E
FDF20000 E
FDF60000 E
FDF80000 E
FDFA0000 E
FDFC0000 E
FE000000 E
FE020000 E
FE040000 E
FE060000 E
FE0A0000 E
FE0C0000 E
FE0E0000 E
FE100000 E
FE140000 E
FE160000 E
FE180000 E
FE1A0000 E
FE1E0000 E
FE200000 E
FE220000 E
FE240000 E
FE280000 E
FE2A0000 E
FE2C0000 E
FE2E0000 E
FE320000 E
FE340000 E
FE360000 E
FE380000 E
FE3C0000 E
FE3E0000 E
FE400000 E
FE420000 E
FE460000 E
FE480000 E
FE4A0000 E
FE4C0000 E
FE500000 E
FE520000 E
FE540000 E
FE560000 E
FE5A0000 E
FE5C0000 E
FE5E0000 E
FE600000 E
FE640000 E
FE660000 E
FE680000 E
FE6A0000 E
FE6E0000 E
FE700000 E
FE720000 E
FE740000 E
FE780000 E
FE7A0000 E
FE7C0000 E
FE7E0000 E
FE820000 E
FE840000 E
FE860000 E
FE880000 E
FE8C0000 E
FE8E0000 E
FE900000 E
FE920000 E
FE960000 E
FE980000 E
FE9A0000 E
FE9C0000 E
FEA00000 E
FEA20000 E
FEA40000 E
FEA60000 E
FEAA0000 E
FEAC0000 E
FEAE0000 E
FEB00000 E
FEB40000 E
FEB60000 E
FEB80000 E
FEBA0000 E
FEBE0000 E
FEC00000 E
FEC20000 E
FEC40000 E
FEC80000 E
FECA0000 E
FECC0000 E
FECE0000 E
FED20000 E
FED40000 E
FED60000 E
FED80000 E
FEDC0000 E
FEDE0000 E
FEE00000 E
FEE20000 E
FEE60000 E
FEE80000 E
FEEA0000 E
FEEC0000 E
FEF00000 E
FEF20000 E
FEF40000 E
FEF60000 E
FEFA0000 E
FEFC0000 E
FEFE0000 E
FF000000 E
FF040000 E
FF060000 E
FF080000 E
FF0A0000 E
FF0E0000 E
FF100000 E
FF120000 E
FF140000 E
FF180000 E
FF1A0000 E
FF1C0000 E
FF1E0000 E
FF220000 E
FF240000 E
FF260000 E
FF280000 E
FF2C0000 E
FF2E0000 E
FF300000 E
FF320000 E
FF360000 E
FF380000 E
FF3A0000 E
FF3C0000 E
FF400000 E
FF420000 E
FF440000 E
FF460000 E
FF4A0000 E
FF4C0000 E
FF4E0000 E
FF500000 E
FF540000 E
FF560000 E
FF580000 E
FF5A0000 E
FF5E0000 E
FF600000 E
FF620000 E
FF640000 E
FF680000 E
FF6A0000 E
FF6C0000 E
FF6E0000 E
FF720000 E
FF740000 E
FF760000 E
FF780000 E
FF7C0000 E
FF7E0000 E
FF800000 E
FF820000 E
FF860000 E
FF880000 E
FF8A0000 E
FF8C0000 E
FF900000 E RO
FF920000 E RO
FF940000 E RO
FF960000 E RO
FF9A0000 E
FF9C0000 E
FF9E0000 E
FFA00000 E
FFA40000 E
FFA60000 E
FFA80000 E
FFAA0000 E
FFAE0000 E
FFB00000 E
FFB20000 E
FFB40000 E
FFB80000 E
FFBA0000 E
FFBC0000 E
FFBE0000 E
FFC20000 E
FFC40000 E
FFC60000 E
FFC80000 E
FFCC0000 E
FFCE0000 E
FFD00000 E
FFD20000 E
FFD60000 E
FFD80000 E
FFDA0000 E
FFDC0000 E
FFE00000 E
FFE20000 E
FFE40000 E
FFE60000 E
FFEA0000 E
FFEC0000 E
FFEE0000 E
FFF00000 E
FFF40000 E
FFF60000
RO
FFF80000
RO
FFFA0000
RO
FFFE0000
RO
63
The actual level of protection depends on the flash chips used on your hardware, and on the
implementation of the flash device driver for this board. In most cases U-Boot provides just a simple
software-protection, i. e. it prevents you from erasing or overwriting important stuff by accident (like the
U-Boot code itself or U-Boot's environment variables), but it cannot prevent you from circumventing these
restrictions - a nasty user who is loading and running his own flash driver code cannot and will not be stopped
by this mechanism. Also, in most cases this protection is only effective while running U-Boot, i. e. any
operating system will not know about "protected" flash areas and will happily erase these if requested to do
so.
"nor0"
0xFFFFFFFF
0x00100000
0x00000000
The second method uses the Linux kernel's mtdparts command line option and dynamic partitioning:
#define CONFIG_JFFS2_CMDLINE
#define MTDIDS_DEFAULT
"nor1=zuma-1,nor2=zuma-2"
#define MTDPARTS_DEFAULT
"mtdparts=zuma-1:-(jffs2),zuma-2:-(user)"
Command line of course produces bigger images, and may be inappropriate for some targets, so by default it's
off.
The mtdparts command offers an easy to use and powerful interface to define the contents of the
environment variable of the same name that can be passed as boot argument to the Linux kernel:
=> help mtdparts
mtdparts
- list partition table
mtdparts delall
- delete all partitions
mtdparts del part-id
- delete partition (e.g. part-id = nand0,1)
mtdparts add <mtd-dev> <size>[@<offset>] [<name>] [ro]
- add partition
mtdparts default
- reset partition table to defaults
----this command uses three environment variables:
'partition' - keeps current partition identifier
partition
:= <part-id>
64
<part-id>
:= <dev-id>,part_num
:=
:=
:=
:=
<dev-id>=<mtd-id>
'nand'|'nor'<dev-num>
mtd device number, 0...
unique device tag used by linux kernel to find mtd device (mtd->name)
:=
:=
:=
:=
:=
:=
:=
<mtd-id>:<part-def>[,<part-def>...]
unique device tag used by linux kernel to find mtd device (mtd->name)
<size>[@<offset>][<name>][<ro-flag>]
standard linux memsize OR '-' to denote all remaining space
partition start offset within the device
'(' NAME ')'
when set to 'ro' makes partition read-only (not used, passed to kernel)
For example, on some target system the mtdparts command might display this information:
=> mtdparts
device nor0 <TQM5200-0>, # parts = 4
#: name
size
0: firmware
0x00100000
1: kernel
0x00180000
2: small-fs
0x00d80000
3: big-fs
0x01000000
offset
0x00000000
0x00100000
0x00280000
0x01000000
mask_flags
1
0
0
0
defaults:
mtdids : nor0=TQM5200-0
mtdparts: mtdparts=TQM5200-0:1m(firmware),1536k(kernel),3584k(small-fs),2m(initrd),8m(misc),16m(b
The partition table printed here obviously differs from the default value for the mtdparts variable printed in
the last line. To verify this, we can check the current content of this variable:
=> print mtdparts
mtdparts=mtdparts=TQM5200-0:1024k(firmware)ro,1536k(kernel),13824k(small-fs),16m(big-fs)
and we can see that it exactly matches the partition table printed above.
Now let's switch back to the default settings:
=> mtdparts default
=> mtdparts
device nor0 <TQM5200-0>, # parts = 6
#: name
size
0: firmware
0x00100000
1: kernel
0x00180000
2: small-fs
0x00380000
3: initrd
0x00200000
4: misc
0x00800000
5: big-fs
0x01000000
offset
0x00000000
0x00100000
0x00280000
0x00600000
0x00800000
0x01000000
mask_flags
0
0
0
0
0
0
65
defaults:
mtdids : nor0=TQM5200-0
mtdparts: mtdparts=TQM5200-0:1m(firmware),1536k(kernel),3584k(small-fs),2m(initrd),8m(misc),16m(b
=> print mtdparts
mtdparts=mtdparts=TQM5200-0:1m(firmware),1536k(kernel),3584k(small-fs),2m(initrd),8m(misc),16m(bi
Then we delete the last 4 partitions ("small-fs", "initrd", "misc" and "big-fs") ...
=>
=>
=>
=>
=>
mtdparts
mtdparts
mtdparts
mtdparts
mtdparts
del
del
del
del
small-fs
initrd
misc
big-fs
offset
0x00000000
0x00100000
mask_flags
0
0
defaults:
mtdids : nor0=TQM5200-0
mtdparts: mtdparts=TQM5200-0:1m(firmware),1536k(kernel),3584k(small-fs),2m(initrd),8m(misc),16m(b
... and combine the free space into a singe big partition:
=> mtdparts add nor0 - new-part
=> mtdparts
device nor0 <TQM5200-0>, # parts = 3
#: name
size
0: firmware
0x00100000
1: kernel
0x00180000
2: new-part
0x01d80000
offset
0x00000000
0x00100000
0x00280000
mask_flags
0
0
0
defaults:
mtdids : nor0=TQM5200-0
mtdparts: mtdparts=TQM5200-0:1m(firmware),1536k(kernel),3584k(small-fs),2m(initrd),8m(misc),16m(b
=> print mtdparts
mtdparts=mtdparts=TQM5200-0:1m(firmware),1536k(kernel),30208k(new-part)
With the source command you can run "shell" scripts under U-Boot: You create a U-Boot script image by
simply writing the commands you want to run into a text file; then you will have to use the mkimage tool to
convert this text file into a U-Boot image (using the image type script).
5.9.4. Execution Control Commands
66
This image can be loaded like any other image file, and with source you can run the commands in such an
image. For instance, the following text file:
echo
echo Network Configuration:
echo ---------------------echo Target:
printenv ipaddr hostname
echo
echo Server:
printenv serverip rootpath
echo
can be converted into a U-Boot script image using the mkimage command like this:
bash$ mkimage -A ppc -O linux -T script -C none -a 0 -e 0 \
> -n "autoscr example script" \
> -d ./testsystems/dulg/testcases/example.script /tftpboot/duts/canyonlands/example.scr
Image Name:
autoscr example script
Created:
Mon Feb 8 16:36:04 2010
Image Type:
PowerPC Linux Script (uncompressed)
Data Size:
157 Bytes = 0.15 kB = 0.00 MB
Load Address: 0x00000000
Entry Point: 0x00000000
Contents:
Image 0:
149 Bytes =
0 kB = 0 MB
Now you can load and execute this script image in U-Boot:
=> tftp 0x100000 /tftpboot/duts/canyonlands/example.scr
Using ppc_4xx_eth0 device
TFTP from server 192.168.1.1; our IP address is 192.168.100.6
Filename '/tftpboot/duts/canyonlands/example.scr'.
Load address: 0x100000
Loading: #
done
Bytes transferred = 221 (dd hex)
=> imi
## Checking Image at 00100000 ...
Legacy image found
Image Name:
autoscr example script
Created:
2010-02-08 15:36:04 UTC
Image Type:
PowerPC Linux Script (uncompressed)
Data Size:
157 Bytes = 0.2 kB
Load Address: 00000000
Entry Point:
00000000
Contents:
Image 0: 149 Bytes = 0.1 kB
Verifying Checksum ... OK
=> source 0x100000
## Executing script at 00100000
Network Configuration:
---------------------Target:
ipaddr=192.168.100.6
hostname=canyonlands
Server:
serverip=192.168.1.1
rootpath=/opt/eldk/ppc_4xxFP
=>
67
The bootm command is used to start operating system images. From the image header it gets information
about the type of the operating system, the file compression method used (if any), the load and entry point
addresses, etc. The command will then load the image to the required memory address, uncompressing it on
the fly if necessary. Depending on the OS it will pass the required boot arguments and start the OS at it's entry
point.
The first argument to bootm is the memory address (in RAM, ROM or flash memory) where the image is
stored, followed by optional arguments that depend on the OS.
Linux requires the flattened device tree blob to be passed at boot time, and bootm expects its third
argument to be the address of the blob in memory. Second argument to bootm depends on whether an
initrd initial ramdisk image is to be used. If the kernel should be booted without the initial ramdisk, the
second argument should be given as "-", otherwise it is interpreted as the start address of initrd (in RAM,
ROM or flash memory).
To boot a Linux kernel image without a initrd ramdisk image, the following command can be used:
=> bootm ${kernel_addr} - ${fdt_addr}
Both examples of course imply that the variables used are set to correct addresses for a kernel, fdt blob and a
initrd ramdisk image.
When booting images that have been loaded to RAM (for instance using TFTP download) you have to be
careful that the locations where the (compressed) images were stored do not overlap with the memory needed
to load the uncompressed kernel. For instance, if you load a ramdisk image at a location in low memory, it
may be overwritten when the Linux kernel gets loaded. This will cause undefined system crashes.
68
U-Boot has support for so-called standalone applications. These are programs that do not require the complex
environment of an operating system to run. Instead they can be loaded and executed by U-Boot directly,
utilizing U-Boot's service functions like console I/O or malloc() and free().
This can be used to dynamically load and run special extensions to U-Boot like special hardware test routines
or bootstrap code to load an OS image from some filesystem.
The go command is used to start such standalone applications. The optional arguments are passed to the
application without modification. For more information see 5.12. U-Boot Standalone Applications.
5.9.5.3. loadb - load binary file over serial line (kermit mode)
=> help loadb
loadb - load binary file over serial line (kermit mode)
Usage:
loadb [ off ] [ baud ]
- load binary file over serial line with offset 'off' and baudrate 'baud'
=>
With kermit you can download binary data via the serial line. Here we show how to download uImage, the
Linux kernel image. Please make sure, that you have set up kermit as described in section 4.3. Configuring
the "kermit" command and then type:
69
5.9.5.3. loadb - load binary file over serial line (kermit mode)
70
The printenv command prints one, several or all variables of the U-Boot environment. When arguments
are given, these are interpreted as the names of environment variables which will be printed with their values:
=> printenv ipaddr hostname netmask
ipaddr=192.168.100.6
hostname=canyonlands
netmask=255.255.0.0
=>
Without arguments, printenv prints all a list with all variables in the environment and their values, plus
some statistics about the current usage and the total size of the memory available for the environment.
=> printenv
bootdelay=5
baudrate=115200
loads_echo=
preboot=echo;echo Type "run flash_nfs" to mount root filesystem over NFS;echo
netdev=eth0
nfsargs=setenv bootargs root=/dev/nfs rw nfsroot=${serverip}:${rootpath}
ramargs=setenv bootargs root=/dev/ram rw
addip=setenv bootargs ${bootargs} ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}:${
addtty=setenv bootargs ${bootargs} console=ttyS0,${baudrate}
addmisc=setenv bootargs ${bootargs}
initrd_high=30000000
kernel_addr_r=400000
ramdisk_addr_r=C00000
hostname=canyonlands
ramdisk_file=canyonlands/uRamdisk
rootpath=/opt/eldk/ppc_4xxFP
flash_self=run ramargs addip addtty addmisc;bootm ${kernel_addr} ${ramdisk_addr} ${fdt_addr}
flash_nfs=run nfsargs addip addtty addmisc;bootm ${kernel_addr} - ${fdt_addr}
net_nfs=tftp ${kernel_addr_r} ${bootfile}; tftp ${fdt_addr_r} ${fdt_file}; run nfsargs addip addt
net_self_load=tftp ${kernel_addr_r} ${bootfile};tftp ${fdt_addr_r} ${fdt_file};tftp ${ramdisk_add
net_self=run net_self_load;run ramargs addip addtty addmisc;bootm ${kernel_addr_r} ${ramdisk_addr
fdt_file=canyonlands/canyonlands.dtb
update=protect off 0xFFFA0000 FFFFFFFF;era 0xFFFA0000 FFFFFFFF;cp.b ${fileaddr} 0xFFFA0000 ${file
upd=run load update
nload=tftp 200000 canyonlands/u-boot-nand.bin
nupdate=nand erase 0 100000;nand write 200000 0 100000;setenv filesize;saveenv
nupd=run nload nupdate
pciconfighost=1
pcie_mode=RP:RP
ethaddr=00:10:ec:01:08:84
eth1addr=00:10:ec:81:08:84
hostname=canyonlands
sr=tftp 200000 canyonlands/u-boot.bin-sr;protect off 0xFFFA0000 FFFFFFFF;era 0xFFFA0000 FFFFFFFF;
srlinux=setenv bootfile canyonlands/uImage-sr;setenv fdt_file canyonlands/canyonlands.dtb-sr;run
bootcmd=run srlinux
fdtaddr=800000
71
uboot_file=canyonlands/u-boot.bin-duts
load=tftp 200000 ${u-boot}
dzu_net_nfs=setenv bootfile dzu/canyonlands/uImage;setenv fdt_file dzu/canyonlands/canyonlands.dt
bootargs=root=/dev/ram rw ip=192.168.100.6:192.168.1.1:192.168.1.254:255.255.0.0:canyonlands:eth0
ethact=ppc_4xx_eth0
bootfile=/tftpboot/duts/canyonlands/uImage
bar=This is a new example.
cons_opts=console=tty0 console=ttyS0,${baudrate}
test=echo This is a test;printenv ipaddr;echo Done.
test2=echo This is another Test;printenv hostname;echo Done.
kernel_addr=0xFC000000
ramdisk_addr=0xFC200000
fdt_addr=0xFC1E0000
fdt_addr_r=0x00b00000
u-boot=/tftpboot/duts/canyonlands/u-boot.bin
fileaddr=200000
gatewayip=192.168.1.254
netmask=255.255.0.0
ipaddr=192.168.100.6
serverip=192.168.1.1
stdin=serial
stdout=serial
stderr=serial
ver=U-Boot 2009.11.1 (Feb 05 2010 - 08:57:12)
Environment size: 2780/16379 bytes
=>
All changes you make to the U-Boot environment are made in RAM only. They are lost as soon as you reboot
the system. If you want to make your changes permanent you have to use the saveenv command to write a
copy of the environment settings to persistent storage, from where they are automatically loaded during
startup:
=> saveenv
Saving Environment to Flash...
Un-Protected 1 sectors
Un-Protected 1 sectors
Erasing Flash...
. done
Erased 1 sectors
Writing to Flash... done
Protected 1 sectors
Protected 1 sectors
=>
72
To modify the U-Boot environment you have to use the setenv command. When called with exactly one
argument, it will delete any variable of that name from U-Boot's environment, if such a variable exists. Any
storage occupied for such a variable will be automatically reclaimed:
=> setenv foo This is an example value.
=> printenv foo
foo=This is an example value.
=> setenv foo
=> printenv foo
## Error: "foo" not defined
=>
When called with more arguments, the first one will again be the name of the variable, and all following
arguments will (concatenated by single space characters) form the value that gets stored for this variable. New
variables will be automatically created, existing ones overwritten.
=> printenv bar
## Error: "bar" not defined
=> setenv bar This is a new example.
=> printenv bar
bar=This is a new example.
=>
Remember standard shell quoting rules when the value of a variable shall contain characters that have a
special meaning to the command line parser (like the $ character that is used for variable substitution or the
semicolon which separates commands). Use the backslash (\) character to escape such special characters, or
enclose the whole phrase in apstrophes ('). Use "${name}" for variable expansion (see 14.2.17. How the
Command Line Parsing Works for details).
=> setenv cons_opts 'console=tty0 console=ttyS0,${baudrate}'
=> printenv cons_opts
cons_opts=console=tty0 console=ttyS0,${baudrate}
=>
There is no restriction on the characters that can be used in a variable name except the restrictions imposed
by the command line parser (like using backslash for quoting, space and tab characters to separate arguments,
or semicolon and newline to separate commands). Even strange input like "=-/|()+=" is a perfectly legal
variable name in U-Boot.
A common mistake is to write
setenv name=value
instead of
setenv name value
There will be no error message, which lets you believe everything went OK, but it didn't: instead of setting the
variable name to the value value you tried to delete a variable with the name name=value - this is probably
not what you intended! Always remember that name and value have to be separated by space and/or tab
characters!
73
You can use U-Boot environment variables to store commands and even sequences of commands. To execute
such a command, you use the run command:
=> setenv test echo This is a test\;printenv ipaddr\;echo Done.
=> printenv test
test=echo This is a test;printenv ipaddr;echo Done.
=> run test
This is a test
ipaddr=192.168.100.6
Done.
=>
You can call run with several variables as arguments, in which case these commands will be executed in
sequence:
=> setenv test2 echo This is another Test\;printenv hostname\;echo Done.
=> printenv test test2
test=echo This is a test;printenv ipaddr;echo Done.
test2=echo This is another Test;printenv hostname;echo Done.
=> run test test2
This is a test
ipaddr=192.168.100.6
Done.
This is another Test
hostname=canyonlands
Done.
=>
If a U-Boot variable contains several commands (separated by semicolon), and one of these commands
fails when you "run" this variable, the remaining commands will be executed anyway.
If you execute several variables with one call to run, any failing command will cause "run" to terminate, i.
e. the remaining variables are not executed.
The bootd (short: boot) executes the default boot command, i. e. what happens when you don't interrupt
the initial countdown. This is a synonym for the run bootcmd command.
74
family of commands:
=>
=> help fd
list /
fdt_path_offset() returned FDT_ERR_BADMAGIC
mknode / testnode
fdt_path_offset() returned FDT_ERR_BADMAGIC
75
=> fdt
libfdt
=> fdt
libfdt
=>
list /
fdt_path_offset() returned FDT_ERR_BADMAGIC
list /testnode
fdt_path_offset() returned FDT_ERR_BADMAGIC
rm /testnode testprop
fdt_path_offset() returned
list /testnode
fdt_path_offset() returned
rm /testnode
fdt_path_offset() returned
list /
fdt_path_offset() returned
FDT_ERR_BADMAGIC
FDT_ERR_BADMAGIC
FDT_ERR_BADMAGIC
FDT_ERR_BADMAGIC
76
77
};
sdr
};
cpr
};
l2c
};
plb
};
{
{
{
{
};
=> fdt chosen
=> fdt list /
/ {
#address-cells = <0x2>;
#size-cells = <0x1>;
model = "amcc,canyonlands";
compatible = "amcc,canyonlands";
dcr-parent = <0x1>;
chosen {
};
aliases {
};
cpus {
};
memory {
};
interrupt-controller0 {
};
interrupt-controller1 {
};
interrupt-controller2 {
};
interrupt-controller3 {
};
sdr {
};
cpr {
};
l2c {
};
plb {
};
};
=> fdt list /chosen
chosen {
bootargs = "root=/dev/ram rw ip=192.168.100.6:192.168.1.1:192.168.1.254:255.255.0.0:canyonland
};
=>
Note: fdt boardsetup performs board-specific blob updates, most commonly setting clock frequencies,
etc. Discovering its operation is left as an excercise for the reader.
78
i2c
i2c
i2c
i2c
i2c
i2c
i2c
=>
mw chip address[.0, .1, .2] value [count] - write to I2C device (fill)
nm chip address[.0, .1, .2] - write to I2C device (constant address)
crc32 chip address[.0, .1, .2] count - compute CRC32 checksum
probe - show devices on the I2C bus
reset - re-init the I2C Controller
loop chip address[.0, .1, .2] [# of objects] - looping read of device
sdram chip - print SDRAM configuration information
79
NAND:
PCI:
PCIE1:
DTT:
Net:
128 MiB
Bus Dev VenId DevId Class Int
link is not up.
1 is 40 C
ppc_4xx_eth0, ppc_4xx_eth1
The sleep command pauses execution for the number of seconds given as the argument:
=> sleep 5
=>
You can print the version and build date of the U-Boot image running on your system using the version
command (short: vers):
=> version
U-Boot 2009.11.1 (Feb 05 2010 - 08:57:12)
=>
80
autoload: if set to "no" (or any string beginning with 'n'), the rarpb, bootp or dhcp commands
will perform only a configuration lookup from the BOOTP / DHCP server, but not try to load any
image using TFTP.
autostart: if set to "yes", an image loaded using the rarpb, bootp, dhcp, tftp, disk, or
docb commands will be automatically started (by internally calling the bootm command).
baudrate: a decimal number that selects the console baudrate (in bps). Only a predefined list of
baudrate settings is available.
When you change the baudrate (using the "setenv baudrate ..." command), U-Boot will switch the
baudrate of the console terminal and wait for a newline which must be entered with the new speed
setting. This is to make sure you can actually type at the new speed. If this fails, you have to reset the
board (which will operate at the old speed since you were not able to saveenv the new settings.)
If no "baudrate" variable is defined, the default baudrate of 115200 is used.
bootargs: The contents of this variable are passed to the Linux kernel as boot arguments (aka
"command line").
bootcmd: This variable defines a command string that is automatically executed when the initial
countdown is not interrupted.
This command is only executed when the variable bootdelay is also defined!
bootdelay: After reset, U-Boot will wait this number of seconds before it executes the contents of
the bootcmd variable. During this time a countdown is printed, which can be interrupted by pressing
any key.
Set this variable to 0 boot without delay. Be careful: depending on the contents of your bootcmd
variable, this can prevent you from entering interactive commands again forever!
Set this variable to -1 to disable autoboot.
bootfile: name of the default image to load with TFTP
cpuclk: (Only with MPC859 / MPC866 / MPC885 processors) On some processors, the CPU clock
frequency can be adjusted by the user (for example to optimize performance versus power
dissipation). On such systems the cpuclk variable can be set to the desired CPU clock value, in
MHz. If the cpuclk variable exists and its value is within the compile-time defined limits
(CFG_866_CPUCLK_MIN and CFG_866_CPUCLK_MAX = minimum resp. maximum allowed CPU
clock), then the specified value is used. Otherwise, the default CPU clock value is set.
ethaddr: Ethernet MAC address for first/only ethernet interface (= eth0 in Linux).
This variable can be set only once (usually during manufacturing of the board). U-Boot refuses to
delete or overwrite this variable once it has been set.
eth1addr: Ethernet MAC address for second ethernet interface (= eth1 in Linux).
eth2addr: Ethernet MAC address for third ethernet interface (= eth2 in Linux).
...
initrd_high: used to restrict positioning of initrd ramdisk images:
If this variable is not set, initrd images will be copied to the highest possible address in RAM; this is
usually what you want since it allows for maximum initrd size. If for some reason you want to make
sure that the initrd image is loaded below the CFG_BOOTMAPSZ limit, you can set this environment
variable to a value of "no" or "off" or "0". Alternatively, you can set it to a maximum upper address to
use (U-Boot will still check that it does not overwrite the U-Boot stack and data).
For instance, when you have a system with 16 MB RAM, and want to reserve 4 MB from use by
5.10. U-Boot Environment Variables
81
Linux, you can do this by adding "mem=12M" to the value of the "bootargs" variable. However, now
you must make sure that the initrd image is placed in the first 12 MB as well - this can be done with
=> setenv initrd_high 00c00000
Setting initrd_high to the highest possible address in your system (0xFFFFFFFF) prevents U-Boot from
copying the image to RAM at all. This allows for faster boot times, but requires a Linux kernel with zero-copy
ramdisk support.
ipaddr: IP address; needed for tftp command
loadaddr: Default load address for commands like tftp or loads.
loads_echo: If set to 1, all characters received during a serial download (using the loads
command) are echoed back. This might be needed by some terminal emulations (like cu), but may as
well just take time on others.
mtdparts: This variable (usually defined using the mtdparts command) allows to share a common
MTD partition scheme between U-Boot and the Linux kernel.
pram: If the "Protected RAM" feature is enabled in your board's configuration, this variable can be
defined to enable the reservation of such "protected RAM", i. e. RAM which is not overwritten by
U-Boot. Define this variable to hold the number of kB you want to reserve for pRAM. Note that the
board info structure will still show the full amount of RAM. If pRAM is reserved, a new environment
variable "mem" will automatically be defined to hold the amount of remaining RAM in a form that
can be passed as boot argument to Linux, for instance like that:
=> setenv bootargs ${bootargs} mem=\${mem}
=> saveenv
This way you can tell Linux not to use this memory, either, which results in a memory region that will not be
affected by reboots.
serverip: TFTP server IP address; needed for tftp command.
serial#: contains hardware identification information such as type string and/or serial number.
This variable can be set only once (usually during manufacturing of the board). U-Boot refuses to
delete or overwrite this variable once it hass been set.
silent: If the configuration option CONFIG_SILENT_CONSOLE has been enabled for your board,
setting this variable to any value will suppress all console messages. Please see
doc/README.silent for details.
verify: If set to n or no disables the checksum calculation over the complete image in the bootm
command to trade speed for safety in the boot process. Note that the header checksum is still verified.
The following environment variables may be used and automatically updated by the network boot commands
(bootp, dhcp, or tftp), depending the information provided by your boot server:
bootfile: see above
dnsip: IP address of your Domain Name Server
gatewayip: IP address of the Gateway (Router) to use
hostname: Target hostname
5.10. U-Boot Environment Variables
82
To convert the text file into a script image for U-Boot, you have to use the mkimage tool as follows:
bash$ mkimage
Image Name:
Created:
Image Type:
Data Size:
Load Address:
Entry Point:
Contents:
Image 0:
bash$
1 kB = 0 MB
On the target, you can download this image as usual (for example, using the "tftp" command). Use the
"autoscr" command to execute it:
=> tftp 100000 /tftpboot/TQM860L/setenv.img
Using FEC ETHERNET device
TFTP from server 192.168.3.1; our IP address is 192.168.3.80
Filename '/tftpboot/TQM860L/setenv.img'.
Load address: 0x100000
83
Loading: #
done
Bytes transferred = 1211 (4bb hex)
=> imi 100000
## Checking Image at 00100000 ...
Image Name:
Demo Script File
Created:
2005-06-06 11:33:14 UTC
Image Type:
PowerPC Linux Script (uncompressed)
Data Size:
1147 Bytes = 1.1 kB
Load Address: 00000000
Entry Point: 00000000
Verifying Checksum ... OK
=> autoscr 100000
## Executing script at 00100000
===== U-Boot settings =====
===== Linux Kernel settings =====
===== Ramdisk settings =====
===== Save new definitions =====
Saving Environment to Flash...
Un-Protected 1 sectors
Un-Protected 1 sectors
Erasing Flash...
. done
Erased 1 sectors
Writing to Flash... done
Protected 1 sectors
Protected 1 sectors
=>
Hint: maximum flexibility can be achieved if you are using the Hush shell as command interpreter in
U-Boot; see section 14.2.17. How the Command Line Parsing Works
84
argv[0]
argv[1]
argv[2]
argv[3]
argv[4]
argv[5]
argv[6]
argv[7]
Hit any
= "40000"
= "Hello"
= "World!"
= "This"
= "is"
= "a"
= "test."
= ""
key to exit ...
Alternatively, you can of course use TFTP to download the image over the network. In this case the binary
image (hello_world.bin) is used.
=> tftp 40000 /tftpboot/hello_world.bin
...
=> go 40000 This is another test.
## Starting application at 0x00040000 ...
Hello World
argc = 5
argv[0] = "40000"
argv[1] = "This"
argv[2] = "is"
argv[3] = "another"
argv[4] = "test."
argv[5] = ""
Hit any key to exit ...
## Application terminated, rc = 0x0
=> loads
## Ready for S-Record download ...
~>examples/timer.srec
1 2 3 4 5 6 7 8 9 10 11 ...
[file transfer complete]
[connected]
## Start Addr = 0x00040000
=> go 40000
## Starting application at 0x00040000 ...
TIMERS=0xfff00980
Using timer 1
tgcr @ 0xfff00980, tmr @ 0xfff00990, trr @ 0xfff00994, tcr @ 0xfff00998, tcn @ 0xfff0099c, t
Hit 'b':
[q, b, e, ?] Set interval 1000000 us
Enabling timer
85
Hit '?':
[q, b, e,
tgcr=0x1,
Hit '?':
[q, b, e,
tgcr=0x1,
Hit '?':
[q, b, e,
tgcr=0x1,
Hit '?':
[q, b, e,
tgcr=0x1,
Hit 'e':
[q, b, e,
Hit 'q':
[q, b, e,
?] ........
tmr=0xff1c, trr=0x3d09, tcr=0x0, tcn=0xef6, ter=0x0
?] .
tmr=0xff1c, trr=0x3d09, tcr=0x0, tcn=0x2ad4, ter=0x0
?] .
tmr=0xff1c, trr=0x3d09, tcr=0x0, tcn=0x1efc, ter=0x0
?] .
tmr=0xff1c, trr=0x3d09, tcr=0x0, tcn=0x169d, ter=0x0
?] ...Stopping timer
?] ## Application terminated, rc = 0x0
IMG = $(BOARD)_standalone.img
IMG := $(addprefix $(obj),$(IMG))
$(IMG):
$(obj)%.img: $(BIN)
$(MKIMAGE) -n "Hello stand alone" -A ppc -O u-boot -T standalone -C none -a $(LOAD_ADDR) -d $(
With this preparatory step added to the Makefile, the previously given "Hello World" console output example
becomes
=> tftp 600000 helloworld.img
...
=> bootm 600000 Hello World! This is a test.
WARNING: adjusting available memory to 30000000
## Booting kernel from Legacy Image at 600000 ...
Image Name:
Hello stand alone
Image Type:
PowerPC U-Boot Standalone Program (uncompressed)
Data Size:
25391 Bytes = 24.8 KiB
Load Address: 00040000
Entry Point: 00040000
86
Of course, more is done by bootm in this example than is done by go in the original example. This additional
work requires additional time, which may, or may not, be significant in any particular situation.
87
Entry Point
Image Name
Image Timestamp
The header is marked by a special Magic Number, and both the header and the data portions of the image are
secured against corruption by CRC32 checksums.
88
The following command selects a standard configuration for the canyonlands board that has been extensively
tested. It is recommended to use this as a starting point for other, customized configurations:
bash$ make ARCH=powerpc CROSS_COMPILE=ppc_4xxFP- 44x/canyonlands_defconfig
config
or
bash$ make ARCH=powerpc CROSS_COMPILE=ppc_4xxFP-
menuconfig
Note: Because of problems (especially with some older Linux kernel versions) the use of "make xconfig"
is not recommended.
89
The make target uImage uses the tool mkimage (from the U-Boot package) to create a Linux kernel image in
arch/powerpc/boot/uImage
which is immediately usable for download and booting with U-Boot.
In case you need a DTB to boot your linux kernel, you need the following step:
bash$ make canyonlands.dtb
In case you configured modules you will also need to compile the modules:
make ARCH=powerpc CROSS_COMPILE=ppc_4xxFP- modules
add install the modules (make sure to pass the correct root path for module installation):
6.3. Installation
For now it is sufficient to copy the Linux kernel image into the directory used by your TFTP server:
bash$ cp arch/powerpc/boot/uImage /tftpboot/uImage
90
Bootloaders like U-Boot that do not implement the Open Firmware API, are expected to pass to the kernel a
binary form of the flattened device tree, commonly referred to as FDT blob or simply the blob.
Device trees are defined in human-readable text files, which are part of the Linux 2.6 source tree. Device tree
source for the canyonlands board is found in arch/powerpc/boot/dts/canyonlands.dts file.
Before the device tree can be passed to the kernel, it has to be compiled to the binary form by the dtc
compiler. The dtc compiler is included with the Linux kernel since 2.6.25. Since 2.6.26 there is also a simple
makefile rule to generate the blob:
make ARCH=powerpc CROSS_COMPILE=ppc_4xxFP- canyonlands.dtb
After the blob has been compiled, it has to be transferred from where it was built
("arch/powerpc/boot/canyonlands.dtb") to target's memory, for example over the TFTP
protocol using U-Boot's tftp command. Then, the blob is passed to the kernel by the bootm command, and
its address in memory is one of the arguments to bootm - refer to the description of this command in
UBootCmdGroupExec for more details.
Note that U-Boot makes some automatic modifications to the blob before passing it to the kernel - mainly
adding and modifying information that is learnt at run-time. See the board-specific function ft_board_setup()
and related routines.
U-Boot also has provisions to alter a flattened device tree in arbitrary ways from the command line, refer to
the description of the fdt commands found in UBootCmdFDT.
Notes:
Flattened Device Tree custodian's page at http://www.denx.de/wiki/U-Boot/UBootFdtInfo contains
useful information, and a number of references.
At the time of this writing (September 2007) blob handling is still a very fresh feature and undergoing
frequent changes. Reader is encouraged to watch the u-boot-users and linuxppc-dev mailing
lists for important news (required version of the dtc compiler, blob compilation options, flattened
device tree source file structure, etc.).
To boot the same kernel image with a root filesystem over NFS, the following command sequence can be
used. This example assumes that your NFS server has the IP address "192.168.1.1" and exports the directory
7.3. Passing Kernel Arguments
91
"/opt/eldk-4.2/ppc_4xx" as root filesystem for the target. The target has been assigned the IP address
"192.168.100.6" and the hostname "canyonlands". A netmask of "255.255.0.0" is used:
Then you can use these variables to build the boot arguments to be passed to the Linux kernel:
=> setenv nfsargs 'root=/dev/nfs rw nfsroot=${serverip}:${rootpath}'
Note how apostrophes are used to delay the substitution of the referenced environment variables. This way,
the current values of these variables get inserted when assigning values to the "bootargs" variable itself
later, i. e. when it gets assembled from the given parts before passing it to the kernel. This allows us to simply
redefine any of the variables (say, the value of "ipaddr" if it has to be changed), and the changes will
automatically propagate to the Linux kernel.
Note: You cannot use this method directly to define for example the "bootargs" environment variable,
as the implicit usage of this variable by the "bootm" command will not trigger variable expansion - this
7.4. Boot Arguments Unleashed
92
setenv
setenv
setenv
setenv
setenv
In this setup we define two variables, ram_root and nfs_root, to boot with root filesystem from a
ramdisk image or over NFS, respecively. The variables can be executed using U-Boot's run command. These
variables make use of the run command itself:
First, either run ramargs or run nfsargs is used to initialize the bootargs environment
variable as needed to boot with ramdisk image or with root over NFS.
Then, in both cases, run addip is used to append the ip parameter to use the Linux kernel IP
autoconfiguration mechanism for configuration of the network settings.
Finally, the bootm command is used with three resp. two address arguments %ENDIF0% to boot the
Linux kernel image with resp. without a ramdisk image. (We assume here that the variables
kernel_addr , ramdisk_addr and fdt_addr %ENDIF0% have already been set.)
This method can be easily extended to add more customization options when needed.
If you have used U-Boot's network commands before (and/or read the documentation), you will probably have
recognized that the names of the U-Boot environment variables we used in the examples above are exactly the
same as those used with the U-Boot commands to boot over a network using DHCP or BOOTP. That means
that, instead of manually setting network configuration parameters like IP address, etc., these variables will be
set automatically to the values retrieved with the network boot protocols. This is explained in detail in the
sections about the respective U-Boot commands.
93
ip=192.168.100.6:192.168.1.1:192.168.1.1:255.255.0.0:canyonlands::off:
the target has the IP address 192.168.100.6; the NFS server is 192.168.1.1; there is a
gateway at IP address 192.168.1.1; the netmask is 255.255.0.0 and our hostname is
canyonlands. The first ethernet interface (eth0) willbe used, and the Linux kernel will
immediately use this network configuration and not try to re-negotiate it (IP autoconfiguration is
off).
See Documentation/nfsroot.txt in you Linux kernel source directory for more information about these
parameters and other options.
7.5.1. Bootlog of tftp'd Linux kernel with Root Filesystem over NFS
94
* 0xfffef000..0xfffff000 : fixmap
* 0xffc00000..0xffe00000 : highmem PTEs
* 0xffa00000..0xffc00000 : consistent mem
* 0xffa00000..0xffa00000 : early ioremap
* 0xe1000000..0xffa00000 : vmalloc & ioremap
SLUB: Genslabs=11, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
Hierarchical RCU implementation.
NR_IRQS:512
UIC0 (32 IRQ sources) at DCR 0xc0
UIC1 (32 IRQ sources) at DCR 0xd0
UIC2 (32 IRQ sources) at DCR 0xe0
UIC3 (32 IRQ sources) at DCR 0xf0
clocksource: timebase mult[3c0000] shift[22] registered
Mount-cache hash table entries: 512
NET: Registered protocol family 16
256k L2-cache enabled
PCIE0: Port disabled via device-tree
PCIE1: Checking link...
PCIE1: No device detected.
PCI host bridge /plb/pciex@d20000000 (primary) ranges:
MEM 0x0000000e80000000..0x0000000effffffff -> 0x0000000080000000
MEM 0x0000000f00100000..0x0000000f001fffff -> 0x0000000000000000
IO 0x0000000f80010000..0x0000000f8001ffff -> 0x0000000000000000
Removing ISA hole at 0x0000000f00100000
4xx PCI DMA offset set to 0x00000000
/plb/pciex@d20000000: Legacy ISA memory support enabled
PCIE1: successfully set as root-complex
PCI host bridge /plb/pci@c0ec00000 (primary) ranges:
MEM 0x0000000d80000000..0x0000000dffffffff -> 0x0000000080000000
MEM 0x0000000c0ee00000..0x0000000c0eefffff -> 0x0000000000000000
IO 0x0000000c08000000..0x0000000c0800ffff -> 0x0000000000000000
Removing ISA hole at 0x0000000c0ee00000
4xx PCI DMA offset set to 0x00000000
/plb/pci@c0ec00000: Legacy ISA memory support enabled
PCI: Probing PCI hardware
PCI: Hiding 4xx host bridge resources 0000:80:00.0
pci 0000:80:00.0: PCI bridge, secondary bus 0000:81
pci 0000:80:00.0:
IO window: disabled
pci 0000:80:00.0:
MEM window: disabled
pci 0000:80:00.0:
PREFETCH window: disabled
bio: create slab <bio-0> at 0
vgaarb: loaded
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
Switching to clocksource timebase
NET: Registered protocol family 2
IP route cache hash table entries: 4096 (order: 2, 16384 bytes)
TCP established hash table entries: 16384 (order: 5, 131072 bytes)
TCP bind hash table entries: 16384 (order: 4, 65536 bytes)
TCP: Hash tables configured (established 16384 bind 16384)
TCP reno registered
NET: Registered protocol family 1
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
JFFS2 version 2.2. (NAND) 2001-2006 Red Hat, Inc.
msgmni has been set to 1006
io scheduler noop registered
io scheduler anticipatory registered (default)
io scheduler deadline registered
io scheduler cfq registered
Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
serial8250.0: ttyS0 at MMIO 0x4ef600300 (irq = 19) is a 16550A
console [ttyS0] enabled
serial8250.0: ttyS1 at MMIO 0x4ef600400 (irq = 20) is a 16550A
7.5.1. Bootlog of tftp'd Linux kernel with Root Filesystem over NFS
95
7.5.1. Bootlog of tftp'd Linux kernel with Root Filesystem over NFS
96
7.5.1. Bootlog of tftp'd Linux kernel with Root Filesystem over NFS
97
Starting
Starting
Starting
Mounting
Mounting
Starting
system logger: [ OK ]
kernel logger: [ OK ]
rpcbind: [ OK
]
NFS filesystems: [ OK ]
other filesystems: [
OK
xinetd: [ OK
]
Addresses:
FC020000
FC0C0000
FC160000
FC200000
FC2A0000
FC340000
FC3E0000
FC480000
FC520000
FC5C0000
FC660000
FC700000
FC7A0000
FC840000
FC8E0000
FC980000
FCA20000
FCAC0000
FCB60000
FCC00000
FCCA0000
FCD40000
FCDE0000
FCE80000
FCF20000
FCFC0000
FD060000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
FC040000
FC0E0000
FC180000
FC220000
FC2C0000
FC360000
FC400000
FC4A0000
FC540000
FC5E0000
FC680000
FC720000
FC7C0000
FC860000
FC900000
FC9A0000
FCA40000
FCAE0000
FCB80000
FCC20000
FCCC0000
FCD60000
FCE00000
FCEA0000
FCF40000
FCFE0000
FD080000
FC060000
FC080000
FC100000
FC120000
FC1A0000
FC1C0000 E
FC240000
FC260000
FC2E0000
FC300000
FC380000
FC3A0000
E
FC420000 E
FC440000
E
FC4C0000 E
FC4E0000
E
FC560000 E
FC580000
E
FC600000 E
FC620000
E
FC6A0000 E
FC6C0000
E
FC740000 E
FC760000
E
FC7E0000 E
FC800000
E
FC880000 E
FC8A0000
E
FC920000 E
FC940000
E
FC9C0000 E
FC9E0000
E
FCA60000 E
FCA80000
E
FCB00000 E
FCB20000
E
FCBA0000 E
FCBC0000
E
FCC40000 E
FCC60000
E
FCCE0000 E
FCD00000
E
FCD80000 E
FCDA0000
E
FCE20000 E
FCE40000
E
FCEC0000 E
FCEE0000
E
FCF60000 E
FCF80000
E
FD000000 E
FD020000
E
FD0A0000 E
FD0C0000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
98
FD0E0000
FD180000
FD220000
FD2C0000
FD360000
FD400000
FD4A0000
FD540000
FD5E0000
FD680000
FD720000
FD7C0000
FD860000
FD900000
FD9A0000
FDA40000
FDAE0000
FDB80000
FDC20000
FDCC0000
FDD60000
FDE00000
FDEA0000
FDF40000
FDFE0000
FE080000
FE120000
FE1C0000
FE260000
FE300000
FE3A0000
FE440000
FE4E0000
FE580000
FE620000
FE6C0000
FE760000
FE800000
FE8A0000
FE940000
FE9E0000
FEA80000
FEB20000
FEBC0000
FEC60000
FED00000
FEDA0000
FEE40000
FEEE0000
FEF80000
FF020000
FF0C0000
FF160000
FF200000
FF2A0000
FF340000
FF3E0000
FF480000
FF520000
FF5C0000
FF660000
FF700000
FF7A0000
FF840000
FF8E0000
FF980000
FFA20000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
FD100000
FD1A0000
FD240000
FD2E0000
FD380000
FD420000
FD4C0000
FD560000
FD600000
FD6A0000
FD740000
FD7E0000
FD880000
FD920000
FD9C0000
FDA60000
FDB00000
FDBA0000
FDC40000
FDCE0000
FDD80000
FDE20000
FDEC0000
FDF60000
FE000000
FE0A0000
FE140000
FE1E0000
FE280000
FE320000
FE3C0000
FE460000
FE500000
FE5A0000
FE640000
FE6E0000
FE780000
FE820000
FE8C0000
FE960000
FEA00000
FEAA0000
FEB40000
FEBE0000
FEC80000
FED20000
FEDC0000
FEE60000
FEF00000
FEFA0000
FF040000
FF0E0000
FF180000
FF220000
FF2C0000
FF360000
FF400000
FF4A0000
FF540000
FF5E0000
FF680000
FF720000
FF7C0000
FF860000
FF900000
FF9A0000
FFA40000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
FD120000
FD1C0000
FD260000
FD300000
FD3A0000
FD440000
FD4E0000
FD580000
FD620000 E
FD6C0000
FD760000
FD800000
FD8A0000
FD940000
FD9E0000
FDA80000
FDB20000
FDBC0000
FDC60000
FDD00000
FDDA0000
FDE40000
FDEE0000
FDF80000
FE020000
FE0C0000
FE160000
FE200000
FE2A0000
FE340000
FE3E0000
FE480000
FE520000
FE5C0000
FE660000
FE700000
FE7A0000
FE840000
FE8E0000
FE980000
FEA20000
FEAC0000
FEB60000
FEC00000
FECA0000
FED40000
FEDE0000
FEE80000
FEF20000
FEFC0000
FF060000
FF100000
FF1A0000
FF240000
FF2E0000
FF380000
FF420000
FF4C0000
FF560000
FF600000
FF6A0000
FF740000
FF7E0000
FF880000
FF920000
FF9C0000
FFA60000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
FD140000
FD1E0000
FD280000
FD320000
FD3C0000
FD460000
FD500000
FD5A0000
FD640000 E
FD6E0000
FD780000
FD820000
FD8C0000
FD960000
FDA00000
FDAA0000
FDB40000
FDBE0000
FDC80000
FDD20000
FDDC0000
FDE60000
FDF00000
FDFA0000
FE040000
FE0E0000
FE180000
FE220000
FE2C0000
FE360000
FE400000
FE4A0000
FE540000
FE5E0000
FE680000
FE720000
FE7C0000
FE860000
FE900000
FE9A0000
FEA40000
FEAE0000
FEB80000
FEC20000
FECC0000
FED60000
FEE00000
FEEA0000
FEF40000
FEFE0000
FF080000
FF120000
FF1C0000
FF260000
FF300000
FF3A0000
FF440000
FF4E0000
FF580000
FF620000
FF6C0000
FF760000
FF800000
FF8A0000
FF940000
FF9E0000
FFA80000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
FD160000
FD200000
FD2A0000
FD340000
FD3E0000
FD480000
FD520000
FD5C0000
FD660000 E
FD700000
FD7A0000
FD840000
FD8E0000
FD980000
FDA20000
FDAC0000
FDB60000
FDC00000
FDCA0000
FDD40000
FDDE0000
FDE80000
FDF20000
FDFC0000
FE060000
FE100000
FE1A0000
FE240000
FE2E0000
FE380000
FE420000
FE4C0000
FE560000
FE600000
FE6A0000
FE740000
FE7E0000
FE880000
FE920000
FE9C0000
FEA60000
FEB00000
FEBA0000
FEC40000
FECE0000
FED80000
FEE20000
FEEC0000
FEF60000
FF000000
FF0A0000
FF140000
FF1E0000
FF280000
FF320000
FF3C0000
FF460000
FF500000
FF5A0000
FF640000
FF6E0000
FF780000
FF820000
FF8C0000
FF960000
FFA00000
FFAA0000
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
99
FFAC0000
FFB60000
FFC00000
FFCA0000
FFD40000
FFDE0000
FFE80000
FFF20000
FFFC0000
=>
E
E
E
E
E
E
E
E
RO
FFAE0000 E
FFB80000 E
FFC20000 E
FFCC0000 E
FFD60000 E
FFE00000 E
FFEA0000 E
FFF40000 E
FFFE0000
FFB00000
FFBA0000
FFC40000
FFCE0000
FFD80000
FFE20000
FFEC0000
FFF60000
RO
E
E
E
E
E
E
E
RO
FFB20000 E
FFBC0000 E
FFC60000 E
FFD00000 E
FFDA0000 E
FFE40000 E
FFEE0000 E
FFF80000
FFB40000 E
FFBE0000 E
FFC80000 E
FFD20000 E
FFDC0000 E
FFE60000 E
FFF00000 E
RO
FFFA0000
RO
From this output you can see the total amount of flash memory, and how it is divided in blocks (Erase Units
or Sectors). The RO markers show blocks of flash memory that are write protected (by software) - this is the
area where U-Boot is stored. The remaining flash memory is available for other use.
For instance, we can store the Linux kernel image in flash starting at the start address of the next free flash
sector. Before we can do this we must make sure that the flash memory in that region is empty - a Linux
kernel image is typically around 600...700 kB, so to be on the safe side we dedicate the whole area from
0xFC000000 to 0xFC17FFFF for the kernel image. Keep in mind that with flash memory only whole erase
units can be cleared.
After having deleted the target flash area, you can download the Linux image and write it to flash. Below is a
transcript of the complete operation with a final iminfo command to check the newly placed Linux kernel
image in the flash memory.
=>
=> setenv kernel_addr FC000000
=>
=> prot off FC000000 FC17FFFF
Un-Protected 12 sectors
=>
=> era FC000000 FC17FFFF
............ done
Erased 12 sectors
=>
=> tftp 100000 /tftpboot/canyonlands/uImage-duts
ENET Speed is 1000 Mbps - FULL duplex connection (EMAC0)
Using ppc_4xx_eth0 device
TFTP from server 192.168.1.1; our IP address is 192.168.100.6
Filename '/tftpboot/canyonlands/uImage-duts'.
Load address: 0x100000
Loading: * #################################################################
######################################################
done
Bytes transferred = 1744326 (1a9dc6 hex)
=>
=> imi 100000
## Checking Image at 00100000 ...
Legacy image found
Image Name:
Linux-2.6.25-rc8-01016-g94bf13bCreated:
2008-04-10
9:50:08 UTC
Image Type:
PowerPC Linux Kernel Image (gzip compressed)
Data Size:
1744262 Bytes = 1.7 MB
Load Address: 00000000
Entry Point: 00000000
Verifying Checksum ... OK
=>
=> setenv ram_ws 100000
=>
=> cp.b ${ram_ws} ${kernel_addr} ${filesize}
Copy to Flash... done
100
=>
=> iminfo ${kernel_addr}
## Checking Image at fc000000 ...
Legacy image found
Image Name:
Linux-2.6.25-rc8-01016-g94bf13bCreated:
2008-04-10
9:50:08 UTC
Image Type:
PowerPC Linux Kernel Image (gzip compressed)
Data Size:
1744262 Bytes = 1.7 MB
Load Address: 00000000
Entry Point: 00000000
Verifying Checksum ... OK
=>
=> saveenv
Saving Environment to Flash...
Un-Protected 1 sectors
Un-Protected 1 sectors
Erasing Flash...
. done
Erased 1 sectors
Writing to Flash... done
Protected 1 sectors
Protected 1 sectors
=>
Note how the filesize variable (which gets set by the TFTP transfer) is used to automatically adjust for
the actual image size.
Since kernel requires the flattened device tree blob to be passed at boot time, you have to also write the blob
to the flash memory. Below is a transcript of this operation.
=>
=> setenv fdt_addr FC1E0000
=>
=> prot off FC1E0000 FC1FFFFF
Un-Protected 1 sectors
=>
=> era FC1E0000 FC1FFFFF
. done
Erased 1 sectors
=>
=> tftp 100000 /tftpboot/canyonlands/canyonlands.dtb
Waiting for PHY auto negotiation to complete... done
ENET Speed is 1000 Mbps - FULL duplex connection (EMAC0)
Using ppc_4xx_eth0 device
TFTP from server 192.168.1.1; our IP address is 192.168.100.6
Filename '/tftpboot/canyonlands/canyonlands.dtb'.
Load address: 0x100000
Loading: * T #
done
Bytes transferred = 10000 (2710 hex)
=>
=> md 100000
00100000: d00dfeed 00002710 000000b8 00001b08
......'.........
00100010: 00000028 00000011 00000010 00000000
...(............
00100020: 000002f5 00001a50 00000000 00000000
.......P........
00100030: 00000000 00000000 00000000 00000000
................
00100040: 00000000 00000000 00000000 00000000
................
00100050: 00000000 00000000 00000000 00000000
................
00100060: 00000000 00000000 00000000 00000000
................
00100070: 00000000 00000000 00000000 00000000
................
00100080: 00000000 00000000 00000000 00000000
................
00100090: 00000000 00000000 00000000 00000000
................
101
................
................
................
................
............amcc
,canyonlands....
......'.........
...(............
.......P........
................
................
................
................
................
................
................
................
................
................
................
............amcc
,canyonlands....
Now we can boot directly from flash. All we need to do is passing the in-flash address of the image
(FC000000) and the in-flash address of the flattened device tree (FC1E0000) with the bootm command; we
also make the definition of the bootargs variable permanent now:
Use printenv to verify that everything is OK before you save the environment settings:
=> printenv
bootdelay=5
baudrate=115200
stdin=serial
stdout=serial
stderr=serial
bootcmd=bootm FC000000 - FC1E0000
bootargs=root=/dev/nfs rw nfsroot=192.168.1.1:/opt/eldk-4.2/ppc_4xx
ip=192.168.100.6:192.168.1.1:192.168.1.1:255.255.0.0:canyonlands::off
....
=> saveenv
102
To test booting from flash you can now reset the board (either by power-cycling it, or using the U-Boot
command reset), or you can manually call the boot command which will run the commands in the
bootcmd variable:
103
104
0x000000000000-0x0000001e0000 : "kernel"
0x0000001e0000-0x000000200000 : "dtb"
0x000000200000-0x000001600000 : "ramdisk"
0x000001600000-0x000001a00000 : "jffs2"
0x000001a00000-0x000003f60000 : "user"
0x000003f60000-0x000003fa0000 : "env"
0x000003fa0000-0x000004000000 : "u-boot"
NAND device: Manufacturer ID: 0x20, Chip ID: 0xf1 (ST Micro NAND 128MiB 3,3V 8-bit)
Scanning device for bad blocks
Creating 2 MTD partitions on "4e0000000.ndfc.nand":
0x000000000000-0x000000100000 : "u-boot"
0x000000000000-0x000003f00000 : "user"
e1000e: Intel(R) PRO/1000 Network Driver - 1.0.2-k2
e1000e: Copyright (c) 1999-2008 Intel Corporation.
PPC 4xx OCP EMAC driver, version 3.54
MAL v2 /plb/mcmal, 2 TX channels, 16 RX channels
ZMII /plb/opb/emac-zmii@ef600d00 initialized
RGMII /plb/opb/emac-rgmii@ef601500 initialized with MDIO support
TAH /plb/opb/emac-tah@ef601350 initialized
TAH /plb/opb/emac-tah@ef601450 initialized
/plb/opb/emac-rgmii@ef601500: input 0 in RGMII mode
eth0: EMAC-0 /plb/opb/ethernet@ef600e00, MAC 00:10:ec:01:08:84
eth0: found Generic MII PHY (0x00)
/plb/opb/emac-rgmii@ef601500: input 1 in RGMII mode
eth1: EMAC-1 /plb/opb/ethernet@ef600f00, MAC 00:10:ec:81:08:84
eth1: found Generic MII PHY (0x01)
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
ppc-of-ehci 4bffd0400.ehci: OF EHCI
ppc-of-ehci 4bffd0400.ehci: new USB bus registered, assigned bus number 1
ppc-of-ehci 4bffd0400.ehci: irq 38, io mem 0x4bffd0400
ppc-of-ehci 4bffd0400.ehci: USB 2.0 started, EHCI 1.00
usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
usb usb1: Product: OF EHCI
usb usb1: Manufacturer: Linux 2.6.32.7-00007-g08eba26 ehci_hcd
usb usb1: SerialNumber: PPC-OF USB
usb usb1: configuration #1 chosen from 1 choice
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 1 port detected
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
ppc-of-ohci 4bffd0000.usb: OF OHCI
ppc-of-ohci 4bffd0000.usb: new USB bus registered, assigned bus number 2
ppc-of-ohci 4bffd0000.usb: irq 39, io mem 0x4bffd0000
usb usb2: New USB device found, idVendor=1d6b, idProduct=0001
usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
usb usb2: Product: OF OHCI
usb usb2: Manufacturer: Linux 2.6.32.7-00007-g08eba26 ohci_hcd
usb usb2: SerialNumber: PPC-OF USB
usb usb2: configuration #1 chosen from 1 choice
hub 2-0:1.0: USB hub found
hub 2-0:1.0: 1 port detected
Initializing USB Mass Storage driver...
usbcore: registered new interface driver usb-storage
USB Mass Storage support registered.
usbcore: registered new interface driver libusual
dwc_otg: version 2.60a 22-NOV-2006
dwc_otg: Shared Tx FIFO mode
dwc_otg: Using DMA mode
dwc_otg dwc_otg.0: DWC OTG Controller
dwc_otg dwc_otg.0: new USB bus registered, assigned bus number 3
dwc_otg dwc_otg.0: irq 28, io mem 0x00000000
dwc_otg: Init: Port Power? op_state=4
usb usb3: New USB device found, idVendor=1d6b, idProduct=0002
usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1
usb usb3: Product: DWC OTG Controller
usb usb3: Manufacturer: Linux 2.6.32.7-00007-g08eba26 dwc_otg_hcd
usb usb3: SerialNumber: dwc_otg.0
105
~ #
106
Loading: #################################################################
#####################################################
done
Bytes transferred = 1728001 (1a5e01 hex)
=> iminfo ${ram_ws}
## Checking Image at 00100000 ...
Legacy image found
Image Name:
Simple Embedded Linux Framework
Created:
2008-04-01 19:52:43 UTC
Image Type:
PowerPC Linux RAMDisk Image (gzip compressed)
Data Size:
1727937 Bytes = 1.6 MB
Load Address: 00000000
Entry Point:
00000000
Verifying Checksum ... OK
=> cp.b ${ram_ws} ${ramdisk_addr} ${filesize}
Copy to Flash... done
=> iminfo ${ramdisk_addr}
## Checking Image at fc200000 ...
Legacy image found
Image Name:
Simple Embedded Linux Framework
Created:
2008-04-01 19:52:43 UTC
Image Type:
PowerPC Linux RAMDisk Image (gzip compressed)
Data Size:
1727937 Bytes = 1.6 MB
Load Address: 00000000
Entry Point:
00000000
Verifying Checksum ... OK
=> setenv ram_ws
=> saveenv
Saving Environment to Flash...
Un-Protected 1 sectors
Un-Protected 1 sectors
Erasing Flash...
. done
Erased 1 sectors
Writing to Flash... done
Protected 1 sectors
Protected 1 sectors
=>
To tell the Linux kernel to use the ramdisk image as root filesystem you have to modify the command line
arguments passed to the kernel, and pass ramdisk image address as the second argument to the bootm
command (first argument is the memory address of the Linux kernel image, the third one is the memory
address of the flattened device tree blob):
=> run flash_self
## Booting kernel from Legacy Image at fc000000 ...
Image Name:
Linux-2.6.32.7-00007-g08eba26
Created:
2010-02-04 17:54:22 UTC
Image Type:
PowerPC Linux Kernel Image (gzip compressed)
Data Size:
1958545 Bytes = 1.9 MB
Load Address: 00000000
Entry Point:
00000000
Verifying Checksum ... OK
## Loading init Ramdisk from Legacy Image at fc200000 ...
Image Name:
Simple Embedded Linux Framework
Created:
2008-04-01 19:52:43 UTC
Image Type:
PowerPC Linux RAMDisk Image (gzip compressed)
Data Size:
1727937 Bytes = 1.6 MB
Load Address: 00000000
Entry Point:
00000000
Verifying Checksum ... OK
## Flattened Device Tree blob at fc1e0000
Booting using the fdt blob at 0xfc1e0000
Uncompressing Kernel Image ... OK
107
108
109
110
~ #
9. Advanced Topics
This section lists some advanced topics of interest to users of U-Boot and Linux.
111
Note: this configuration uses CFI conformant AMD flash chips; you may need to adjust these settings on
other boards.
The partition layout of the flash devices is contained in the flat device tree for the system (see 13.1. Flat
Device Tree).
Informational messages of the MTD subsystem can be found in the Linux bootlog, i.e. see section 7.5.1.
Bootlog of tftp'd Linux kernel with Root Filesystem over NFS.
One can discover this information in a running system using the proc filesystem:
-bash-3.2# cat /proc/mtd
dev:
size
erasesize name
mtd0: 001e0000 00020000 "kernel"
mtd1: 00020000 00020000 "dtb"
mtd2: 01400000 00020000 "ramdisk"
mtd3: 00400000 00020000 "jffs2"
mtd4: 02560000 00020000 "user"
mtd5: 00040000 00020000 "env"
mtd6: 00060000 00020000 "u-boot"
mtd7: 00100000 00020000 "u-boot"
mtd8: 03f00000 00020000 "user"
-bash-3.2#
Now we can run some basic tests to verify that the flash driver routines and the partitioning works as
expected:
-bash-3.2# xxd /dev/mtd3 | head -4
0000000: ffff ffff ffff ffff ffff ffff
0000010: ffff ffff ffff ffff ffff ffff
0000020: ffff ffff ffff ffff ffff ffff
0000030: ffff ffff ffff ffff ffff ffff
-bash-3.2#
ffff
ffff
ffff
ffff
ffff
ffff
ffff
ffff
................
................
................
................
In the hex-dumps of the MTD devices you can identify some strings that verify that we indeed see an U-Boot
environment, a Linux kernel, a ramdisk image and an empty partition to play wih.
The last output shows the partition to be empty. We can try write some data into it:
-bash-3.2# date > /tmp/tempfile
-bash-3.2# dd if=/dev/zero of=/tmp/tempfile bs=1 count=4096 seek=50
4096+0 records in
4096+0 records out
4096 bytes (4.1 kB) copied, 0.0107987 s, 379 kB/s
-bash-3.2# dd if=/tmp/tempfile of=/dev/mtd3 bs=4096 count=1
112
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 0.0179843 s, 228 kB/s
-bash-3.2# head -1 /dev/mtd3
Mon Feb
8 16:36:04 CET 2010
-bash-3.2# dd if=/tmp/tempfile of=/dev/mtd3 bs=4096 count=1
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 0.0179315 s, 228 kB/s
-bash-3.2#
As you can see it worked the first time. When we tried to write the (new date) again, we got an error. The
reason is that the date has changed (probably at least the seconds) and flash memory cannot be simply
overwritten - it has to be erased first.
You can use the eraseall Linux commands to erase a whole MTD partition:
-bash-3.2# flash_eraseall /dev/mtd3
Erasing 128 Kibyte @ 0 -- 0 % complete.Erasing 128 Kibyte @ 20000 --bash-3.2# date > /tmp/tempfile
-bash-3.2# dd if=/dev/zero of=/tmp/tempfile bs=1 count=4096 seek=50
4096+0 records in
4096+0 records out
4096 bytes (4.1 kB) copied, 0.01086 s, 377 kB/s
-bash-3.2# dd if=/tmp/tempfile of=/dev/mtd3 bs=4096 count=1
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 0.0180026 s, 228 kB/s
-bash-3.2# head -1 /dev/mtd3
Mon Feb
8 16:35:35 CET 2010
-bash-3.2#
3 % complete.Erasing 128 K
We have now sufficient proof that the MTD layer is working as expected, so we can try creating a flash
filesystem.
If the flash device is erased, we can simply mount it, and the creation of the JFFS filesystem is performed
automagically.
Note: For simple accesses like direct read or write operations or erasing you use the character device
interface (/dev/mtd*) of the MTD layer, while for filesystem operations like mounting we must use the block
device interface (/dev/mtdblock*).
# eraseall /dev/mtd2
Erased 4096 Kibyte @ 0 -- 100% complete.
# mount -t jffs /dev/mtdblock2 /mnt
# mount
/dev/root on / type nfs (rw,v2,rsize=4096,wsize=4096,hard,udp,nolock,addr=10.0.0.2)
proc on /proc type proc (rw)
devpts on /dev/pts type devpts (rw)
/dev/mtdblock2 on /mnt type jffs (rw)
# df
113
Filesystem
/dev/root
/dev/mtdblock2
1k-blocks
2087212
3584
Now you can access the files in the JFFS filesystem in the /mnt directory.
Note: Especially when you are running time-critical applications on your system you should carefully
study if the behaviour of the flash filesystem might have any negative impact on your application. After all, a
flash device is not a normal harddisk. This is especially important when your flash filesystem gets full; JFFS2
acts a bit weird then:
You will note that an increasing amount of CPU time is spent by the filesystem's garbage collection
kernel thread.
Access times to the files on the flash filesystem may increase drastically.
Attempts to truncate a file (to free space) or to rename it may fail:
...
# cp /bin/bash file
cp: writing `file': No space left on device
# >file
bash: file: No space left on device
# mv file foo
mv: cannot create regular file `foo': No space left on device
114
As you can see, the CramFs image test.cramfs.img takes just 24 kB, while the input directory contained 64 kB
of data. Savings of some 60% like in this case are typical CramFs.
Now we write the CramFs image to a partition in flash and test it:
# cp test.cramfs.img /dev/mtd3
# mount -t cramfs /dev/mtdblock3 /mnt
# mount
115
Note that all the timestamps in the CramFs filesyste are bogus, and so is for instance the output of the df
command for such filesystems:
# df /mnt
Filesystem
/dev/mtdblock3
1k-blocks
0
116
These options do not have any effect on remount. You can change these parameters with chmod(1),
chown(1) and chgrp(1) on a mounted filesystem.
So the following mount command will give you a tmpfs instance on /mytmpfs which can allocate 12MB of
RAM/SWAP and it is only accessible by root.
mount -t tmpfs -o size=12M,mode=700 tmpfs /mytmpfs
The commented out sections will of course fail on a read-only root filesystem, so you have to create the
/tmpfs mount-point and the symbolic links in your root filesystem beforehand in order to successfully use
this setup.
Then, to activate it, you use the swapon command like this:
117
# free
total
used
free
shared
Mem:
14628
14060
568
8056
-/+ buffers/cache:
2296
12332
Swap:
0
0
0
# free
total
used
free
shared
Mem:
14628
14060
568
8056
-/+ buffers/cache:
2296
12332
Swap:
0
0
0
# swapon /dev/hda3
Adding Swap: 66016k swap-space (priority -2)
# free
total
used
free
shared
Mem:
14628
14084
544
8056
-/+ buffers/cache:
2336
12292
Swap:
66016
0
66016
buffers
100
cached
11664
buffers
100
cached
11664
buffers
100
cached
11648
If you forgot to reserve (sufficient) space in a separate partition on your disk, you can still use an ordinary file
for swap space. You only have to create a file of appropriate size, and initialize it as follows:
# mount /dev/hda4 /mnt
# df
Filesystem
1k-blocks
Used Available Use% Mounted on
/dev/root
2087212
1378824
708388 67% /
/dev/hda4
711352
20
675196
1% /mnt
# dd if=/dev/zero of=/mnt/swapfile bs=1024k count=64
64+0 records in
64+0 records out
# mkswap /mnt/swapfile
Setting up swapspace version 1, size = 67104768 bytes
buffers
96
cached
11788
buffers
96
cached
11752
118
Linux manages its own colormap, and we considered it too much effort to keep the same settings as
used by U-Boot. Instead we use the "trick" that U-Boot will fill the color map table backwards (top
down). This works pretty well for images which use no more than 200...225 colors. If the images uses
more colors, a bad color mapping may result.
We strongly recommend to convert all images that will be loaded as Linux splash screens to use no
more than 225 colors. The "ppmquant" tool can be used for this purpose (see Bitmap Support in
U-Boot for details).
Usually there will be a Linux device driver that is used to adjust the brightness and contrast of the
display. When this driver starts, a visible change of brightness will happen if the default settings as
used by U-Boot differ.
We recommend to store settings of brightness and contrast in U-Boot environment variables that
can be shared between U-Boot and Linux. This way it is possible (assuming adequate driver support)
to adjust the display settings correctly already in U-Boot and thus to avoid any flicker of the display
when Linux takes over control.
119
3. Create tarball; to avoid the need for root permissions in the following steps we don't include the
device files in our tarball:
bash# cd /mnt/tmp
bash# tar -zc --exclude='dev/*' -f /tmp/rootfs.tar.gz *
4. Instead, we create a separate tarball which contains only the device entries so we can use them when
necessary (with cramfs):
bash# tar -zcf /tmp/devices.tar.gz dev/
bash# cd /tmp
We will use the /tmp/rootfs.tar.gz tarball as master file in all following experiments.
120
2. We use the genext2fs tool to create the ramdisk image as this allows to use a simple text file to
describe which devices shall be created in the generated file system image. That means that no root
permissions are required at all. We use the following device table rootfs_devices.tab:
#<name>
<type> <mode> <uid> <gid> <major> <minor> <start>
/dev
d 755 0
0
/dev/console
c 640 0
0
5
1
/dev/fb0
c 640 0
0
29
0
/dev/full
c 640 0
0
1
7
/dev/hda
b 640 0
0
3
0
/dev/hda
b 640 0
0
3
1
1
/dev/kmem
c 640 0
0
1
2
/dev/mem
c 640 0
0
1
1
/dev/mtd
c 640 0
0
90
0
0
/dev/mtdblock
b 640 0
0
31
0
0
/dev/mtdr
c 640 0
0
90
1
0
/dev/nftla
b 640 0
0
93
0
/dev/nftla
b 640 0
0
93
1
1
/dev/nftlb
b 640 0
0
93
16
/dev/nftlb
b 640 0
0
93
17
1
/dev/null
c 640 0
0
1
3
/dev/ptyp
c 640 0
0
2
0
0
/dev/ptypa
c 640 0
0
2
10
/dev/ptypb
c 640 0
0
2
11
/dev/ptypc
c 640 0
0
2
12
/dev/ptypd
c 640 0
0
2
13
/dev/ptype
c 640 0
0
2
14
/dev/ptypf
c 640 0
0
2
15
/dev/ram
b 640 0
0
1
0
0
/dev/ram
b 640 0
0
1
1
/dev/rtc
c 640 0
0
10
135
/dev/tty
c 640 0
0
4
0
0
/dev/tty
c 640 0
0
5
0
/dev/ttyS
c 640 0
0
4
64
0
/dev/ttyp
c 640 0
0
3
0
0
/dev/ttypa
c 640 0
0
3
10
/dev/ttypb
c 640 0
0
3
11
/dev/ttypc
c 640 0
0
3
12
/dev/ttypd
c 640 0
0
3
13
/dev/ttype
c 640 0
0
3
14
/dev/ttypf
c 640 0
0
3
15
/dev/zero
c 640 0
0
1
5
-
<inc>
1
2
1
2
1
1
1
1
1
1
1
-
<count>
16
16
16
16
8
8
10
2
4
8
10
-
A description of the format of this table is part of the manual page for the genext2fs tool,
genext2fs(8).
3. We can now create an ext2 file system image using the genext2fs tool:
$
$
$
$
$
$
ROOTFS_DIR=rootfs
ROOTFS_SIZE=3700
ROOTFS_FREE=100
ROOTFS_INODES=380
ROOTFS_DEVICES=rootfs_devices.tab
ROOTFS_IMAGE=ramdisk.img
#
#
#
#
#
#
$ genext2fs -U \
-d ${ROOTFS_DIR} \
-D ${ROOTFS_DEVICES} \
-b ${ROOTFS_SIZE} \
-r ${ROOTFS_FREE} \
-i ${ROOTFS_INODES} \
${ROOTFS_IMAGE}
121
We now have a root file system image uRamdisk that can be used with U-Boot.
2. We can now create a JFFS2 file system image using the mkfs.jffs2 tool:
$
$
$
$
ROOTFS_DIR=rootfs
ROOTFS_EBSIZE=0x20000
ROOTFS_ENDIAN=b
ROOTFS_DEVICES=rootfs_devices.tab
#
#
#
#
122
$ ROOTFS_IMAGE=jffs2.img
$ mkfs.jffs2 -U \
-d ${ROOTFS_DIR} \
-D ${ROOTFS_DEVICES} \
-${ROOTFS_ENDIAN} \
-e ${ROOTFS_EBSIZE} \
-o ${ROOTFS_IMAGE}
mkfs.jffs2: skipping device_table entry '/dev': no parent directory!
Note: When you intend to write the JFFS2 file system image to a NAND flash device, you should also
add the "-n" (or "--no-cleanmarkers") option, as cleanmarkers are not needed then.
When booting the Linux kernel prints the following messages showing the default partition map which is used
for the flash memory on the TQM8xxL boards:
TQM flash bank 0: Using static image partition definition
Creating 7 MTD partitions on "TQM8xxL0":
0x00000000-0x00040000 : "u-boot"
0x00040000-0x00100000 : "kernel"
0x00100000-0x00200000 : "user"
0x00200000-0x00400000 : "initrd"
0x00400000-0x00600000 : "cramfs"
0x00600000-0x00800000 : "jffs"
0x00400000-0x00800000 : "big_fs"
We use U-Boot to load and store the JFFS2 image into the last partition and set up the Linux boot arguments
to use this as root device:
1. Erase flash:
=> era 40400000 407FFFFF
................. done
Erased 35 sectors
123
124
1. Create a directory tree with the content of the target root filesystem. We do this by unpacking our
master tarball:
$ mkdir rootfs
$ cd rootfs
$ tar -zxf /tmp/rootfs.tar.gz
2. Create the required device files. We do this here by unpacking a special tarball which holds only the
device file entries.
Note: this requires root permissions!
# cd rootfs
# tar -zxf /tmp/devices.tar.gz
3. Many tools require some storage place in a filesystem, so we must provide at least one (small)
writable filesystem. For all data which may be lost when the system goes down, a "tmpfs"
filesystem is the optimal choice. To create such a writable tmpfs filesystem we add the following lines
to the /etc/rc.sh script:
# mount TMPFS because root-fs is readonly
/bin/mount -t tmpfs -o size=2M tmpfs /tmpfs
Some tools require write permissions on some device nodes (for example, to change ownership and
permissions), or dynamically (re-) create such files (for example, /dev/log which is usually a Unix
Domain socket). The files are placed in a writable filesystem; in the root filesystem symbolic links are
used to point to their new locations:
dev/ptyp0
/tmpfs/dev/ptyp0
dev/ptyp1
/tmpfs/dev/ptyp1
dev/ptyp2
/tmpfs/dev/ptyp2
dev/ptyp3
/tmpfs/dev/ptyp3
dev/ptyp4
/tmpfs/dev/ptyp4
dev/ptyp5
/tmpfs/dev/ptyp5
dev/ptyp6
/tmpfs/dev/ptyp6
dev/ptyp7
/tmpfs/dev/ptyp7
dev/ptyp8
/tmpfs/dev/ptyp8
dev/ptyp9
/tmpfs/dev/ptyp9
dev/ptypa
/tmpfs/dev/ptypa
dev/ptypb
/tmpfs/dev/ptypb
dev/ptypc
/tmpfs/dev/ptypc
dev/ptypd
/tmpfs/dev/ptypd
dev/ptype
/tmpfs/dev/ptype
dev/ptypf
/tmpfs/dev/ptypf
tmp
/tmpfs/tmp
dev/log
/var/log/log
In case you use dhclient also:
etc/dhclient.conf /tmpfs/var/lib/dhclient.conf
dev/ttyp0
dev/ttyp1
dev/ttyp2
dev/ttyp3
dev/ttyp4
dev/ttyp5
dev/ttyp6
dev/ttyp7
dev/ttyp8
dev/ttyp9
dev/ttypa
dev/ttypb
dev/ttypc
dev/ttypd
dev/ttype
dev/ttypf
var
/tmpfs/dev/ttyp0
/tmpfs/dev/ttyp1
/tmpfs/dev/ttyp2
/tmpfs/dev/ttyp3
/tmpfs/dev/ttyp4
/tmpfs/dev/ttyp5
/tmpfs/dev/ttyp6
/tmpfs/dev/ttyp7
/tmpfs/dev/ttyp8
/tmpfs/dev/ttyp9
/tmpfs/dev/ttypa
/tmpfs/dev/ttypb
/tmpfs/dev/ttypc
/tmpfs/dev/ttypd
/tmpfs/dev/ttype
/tmpfs/dev/ttypf
/tmpfs/var
etc/resolv.conf /tmpfs/var/lib/resolv.conf
To place the corresponding directories and device files in the tmpfs file system, the following code
is added to the /etc/rc.sh script:
mkdir -p /tmpfs/tmp /tmpfs/dev \
/tmpfs/var/lib/dhcp /tmpfs/var/lock /tmpfs/var/run
while read name minor
do
mknod /tmpfs/dev/ptyp$name c 2 $minor
125
4. We can now create a cramfs file system image using the mkcramfs tool:
$ ROOTFS_DIR=rootfs
$ ROOTFS_ENDIAN="-r"
$ ROOTFS_IMAGE=cramfs.img
PATH=/opt/eldk/usr/bin:$PATH
mkcramfs ${ROOTFS_ENDIAN} ${DEVICES} ${ROOTFS_DIR} ${ROOTFS_IMAGE}
Swapping filesystem endian-ness
bin
dev
etc
...
-48.78% (-86348 bytes) in.ftpd
-46.02% (-16280 bytes) in.telnetd
-45.31% (-74444 bytes) xinetd
Everything: 1864 kilobytes
Super block: 76 bytes
CRC: c166be6d
warning: gids truncated to 8 bits. (This may be a security concern.)
5. We can use the same setup as before for the JFFS2 filesystem, just changing the bootargument to
"rootfstype=cramfs"
126
Disadvantages:
high flash memory footprint because no compression
To create an ext2 image that can be used as a read-only root file system the following steps are necessary:
1. Create a directory tree with the content of the target root filesystem. We do this by unpacking our
master tarball:
$ mkdir rootfs
$ cd rootfs
$ tar -zxf /tmp/rootfs.tar.gz
2. Like with the cramfs root file system, we use "tmpfs" for cases where a writable file system is
needed and add the following lines to the /etc/rc.sh script:
# mount TMPFS because root-fs is readonly
/bin/mount -t tmpfs -o size=2M tmpfs /tmpfs
We also create the same symbolic links for device files that must be placed in a writable filesystem:
dev/ptyp0
/tmpfs/dev/ptyp0
dev/ptyp1
/tmpfs/dev/ptyp1
dev/ptyp2
/tmpfs/dev/ptyp2
dev/ptyp3
/tmpfs/dev/ptyp3
dev/ptyp4
/tmpfs/dev/ptyp4
dev/ptyp5
/tmpfs/dev/ptyp5
dev/ptyp6
/tmpfs/dev/ptyp6
dev/ptyp7
/tmpfs/dev/ptyp7
dev/ptyp8
/tmpfs/dev/ptyp8
dev/ptyp9
/tmpfs/dev/ptyp9
dev/ptypa
/tmpfs/dev/ptypa
dev/ptypb
/tmpfs/dev/ptypb
dev/ptypc
/tmpfs/dev/ptypc
dev/ptypd
/tmpfs/dev/ptypd
dev/ptype
/tmpfs/dev/ptype
dev/ptypf
/tmpfs/dev/ptypf
tmp
/tmpfs/tmp
dev/log
/var/log/log
In case you use dhclient also:
etc/dhclient.conf /tmpfs/var/lib/dhclient.conf
dev/ttyp0
dev/ttyp1
dev/ttyp2
dev/ttyp3
dev/ttyp4
dev/ttyp5
dev/ttyp6
dev/ttyp7
dev/ttyp8
dev/ttyp9
dev/ttypa
dev/ttypb
dev/ttypc
dev/ttypd
dev/ttype
dev/ttypf
var
/tmpfs/dev/ttyp0
/tmpfs/dev/ttyp1
/tmpfs/dev/ttyp2
/tmpfs/dev/ttyp3
/tmpfs/dev/ttyp4
/tmpfs/dev/ttyp5
/tmpfs/dev/ttyp6
/tmpfs/dev/ttyp7
/tmpfs/dev/ttyp8
/tmpfs/dev/ttyp9
/tmpfs/dev/ttypa
/tmpfs/dev/ttypb
/tmpfs/dev/ttypc
/tmpfs/dev/ttypd
/tmpfs/dev/ttype
/tmpfs/dev/ttypf
/tmpfs/var
etc/resolv.conf /tmpfs/var/lib/resolv.conf
To place the corresponding directories and device files in the tmpfs file system, the following code
is added to the /etc/rc.sh script:
mkdir -p /tmpfs/tmp /tmpfs/dev \
/tmpfs/var/lib/dhcp /tmpfs/var/lock /tmpfs/var/run
while read name minor
do
mknod /tmpfs/dev/ptyp$name c 2 $minor
mknod /tmpfs/dev/ttyp$name c 3 $minor
done <<__EOD__
0 0
1 1
127
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
a 10
b 11
c 12
d 13
e 14
f 15
__EOD__
chmod 0666 /tmpfs/dev/*
3. Like we did for the ramdisk, we now create an ext2 file system image using the genext2fs tool:
$
$
$
$
$
$
ROOTFS_DIR=rootfs
ROOTFS_SIZE=3700
ROOTFS_FREE=100
ROOTFS_INODES=380
ROOTFS_DEVICES=rootfs_devices.tab
ROOTFS_IMAGE=ext2.img
#
#
#
#
#
#
$ genext2fs -U \
-d ${ROOTFS_DIR} \
-D ${ROOTFS_DEVICES} \
-b ${ROOTFS_SIZE} \
-r ${ROOTFS_FREE} \
-i ${ROOTFS_INODES} \
${ROOTFS_IMAGE}
4. We can again use the same setup as before for the JFFS2 filesystem, just changing the boot argument
to "rootfstype=ext2" (or simply omit it completely as this is the default anyway), and we must
change the "rw" argument into "ro" to mount our root file system really read-only:
...
Linux version 2.4.25 (wd@xpert) (gcc version 3.3.3 (DENX ELDK 3.1.1 3.3.3-9)) #1 Sun Jun 12
On node 0 totalpages: 4096
zone(0): 4096 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: root=/dev/mtdblock6 ro rootfstype=ext2 ip=192.168.3.80:192.168.3.1::25
Decrementer Frequency = 187500000/60
Calibrating delay loop... 49.86 BogoMIPS
...
128
--
Num Sectors
500704
Type
6
IDE write: device 0 block # 32, count 7400 ... 7400 blocks written: OK
Note that the "ide write" command takes parameters as hex numbers, and the write count is in
terms of disk blocks of 512 bytes each. So we have to use 0x20 for the starts sector of the first
partition, and 3788800 / 512 = 7400 = 0x1CE8 for the block count.
2. We now prepare the Linux boot arguments to take this partition as read-only root device:
=> setenv cf_args setenv bootargs root=/dev/hda1 ro
=> setenv flash_cf 'run cf_args addip;bootm ${kernel_addr} - ${fdt_addr}'
=> setenv bootcmd run flash_cf
...
Linux version 2.4.25 (wd@xpert) (gcc version 3.3.3 (DENX ELDK 3.1.1 3.3.3-9)) #1 Sun Jun 12
On node 0 totalpages: 4096
zone(0): 4096 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: root=/dev/hda1 ro ip=192.168.3.80:192.168.3.1::255.255.255.0:tqm860l:e
Decrementer Frequency = 187500000/60
Calibrating delay loop... 49.86 BogoMIPS
...
129
happen to find, so you have no information about brand or size of the storage device.
Unfortunately most of your customers use Windows systems. And they don't want to be bothered with long
instructions how to create special partitions on the storage device or how to write binary images or things like
that. A simple "copy file" operation is nearly exhausting their capabilities.
What to do? Well, if copying a file is all your customers can do we should not ask for more. Storage devices
like CompactFlash cards etc. typically come with a single partition on it, which holds a FAT or VFAT file
system. This cannot be used as a Linux root file system directly, so we have to use some trickery.
Here is one possible solution: Your software distribution consistes of two files: The first file is the Linux
kernel with a minimal ramdisk image attached (using the multi-file image format for U-Boot); U-Boot can
load and boot such files from a FAT or VFAT file system. The second file is your root file system. For
convenience and speed we use again an image of an ext2 file system. When Linux boots, it will initially use
the attached ramdisk as root file system. The programs in this ramdisk will mount the FAT or VFAT file
system - read-only. Then we can use a loop device (see losetup(8)) to associate the root file system image with
a block device which can be used as a mount point. And finally we use pivot_root(8) to change the root file
system to our image on the CF card.
This sounds not so complicated, and actually it is quite simple once you understand what needs to be done.
Here is a more detailed description:
1. The root file system image is easy: as mantioned before, we will use an ext2 file system image, and
to avoid wearing the flash storage device we will use it in read-only mode - we did a read-only ext2
root file system image before, and here we can just re-use the existing image file.
2. The initial ramdisk image that performs the pivot_root step must be created from scratch, but we
already know how to create ramdisk images, so we just have to figure out what to put in it.
The most important tool here is nash, a script interpreter that was specifically designed for such
purposes (see nash(8)). We don't need any additional tools, and if we use static linking, then the
nash binary plus a small script to control it is all we need for our initial ramdisk.
To be precise, we need a couple of (empty) directories (bin, dev, etc, lib, loopfs, mnt, proc,
and sysroot), the bin/nash binary, the linuxrc script and a symbolic link sbin pointing to
bin:
drwxr-xr-x
-rwxr-xr-x
drwxr-xr-x
drwxr-xr-x
drwxr-xr-x
-rwxr-xr-x
drwxr-xr-x
drwxr-xr-x
drwxr-xr-x
lrwxrwxrwx
drwxr-xr-x
2
1
2
2
2
1
2
2
2
1
2
wd
wd
wd
wd
wd
wd
wd
wd
wd
wd
wd
users
users
users
users
users
users
users
users
users
users
users
4096
469512
4096
4096
4096
511
4096
4096
4096
3
4096
Apr
Apr
Apr
Apr
Apr
Apr
Apr
Apr
Apr
Jun
Apr
13
11
12
12
12
13
12
12
12
12
12
01:11
22:47
00:04
00:04
00:04
01:28
00:04
00:09
00:04
18:54
00:04
bin
bin/nash
dev
etc
lib
linuxrc
loopfs
mnt
proc
sbin -> bin
sysroot
3. We also need only a minimal device table for creating the initial ramdisk:
#<name>
<type> <mode> <uid> <gid> <major> <minor> <start>
/dev
d 755 0
0
/dev/console
c 640 0
0
5
1
/dev/hda
b 640 0
0
3
0
/dev/hda
b 640 0
0
3
1
1
/dev/loop
b 640 0
0
7
0
0
/dev/null
c 640 0
0
1
3
/dev/ram
b 640 0
0
1
0
0
/dev/ram
b 640 0
0
1
1
-
<inc>
1
1
1
-
<count>
8
4
2
-
130
/dev/tty
/dev/tty
/dev/ttyS
/dev/zero
c
c
c
c
640
640
640
640
0
0
0
0
0
0
0
0
4
5
4
1
0
0
64
5
0
0
-
1
1
-
4
4
-
INITRD_DIR=initrd
INITRD_SIZE=490
INITRD_FREE=0
INITRD_INODES=54
INITRD_DEVICES=initrd_devices.tab
INITRD_IMAGE=initrd.img
$ genext2fs -U \
-d ${INITRD_DIR} \
-D ${INITRD_DEVICES} \
-b ${INITRD_SIZE} \
-r ${INITRD_FREE} \
-i ${INITRD_INODES} \
${INITRD_IMAGE}
$ gzip -v9 ${INITRD_IMAGE}
The newly created file linux.img is the second image we have to copy to the CF card.
We are done.
But wait - one essential part was not mentioned yet: the linuxrc script in our initial ramdisk image which
contains all the magic. This script is quite simple:
#!/bin/nash
echo Mounting /proc filesystem
mount -t proc /proc /proc
echo Creating block devices
mkdevices /dev
echo Creating root device
mkrootdev /dev/root
echo 0x0100 > /proc/sys/kernel/real-root-dev
echo Mounting flash card
mount -o noatime -t vfat /dev/hda1 /mnt
echo losetup for filesystem image
131
System
FAT16
05:36 linux.img
05:36 rootfs.img
132
2. We now prepare U-Boot to load the "uMulti" file (combined Linux kernel and initial ramdisk)
from the CF card and boot it:
=> setenv fat_args setenv bootargs rw
=> setenv fat_boot 'run fat_args addip;fatload ide 0:1 200000 linux.img;bootm'
=> setenv bootcmd run fat_boot
133
mkimage -A ppc -O Linux -T multi -C gzip -n 'Kernel + Pivot Root Helper initrd + FDT blob' -d vml
Image Name:
Kernel + Pivot Root Helper initrd + FDT blob
Created:
Fri Sep 14 18:24:29 2007
Image Type:
PowerPC Linux Multi-File Image (gzip compressed)
Data Size:
2894576 Bytes = 2826.73 kB = 2.76 MB
Load Address: 0x00000000
Entry Point: 0x00000000
Contents:
Image 0: 1351205 Bytes = 1319 kB = 1 MB
Image 1: 1531063 Bytes = 1495 kB = 1 MB
Image 2:
12288 Bytes =
12 kB = 0 MB
Boot Time
Free Mem
Updates
while running
ramdisk
16.3 sec
6.58 MB
whole image
yes
JFFS2
21.4 sec
10.3 MB
per file
cramfs
10.8 sec
10.3 MB
whole image
no
ext2 (ro)
9.1 sec
10.8 MB
whole image
no
ext2 on CF (ro)
9.3 sec
10.9 MB
whole image
no
File on FAT fs
11.4 sec
7.8 MB
whole image
yes
134
As you can see, the ramdisk solution is the worst of all in terms of RAM memory footprint; also it takes a
pretty long time to boot. However, it is one of the few solutions that allow an in-situ update while the system
is running.
JFFS2 is easy to use as it's a writable file system but it takes a long time to boot.
A read-only ext2 file system shines when boot time and RAM memory footprint are important; you pay for
this with an increased flash memory footprint.
External flash memory devices like CompactFlash cards or USB memory sticks can be cheap and efficient
solutions especially when lots of data need to be stored or when easy update procedures are required. -
135
RAM during startup. These can be avoided by overlaying the root file system as in the previous example but
with the difference that the tmpfs file system is used as storage. Thus only modified files are stored in RAM,
and can even be swapped out if neccessary. This saves boot time and RAM!
Resetable changes
Mini_fo can be easily used to implement a "reset to factory defaults" function by overlaying the default root
file system. When configuration changes are made, these are automatically directed to the storage file system
and take precedence over the original files. Now, to restore the system to factory defaults, all that needs to be
done is delete the contents of the storage directory. This will remove all changes made to the root file system
and return it to the original state.
Note: Deleting the contents of the storage directory should only be done when the overlay file system is
unmounted.
Examples
Generally, there are two different ways of overlaying the root file system, which both make sense in different
scenarios.
The mini_fo file system is mounted with "/" as base directory, "/tmp/sto/" as storage directory to the mount
point "/mnt/mini_fo". After that, chroot(1) is used to start the application with the new file system root
"/mnt/mini_fo". All modifications made by the application will be stored to the JFFS2 file system in /tmp/sto.
136
Now its easy to choose between a mini_fo overlayed and the regular non overlayed system just by setting
the "init" kernel parameter in the boot loader to "init=/sbin/overlay_init".
Tips
pivot_root(1) can be used with chroot if there is need to access the original non overlayed root
file system from the chrooted overlayed environment.
Performance overhead
The mini_fo file system is inserted as an additional layer between the VFS and the native file system, and
thus creates some overhead that varies strongly depending of the operation performed.
1. modifying a regular file for the first time
This results in a copy of the original file beeing created in the storage directory, that is then modified.
Overhead depends on the size of the modified file.
2. Reading from files, creating new files, modifying already modified files
These operations are passed directly through to the lower native layer, and only impose an overhead
of 1-2%.
Further information
This section discusses how the mini_fo overlay file system can be used in embedded systems. More general
information is available at the mini_fo project page: http://www.denx.de/wiki/Know/MiniFOHome.
9.8.2. Example
We will show a sample usage of pramfs in this section using normal DRAM on a board with at least 256MB
of memory. For pramfs we reserve the upper 32MB by appending mem=224M to the kernel command line.
137
First off we generate some testdata on a persistent file system (/tmp) to demonstrate that pramfs survives a
reboot (of course with power always applied to keep the DRAM refreshed):
bash-3.00# dd if=/dev/urandom bs=1M count=8 of=/tmp/testdata
8+0 records in
8+0 records out
bash-3.00#
Next we mount the 32MB that we reserved and initialize it to be 32MB in size and copy the testfile. A final
compare shows that the copy was indeed successful so we can reboot:
bash-3.00#
bash-3.00#
bash-3.00#
bash-3.00#
Having rebooted (using mem=224M on the kernel command line again of course) we mount the file system
but this time without the init parameter because it is preinitialized. We then check the contents again:
bash-3.00# mount -t pramfs -o physaddr=0xe000000 none /mnt
bash-3.00# ls /mnt
testdata
bash-3.00# cmp /tmp/testdata /mnt/testdata
bash-3.00#
10. Debugging
10.1. Debugging of U-Boot
10.1.1. Debugging of U-Boot Before Relocation
10.1.2. Debugging of U-Boot After Relocation
10.2. Linux Kernel Debugging
10.2.1. Linux Kernel and Statically Linked Device Drivers
10.2.2. Dynamically Loaded Device Drivers (Modules)
10.2.3. GDB Macros to Simplify Module Loading
10.3. GDB Startup File and Utility Scripts
10.4. Tips and Tricks
10.5. Application Debugging
10.5.1. Local Debugging
10.5.2. Remote Debugging
10.6. Debugging with Graphical User Interfaces
10. Debugging
The purpose of this document is not to provide an introduction into programming and debugging in general.
We assume that you know how to use the GNU debugger gdb and probably it's graphical frontends like ddd.
We also assume that you have access to adequate tools for your work, i. e. a BDI2000 BDM/JTAG debugger.
The following discussion assumes that the host name of your BDI2000 is bdi.
Please note that there are several limitations in earlier versions of GDB. The version of GDB as distributed
with the ELDK contains several bug fixes and extensions. If you find that your GDB behaves differently, have
a look at the GDB sources and patches that come with the ELDK source.
138
When U-Boot starts it is running from ROM space. Running from flash would make it nearly impossible to
read from flash while executing code from flash not to speak of updating the U-Boot image in flash itself. To
be able to do just that, U-Boot relocates itself to RAM. We therefore have two phases with different program
addresses. The following sections show how to debug U-Boot in both phases.
::: "lr");
::: "r3");
::: "r4");
relocaddr;
which is the start addresses of U-Boot after relocation to RAM. You can easily print this value in gdb like
that:
(gdb) print/x ((gd_t *)$r2)->relocaddr
With this knowledge, we can instruct gdb to forget the old symbol table and reload the symbols with our
calculated offset:
139
(gdb) symbol-file
Discard symbol table from `/home/dzu/denx/cvs-trees/u-boot/u-boot'? (y or n) y
No symbol file now.
(gdb) add-symbol-file u-boot 0xfd0000
add symbol table from file "u-boot" at
.text_addr = 0xfd0000
(y or n) y
Reading symbols from u-boot...done.
(gdb) b board_init_r
Breakpoint 2 at 0xfd99ac: file board.c, line 533.
(gdb) c
Continuing.
Breakpoint 2, board_init_r (id=0xfbb1f0, dest_addr=16495088) at board.c:533
533
{
(gdb)
board_init_r is the first C routine running in the newly relocated C friendly RAM environment.
The simple example above relocates the symbols of only one section, .text. Other sections of the
executable image (like .data, .bss, etc.) are not relocated and this prevents gdb from accessing static and
global variables by name. See more sophisticated examples in section 10.3. GDB Startup File and Utility
Scripts.
Now attach to the target and start execution with the commands:
(gdb) target remote bdi:2001
Remote debugging using bdi:2001
0x00000100 in ?? ()
(gdb) c
Continuing.
Now the target should boot Linux as usual. Next you need to load your kernel module on the target:
bash# insmod -m ex_sw.o
Sections:
Size
.this
00000060
.text
000002f4
.rodata
00000134
.data
00000000
.sdata
0000000c
Address
cf030000
cf030060
cf030354
cf030488
cf030488
Align
2**2
2**2
2**2
2**0
2**2
140
.kstrtab
.bss
.sbss
...
00000085
00000000
00000008
cf030494
cf030519
cf03051c
2**0
2**0
2**2
The option -m prints out the addresses of the various code and data segments ( .text, .data, .sdata, .bss, .sbss )
after relocation. GDB needs these addresses to know where all the symbols are located. We now interrupt
GDB to load the symbol table of the module as follows:
(gdb) ^C
Program received signal SIGSTOP, Stopped (signal).
...
(gdb) add-symbol-file <path-to-module-dir>/ex_sw.o 0xcf030060\
-s .rodata 0xcf030354\
-s .data
0xcf030488\
-s .sdata 0xcf030488\
-s .bss
0xcf030519\
-s .sbss
0xcf03051c
add symbol table from file "<path-to-module-dir>/ex_sw.o" at
.text_addr = 0xcf030060
.rodata_addr = 0xcf030354
.data_addr = 0xcf030488
.sdata_addr = 0xcf030488
.bss_addr = 0xcf030519
.sbss_addr = 0xcf03051c
(y or n) y
Reading symbols from <path-to-module-dir>/ex_sw.o...done.
Now you can list the source code of the module, set break points or inspect variables as usual:
(gdb) l fun
61
static RT_TASK *thread;
62
63
static int cpu_used[NR_RT_CPUS];
64
65
static void fun(int t)
66
{
67
unsigned int loops = LOOPS;
68
while(loops--) {
69
cpu_used[hard_cpu_id()]++;
70
rt_leds_set_mask(1,t);
(gdb)
(gdb) b ex_sw.c:69
Breakpoint 1 at 0xcf03007c: file ex_sw.c, line 69.
(gdb) c
Continuing.
Breakpoint 1, fun (t=1) at ex_sw.c:69
69
cpu_used[hard_cpu_id()]++;
(gdb) p ntasks
$1 = 16
(gdb) p stack_size
$2 = 3000
The next section demonstrates a way to automate the symbol table loading procedure.
141
In your $HOME directory you need the scripts add-symbol-file.sh and the GDB startup file .gdbinit, which are
listed in 10.3. GDB Startup File and Utility Scripts below.
Now you can include the symbol definition into GDB with:
bash$ ${CROSS_COMPILE}gdb vmlinux
GNU gdb 5.1.1
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "--host=i386-redhat-linux --target=ppc-linux".
0x00000100 in ?? ()
c
Continuing.
^C
Program received signal SIGSTOP, Stopped (signal).
0xcf02a91c in ?? ()
(gdb) add-module rtai4/examples/sw/ex_sw.o
add symbol table from file "/HHL/8xx/target/home/wolf/rtai4/examples/sw/ex_sw.o" at
.text_addr = 0xcf030060
.rodata_addr = 0xcf030340
.data_addr = 0xcf030464
.sdata_addr = 0xcf030464
.bss_addr = 0xcf0304f5
.sbss_addr = 0xcf0304f8
(gdb) b ex_sw.c:69
Breakpoint 1 at 0xcf03007c: file ex_sw.c, line 69.
(gdb) c
Continuing.
Breakpoint 1, fun (t=0x1) at ex_sw.c:69
69
cpu_used[hard_cpu_id()]++;
(gdb) p/d loops
$2 = 999986939
(gdb) p t
$3 = 0x1
(gdb) d b
Delete all breakpoints? (y or n) y
(gdb) c
Continuing.
142
The following shell script ~/add-symbol-file.sh is used to run the GDB add-symbol-file command
automatically:
#!/bin/sh
#
# Constructs the GDB "add-symbol-file" command string
# from the map file of the specified kernel module.
add_sect() {
ADDR=`awk '/^'$1' / {print $3}' $MAPFILE`
if [ "$ADDR" != "" ]; then
echo "-s $1 0x`awk '/^'$1' / {print $3}' $MAPFILE`"
fi
}
[ $# == 1 ] && [ -r "$1" ] || { echo "Usage: $0 <module>" >&2 ; exit 1 ; }
MAPFILE=$1.map
ARGS="0x`awk '/^.text / {print $3}' $MAPFILE`\
`add_sect .rodata`\
`add_sect .data`\
`add_sect .sdata`\
`add_sect .bss`\
`add_sect .sbss`\
"
echo "add-symbol-file $1 $ARGS" > ~/add-symbol-file.gdb
On some systems (like the MPC8xx or MPC8260) you can only define one hardware breakpoint.
Therefore you must delete an existing breakpoint before you can define a new one:
(gdb) d b
Delete all breakpoints? (y or n) y
(gdb) b ex_preempt.c:63
Breakpoint 2 at 0xcf030080: file ex_preempt.c, line 63.
143
To use the server, you must tell it how to communicate with GDB, the name of your program, and the
arguments for your program. To start a debugging session via network type on the target:
bash$ cd <directory-shared-with-host>
bash$ gdbserver 192.168.1.1:12345 hello-stripped
Process hello-stripped created; pid = 353
144
3
int main(int argc, char* argv[])
4
{
5
printf ("Hello world\n");
6
return 0;
7
}
(gdb) break 5
Breakpoint 1 at 0x10000498: file hello.c, line 5.
(gdb) continue
Continuing.
Breakpoint 1, main (argc=1, argv=0x7ffffbe4) at hello.c:5
5
printf ("Hello world\n");
(gdb) p argc
$1 = 1
(gdb) continue
Continuing.
Program exited normally.
If the target program you want to debug is linked against shared libraries, you must tell GDB where the
proper target libraries are located. This is done using the set solib-absolute-prefix GDB
command. If this command is omitted, then, apparently, GDB loads the host versions of the libraries and gets
crazy because of that.
If DDD is not already installed on your Linux system, have a look at your distribution media.
145
146
Articles
The Linux Kernel - describing most aspects of the Linux Kernel. Probably, the first reference for
beginners. Lots of illustrations explaining data structures use and relationships. In short: a must have.
Linux Kernel Module Programming Guide - Very nice 92 pages GPL book on the topic of modules
programming. Lots of examples.
LWN: Porting device drivers to the 2.6 kernel - Series of articles (37) in Linux Weekly News:
http://lwn.net/Articles/driver-porting/
MIPS Linux Porting Guide: http://linux.junsun.net/porting-howto/porting-howto.html
Andries Brouwers remarks to the linux kernel: http://www.win.tue.nl/~aeb/linux/lk/lk.html
Articles
The GNU C Library: http://www.linuxselfhelp.com/gnu/glibc/html_chapter/libc_toc.html
General Linux Programming: http://www.linuxselfhelp.com/cats/programming.html
Multi-Threaded Programming With POSIX Threads:
http://users.actcom.co.il/~choo/lupg/tutorials/multi-thread/multi-thread.html
Brad Hards: The Linux USB Input Subsystem, Part I
http://www.linuxjournal.com/article/6396
Brad Hards: Using the Input Subsystem, Part II
http://www.linuxjournal.com/article/6429
Ulrich Drepper: Position Independent Binaries: "Text Relocations"
http://people.redhat.com/drepper/textrelocs.html
Ulrich Drepper: "How to Write Shared Libraries"
http://people.redhat.com/drepper/dsohowto.pdf
Books
147
Standards:
POSIX.1-2008, IEEE Std 1003.1 -2008, The Open Group Technical Standard Base Specifications,
Issue 7: http://pubs.opengroup.org/onlinepubs/9699919799/mindex.html
Linux Standard Base: http://refspecs.freestandards.org/lsb.shtml
Single UNIX Specification, Version 3 (needs registration even for online viewing)
Single UNIX Specification, Version 2
PCI Bus Bindings - Standard for Boot Firmware:
http://playground.sun.com/1275/bindings/pci/pci2_1.pdf
International standardization working group for the programming language C:
http://www.open-std.org/jtc1/sc22/WG14/
Articles
Linux Networking topics (like NAPI, GSO, VLAN, IPsec etc.):
http://linux-net.osdl.org/index.php/Main_Page
Articles
148
Scott Meyers: "Effective C++: 55 Specific Ways to Improve Your Programs and Designs (3rd
Edition)", Addison-Wesley, May 20, 2005, ISBN: 0321334876
Articles
Introduction to Assembly on the PowerPC:
http://www-106.ibm.com/developerworks/library/l-ppc/?t=gr,lnxw09=PowPC
IBM PDF compiler writers guide on PPC asm tuning etc.:
http://www-3.ibm.com/chips/techlib/techlib.nsf/techdocs/852569B20050FF7785256996007558C6
A developer's guide to the POWER architecture:
http://www-128.ibm.com/developerworks/linux/library/l-powarch/index.html
PowerPC EABI Calling Sequence:
ftp://sourceware.redhat.com/pub/binutils/ppc-docs/ppc-eabi-calling-sequence
Books
149
12.4. Links
Linux Kernel Resources:
The Linux Documentation Project : http://www.tldp.org/
12.4. Links
150
U-Boot:
U-Boot Project Page: http://www.denx.de/wiki/U-Boot/WebHome.
Note that the old SourceForge page is not maintained anymore.
DENX U-Boot and Linux Guide: http://www.denx.de/twiki/bin/view/DULG
12.5. Tools
http://lxr.linux.no/source/ - Cross-Referencing the Linux Kernel - using a versatile hypertext
cross-referencing tool for the Linux Kernel source tree (the Linux Cross-Reference project)
ftp://ftp.denx.de/pub/tools/backtrace - Decode Stack Backtrace - Perl script to decode the Stack
Backtrace printed by the Linux Kernel when it panics
ftp://ftp.denx.de/pub/tools/clone_tree - "Clone" a Source Tree - Perl script to create a working copy of
a source tree (for example the Linux Kernel) which contains mainly symbolic links (and
automagically omits "unwanted" files like CVS repository data, etc.)
13. Appendix
13.1. Flat Device Tree
13.2. Flat Device Tree
13.3. BDI2000 Configuration file
12.5. Tools
151
13. Appendix
13.1. Flat Device Tree
/*
* Device Tree Source for AMCC Canyonlands (460EX)
*
* Copyright 2008-2009 DENX Software Engineering, Stefan Roese <[email protected]>
*
* This file is licensed under the terms of the GNU General Public
* License version 2. This program is licensed "as is" without
* any warranty of any kind, whether express or implied.
*/
/dts-v1/;
/ {
#address-cells = <2>;
#size-cells = <1>;
model = "amcc,canyonlands";
compatible = "amcc,canyonlands";
dcr-parent = <&{/cpus/cpu@0}>;
aliases {
ethernet0
ethernet1
serial0 =
serial1 =
};
= &EMAC0;
= &EMAC1;
&UART0;
&UART1;
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu@0 {
device_type = "cpu";
model = "PowerPC,460EX";
reg = <0x00000000>;
clock-frequency = <0>; /* Filled in by U-Boot */
timebase-frequency = <0>; /* Filled in by U-Boot */
i-cache-line-size = <32>;
d-cache-line-size = <32>;
i-cache-size = <32768>;
d-cache-size = <32768>;
dcr-controller;
dcr-access-method = "native";
next-level-cache = <&L2C0>;
};
};
memory {
device_type = "memory";
reg = <0x00000000 0x00000000 0x00000000>; /* Filled in by U-Boot */
};
UIC0: interrupt-controller0 {
compatible = "ibm,uic-460ex","ibm,uic";
interrupt-controller;
cell-index = <0>;
dcr-reg = <0x0c0 0x009>;
#address-cells = <0>;
#size-cells = <0>;
#interrupt-cells = <2>;
};
13. Appendix
152
UIC1: interrupt-controller1 {
compatible = "ibm,uic-460ex","ibm,uic";
interrupt-controller;
cell-index = <1>;
dcr-reg = <0x0d0 0x009>;
#address-cells = <0>;
#size-cells = <0>;
#interrupt-cells = <2>;
interrupts = <0x1e 0x4 0x1f 0x4>; /* cascade */
interrupt-parent = <&UIC0>;
};
UIC2: interrupt-controller2 {
compatible = "ibm,uic-460ex","ibm,uic";
interrupt-controller;
cell-index = <2>;
dcr-reg = <0x0e0 0x009>;
#address-cells = <0>;
#size-cells = <0>;
#interrupt-cells = <2>;
interrupts = <0xa 0x4 0xb 0x4>; /* cascade */
interrupt-parent = <&UIC0>;
};
UIC3: interrupt-controller3 {
compatible = "ibm,uic-460ex","ibm,uic";
interrupt-controller;
cell-index = <3>;
dcr-reg = <0x0f0 0x009>;
#address-cells = <0>;
#size-cells = <0>;
#interrupt-cells = <2>;
interrupts = <0x10 0x4 0x11 0x4>; /* cascade */
interrupt-parent = <&UIC0>;
};
SDR0: sdr {
compatible = "ibm,sdr-460ex";
dcr-reg = <0x00e 0x002>;
};
CPR0: cpr {
compatible = "ibm,cpr-460ex";
dcr-reg = <0x00c 0x002>;
};
L2C0: l2c {
compatible = "ibm,l2-cache-460ex", "ibm,l2-cache";
dcr-reg = <0x020 0x008
/* Internal SRAM DCR's */
0x030 0x008>;
/* L2 cache DCR's */
cache-line-size = <32>;
/* 32 bytes */
cache-size = <262144>;
/* L2, 256K */
interrupt-parent = <&UIC1>;
interrupts = <11 1>;
};
plb {
compatible = "ibm,plb-460ex", "ibm,plb4";
#address-cells = <2>;
#size-cells = <1>;
ranges;
clock-frequency = <0>; /* Filled in by U-Boot */
SDRAM0: sdram {
compatible = "ibm,sdram-460ex", "ibm,sdram-405gp";
dcr-reg = <0x010 0x002>;
153
};
CRYPTO: crypto@180000 {
compatible = "amcc,ppc460ex-crypto", "amcc,ppc4xx-crypto";
reg = <4 0x00180000 0x80400>;
interrupt-parent = <&UIC0>;
interrupts = <0x1d 0x4>;
};
MAL0: mcmal {
compatible = "ibm,mcmal-460ex", "ibm,mcmal2";
dcr-reg = <0x180 0x062>;
num-tx-chans = <2>;
num-rx-chans = <16>;
#address-cells = <0>;
#size-cells = <0>;
interrupt-parent = <&UIC2>;
interrupts = <
/*TXEOB*/ 0x6 0x4
/*RXEOB*/ 0x7 0x4
/*SERR*/ 0x3 0x4
/*TXDE*/ 0x4 0x4
/*RXDE*/ 0x5 0x4>;
};
USB0: ehci@bffd0400 {
compatible = "ibm,usb-ehci-460ex", "usb-ehci";
interrupt-parent = <&UIC2>;
interrupts = <0x1d 4>;
reg = <4 0xbffd0400 0x90 4 0xbffd0490 0x70>;
};
USB1: usb@bffd0000 {
compatible = "ohci-le";
reg = <4 0xbffd0000 0x60>;
interrupt-parent = <&UIC2>;
interrupts = <0x1e 4>;
};
USBOTG0: usbotg@bff80000 {
compatible = "amcc,usb-otg-460ex", "amcc,usb-otg";
reg = <4 0xbff80000 0x10000>;
interrupt-parent = <&USBOTG0>;
interrupts = <0 1 2>;
#interrupt-cells = <1>;
#address-cells = <0>;
#size-cells = <0>;
interrupt-map = </* USB-OTG */ 0 &UIC2 0x1c 4
/* HIGH-POWER */ 1 &UIC1 0x1a 8
/* DMA */ 2 &UIC0 0xc 4>;
interrupt-map-mask = <0xffffffff>;
};
SATA0: sata@bffd1000 {
compatible = "amcc,sata-460ex";
reg = <4 0xbffd1000 0x800
/* SATA */
4 0xbffd0800 0x400>;
/* AHBDMA */
interrupt-parent = <&UIC3>;
interrupts = <0 4
/* SATA */
5 4>;
/* AHBDMA */
};
POB0: opb {
compatible = "ibm,opb-460ex", "ibm,opb";
#address-cells = <1>;
#size-cells = <1>;
ranges = <0xb0000000 0x00000004 0xb0000000 0x50000000>;
clock-frequency = <0>; /* Filled in by U-Boot */
154
EBC0: ebc {
compatible = "ibm,ebc-460ex", "ibm,ebc";
dcr-reg = <0x012 0x002>;
#address-cells = <2>;
#size-cells = <1>;
clock-frequency = <0>; /* Filled in by U-Boot */
/* ranges property is supplied by U-Boot */
interrupts = <0x6 0x4>;
interrupt-parent = <&UIC1>;
nor_flash@0,0 {
compatible = "amd,s29gl512n", "cfi-flash";
bank-width = <2>;
reg = <0x00000000 0x00000000 0x04000000>;
#address-cells = <1>;
#size-cells = <1>;
partition@0 {
label = "kernel";
reg = <0x00000000 0x001e0000>;
};
partition@1e0000 {
label = "dtb";
reg = <0x001e0000 0x00020000>;
};
partition@200000 {
label = "ramdisk";
reg = <0x00200000 0x01400000>;
};
partition@1600000 {
label = "jffs2";
reg = <0x01600000 0x00400000>;
};
partition@1a00000 {
label = "user";
reg = <0x01a00000 0x02560000>;
};
partition@3f60000 {
label = "env";
reg = <0x03f60000 0x00040000>;
};
partition@3fa0000 {
label = "u-boot";
reg = <0x03fa0000 0x00060000>;
};
};
ndfc@3,0 {
compatible = "ibm,ndfc";
reg = <0x00000003 0x00000000 0x00002000>;
ccr = <0x00001000>;
bank-settings = <0x80002222>;
#address-cells = <1>;
#size-cells = <1>;
nand {
#address-cells = <1>;
#size-cells = <1>;
partition@0 {
label = "u-boot";
reg = <0x00000000 0x00100000>;
};
partition@100000 {
label = "user";
reg = <0x00000000 0x03f00000>;
};
155
};
};
};
UART0: serial@ef600300 {
device_type = "serial";
compatible = "ns16550";
reg = <0xef600300 0x00000008>;
virtual-reg = <0xef600300>;
clock-frequency = <0>; /* Filled in by U-Boot */
current-speed = <0>; /* Filled in by U-Boot */
interrupt-parent = <&UIC1>;
interrupts = <0x1 0x4>;
};
UART1: serial@ef600400 {
device_type = "serial";
compatible = "ns16550";
reg = <0xef600400 0x00000008>;
virtual-reg = <0xef600400>;
clock-frequency = <0>; /* Filled in by U-Boot */
current-speed = <0>; /* Filled in by U-Boot */
interrupt-parent = <&UIC0>;
interrupts = <0x1 0x4>;
};
UART2: serial@ef600500 {
device_type = "serial";
compatible = "ns16550";
reg = <0xef600500 0x00000008>;
virtual-reg = <0xef600500>;
clock-frequency = <0>; /* Filled in by U-Boot */
current-speed = <0>; /* Filled in by U-Boot */
interrupt-parent = <&UIC1>;
interrupts = <0x1d 0x4>;
};
UART3: serial@ef600600 {
device_type = "serial";
compatible = "ns16550";
reg = <0xef600600 0x00000008>;
virtual-reg = <0xef600600>;
clock-frequency = <0>; /* Filled in by U-Boot */
current-speed = <0>; /* Filled in by U-Boot */
interrupt-parent = <&UIC1>;
interrupts = <0x1e 0x4>;
};
IIC0: i2c@ef600700 {
compatible = "ibm,iic-460ex", "ibm,iic";
reg = <0xef600700 0x00000014>;
interrupt-parent = <&UIC0>;
interrupts = <0x2 0x4>;
#address-cells = <1>;
#size-cells = <0>;
rtc@68 {
compatible = "stm,m41t80";
reg = <0x68>;
interrupt-parent = <&UIC2>;
interrupts = <0x19 0x8>;
};
sttm@48 {
compatible = "ad,ad7414";
reg = <0x48>;
interrupt-parent = <&UIC1>;
interrupts = <0x14 0x8>;
};
156
};
IIC1: i2c@ef600800 {
compatible = "ibm,iic-460ex", "ibm,iic";
reg = <0xef600800 0x00000014>;
interrupt-parent = <&UIC0>;
interrupts = <0x3 0x4>;
};
ZMII0: emac-zmii@ef600d00 {
compatible = "ibm,zmii-460ex", "ibm,zmii";
reg = <0xef600d00 0x0000000c>;
};
RGMII0: emac-rgmii@ef601500 {
compatible = "ibm,rgmii-460ex", "ibm,rgmii";
reg = <0xef601500 0x00000008>;
has-mdio;
};
TAH0: emac-tah@ef601350 {
compatible = "ibm,tah-460ex", "ibm,tah";
reg = <0xef601350 0x00000030>;
};
TAH1: emac-tah@ef601450 {
compatible = "ibm,tah-460ex", "ibm,tah";
reg = <0xef601450 0x00000030>;
};
EMAC0: ethernet@ef600e00 {
device_type = "network";
compatible = "ibm,emac-460ex", "ibm,emac4sync";
interrupt-parent = <&EMAC0>;
interrupts = <0x0 0x1>;
#interrupt-cells = <1>;
#address-cells = <0>;
#size-cells = <0>;
interrupt-map = </*Status*/ 0x0 &UIC2 0x10 0x4
/*Wake*/
0x1 &UIC2 0x14 0x4>;
reg = <0xef600e00 0x000000c4>;
local-mac-address = [000000000000]; /* Filled in by U-Boot */
mal-device = <&MAL0>;
mal-tx-channel = <0>;
mal-rx-channel = <0>;
cell-index = <0>;
max-frame-size = <9000>;
rx-fifo-size = <4096>;
tx-fifo-size = <2048>;
rx-fifo-size-gige = <16384>;
phy-mode = "rgmii";
phy-map = <0x00000000>;
rgmii-device = <&RGMII0>;
rgmii-channel = <0>;
tah-device = <&TAH0>;
tah-channel = <0>;
has-inverted-stacr-oc;
has-new-stacr-staopc;
};
EMAC1: ethernet@ef600f00 {
device_type = "network";
compatible = "ibm,emac-460ex", "ibm,emac4sync";
interrupt-parent = <&EMAC1>;
interrupts = <0x0 0x1>;
#interrupt-cells = <1>;
#address-cells = <0>;
157
#size-cells = <0>;
interrupt-map = </*Status*/ 0x0 &UIC2 0x11 0x4
/*Wake*/
0x1 &UIC2 0x15 0x4>;
reg = <0xef600f00 0x000000c4>;
local-mac-address = [000000000000]; /* Filled in by U-Boot */
mal-device = <&MAL0>;
mal-tx-channel = <1>;
mal-rx-channel = <8>;
cell-index = <1>;
max-frame-size = <9000>;
rx-fifo-size = <4096>;
tx-fifo-size = <2048>;
rx-fifo-size-gige = <16384>;
phy-mode = "rgmii";
phy-map = <0x00000000>;
rgmii-device = <&RGMII0>;
rgmii-channel = <1>;
tah-device = <&TAH1>;
tah-channel = <1>;
has-inverted-stacr-oc;
has-new-stacr-staopc;
mdio-device = <&EMAC0>;
};
};
PCIX0: pci@c0ec00000 {
device_type = "pci";
#interrupt-cells = <1>;
#size-cells = <2>;
#address-cells = <3>;
compatible = "ibm,plb-pcix-460ex", "ibm,plb-pcix";
primary;
large-inbound-windows;
enable-msi-hole;
reg = <0x0000000c 0x0ec00000
0x00000008
/* Config space access */
0x00000000 0x00000000 0x00000000
/* no IACK cycles */
0x0000000c 0x0ed00000
0x00000004
/* Special cycles */
0x0000000c 0x0ec80000 0x00000100 /* Internal registers */
0x0000000c 0x0ec80100 0x000000fc>;
/* Internal messaging registers */
/* Outbound ranges, one memory and one IO,
* later cannot be changed
*/
ranges = <0x02000000 0x00000000 0x80000000 0x0000000d 0x80000000 0x00000000 0x80000000
0x02000000 0x00000000 0x00000000 0x0000000c 0x0ee00000 0x00000000 0x00100000
0x01000000 0x00000000 0x00000000 0x0000000c 0x08000000 0x00000000 0x00010000>;
/* Inbound 2GB range starting at 0 */
dma-ranges = <0x42000000 0x0 0x0 0x0 0x0 0x0 0x80000000>;
/* This drives busses 0 to 0x3f */
bus-range = <0x0 0x3f>;
/* All PCI interrupts are routed to ext IRQ 2 -> UIC1-0 */
interrupt-map-mask = <0x0 0x0 0x0 0x0>;
interrupt-map = < 0x0 0x0 0x0 0x0 &UIC1 0x0 0x8 >;
};
PCIE0: pciex@d00000000 {
device_type = "pci";
#interrupt-cells = <1>;
#size-cells = <2>;
#address-cells = <3>;
compatible = "ibm,plb-pciex-460ex", "ibm,plb-pciex";
primary;
port = <0x0>; /* port number */
reg = <0x0000000d 0x00000000 0x20000000 /* Config space access */
158
/* Registers */
159
interrupt-map-mask
interrupt-map = <
0x0 0x0 0x0 0x1
0x0 0x0 0x0 0x2
0x0 0x0 0x0 0x3
0x0 0x0 0x0 0x4
0x10
0x11
0x12
0x13
0x4
0x4
0x4
0x4
/*
/*
/*
/*
swizzled
swizzled
swizzled
swizzled
int
int
int
int
A
B
C
D
*/
*/
*/
*/>;
};
};
};
= &EMAC0;
= &EMAC1;
&UART0;
&UART1;
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu@0 {
device_type = "cpu";
model = "PowerPC,460EX";
reg = <0x00000000>;
clock-frequency = <0>; /* Filled in by U-Boot */
timebase-frequency = <0>; /* Filled in by U-Boot */
i-cache-line-size = <32>;
d-cache-line-size = <32>;
i-cache-size = <32768>;
d-cache-size = <32768>;
dcr-controller;
dcr-access-method = "native";
next-level-cache = <&L2C0>;
};
};
memory {
device_type = "memory";
reg = <0x00000000 0x00000000 0x00000000>; /* Filled in by U-Boot */
};
UIC0: interrupt-controller0 {
compatible = "ibm,uic-460ex","ibm,uic";
160
interrupt-controller;
cell-index = <0>;
dcr-reg = <0x0c0 0x009>;
#address-cells = <0>;
#size-cells = <0>;
#interrupt-cells = <2>;
};
UIC1: interrupt-controller1 {
compatible = "ibm,uic-460ex","ibm,uic";
interrupt-controller;
cell-index = <1>;
dcr-reg = <0x0d0 0x009>;
#address-cells = <0>;
#size-cells = <0>;
#interrupt-cells = <2>;
interrupts = <0x1e 0x4 0x1f 0x4>; /* cascade */
interrupt-parent = <&UIC0>;
};
UIC2: interrupt-controller2 {
compatible = "ibm,uic-460ex","ibm,uic";
interrupt-controller;
cell-index = <2>;
dcr-reg = <0x0e0 0x009>;
#address-cells = <0>;
#size-cells = <0>;
#interrupt-cells = <2>;
interrupts = <0xa 0x4 0xb 0x4>; /* cascade */
interrupt-parent = <&UIC0>;
};
UIC3: interrupt-controller3 {
compatible = "ibm,uic-460ex","ibm,uic";
interrupt-controller;
cell-index = <3>;
dcr-reg = <0x0f0 0x009>;
#address-cells = <0>;
#size-cells = <0>;
#interrupt-cells = <2>;
interrupts = <0x10 0x4 0x11 0x4>; /* cascade */
interrupt-parent = <&UIC0>;
};
SDR0: sdr {
compatible = "ibm,sdr-460ex";
dcr-reg = <0x00e 0x002>;
};
CPR0: cpr {
compatible = "ibm,cpr-460ex";
dcr-reg = <0x00c 0x002>;
};
L2C0: l2c {
compatible = "ibm,l2-cache-460ex", "ibm,l2-cache";
dcr-reg = <0x020 0x008
/* Internal SRAM DCR's */
0x030 0x008>;
/* L2 cache DCR's */
cache-line-size = <32>;
/* 32 bytes */
cache-size = <262144>;
/* L2, 256K */
interrupt-parent = <&UIC1>;
interrupts = <11 1>;
};
plb {
compatible = "ibm,plb-460ex", "ibm,plb4";
#address-cells = <2>;
161
#size-cells = <1>;
ranges;
clock-frequency = <0>; /* Filled in by U-Boot */
SDRAM0: sdram {
compatible = "ibm,sdram-460ex", "ibm,sdram-405gp";
dcr-reg = <0x010 0x002>;
};
CRYPTO: crypto@180000 {
compatible = "amcc,ppc460ex-crypto", "amcc,ppc4xx-crypto";
reg = <4 0x00180000 0x80400>;
interrupt-parent = <&UIC0>;
interrupts = <0x1d 0x4>;
};
MAL0: mcmal {
compatible = "ibm,mcmal-460ex", "ibm,mcmal2";
dcr-reg = <0x180 0x062>;
num-tx-chans = <2>;
num-rx-chans = <16>;
#address-cells = <0>;
#size-cells = <0>;
interrupt-parent = <&UIC2>;
interrupts = <
/*TXEOB*/ 0x6 0x4
/*RXEOB*/ 0x7 0x4
/*SERR*/ 0x3 0x4
/*TXDE*/ 0x4 0x4
/*RXDE*/ 0x5 0x4>;
};
USB0: ehci@bffd0400 {
compatible = "ibm,usb-ehci-460ex", "usb-ehci";
interrupt-parent = <&UIC2>;
interrupts = <0x1d 4>;
reg = <4 0xbffd0400 0x90 4 0xbffd0490 0x70>;
};
USB1: usb@bffd0000 {
compatible = "ohci-le";
reg = <4 0xbffd0000 0x60>;
interrupt-parent = <&UIC2>;
interrupts = <0x1e 4>;
};
USBOTG0: usbotg@bff80000 {
compatible = "amcc,usb-otg-460ex", "amcc,usb-otg";
reg = <4 0xbff80000 0x10000>;
interrupt-parent = <&USBOTG0>;
interrupts = <0 1 2>;
#interrupt-cells = <1>;
#address-cells = <0>;
#size-cells = <0>;
interrupt-map = </* USB-OTG */ 0 &UIC2 0x1c 4
/* HIGH-POWER */ 1 &UIC1 0x1a 8
/* DMA */ 2 &UIC0 0xc 4>;
interrupt-map-mask = <0xffffffff>;
};
SATA0: sata@bffd1000 {
compatible = "amcc,sata-460ex";
reg = <4 0xbffd1000 0x800
/* SATA */
4 0xbffd0800 0x400>;
/* AHBDMA */
interrupt-parent = <&UIC3>;
interrupts = <0 4
/* SATA */
5 4>;
/* AHBDMA */
};
162
POB0: opb {
compatible = "ibm,opb-460ex", "ibm,opb";
#address-cells = <1>;
#size-cells = <1>;
ranges = <0xb0000000 0x00000004 0xb0000000 0x50000000>;
clock-frequency = <0>; /* Filled in by U-Boot */
EBC0: ebc {
compatible = "ibm,ebc-460ex", "ibm,ebc";
dcr-reg = <0x012 0x002>;
#address-cells = <2>;
#size-cells = <1>;
clock-frequency = <0>; /* Filled in by U-Boot */
/* ranges property is supplied by U-Boot */
interrupts = <0x6 0x4>;
interrupt-parent = <&UIC1>;
nor_flash@0,0 {
compatible = "amd,s29gl512n", "cfi-flash";
bank-width = <2>;
reg = <0x00000000 0x00000000 0x04000000>;
#address-cells = <1>;
#size-cells = <1>;
partition@0 {
label = "kernel";
reg = <0x00000000 0x001e0000>;
};
partition@1e0000 {
label = "dtb";
reg = <0x001e0000 0x00020000>;
};
partition@200000 {
label = "ramdisk";
reg = <0x00200000 0x01400000>;
};
partition@1600000 {
label = "jffs2";
reg = <0x01600000 0x00400000>;
};
partition@1a00000 {
label = "user";
reg = <0x01a00000 0x02560000>;
};
partition@3f60000 {
label = "env";
reg = <0x03f60000 0x00040000>;
};
partition@3fa0000 {
label = "u-boot";
reg = <0x03fa0000 0x00060000>;
};
};
ndfc@3,0 {
compatible = "ibm,ndfc";
reg = <0x00000003 0x00000000 0x00002000>;
ccr = <0x00001000>;
bank-settings = <0x80002222>;
#address-cells = <1>;
#size-cells = <1>;
nand {
#address-cells = <1>;
#size-cells = <1>;
partition@0 {
163
label = "u-boot";
reg = <0x00000000 0x00100000>;
};
partition@100000 {
label = "user";
reg = <0x00000000 0x03f00000>;
};
};
};
};
UART0: serial@ef600300 {
device_type = "serial";
compatible = "ns16550";
reg = <0xef600300 0x00000008>;
virtual-reg = <0xef600300>;
clock-frequency = <0>; /* Filled in by U-Boot */
current-speed = <0>; /* Filled in by U-Boot */
interrupt-parent = <&UIC1>;
interrupts = <0x1 0x4>;
};
UART1: serial@ef600400 {
device_type = "serial";
compatible = "ns16550";
reg = <0xef600400 0x00000008>;
virtual-reg = <0xef600400>;
clock-frequency = <0>; /* Filled in by U-Boot */
current-speed = <0>; /* Filled in by U-Boot */
interrupt-parent = <&UIC0>;
interrupts = <0x1 0x4>;
};
UART2: serial@ef600500 {
device_type = "serial";
compatible = "ns16550";
reg = <0xef600500 0x00000008>;
virtual-reg = <0xef600500>;
clock-frequency = <0>; /* Filled in by U-Boot */
current-speed = <0>; /* Filled in by U-Boot */
interrupt-parent = <&UIC1>;
interrupts = <0x1d 0x4>;
};
UART3: serial@ef600600 {
device_type = "serial";
compatible = "ns16550";
reg = <0xef600600 0x00000008>;
virtual-reg = <0xef600600>;
clock-frequency = <0>; /* Filled in by U-Boot */
current-speed = <0>; /* Filled in by U-Boot */
interrupt-parent = <&UIC1>;
interrupts = <0x1e 0x4>;
};
IIC0: i2c@ef600700 {
compatible = "ibm,iic-460ex", "ibm,iic";
reg = <0xef600700 0x00000014>;
interrupt-parent = <&UIC0>;
interrupts = <0x2 0x4>;
#address-cells = <1>;
#size-cells = <0>;
rtc@68 {
compatible = "stm,m41t80";
reg = <0x68>;
interrupt-parent = <&UIC2>;
interrupts = <0x19 0x8>;
164
};
sttm@48 {
compatible = "ad,ad7414";
reg = <0x48>;
interrupt-parent = <&UIC1>;
interrupts = <0x14 0x8>;
};
};
IIC1: i2c@ef600800 {
compatible = "ibm,iic-460ex", "ibm,iic";
reg = <0xef600800 0x00000014>;
interrupt-parent = <&UIC0>;
interrupts = <0x3 0x4>;
};
ZMII0: emac-zmii@ef600d00 {
compatible = "ibm,zmii-460ex", "ibm,zmii";
reg = <0xef600d00 0x0000000c>;
};
RGMII0: emac-rgmii@ef601500 {
compatible = "ibm,rgmii-460ex", "ibm,rgmii";
reg = <0xef601500 0x00000008>;
has-mdio;
};
TAH0: emac-tah@ef601350 {
compatible = "ibm,tah-460ex", "ibm,tah";
reg = <0xef601350 0x00000030>;
};
TAH1: emac-tah@ef601450 {
compatible = "ibm,tah-460ex", "ibm,tah";
reg = <0xef601450 0x00000030>;
};
EMAC0: ethernet@ef600e00 {
device_type = "network";
compatible = "ibm,emac-460ex", "ibm,emac4sync";
interrupt-parent = <&EMAC0>;
interrupts = <0x0 0x1>;
#interrupt-cells = <1>;
#address-cells = <0>;
#size-cells = <0>;
interrupt-map = </*Status*/ 0x0 &UIC2 0x10 0x4
/*Wake*/
0x1 &UIC2 0x14 0x4>;
reg = <0xef600e00 0x000000c4>;
local-mac-address = [000000000000]; /* Filled in by U-Boot */
mal-device = <&MAL0>;
mal-tx-channel = <0>;
mal-rx-channel = <0>;
cell-index = <0>;
max-frame-size = <9000>;
rx-fifo-size = <4096>;
tx-fifo-size = <2048>;
rx-fifo-size-gige = <16384>;
phy-mode = "rgmii";
phy-map = <0x00000000>;
rgmii-device = <&RGMII0>;
rgmii-channel = <0>;
tah-device = <&TAH0>;
tah-channel = <0>;
has-inverted-stacr-oc;
has-new-stacr-staopc;
};
165
EMAC1: ethernet@ef600f00 {
device_type = "network";
compatible = "ibm,emac-460ex", "ibm,emac4sync";
interrupt-parent = <&EMAC1>;
interrupts = <0x0 0x1>;
#interrupt-cells = <1>;
#address-cells = <0>;
#size-cells = <0>;
interrupt-map = </*Status*/ 0x0 &UIC2 0x11 0x4
/*Wake*/
0x1 &UIC2 0x15 0x4>;
reg = <0xef600f00 0x000000c4>;
local-mac-address = [000000000000]; /* Filled in by U-Boot */
mal-device = <&MAL0>;
mal-tx-channel = <1>;
mal-rx-channel = <8>;
cell-index = <1>;
max-frame-size = <9000>;
rx-fifo-size = <4096>;
tx-fifo-size = <2048>;
rx-fifo-size-gige = <16384>;
phy-mode = "rgmii";
phy-map = <0x00000000>;
rgmii-device = <&RGMII0>;
rgmii-channel = <1>;
tah-device = <&TAH1>;
tah-channel = <1>;
has-inverted-stacr-oc;
has-new-stacr-staopc;
mdio-device = <&EMAC0>;
};
};
PCIX0: pci@c0ec00000 {
device_type = "pci";
#interrupt-cells = <1>;
#size-cells = <2>;
#address-cells = <3>;
compatible = "ibm,plb-pcix-460ex", "ibm,plb-pcix";
primary;
large-inbound-windows;
enable-msi-hole;
reg = <0x0000000c 0x0ec00000
0x00000008
/* Config space access */
0x00000000 0x00000000 0x00000000
/* no IACK cycles */
0x0000000c 0x0ed00000
0x00000004
/* Special cycles */
0x0000000c 0x0ec80000 0x00000100 /* Internal registers */
0x0000000c 0x0ec80100 0x000000fc>;
/* Internal messaging registers */
/* Outbound ranges, one memory and one IO,
* later cannot be changed
*/
ranges = <0x02000000 0x00000000 0x80000000 0x0000000d 0x80000000 0x00000000 0x80000000
0x02000000 0x00000000 0x00000000 0x0000000c 0x0ee00000 0x00000000 0x00100000
0x01000000 0x00000000 0x00000000 0x0000000c 0x08000000 0x00000000 0x00010000>;
/* Inbound 2GB range starting at 0 */
dma-ranges = <0x42000000 0x0 0x0 0x0 0x0 0x0 0x80000000>;
/* This drives busses 0 to 0x3f */
bus-range = <0x0 0x3f>;
/* All PCI interrupts are routed to ext IRQ 2 -> UIC1-0 */
interrupt-map-mask = <0x0 0x0 0x0 0x0>;
interrupt-map = < 0x0 0x0 0x0 0x0 &UIC1 0x0 0x8 >;
};
PCIE0: pciex@d00000000 {
device_type = "pci";
166
#interrupt-cells = <1>;
#size-cells = <2>;
#address-cells = <3>;
compatible = "ibm,plb-pciex-460ex", "ibm,plb-pciex";
primary;
port = <0x0>; /* port number */
reg = <0x0000000d 0x00000000 0x20000000 /* Config space access */
0x0000000c 0x08010000 0x00001000>;
/* Registers */
dcr-reg = <0x100 0x020>;
sdr-base = <0x300>;
/* Outbound ranges, one memory and one IO,
* later cannot be changed
*/
ranges = <0x02000000 0x00000000 0x80000000 0x0000000e 0x00000000 0x00000000 0x80000000
0x02000000 0x00000000 0x00000000 0x0000000f 0x00000000 0x00000000 0x00100000
0x01000000 0x00000000 0x00000000 0x0000000f 0x80000000 0x00000000 0x00010000>;
/* Inbound 2GB range starting at 0 */
dma-ranges = <0x42000000 0x0 0x0 0x0 0x0 0x0 0x80000000>;
/* This drives busses 40 to 0x7f */
bus-range = <0x40 0x7f>;
/* Legacy interrupts (note the weird polarity, the bridge seems
* to invert PCIe legacy interrupts).
* We are de-swizzling here because the numbers are actually for
* port of the root complex virtual P2P bridge. But I want
* to avoid putting a node for it in the tree, so the numbers
* below are basically de-swizzled numbers.
* The real slot is on idsel 0, so the swizzling is 1:1
*/
interrupt-map-mask = <0x0 0x0 0x0 0x7>;
interrupt-map = <
0x0 0x0 0x0 0x1 &UIC3 0xc 0x4 /* swizzled int A */
0x0 0x0 0x0 0x2 &UIC3 0xd 0x4 /* swizzled int B */
0x0 0x0 0x0 0x3 &UIC3 0xe 0x4 /* swizzled int C */
0x0 0x0 0x0 0x4 &UIC3 0xf 0x4 /* swizzled int D */>;
};
PCIE1: pciex@d20000000 {
device_type = "pci";
#interrupt-cells = <1>;
#size-cells = <2>;
#address-cells = <3>;
compatible = "ibm,plb-pciex-460ex", "ibm,plb-pciex";
primary;
port = <0x1>; /* port number */
reg = <0x0000000d 0x20000000 0x20000000 /* Config space access */
0x0000000c 0x08011000 0x00001000>;
/* Registers */
dcr-reg = <0x120 0x020>;
sdr-base = <0x340>;
/* Outbound ranges, one memory and one IO,
* later cannot be changed
*/
ranges = <0x02000000 0x00000000 0x80000000 0x0000000e 0x80000000 0x00000000 0x80000000
0x02000000 0x00000000 0x00000000 0x0000000f 0x00100000 0x00000000 0x00100000
0x01000000 0x00000000 0x00000000 0x0000000f 0x80010000 0x00000000 0x00010000>;
/* Inbound 2GB range starting at 0 */
dma-ranges = <0x42000000 0x0 0x0 0x0 0x0 0x0 0x80000000>;
/* This drives busses 80 to 0xbf */
bus-range = <0x80 0xbf>;
/* Legacy interrupts (note the weird polarity, the bridge seems
167
[TARGET]
JTAGCLOCK
CPUTYPE
WAKEUP
BREAKMODE
STEPMODE
0x20
[HOST]
IP
FILE
FORMAT
DUMP
PROMPT
0x40004580
1
440
500
HARD
HWBP
;16k
192.168.1.1
/tftpboot/canyonlands/u-boot.bin
BIN
/tftpboot/canyonlands/dump.bin
460EX>
[FLASH]
;WORKSPACE
0xe3040000
;workspace in OCM
;WORKSPACE
0x70000000
;workspace in OCM
;WORKSPACE
0x90040000
;workspace in OCM
CHIPTYPE
MIRRORX16
;Flash type
CHIPSIZE
0x1000000
;The size of one flash chip in bytes
BUSWIDTH
16
;The width of the flash memory bus in bits (8 | 16 | 32)
FILE
/tftpboot/canyonlands/u-boot.bin
;FORMAT
BIN 0xFFF80000
168
FORMAT
;ERASE
ERASE
ERASE
ERASE
BIN 0xFFFA0000
0xFFF80000
;erase sector 4
0xFFFA0000
;erase sector 4
0xFFFC0000
;erase sector 4
0xFFFE0000
;erase sector 6
[REGS]
FILE
/tftpboot/BDI2000/reg460ex.def
169
170
14.1. ELDK
14.1.1. ELDK Installation under FreeBSD
Question:
How can I install ELDK on a FreeBSD system?
Answer:
[Thanks to Rafal Jaworowski for these detailed instructions.] This is a short tutorial how to host
ELDK on FreeBSD 5.x and 6.x. The procedure described below was tested on 5.2.1, 5.3 and 6-current
releases; we assume the reader is equipped with the ELDK 3.x CDROM or ISO image for installation,
and is familiar with FreeBSD basic administration tasks like ports/packages installation.
1. Prerequisites:
1. Install linux_base
The first step is to install the Linux compatibility layer from ports
/usr/ports/emulators/linux_base/ or packages
ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages/emulators
Please make sure to install version 7.1_5 (linux_base-7.1_5.tbz) or later;
in particular, version 6.1.5 which can also be found in the ports tree does not work
properly!
The compatibility layer is activated by
# kldload linux
2. Install bash
Since ELDK and Linux build scripts are organised around bash while FreeBSD does
not have it in base, this shell needs to be installed either from ports
/usr/ports/shells/bash2/ or packages collection
ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages/shells/
The installation puts the bash binary in /usr/local/bin. It is a good idea to
create a symlink in /bin so that hash bang from scripts (#!/bin/bash) works
without modifications:
# cd /bin
# ln -s /usr/local/bin/bash
2. Prepare ELDK
This step is only needed for ELDK release 3.1 and older versions.
Copy the install files from the CDROM or ISO image to a writable location. Brand the ELDK
installer as Linux ELF file:
14.1.1. ELDK Installation under FreeBSD
171
# cd <elkd_install_dir>
# brandelf -t Linux ./install
Note: The following workaround might be a good alternative for the tedious copying of
the installation CDROM to a writable location and manual branding: you can set a fallback
branding in FreeBSD - when the loader cannot recognise the ELF brand it will switch to the
last resort defined.
# sysctl -w kern.elf32.fallback_brand=3
kern.elf32.fallback_brand: -1 -> 3
With this setting, the normal ELDK CDROM images should work.
3. Install ELDK normally as described in 3.5.3. Initial Installation
4. Set envrionment variables and PATH as needed for ELDK (in bash); for example:
bash$ export CROSS_COMPILE=ppc_8xxbash$ export PATH=${PATH}:/opt/eldk/bin:/opt/eldk/usr/bin
cd /opt/eldk/ppc_8xx/usr/src/linux-2.4.25/
gmake mrproper
gmake TQM823L_config
gmake oldconfig
gmake dep
gmake -j6 uImage
172
I try to install the ELDK on a Linux PC, and the installation hangs. It starts fine, but then it freezes
like this:
...
Preparing...
1:db4-devel-ppc_4xx
Preparing...
1:db4-utils-ppc_4xx
Preparing...
1:glib2-ppc_4xx
Preparing...
1:glib2-devel-ppc_4xx
Preparing...
###########################################
###########################################
###########################################
###########################################
###########################################
###########################################
###########################################
###########################################
###########################################
[100%]
[100%]
[100%]
[100%]
[100%]
[100%]
[100%]
[100%]
[100%]
<hangs here>
Answer:
This is almost certainly a FUTEX problem. To verify this, please wait until the process grinds to a
halt, then use ps to find the pid of the "rpm" process that was started by the "install" program
(use "ps -axf" which gives you a nice hierarchy, look for the "install" process, then for
"rpm") and then attach to it with "strace -p". Most probably you will see the something like
this:
# strace -p 21197
Process 21197 attached - interrupt to quit
futex(0x96fe17c, FUTEX_WAIT_PRIVATE, 1, NULL
173
$ df -h /home/wd/.gvfs
Filesystem
Size Used Avail Use% Mounted on
gvfs-fuse-daemon
0
0
0
- /home/wd/.gvfs
$ sudo df -h /home/wd/.gvfs
df: `/home/wd/.gvfs': Permission denied
df: no file systems processed
Start
1
979
12424
23869
End
978
12423
23868
35239
Blocks
1001456
11719680
11719680
11643904
Id
82
83
83
83
System
Linux swap / Solaris
Linux
Linux
Linux
5. Copy the content of the (NFS) root file system into the mounted file system:
bash-3.00# tar --one-file-system -c -f - / | ( cd /mnt ; tar xpf - )
ext3
swap
proc
sysfs
defaults
defaults
defaults
defaults
1
0
0
0
1
0
0
0
7. Adjust /etc/rc.sysinit for running from local disk; remove the following comments:
bash-3.00# diff -u /mnt/etc/rc.sysinit.ORIG /mnt/etc/rc.sysinit
--- /mnt/etc/rc.sysinit.ORIG
2007-01-21 04:37:00.000000000 +0100
+++ /mnt/etc/rc.sysinit 2007-03-02 10:58:22.000000000 +0100
@@ -460,9 +460,9 @@
# Remount the root filesystem read-write.
update_boot_stage RCmountfs
-#state=`LC_ALL=C awk '/ \/ / && ($3 !~ /rootfs/) { print $4 }' /proc/mounts`
174
8. Unmount disk:
bash-3.00# umount /mnt
9. Reboot, and adjust boot arguments to use disk partition as root file system
=> setenv diskargs setenv bootargs root=/dev/sda2 ro
=> setenv net_disk 'tftp ${loadaddr} ${bootfile};run diskargs addip addcons;bootm'
=> saveenv
Answer:
The Linux installation on your host is missing essential files that are needed to perform software
development and use a C compiler. On Ubuntu, check for example if you miss a "libc6-dev" package.
The specific package name differs from distribution to distribution; on Fedora, you need for example
the "glibc-headers" package.
If you want to work with a Linux kernel you will probably also need other packages.
Answer:
The error message contains clear hints for the solution: the "patch" command cannot be found on
your system, so most probably it has not been installed yet. Please try:
$ sudo apt-get install patch
175
<eldkroot>/bin/rpm -e kernel-headers-ppc_<target>
cd <eldkroot>/ppc_<target>
rm usr/include/asm
tar -xvzf kernel-headers-powerpc.tar.gz
The tarball mentioned above can be downloaded here. It contains the include files that get installed by
running the "make ARCH=powerpc headers_install" command in the Linux kernel tree.
This problem is fixed in ELDK 4.2 and later releases.
176
Answer:
If you are using at least BDI firmware v1.09 then most probably you forgot to include the following
directive in the BDI config file:
[TARGET]
REGLIST
E500
Also be sure that the gdb really thinks that it debugs an e500 core:
(gdb) show architecture
The target architecture is set automatically (currently powerpc:e500)
(gdb)
If this is not the case, then fix this problem first. It might just be that you are not using the right cross
debugger in the first place.
177
return z;
}
2. Build for normal FPU support (using the ppc_6xx target architecture):
$ export CROSS_COMPILE=ppc_6xx$ ppc_6xx-gcc -S -O fp_test.c
Check results:
$ cat fp_test.s
.file
"fp_test.c"
.section
".text"
.align 2
.globl foo
.type
foo, @function
foo:
fadd 0,1,2
fmul 1,1,2
fdiv 1,0,1
blr
.size
foo, .-foo
.ident "GCC: (GNU) 4.2.2"
.section
.note.GNU-stack,"",@progbits
The use of floating point machine instructions ("fadd", "fmul", "fdiv") and the fact that no
additional register use is needed is a clear indication that full support for the hardware FPU is
available in this configuration.
3. Build for soft-float emulation (using the ppc_8xx target architecure):
$ export CROSS_COMPILE=ppc_8xx$ ppc_8xx-gcc -S -O fp_test.c
$ cat fp_test.s
.file
"fp_test.c"
.globl __adddf3
.globl __muldf3
.globl __divdf3
.section
".text"
.align 2
.globl foo
.type
foo, @function
foo:
stwu 1,-48(1)
mflr 0
stw 24,16(1)
stw 25,20(1)
stw 26,24(1)
stw 27,28(1)
stw 28,32(1)
stw 29,36(1)
stw 0,52(1)
mr 28,3
mr 29,4
mr 26,5
mr 27,6
bl __adddf3
mr 24,3
mr 25,4
mr 3,28
mr 4,29
mr 5,26
mr 6,27
bl __muldf3
mr 5,3
178
mr 6,4
mr 3,24
mr 4,25
bl __divdf3
lwz 0,52(1)
mtlr 0
lwz 24,16(1)
lwz 25,20(1)
lwz 26,24(1)
lwz 27,28(1)
lwz 28,32(1)
lwz 29,36(1)
addi 1,1,48
blr
.size
foo, .-foo
.ident "GCC: (GNU) 4.2.2"
.section
.note.GNU-stack,"",@progbits
The fact that the compiler is calling helper functions (__adddf3, __muldf3, __divdf3)
combined with heavy use of the General Purpose Registers is a clear indication for
software-emulated FP support - and explains why this is so slow compared to a real FPU.
4. Build for SPE v2 support (as needed for example for a P2020 QorIQ processor, using the
ppc_85xxDP target architecture):
$ export CROSS_COMPILE=ppc_85xxDP$ ppc_85xxDP-gcc -S -O fp_test.c
$ cat fp_test.s
.file
"fp_test.c"
.section
".text"
.align 2
.globl foo
.type
foo, @function
foo:
stwu 1,-48(1)
stw 3,8(1)
stw 4,12(1)
stw 5,16(1)
stw 6,20(1)
evmergelo 0,3,4
evmergelo 9,5,6
efdadd 11,0,9
efdmul 0,0,9
efddiv 11,11,0
evstdd 11,24(1)
evmergehi 9,11,11
mr 10,11
stw 9,32(1)
stw 10,36(1)
mr 3,9
mr 4,10
addi 1,1,48
blr
.size
foo, .-foo
.ident "GCC: (GNU) 4.2.2"
.section
.note.GNU-stack,"",@progbits
Here we can see moderate use of General Purpos Registers combined with the use of SPE
machine instructions (evmergelo, efdadd, efdmul, efddiv, evstdd, evmergehi) which proves
that the compiler really generates code that supports the SPE.
179
Now you should be able to access the target system through SSH.
180
14.2. U-Boot
14.2.1. Can U-Boot be configured such that it can
be started in RAM?
Question:
I don't want to erase my flash memory because I'm not sure if my new U-Boot image will work. Is it
possible to configure U-Boot such that I can load it into RAM instead of flash, and start it from my
old boot loader?
Answer:
No. (Unless you're using a Blackfin processor, or Socfpga board, but you probably aren't.)
Question:
But I've been told it is possible??
Answer:
Well, yes. Of course this is possible. This is software, so everything is possible. But it is difficult,
unsupported, and fraught with peril. You are on your own if you choose to do it. And it will not help
you to solve your problem.
Question:
Why?
Answer:
U-Boot expects to see a virgin CPU on many platforms, i. e. the CPU state must match what you see
if the processor starts executing the first instructions when it comes out of reset. If you want to start
U-Boot from another boot loader, you must disable a lot of code, i. e. all initialization parts that
already have been performed by this other boot loader, like setting up the memory controller,
initializing the SDRAM, initializing the serial port, setting up a stack frame etc. Also you must
disable the relocation to RAM and adjust the link addresses etc.
(On machines with boot-ROM and U-Boot-SPL, you might have better luck.)
This requires a lot of experience with U-Boot, and the fact that you had to ask if this can be done
means that you are not in a position to do this.
The code you have to disable contains the most critical parts in U-Boot, i. e. these are the areas where
99% or more of all errors are located when you port U-Boot to a new hardware. In the result, your
RAM image may work, but in the end you will need a full image to program the flash memory with it,
and then you will have to enable all this highly critical and completely untested code.
You see? You cannot use a RAM version of U-Boot to avoid testing a flash version, so you can save
all this effort and just burn your image to flash.
Question:
So how can I test an U-Boot image and recover my system if it doesn't work?
Answer:
Attach a BDI2000 (or any appropriate JTAG ICE) to your board, burn the image to flash, and debug it
in its natural environment, i.e. U-Boot being the boot loader of the system and taking control over the
CPU right as it comes out of reset. If something goes wrong, erase the flash and program a new
image. This is a routine job using a BDI2000.
181
Answer:
ELDK 3.0 uses GCC-3.2.2; your U-Boot sources are too old for this compiler. GCC-3.x requires a
few adaptions which were added in later versions of U-Boot. Use for example the source tree (1.0.2)
which is included with the ELDK, or download the latest version from CVS.
182
operations in U-Boot. In Linux, burst accesses may also result from DMA. For example, it is typical
that a system may crash under heavy network load if the Ethernet controller uses DMA to memory.
It is NOT sufficient to program the memory controller of your CPU; each SDRAM chip also
requires a specific initialization sequence which you must adhere to to the letter - check with the chip
manufacturer's manual.
It has been observed that some operating systems like pSOS+ or VxWorks do not stress the memory
subsystem as much as Linux or other UNIX systems like LynxOS do, so just because your board
appears to work running another OS does not mean it is 100% OK.
Standard memory tests are not effective in identifying this type of problem because they do not cause
stressful cache burst read/write operations.
With this caveat in mind, reportedly this program has found memory problems before:
http://pyropus.ca/software/memtester/
Argument:
But my board ran fine with bootloader XYZ and/or operating system ABC.
Answer:
Double-check your configuration that you claim runs properly...
1. Are you sure the SDRAM is initialized using the same init sequence and values?
2. Are you sure the memory controlling registers are set the same?
3. Are you sure your other configuration uses caches and/or DMA? If it doesn't, it isn't a valid
comparison.
Why?
Answer:
Most probably everything is OK. The message is printed because the flash sector or ERPROM
containing the environment variables has never been initialized yet. The message will go away as
soon as you save the envrionment variables using the saveenv command.
No ethernet found.
183
Why?
Answer:
Some network drivers (especially on ppc4xx) respond with such a message when no valid MAC
address has been defined. Please make sure that a valid MAC address has been defined in the
environment (using the "setenv" command). Then store the environment (using the "saveenv"
command). After the next reboot, the Ethernet interface should be available.
0x01fe0000
Note: when you want to switch modes during one debug session (i. e. without restarting GDB) you
can "delete" the current symbol information by using the symbol-file command without
arguments, and then either using "symbol-file u-boot" for code before relocation, or
"add-symbol-file u-boot _offset_" for code after relocation.
184
To find out what happened, you can try to decode the stack backtrace (the list of addresses printed after the
"Call backtrace:" line. The backtrace tool can be used for this purpose. However, there is a little
problem: the addresses printed for the stack backtrace are after relocation of the U-Boot code to RAM; to use
the backtrace tool you need to know U-Boot's address offset (the difference between the start address of
U-Boot in flash and its relocation address in RAM).
The easiest way to find out the relocation address is to enable debugging for the U-Boot source file
lib_*/board.c - U-Boot will then print some debug messages
...
Now running in RAM - U-Boot at: 00f75000
...
Now you have to calculate the address offset between your link address (The value of the TEXT_BASE
definition in your board/?/config.mk file). In our case this value is 0x40000000, so the address offset
is 0x40000000 - 0x00f75000 = 0x3f08b000
Now we use the backtrace script with the System.map file in the U-Boot source tree and this address
offset:
-> backtrace System.map 0x3f08b000
Reading symbols from System.map
Using Address Offset 0x3f08b000
0x3f08b000 -- unknown address
0x4001a998 -- 0x4001a8d0 + 0x00c8
0x4001aa88 -- 0x4001aa2c + 0x005c
0x4001aaf8 -- 0x4001aad0 + 0x0028
0x4001bb5c -- 0x4001ba68 + 0x00f4
0x4001bcf8 -- 0x4001bcd8 + 0x0020
0x4000e85c -- 0x4000e6f8 + 0x0164
0x40004e6c -- 0x40004b9c + 0x02d0
0x400023b0 -- 0x400023b0 + 0x0000
free_pipe
free_pipe_list
run_list
parse_stream_outer
parse_file_outer
main_loop
board_init_r
trap_init
In this case the last "good" entry on the stack was in free_pipe...
Answer:
Check your linker script board/your_board/u-boot.lds which controls how the object files
are linked together to build the U-Boot image.
It looks as if your board uses an "embedded" environment, i. e. the flash sector containing the
environment variables is surrounded by code. The u-boot.lds tries to collect as many as possible
code in the first part, making the gap between this first part and the environment sector as small as
14.2.9. Porting Problem: cannot move location counter backwards
185
possible. Everything that does not fit is then placed in the second part, after the environment sector.
Some your modifications caused the code that was put in this first part to grow, so that the linker finds
that it would have to overwrite space that is already used.
Try commenting out one (or more) line(s) before the line containing the
"common/environment.o" statement. [ "lib_generic/zlib.o" is usually a good
candidate for testing as it's big ]. Once you get U-Boot linked, you can check in the u-boot.map
file how big the gap is, and which object files could be used to fill it up again.
186
In the example above, the area 40050000 ... 40050100 lies right in the middle of a erase unit
(40040000 ... 4005FFFF), so you cannot erase it without erasing the whole sector, i. e. you have to
type
=> erase 40040000 4005FFFF
Also note that there are some sectors marked as read-only ((RO)); you cannot erase or overwrite
these sectors without un-protecting the sectors first (see the U-Boot protect command).
187
-o tools/gen_eth_addr
...
Loading: #######T ##################################T###################T ####T ##T #
###T #T #########T ########T #############T ##T #############T ########T ###########
#####T ###T ######T #######T #######T #############T ##T ##############T ###########
###########
done
If the target is connected directly to the host PC (i. e. without a switch inbetween) the problem goes
away or is at least less incisive.
What's wrong?
Answer 1:
14.2.15. Why do I get TFTP timeouts?
188
Most probably you have a full duplex/half duplex problem. Verify that U-Boot is setting the ethernet
interface on your board to the proper duplex mode (full/half). I'm guessing your board is half duplex
but your switch is full (typical of a switch ;-).
The switch sends traffic to your board while your board is transmitting... that is a collision (late
collision at that) to your board but is OK to the switch. This doesn't happen nearly as much with a
direct link to your PC since then you have a dedicated link without much asynchronous traffic.
The software (U-Boot/Linux) needs to poll the PHY chip for duplex mode and then (re)configure the
MAC chip (separate or built into the CPU) to match. If the poll isn't happening or has a bug, you have
problems like described above.
Question 2:
When I use tftp, there are some problems. My terminal always displays "Loading: T T T T T T T T T
T T T T T T T T T T T". The whole information as follows:
U-Boot 1.1.4_XT (Jun 6 2006 - 17:36:18)
U-Boot code: 0C300000 -> 0C31AD70 BSS: -> 0C31EF98
RAM Configuration:
Bank #0: 0c000000 8 MB
Bank #1: 0c800000 8 MB
Flash: 2 MB
*** Warning - bad CRC, using default environment
In:
serial
Out:
serial
Err:
serial
Hit any key to stop autoboot: 0
XT=> help tftp
tftpboot [loadAddress] [bootfilename]
XT=> tftpboot 0x0c700000 image.bin
TFTP from server 192.168.0.23; our IP address is 192.168.0.70
Filename 'image.bin'.
Load address: 0xc700000
Loading: T T T T T T T T T T T T T T T T T T T T
Retry count exceeded; starting again
TFTP from server 192.168.0.23; our IP address is 192.168.0.70
If this doesn't work, fix your TFTP server configuration and make sure it is running.
(2) If your TFTP server is working, run ethereal (or equivalent ethernet sniffing) to see what ethernet
packets are being sent by your development board. It usually works best to run ethereal on your TFTP
server (if you run it on a different machine and you use an ethernet switch, the third machine likely
won't see the tftp packets).
189
or:
Question:
I always see transmit errors or timeouts for the first packet of a download, but then it works well.
or:
Question:
I cannot mount the Linux root file system over NFS; especially not with recent Linux kernel versions
(older kernel versions work better). Specifying "proto=tcp" as mount option greatly improves the
situation.
etc.
Answer:
There are many possible explanations for such problems. After eliminating the obvious sources (like
broken cables etc.) you should check the configuration of your Ethernet PHY. One common cause of
problems is if your PHY is hard configured in duplex mode (for example 100baseTX Full Duplex or
10baseT Full Duplex). If such a setup is combined with a autonegotiating switch, then trouble is
ahead.
Jerry Van Baren explained this as follows:
Ignoring the configuration where both ends are (presumably correctly)
manually configured, you end up with five cases, two of them
misconfigured and WRONG:
1) Autonegotiation
<-> autonegotiation - reliable.
2) 10bT half duplex
<-> autonegotiation - reliable.
3) 100bT half duplex
<-> autonegotiation - reliable.
4) 10bT *FULL* duplex <-> autonegotiation - *UNreliable*.
5) 100bT *FULL* duplex <-> autonegotiation - *UNreliable*.
The problem that I've observed is that the *humans* (the weak links)
that do the manual configuration don't understand that "parallel
detection" *must be* half duplex by definition in the spec (it is hard
to define a reliable algorithm to detect full duplex capability so the
spec writers punted). As a result, the human invariably picks "full
duplex" because everybody knows full duplex is better... and end up as
case (4) or (5). They inadvertently end up with a slower unreliable
link (lots of "collisions" resulting in runt packets) rather than the
faster better link they thought they were picking (d'oh!). The really
bad thing is that the network works fine in testing on an isolated LAN
with no traffic and absolutely craps its pants when it hits the real
world.
That is my reasoning behind my statement that we can generally ignore
the autonegotiation <-> fixed configuration case because the odds of it
working properly are poor anyway.
Rule:
Always try to set up your PHY for autonegotiation.
If you must use some fixed setting, then set it to half duplex mode.
If you really must use a fixed full-duplex setting, then you absolutley must make sure that the link
partner is configured exactly the same.
See also:
Wikipedia: Autonegotiation and Wikipedia: Duplex mismatch
190
You can also escape text by enclosing in single apostrophes, for example:
191
=> setenv check 'if imi $addr; then echo Image OK; else echo Image corrupted!!; fi'
=> print check
check=if imi $addr; then echo Image OK; else echo Image corrupted!!; fi
=> addr=0 ; run check
## Checking Image at 00000000 ...
Bad Magic Number
Image corrupted!!
=> addr=40000 ;run check
## Checking Image at 00040000 ...
Image Name:
ARM Linux-2.4.18
Created:
2003-06-02 14:10:54 UTC
Image Type:
ARM Linux Kernel Image (gzip compressed)
Data Size:
801609 Bytes = 782.8 kB
Load Address: 0c008000
Entry Point: 0c008000
Verifying Checksum ... OK
Image OK
Instead of "echo Image OK" there could be a command (sequence) to boot or otherwise deal with
the correct image; instead of the "echo Image corrupted!!" there could be a command
(sequence) to (load and) boot an alternative image, etc.
Example:
=> addr1=0
=> addr2=10
=> bootm $addr1 || bootm $addr2 || tftpboot $loadaddr $loadfile && bootm
## Booting image at 00000000 ...
Bad Magic Number
## Booting image at 00000010 ...
Bad Magic Number
TFTP from server 192.168.3.1; our IP address is 192.168.3.68
Filename '/tftpboot/TRAB/uImage'.
Load address: 0xc400000
Loading: #################################################################
#################################################################
###########################
done
Bytes transferred = 801673 (c3b89 hex)
## Booting image at 0c400000 ...
Image Name:
ARM Linux-2.4.18
This will check if the image at (flash?) address "addr1" is ok and boot it; if the image is not ok, the
alternative image at address "addr2" will be checked and booted if it is found to be OK. If both
images are missing or corrupted, a new image will be loaded over TFTP and booted.
192
$ cd /tmp/
$ wget http://download.fedora.redhat.com/pub/fedora/linux/updates/11/ppc/kernel-2.6.30.9-90
After downloading the RPM we install it (manually using "rpm2cpio" and "cpio" in the root of
the ELDK file system, "/opt/eldk/ppc_4xxFP/" :
$ cd /opt/eldk/ppc_4xxFP/
$ rpm2cpio /tmp/kernel-2.6.30.9-90.fc11.ppc.rpm | sudo cpio -vidum
This installs a lot of kernel modules in "./lib/modules/" and a kernel ELF file in "./boot" :
$ ls -l boot
total 8792
-rw-r--r-- 1 root root 1226119 Oct 17 17:31 System.map-2.6.30.9-90.fc11.ppc
-rw-r--r-- 1 root root
96224 Oct 17 17:31 config-2.6.30.9-90.fc11.ppc
-rwxr-xr-x 1 root root 7673768 Oct 17 18:20 vmlinuz-2.6.30.9-90.fc11.ppc
193
As you can see, the entry point (function hello_world()) is no longer at 0x40004 as it was before and
as it's documented. Instead, it is now at 0x40058. So you have to start your standalone program at this
address, and everything should work well.
194
Bad device tree; for example, check that the memory map set up by the boot loader (like
mapping of IMMR, PCI addresses etc.) is consistent with what is encoded in your device tree
specification.
Here some possible reasons for older Linux kernel versions:
Linux:
arch/ppc:
arch/ppc: Bad definition of the bd_info structure
You must make sure that your machine specific header file (for instance
include/asm-ppc/tqm8xx.h) includes the same definition of the Board Information structure as
we define in include/ppcboot.h, and make sure that your definition of IMAP_ADDR uses the
same value as your U-Boot configuration in CFG_IMMR.
Bad clock information
Before kernel version 2.4.5-pre5 (BitKeeper Patch 1.1.1.6, 22MAY2001) the kernel expected
the clock information in MHz, but recent kernels expect it in Hz instead. U-Boot passes the
clock information in Hz by default. To switch to the old behaviour, you can set the
environment variable "clocks_in_mhz" in U-Boot:
=> setenv clocks_in_mhz 1
=> saveenv
For recent kernel the "clocks_in_mhz" variable must not be set. If it is present in your environment, you
can delete it as follows:
=> setenv clocks_in_mhz
=> saveenv
A common error is to try "setenv clocks_in_mhz 0" or to some other value - this will not work,
as the value of the variable is not important at all. It is the existence of the variable that will be checked.
195
When auto-update support over TFTP is enabled, U-Boot will test in the initialization sequence if a
specific image file is present on the TFTP server. If this is the case, the image will be downloaded
and, if it is considered ok, installed into flash. For details, please read doc/README.update and/or
see commits 4bae9090 and e83cc063.
USB:
Several boards implement this feature, all in a slightly different way; see board/trab/auto_update.c,
board/mcc200/auto_update.c and board/esd/common/auto_update.c.
With this feature enabled, U-Boot will check during the init sequence if a USB mass storage device is
plugged in, if this contains a readable file system, and check if this contains one or more known image
files. Additionally it is possible to check if the image versions on the USB device are more recent than
those already stored in flash. If all programmed criteria match, and if the images can be read without
error, the content of the on-board storage (flash, NAND, etc.) gets automatically updated. Adaption
for other storage devices (like SD card etc.) should be trivial to implement.
14.3. Linux
14.3.1. Linux crashes randomly
Question:
On my board, Linux crashes randomly or has random exceptions (especially floating point exceptions
if it is a Power Architecture processor). Why?
Answer:
Quite likely your SDRAM initialization is bad. See UBootCrashAfterRelocation for more
information.
On a Power Architecture, the instructions beginning with 0xFF are floating point instructions. When
your memory subsystem fails, the Power Architecture is reading bad values (0xFF) and thus
executing illegal floating point instructions.
Answer:
196
Your kernel image is quite big - nearly 1 MB compressed; when it gets uncompressed it will need 2.5
... 3 MB, starting at address 0x0000. But your compressed image was stored at 1 MB (0x100000), so
the uncompressed code will overwrite the (remaining) compressed image. The solution is thus simple:
just use a higher address to download the compressed image into RAM. For example, try:
=> bootm 400000
This whole operation is based on the assumption that your boot loader does not overwrite the RAM contents U-Boot will take care not to destroy such valuable information.
197
R3-R4:
parameter passing and return values
R5-R10:
parameter passing
R13:
small data area pointer
R30:
GOT pointer
R31:
frame pointer
A function can use r0 and r3 - r12 without saving and restoring them. r13 - r31 have to be preserved so
they must be saved and restored when you want to use them. Also, cr2 - cr4 must be preserved, while cr0,
cr1, cr5 - cr7, lr, ctr and xer can be used without saving & restoring them. [ Posted Tue, 15 Jul 2003
by Paul Mackerras to [email protected] ].
See also the (E)ABI specifications for the Power Architecture architecture, Developing PowerPC Embedded
Application Binary Interface (EABI) Compliant Programs
The machine descriptor macros for your machine will be located in a similar file in your kernel source
tree. Having located your machine descriptor macros, the next step is to find out where U-Boot puts
the kernel boot tags in memory for your architecture. On the Lubbock, this address turns out to be the
start of physical RAM plus 0x100, or 0xa0000100. Add the "BOOT_PARAMS" macro with this
address to your machine descriptor macros; the result should look something like this:
MACHINE_START(LUBBOCK, "Intel DBPXA250 Development Platform")
198
If there is already a BOOT_PARAMS macro in your machine descriptor macros, modify it so that it
has the correct address. Then, rebuild your kernel and re-install it on your target. Now the kernel
should be able to pick up the kernel options you have set in the "bootargs" environment variable.
Answer:
You probably run your system with the root file system mounted over NFS. Change into the root
directory of your target file system, and remove the file "etc/ld.so.cache". That should fix this
problem:
# cd /opt/eldk/ppc_6xx/
# rm -f etc/ld.so.cache
Explanation:
Normally, the file "etc/ld.so.cache" contains a compiled list of system libraries. This file is
used by the dynamic linker/loader ld.so to cache library information. If it does not exist, rebuilt
automatically. For some reason, a corrupted or partial file was written to your root file system. This
corrupt file then confused the dynamic linker so that it crashed when trying to start the init process.
Question:
I cannot boot into my freshly installed ELDK Root-NFS because init dies with an unhandled signal
like this:
199
Answer:
Your CPU does not have a floating point unit, your kernel has no math emulation
(CONFIG_MATH_EMULATION) enabled but you still try to boot into a rootfilesystem intended for
FPU systems.
This is to be expected for example if you try to use a ppc_6xx rootfilesystem on an 8xx system.
200
The default configuration of the SELF was not designed to mount additional filesystems with file
locking over NFS, so no portmap deamon is running, which is causing your problems. There are two
solutions for the problem:
1. Add the portmap deamon (/sbin/portmap) to the target filesystem and start it as part of
the init scripts.
2. Tell the "mount" program and the kernel that you don't need file locking by passing the
"nolock" option to the mount call, i. e. use
# mount -o nolock -t nfs 192.168.1.1:/target/home /home
Explanation:
If you call the mount command like above (i. e. without the "nolock" option) an RPC call to the
"portmap" deamon will be attempted which is required to start a lockd kernel thread which is
necessary if you want to use file locking on the NFS filesystem. This call will fail only after a very
long timeout.
201
This will ensure that the boot messages are displayed on both the framebuffer (/dev/tty0) and the serial
console (/dev/ttyS0); the last device named in a console= option will be the one that takes input,
too, so with the settings above you can use the serial console to enter commands etc. For a more
detailed description see
http://www.tldp.org/HOWTO/Remote-Serial-Console-HOWTO/configure-kernel.html
202
To turn off the blinking cursor, send the sequence "\E[?25l\E[?1c" to the terminal. For
example, copy the content of file "/etc/init_tty" to the terminal:
# cat /etc/init_tty
203
I have a Power Architecture board with 1 GiB of RAM (or more). It works fine with root file system
over NFS, but it will crash when I try to use a ramdisk.
Answer:
Check where your ramdisk image gets loaded to. In the standard configuration, the Linux kernel can
access only 768 MiB of RAM, so your ramdisk image must be loaded below this limit. Check your
boot messages. You are hit by this problem when U-Boot reports something like this:
Loading Ramdisk to 3fdab000, end 3ff2ff9d ... OK
To fix, just tell U-Boot to load the ramdisk image below the 768 MB limit:
=> setenv initrd_high 30000000
If you later find out that you need an even bigger ramdisk image, or that a smaller one is sufficient, all that
needs changing is the value of the "rd_size" environment variable.
204
See also the usage message you get when you call "mkimage" without arguments.
205
This creates a new special device for the modem card; please note that /dev/ttyS0 ... S4 and
TTY_MAJOR 4 are already used by the standard 8xx UART driver). /dev/ttySp0 becomes
available for use as soon as the CardServices detect and initialize the PCMCIA modem card.
PCMCIA Wireless LAN cards
Enable the "Network device support" --> "Wireless LAN (non-hamradio)" --> "Wireless
LAN (non-hamradio)" option in the kernel configuration (CONFIG_NET_RADIO flag).
206
There is no support for "hot plug", i. e. you cannot insert or remove the card while Linux is running.
(Well, of course you can do this, but either you will not be able to access any card inserted, or when
you remove a card you will most likely crash the system. Don't do it - you have been warned!)
The code relies on initialization of the PCMCIA controller by the firmware (of course U-Boot will do
exactly what's required).
On the other hand these are no real restrictions for use in an Embedded System.
To enable the "direct IDE support" you have to select the following Linux kernel configuration options:
CONFIG_IDE=y
CONFIG_BLK_DEV_IDE=y
CONFIG_BLK_DEV_IDEDISK=y
CONFIG_IDEDISK_MULTI_MODE=y
CONFIG_BLK_DEV_MPC8xx_IDE=y
CONFIG_BLK_DEV_IDE_MODES=y
and, depending on which partition types and languages you want to support:
CONFIG_PARTITION_ADVANCED=y
CONFIG_MAC_PARTITION=y
CONFIG_MSDOS_PARTITION=y
CONFIG_NLS=y
CONFIG_NLS_DEFAULT="y"
CONFIG_NLS_ISO8859_1=y
CONFIG_NLS_ISO8859_15=y
With these options you will see messages like the following when you boot the Linux kernel:
...
Uniform Multi-Platform E-IDE driver Revision: 6.31
ide: Assuming 50MHz system bus speed for PIO modes; override with idebus=xx
PCMCIA slot B: phys mem e0000000...ec000000 (size 0c000000)
Card ID:
CF 128MB CH
Fixed Disk Card
IDE interface
[silicon] [unique] [single] [sleep] [standby] [idle] [low power]
hda: probing with STATUS(0x50) instead of ALTSTATUS(0x41)
hda: CF 128MB, ATA DISK drive
ide0 at 0xc7000320-0xc7000327,0xc3000106 on irq 13
hda: 250368 sectors (128 MB) w/16KiB Cache, CHS=978/8/32
Partition check:
hda: hda1 hda2 hda3 hda4
...
You can now access your PC Card "disk" like any normal IDE drive. If you start with a new drive, you have
to start by creating a new partition table. For Power Architecture systems, there are two commonly used
options:
207
# pdisk /dev/hda
Edit /dev/hda Command (? for help): ?
Notes:
Base and length fields are blocks, which vary in size between media.
The base field can be <nth>p; i.e. use the base of the nth partition.
The length field can be a length followed by k, m, g or t to indicate
kilo, mega, giga, or tera bytes; also the length can be <nth>p; i.e. use
the length of the nth partition.
The name of a partition is descriptive text.
Commands are:
h
help
p
print the partition table
P
(print ordered by base address)
i
initialize partition map
s
change size of partition map
c
create new partition (standard MkLinux type)
C
(create with type also specified)
n
(re)name a partition
d
delete a partition
r
reorder partition entry in map
w
write the partition table
q
quit editing (don't save changes)
Command (? for help): i
map already exists
do you want to reinit? [n/y]: y
Command (? for help): p
Partition map (with 512 byte blocks) on '/dev/hda'
#:
type name
length
base
( size )
1: Apple_partition_map Apple
63 @ 1
2:
Apple_Free Extra 1587536 @ 64
(775.2M)
Device block size=512, Number of Blocks=1587600 (775.2M)
DeviceType=0x0, DeviceId=0x0
At first we create two small partitions that will be used to store a Linux boot image; a compressed Linux
kernel is typically around 400 ... 500 kB, so chosing a partition size of 2 MB is more than generous. 2 MB
coresponds to 4096 disk blocks of 512 bytes each, so we enter:
Command (? for help): C
First block: 64
Length in blocks: 4096
Name of partition: boot0
Type of partition: PPCBoot
Command (? for help): p
Partition map (with 512 byte blocks) on '/dev/hda'
#:
type name
length
base
( size )
1: Apple_partition_map Apple
63 @ 1
2:
PPCBoot boot0
4096 @ 64
( 2.0M)
3:
Apple_Free Extra 1583440 @ 4160
(773.2M)
Device block size=512, Number of Blocks=1587600 (775.2M)
DeviceType=0x0, DeviceId=0x0
To be able to select between two kernel images (for instance when we want to do a field upgrade of the Linux
kernel) we create a second boot partition of exactly the same size:
Command (? for help): C
First block: 4160
Length in blocks: 4096
Name of partition: boot1
Type of partition: PPCBoot
Command (? for help): p
Partition map (with 512 byte blocks) on '/dev/hda'
#:
type name
length
base
( size )
1: Apple_partition_map Apple
63 @ 1
2:
PPCBoot boot0
4096 @ 64
( 2.0M)
208
3:
PPCBoot boot1
4096 @ 4160
( 2.0M)
4:
Apple_Free Extra 1579344 @ 8256
(771.2M)
Device block size=512, Number of Blocks=1587600 (775.2M)
DeviceType=0x0, DeviceId=0x0
Now we create a swap partition - 64 MB should be more than sufficient for our Embedded System; 64 MB
means 64*1024*2 = 131072 disk blocks of 512 bytes:
Command (? for help): C
First block: 8256
Length in blocks: 131072
Name of partition: swap
Type of partition: swap
Command (? for help): p
Partition map (with 512 byte blocks) on '/dev/hda'
#:
type name
length
base
( size )
1: Apple_partition_map Apple
63 @ 1
2:
PPCBoot boot0
4096 @ 64
( 2.0M)
3:
PPCBoot boot1
4096 @ 4160
( 2.0M)
4:
swap swap
131072 @ 8256
( 64.0M)
5:
Apple_Free Extra 1448272 @ 139328 (707.2M)
Device block size=512, Number of Blocks=1587600 (775.2M)
DeviceType=0x0, DeviceId=0x0
To make our changes permanent we must write the new partition table to the disk, before we quit the pdisk
program:
Command (? for help): w
Writing the map destroys what was there before. Is that okay? [n/y]: y
hda: [mac] hda1 hda2 hda3 hda4 hda5
hda: [mac] hda1 hda2 hda3 hda4 hda5
Command (? for help): q
209
6 block groups
32768 blocks per group, 32768 fragments per group
15104 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
210
e
p
extended
primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (6-1575, default 6):
Using default value 6
Last cylinder or +size or +sizeM or +sizeK (6-1575, default 1575): +2M
Command (m for help): p
Disk /dev/hda: 16 heads, 63 sectors, 1575 cylinders
Units = cylinders of 1008 * 512 bytes
Device Boot
Start
End
Blocks
Id System
/dev/hda1
1
5
2488+ 83 Linux
/dev/hda2
6
10
2520
83 Linux
Command (m for help): n
Command action
e
extended
p
primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (11-1575, default 11):
Using default value 11
Last cylinder or +size or +sizeM or +sizeK (11-1575, default 1575): +64M
Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): 82
Changed system type of partition 3 to 82 (Linux swap)
Command (m for help): p
Disk /dev/hda: 16 heads, 63 sectors, 1575 cylinders
Units = cylinders of 1008 * 512 bytes
Device Boot
Start
End
Blocks
Id System
/dev/hda1
1
5
2488+ 83 Linux
/dev/hda2
6
10
2520
83 Linux
/dev/hda3
11
141
66024
82 Linux swap
Note that we had to use the t command to mark this partition as swap space.
Command (m for help): n
Command action
e
extended
p
primary partition (1-4)
p
Partition number (1-4): 4
First cylinder (142-1575, default 142):
Using default value 142
Last cylinder or +size or +sizeM or +sizeK (142-1575, default 1575):
Using default value 1575
Command (m for help): p
Disk /dev/hda: 16 heads, 63 sectors, 1575 cylinders
Units = cylinders of 1008 * 512 bytes
Device Boot
Start
End
Blocks
Id System
/dev/hda1
1
5
2488+ 83 Linux
/dev/hda2
6
10
2520
83 Linux
/dev/hda3
11
141
66024
82 Linux swap
/dev/hda4
142
1575
722736
83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
hda: hda1 hda2 hda3 hda4
hda: hda1 hda2 hda3 hda4
WARNING: If you have created or modified any DOS 6.x
partitions, please see the fdisk manual page for additional
information.
Syncing disks.
211
:
:
:
:
:
:
:
"U-Boot"
"Environment 1"
"Environment 2"
"ASIC Images"
"Linux Kernel"
"Ramdisk Image"
"User Data"
212
clock like when using the Network Time Protocol (NTP) to access time servers on the network.
But some systems provide a high-accuracy real-time clock (RTC) while the system clocks are not as accurate,
and sometimes permanent access to the net is not possible or wanted. In such systems it makes more sense to
use the RTC as reference clock (Stratum 1 NTP server - cf. http://www.ntp.org/). To enable this mode of
operation you must edit the NTP daemon's configuration file /etc/ntp.conf in your target's root file
system. Replace the lines
server
fudge
127.127.1.0
# local clock
127.127.1.0 stratum 10
by
server 127.127.43.0
Then make sure to start the NTP daemon on your target by adding it to the corresponding init scripts and
restart it if it is already running.
The "address" of the RTC (127.127.43.0 in the example above) is not an IP address, but actually used
as an index into an internal array of supported reference clocks in the NTP daemon code. You may need to
check with your ntpd implementation if the example above does not work as expected.
The physical and virtual address of the flash memory used for XIP must be defined statically with the macros
CONFIG_XIP_PHYS_ADDR and CONFIG_XIP_VIRT_ADDR. The virtual address usually points to the end
of the kernel virtual address of the system memory. The physical and virtual address must be aligned relative
to an 8 MB boundary:
CONFIG_XIP_PHYS_ADDR = FLASH-base-address + offset-in-FLASH
CONFIG_XIP_VIRT_ADDR = 0xc0000000 + DRAM-size + offset-in-FLASH
The default configuration parameters shown above are for a system with 16MB of DRAM and the XIP kernel
image located at the physical address 0x40100000 in flash memory.
Note that the FLASH and MTD driver must be disabled.
213
You can then build the "uImage", copy it to CONFIG_XIP_PHYS_ADDR in flash memory and boot it from
CONFIG_XIP_PHYS_ADDR as usual.
This defines a cramfs filesystem located at the physical address 0x40400000 in FLASH memory.
After building the kernel image "pImage" as usual, you will want to build a filesystem using the mkcramfs
executable (it's located in /scripts/cramfs). If you do not already have a reasonable sized disk directory tree
you will need to make one. The ramdisk directory of SELF (the Simple Embedded Linux Framework from
DENX at ftp.denx.de) is a good starting point. Before you build your cramfs image you must mark the binary
files to be executed in place later on with the "t" permission:
$ mkcramfs -r ramdisk cramfs.img
214
The XIP extension is currently only available for PowerQUICCI 8xx but can easily be extended to
other architectures.
Currently only up to 8 MB of ROM/Flash are supported.
The original work was done for the amanda system.
Special thanks goes to David Petersen for collecting the availible XIP extension sources and
highlighting how to put all the pieces together.
Mem:
total:
14921728
used:
free:
3866624 11055104
shared: buffers:
2781184
0
cached:
2240512
shared: buffers:
2822144
0
cached:
2240512
Mem:
total:
16175104
used:
free:
3940352 12234752
Mem:
total:
16175104
used:
free:
2367488 13807616
shared: buffers:
610304
0
cached:
671744
The actual RAM saving is here approximately 1.1MB + 1.5M = 2.6 MB.
Have fun with XIP.
Wolfgang Grandegger ([email protected])
linux-2.4.4-2002-03-21-xip.patch.gz: Linux patches for XIP on MPC8xx
215
The serial interface of the SCC ports in MPC8xx / MPC82xx processors is designed as a DTE
circuitry and the RS-232 standard hardware flow control can not be used in the DTE to DTE
connection with the null-modem cable (with crossed RTS/CTS signals).
The RS-232 standard specifies a DTE to DCE connection and its hardware handshaking is designed
for this specific task. The hardware flow control signals in the PC (and similar equipment) are
implemented as software readable/writable bits in a control register and therefore may be arbitrary
treated. Unlike that, in the 8xx/82xx the handshake protocol is handled by the CPM microcode. The
meaning of the signals is fixed for the RS-232 standard with no way for user to change it.
In widely spread DTE-to-DTE connections over the so called 'null-modem' cable with the hardware
flow control lines the meaning of the handshake signals is changed with respect to the RS-232
standard. Therefore this approach may not be used with the 8xx/82xx.
Question:
I succeeded in activating hardware handshake on the transmit side of the SCC using the CTS signal.
However I have problems in the receive direction.
Answer:
This is caused by the semantics of the RTS signal as implemented on the SCC controllers: the CPM
will assert this signal when it wants to send out data. This means you cannot use RTS to enable the
transmitter on the other side, because it will be enabled only when the SCC is sending data itself.
Conclusions:
If you want to use 8xx/82xx based equipment in combination with RS-232 hardware control protocol,
you must have a DCE device (modem, plotter, printer, etc) on the other end.
Hardware flow control on a SCC works only in transmit direction; when receiving data the driver has
to be fast enough to prevent data overrun conditions (normally this is no problem though).
For building against older versions of the MTD headers (meaning before v2.6.8-rc1) it is required to pass the
argument "MTD_VERSION=old" to make:
make MTD_VERSION=old env
The resulting binary is called fw_printenv, but actually includes support for setting environment variables
too. To achieve this, the binary behaves according to the name it is invoked as, so you will have to create a
link called fw_setenv to fw_printenv.
216
These tools work exactly like the U-Boot commands printenv resp. setenv You can either build these
tools with a fixed configuration selected at compile time, or you can configure the tools using the
/etc/fw_env.config configuration file in your target root filesystem. Here is an example configuration
file:
# Configuration file for fw_(printenv/setenv) utility.
# Up to two entries are valid, in this case the redundant
# environment sector is assumed present.
#########################################################################
# For TQM8xxL modules:
#########################################################################
# MTD device name
Device offset
Env. size
Flash sector size
/dev/mtd0
0x8000
0x4000
0x4000
/dev/mtd0
0xC000
0x4000
0x4000
#########################################################################
# For NSCU:
#########################################################################
# MTD device name
Device offset
Env. size
Flash sector size
#/dev/mtd1
0x0000
0x8000
0x20000
#/dev/mtd2
0x0000
0x8000
0x20000
#########################################################################
# For LWMON
#########################################################################
# MTD device name
Device offset
Env. size
Flash sector size
#/dev/mtd1
0x0000
0x2000
0x40000
Solution:
The correct solution for the problem is of course to feed sufficient entropy into /dev/random. To
do so you can modify one or more appropriate device drivers on your system; for example if you
know that there is sufficient traffic on network or on a serial port than adding SA_SAMPLE_RANDOM
to the 3rd argument when calling the request_irq() function in your ethernet and/or serial
driver(s) will cause the inter-interrupt times to be used to build up entropy for /dev/random.
14.3.29. The appWeb server hangs OR /dev/random hangs
217
218
Because the ELDK right now has no device nodes for the loopback driver we create them along the way. It
goes without saying that the loop driver has to be included in the kernel configuration. You can check this by
looking for a driver for major number 7 (block devices) in /proc/devices.
Answer:
In addition to the kernel support, you need to specify the "nfsvers=3" option to use NFS protocol
version 3 as a rootfilesystem. So include something like the following in your kernel commandline:
nfsroot=[<server-ip>:]<root-dir>,nfsvers=3
219
Answer:
Application software on the target cannot open a PTY (pseudo terminal) to handle the incoming
request. To understand the problem, we have to be aware that the linux kernel and glibc support two
schemes to handle PTYs. The deprecated scheme is hooked to the kernel option
CONFIG_LEGACY_PTYS and at runtime uses (static) device files /dev/ptyxx and /dev/ttyxx
for the master- and the slave ends of the PTYs. For this to work, you need the kernel support and
/dev/[pt]tyxx pairs (where xx usually is a letter in the range p-z followed by a hexadecimal
digit) in the target file system.
The regular support is coupled to the linux kernel option CONFIG_UNIX98_PTYS and the devpts
virtual filesystem which has to be mounted on the target. Together with the device special file
/dev/ptmx this will dynamically create device files for the allocated PTYs below the mount point.
To use it, the device file has to exist and the filesystem needs to be mounted, e.g. like this:
# mkdir /dev/pts
# mknod c 5 2 /dev/ptmx
# mount -t devpts devpts /dev/pts
14.4. Self
14.4.1. How to Add Files to a SELF Ramdisk
It is not always necessary to rebuild a SELF based ramdisk image if you want to modify or to extend it.
Especially during development it is often eaiser to unpack it, modify it, and re-pack it again. To do so, you
have to understand the internal structure of the uRamdisk (resp. pRamdisk) images files as used with the
U-Boot (old: PPCBoot) boot loader:
The uRamdisk image contains two parts:
a 64 byte U-Boot header
a (usually gzip compressed) ramdisk image
To modify the contents you have to extract, uncompress and mount the ramdisk image. This can be done as
follows:
1. Extract compressed ramdisk image (ramdisk.gz)
bash$ dd if=uRamdisk bs=64 skip=1 of=ramdisk.gz
21876+1 records in
21876+1 records out
220
Now you can add, remove, or modify files in the /mnt/tmp directory. If you are done, you can re-pack the
ramdisk into a U-Boot image:
1. Unmount ramdisk image:
bash# umount /mnt/tmp
Instead of re-packing into a U-boot ramdisk image you can of course also just extract the contents of the
SELF image and re-use it as base of a (known to be working) root filesystem.
For example, you can create a JFFS2 filesystem using the mkfs.jffs2 command that comes with
the MTD Tools:
bash# mkfs.jffs2 -r /mnt/tmp -e 0x10000 -o image.jffs2
221
As root:
bash# mkdir -p /mnt/new
bash# mount -o loop new_ramdisk /mnt/new
Now you can add, remove, or modify files in the /mnt/new directory. If you are done, you can re-pack
the ramdisk into a U-Boot image:
6. Unmount ramdisk images:
As root:
bash# umount /mnt/tmp
bash# umount /mnt/new
Remember that Linux by default supports only ramdisks up to a size of 4 MB. For bigger ramdisks, you
have to either modify your LInux kernel configuration (parameter CONFIG_BLK_DEV_RAM_SIZE in the
"Block devices" menue), or pass a "ramdisk_size=" boot argument to the Linux kernel.
14.5. RTAI
14.5.1. Conflicts with asm clobber list
Question:
When I try to compile my LInux kernel after applying the RTAI patch, I get a strange "asm-specifier
for variable `__sc_3' conflicts with asm clobber list" error message. What does that mean?
Answer:
You are using an old version of the Linux kernel / RTAI patch in combination with a more recent
version of the cross compiler. Please use a recent kernel tree (and the corresponding RTAI patch), or
apply the attached patch to fix this problem.
See: http://www.denx.de/wiki/pub/DULG/ConflictsWithAsmClobberList/patch
222
14.6. BDI2000
14.6.1. Where can I find BDI2000 Configuration
Files?
The configuration files provided by Abatron can be found here: ftp://94.230.212.16/bdigdb/config/
A collection of configuration files for the BDI2000 BDM/JTAG debugger by Abatron can be found at
ftp://ftp.denx.de/pub/BDI2000/
A list of FAQ (with answers) can be found at www.ultsol.com
A list of supported flash chips (and the needed matching entries for the config file) can be found at
http://www.abatron.ch/fileadmin/user_upload/products/pdf/flashsupp.pdf
223
Answer:
Your single step problem most likely comes from the fact that GDB accesses some non-existent
memory (at least some versions do/did in the past). This exception is stored in some way within the
405 and when you step "rfi" it triggers. This is because some instructions like "rfi" are always
stepped using a hardware breakpoint and not with the JTAG single step feature.
Probably you can step over the "rfi" instruction when using the BDI2000's telnet command
interface instead of GDB.
Similar problems have also been reported when stepping through "mtmsr" or "mfmsr" during
initial boot code. The problem comes also from the fact that GDB accesses non-existent memory
(maybe it tries to read a non-existent stack frame).
To debug the Linux kernel, I recommend that you run to a point where the MMU is on before you
connect with GDB.
To debug boot code where the MMU is off I recommend to use the MMAP feature of the BDI to
prevent illegal memory accesses from GDB.
224
I believe this error is caused by GDB being configured to the wrong architecture. So I did the
following:
$ ppc_4xx-gdb u-boot
...
The target architecture is set automatically (currently powerpc:403)
(gdb) show arch
The target architecture is set automatically (currently powerpc:e500)
(gdb) set arch powerpc:403
The target architecture is assumed to be powerpc:e500
(gdb) show arch
The target architecture is assumed to be powerpc:e500
(gdb) set arch powerpc:common
The target architecture is assumed to be powerpc:e500
(gdb) show arch
The target architecture is assumed to be powerpc:e500
(gdb)
As you see, initially GDB says the target architecture is "powerpc:403". But the "show arch"
command claims it is the "powerpc:e500". And any commands that try to change it from
"powerpc:e500" do not appear to be working.
What's wrong, and why am I not able to change the architecture?
Answer:
Some versions of GDB are hard coded to try and read the architecture from the ELF file and set the
arch based on that at startup. When this happens you cannot change the arch again. In this case it
looks like it has set it incorrectly from the ELF file as "powerpc:e500".
Workaround:
The following procedure can be used to work around the problem:
Start GDB without a file argument, i. e. do not give the the name of the ELF file (here
"u-boot") on the command line
use "set arch" to set the appropriate architecture
use the "add-symbol-file" command to load the ELF file (here "u-boot") manually
double check using "show arch" to make sure the arch hasn't changed; change it back in
case it has
connect to the BDI using the "target remote" commAnd as usual and start debugging
Note:
When you see this problem with the GDB version 6.7-1rh as included with ELDK release 4.2, you
may want to install the update to version 6.7-4rh which can be found here:
ftp://ftp.denx.de/pub/eldk/4.2/ppc-linux-x86/updates/RPMS/gdb-ppc-6.7-4.i386.rpm
225
15. Glossary
ABI
- Application Binary Interface
The convention for register usage and C linkage commonly used on desktop Power Architecture machines.
Similar, but not identical to the EABI.
Includes binding specific ppc registers to certain fixed purposes, even though there may be no technical
reason to enforce such binding, simplifying the process of linking together two separate sets of object code.
e.g the ABI states that r1 shall be the stack pointer.
BANK
- also "memory bank"
A bank of memory (flash or RAM) consists of all those memory chips on your system that are controlled by
the same chip select signal.
For example, a system might consist of one flash chip with a 8 bit bus interface, which is attached to the CS0
chip select signal, 2 flash chips with a 16 bit bus interface, which are attached to the CS1 chip select signal,
and 2 SDRAM chips with a 16 bit bus interface, which are attached to the CS2 chip select signal.
This setup results in a system with 3 banks of memory:
1 bank of flash, 8 bit wide (CS0)
1 bank of flash, 32 bit wide (CS1)
1 bank of SDRAM, 32 bit wide (CS2)
BDM
- Background Debug Mode
An on-chip debug interface supported by a special hardware port on some processors. It allows to take full
control over the CPU with minimal external hardware, in many cases eliminationg the need for expensive
tools like In-Circuit-Emulators.
15. Glossary
226
BOOTP
- Boot Protocol
A network protocol which can be used to inquire a server about information for the intended system
configuration (like IP address, host name, netmask, name server, routing, name of a boot image, address of
NFS server, etc.
CFI
- Common Flash Interface
CFI is a standard for flash chips that allows to create device independend drivers for such chips.
CPM
- Communications Processor Module
The magic communications co-processor in Motorola PowerQUICC devices. It contains SCCs and SMCs, and
performs SDMA and IDMA.
CPU
- Central Processor Unit
Depending on the context, this may refer to the processor core itself, or the physical processor device
(including peripherals like memory controller, Ethernet controller, UARTs, LCD controller, ..., packaging
etc.) as a single unit. The latter is today often called "system on chip" ("SoC").
CramFs
- Compressed ROM File System
Cramfs is designed to be a simple, small, and compressed file system for ROM based embedded systems.
CramFs is read-only, limited to 256MB file systems (with 16MB files), and doesn't support 16/32 bits uid/gid,
hard links and timestamps.
CVS
- Concurrent Versions System
CVS is a version control system; it can be used to record the history of files, so that it is for instance possible
to retrieve specific versions of a source tree.
DHCP
- Dynamic Host Configuration Protocol
A network protocol which can be used to inquire a server about information for the intended system
configuration (like IP address, host name, netmask, name server, routing, name of a boot image, address of
NFS server, etc.). Sucessor of BOOTP
BOOTP
227
DMA
- Direct Memory Access
A form a data transfer directly between memory and a peripheral or between memory and memory, without
normal program intervention.
EABI
- Embedded Application Binary Interface
The convention for register usage and C linkage commonly used on embedded Power Architecture
machines, derived from the ABI.
ELDK
- Embedded Linux Development Kit
A package which contains everything you need to get startet with an Embedded Linux project on your
hardware:
cross development tools (like compiler, assembler, linker etc.) that are running on a Host system
while generating code for a Target system
native tools and libraries that can be use to build a system running on the target; they can also be
exported on a NFS server and used as root filesystem for the target
source code and binary images for PPCBoot and Linux
Our SELF package as example configuration for an embedded system.
FEC
- Fast Ethernet Controller
The 100 Mbps (100Base) Ethernet controller, present on 'T' devices such as the 860T and 855T.
FTP
- File Transfer Protocol
A protocol that can be used to transfer files over a network.
GPL
/ LGPL - GNU General Public License/Lesser General Public License
The full license text can be found at http://www.gnu.org/copyleft/gpl.html.
The licenses under which the Linux kernel and much of the utility and library code necessary to build a
complete system may be copied, distributed and modified. Each portion of the software is copyright by its
DMA
228
respected copyright holder, and you must comply with the terms of the license in order to legally copy (and
hence use) it. One significant requirement is that you freely redistribute any modifications you make; if you
can't cope with this, embedded Linux isn't for you.
Host
The computer system which is used for software development. For instance it is used to run the tools of the
ELDK to build software packages.
IDMA
- Independent DMA
A general purpose DMA engine with relatively limited throughput provided by the microcoded CPM, for use
with external peripherals or memory-to-memory transfers.
JFFS
- Journalling Flash File System
JFFS (developed by Axis Communicartion AB, Sweden) is a log-based filesystem on top of the MTD layer; it
promises to keep your filesystem and data in a consistent state even in cases of sudden power-down or system
crashes. That's why it is especially useful for embedded devices where a regular shutdown procedure cannot
always be guaranteed.
JFFS2
- Second version of the Journalling Flash File System
Like JFFS this is a journalling flash filesystem that is based on the MTD layer; it fixes some design problems
of JFFS and adds transparent compression.
JTAG
- Joint Test Action Group
A standard (see "IEEE Standard 1149.1") that defines how to control the pins of JTAG compliant devices.
Here: An on-chip debug interface supported by a special hardware port on some processors. It allows to take
full control over the CPU with minimal external hardware, in many cases eliminationg the need for expensive
tools like In-Circuit-Emulators.
MII
- Media Independent Interface
The IEEE Ethernet standard control interface used to communicate between the Ethernet controller (MAC)
and the external PHY.
GPL
229
MMU
- Memory Management Unit
CPU component which maps kernel- and user-space virtual addresses to physical addresses, and is an integral
part of Linux kernel operation.
MTD
- Memory Technology Devices
The MTD functions in Linux support memory devices like flash or Disk-On-Chip in a device-independend
way so that the higher software layers (like filesystem code) need no knowledge about the actual hardware
properties.
PC
Card
PC Cards are self-contained extension cards especially for laptops and other types of portable computers. In
just about the size of a credit card they provide functions like LAN cards (including wireless LAN), modems,
ISDN cards, or hard disk drives - often "solid-state" disks based on flash chips.
The PC Card technology has been has been developed and standardized by the Personal Computer Memory
Card International Association (PCMCIA), see http://www.pcmcia.org/pccard.htm .
PCMCIA
- Personal Computer Memory Card International Association
PCMCIA is an abbreviation that can stand for several things: the association which defines the standard, the
specification itself, or the devices. The official term for the devices is PC-Card.
PHY
- Physical Interface
The physical layer transceiver which implements the IEEE Ethernet standard interface between the ethernet
wires (twisted pair, 50 ohm coax, etc.) and the ethernet controller (MAC). PHYs are often external
transceivers but may be integrated in the MAC chip or in the CPU.
The PHY is controlled more or less transparently to software via the MII.
RTOS
- Real-Time Operating System
SCC
- Serial Communications Controller
MMU
230
The high performance module(s) within the CPM which implement the lowest layer of various serial
protocols, such as Asynchronous serial (UART), 10 Mbps Ethernet, HDLC etc.
SDMA
- Serial DMA
DMA used to transfer data to and from the SCCs.
SELF
- Simple Embedded Linux Framework
A simple default configuration for Embedded Linux systems that is suitable as starting point for building your
own systems. It is based on BusyBox to provide an init process, shell, and many common tools (from cat
and ls to vi), plus some other tools to provide network connectivity, allowing to access the system over the
internet using telnet and FTP services.
SIU
- System Interface Unit
Provides much of the external interfacing logic. It's the other major module on Motorola PowerQUICC
devices alongside the CPU core and CPM.
SMC
- Serial Management Controller
A lower performance version of the SCCs with more limited functionality, particularly useful for serial debug
ports and low throughput serial protocols.
SPI
- Serial Peripheral Interface
A relatively simple synchronous serial interface for connecting low speed external devices using minimal
wires.
S-Record
- Motorola S-Record Format
Motorola S-records are an industry-standard format for transmitting binary files to target systems and PROM
programmers.
See also: http://pmon.groupbsd.org/Info/srec.htm
SCC
231
Target
The computer system which will be used later in you application environment, for instance an Embedded
System. In many cases it has a different architecture and much more limited resoucres than a typical Host
system, so it is often not possible to develop the software directly (native) on this system.
TFTP
- Trivial File Transfer Protocol
A simple network protocol for file transfer; used in combination with BOOTP or DHCP to load boot images
etc. over the network.
UART
- Universal Asynchronous Receiver Transmitter
Generically, this refers to any device capable of implementing a variety of asynchronous serial protocols, such
as RS-232, HDLC and SDLC. In this context, it refers to the operating mode of the SCCs which provides this
functionality.
UPM
- User Programmable Machine
A highly flexible bus interfacing machine unit allowing external peripherals with an extremely wide variety of
interfacing requirements to be connected directly to the CPU.
YellowDog
More information about the YellowDog GNU/Linux distribution for Power Architecture systems can be
found at http://www.yellowdoglinux.com.
Target
232