Linux HOWTO:
============Porting Linux to U-Boot based systems:
---------------------------------------U-Boot cannot save you from doing all the necessary modifications to
configure the Linux device drivers for use with your target hardware(no, we don't intend to provide a full virtual machine interface toLinux :-).But now you can ignore ALL boot loader code (in arch/powerpc/mbxboot).
Just make sure your machine specific header file (for instance
include/asm-ppc/tqm8xx.h) includes the same definition of the BoardInformation structure as we define in include/asm-<arch>/u-boot.h,and make sure that your definition of IMAP_ADDR uses the same valueas your U-Boot configuration in CONFIG_SYS_IMMR. Configuring the Linux kernel:-----------------------------No specific requirements for U-Boot. Make sure you have some root
device (initial ramdisk, NFS) for your target system. Building a Linux Image:-----------------------With U-Boot, "normal" build targets like "zImage" or "bzImage" are
not used. If you use recent kernel source, a new build target"uImage" will exist which automatically builds an image usable byU-Boot. Most older kernels also have support for a "pImage" target,which was introduced for our predecessor project PPCBoot and uses a100% compatible format.Example:
make TQM850L_config
make oldconfig make dep make uImageThe "uImage" build target uses a special tool (in 'tools/mkimage') to
encapsulate a compressed Linux kernel image with header information,CRC32 checksum etc. for use with U-Boot. This is what we are doing:* build a standard "vmlinux" kernel image (in ELF binary format):
* convert the kernel into a raw binary image:
${CROSS_COMPILE}-objcopy -O binary \
-R .note -R .comment \ -S vmlinux linux.bin* compress the binary image:
gzip -9 linux.bin
* package compressed binary image for U-Boot:
mkimage -A ppc -O linux -T kernel -C gzip \
-a 0 -e 0 -n "Linux Kernel Image" \ -d linux.bin.gz uImage The "mkimage" tool can also be used to create ramdisk images for usewith U-Boot, either separated from the Linux kernel image, orcombined into one file. "mkimage" encapsulates the images with a 64byte header containing information about target architecture,operating system, image type, compression method, entry points, timestamp, CRC32 checksums, etc."mkimage" can be called in two ways: to verify existing images and
print the header information, or to build new images.In the first form (with "-l" option) mkimage lists the information
contained in the header of an existing U-Boot image; this includeschecksum verification:tools/mkimage -l image
-l ==> list image header informationThe second form (with "-d" option) is used to build a U-Boot image
from a "data file" which is used as image payload:tools/mkimage -A arch -O os -T type -C comp -a addr -e ep \
-n name -d data_file image -A ==> set architecture to 'arch' -O ==> set operating system to 'os' -T ==> set image type to 'type' -C ==> set compression type 'comp' -a ==> set load address to 'addr' (hex) -e ==> set entry point to 'ep' (hex) -n ==> set image name to 'name' -d ==> use image data from 'datafile'Right now, all Linux kernels for PowerPC systems use the same load
address (0x00000000), but the entry point address depends on thekernel version:- 2.2.x kernels have the entry point at 0x0000000C,
- 2.3.x and later kernels have the entry point at 0x00000000.So a typical call to build a U-Boot image would read:
-> tools/mkimage -n '2.4.4 kernel for TQM850L' \
> -A ppc -O linux -T kernel -C gzip -a 0 -e 0 \ > -d /opt/elsk/ppc_8xx/usr/src/linux-2.4.4/arch/powerpc/coffboot/vmlinux.gz \ > examples/uImage.TQM850L Image Name: 2.4.4 kernel for TQM850L Created: Wed Jul 19 02:34:59 2000 Image Type: PowerPC Linux Kernel Image (gzip compressed) Data Size: 335725 Bytes = 327.86 kB = 0.32 MB Load Address: 0x00000000 Entry Point: 0x00000000To verify the contents of the image (or check for corruption):
-> tools/mkimage -l examples/uImage.TQM850L
Image Name: 2.4.4 kernel for TQM850L Created: Wed Jul 19 02:34:59 2000 Image Type: PowerPC Linux Kernel Image (gzip compressed) Data Size: 335725 Bytes = 327.86 kB = 0.32 MB Load Address: 0x00000000 Entry Point: 0x00000000NOTE: for embedded systems where boot time is critical you can trade
speed for memory and install an UNCOMPRESSED image instead: thisneeds more space in Flash, but boots much faster since it does notneed to be uncompressed:-> gunzip /opt/elsk/ppc_8xx/usr/src/linux-2.4.4/arch/powerpc/coffboot/vmlinux.gz
-> tools/mkimage -n '2.4.4 kernel for TQM850L' \ > -A ppc -O linux -T kernel -C none -a 0 -e 0 \ > -d /opt/elsk/ppc_8xx/usr/src/linux-2.4.4/arch/powerpc/coffboot/vmlinux \ > examples/uImage.TQM850L-uncompressed Image Name: 2.4.4 kernel for TQM850L Created: Wed Jul 19 02:34:59 2000 Image Type: PowerPC Linux Kernel Image (uncompressed) Data Size: 792160 Bytes = 773.59 kB = 0.76 MB Load Address: 0x00000000 Entry Point: 0x00000000 Similar you can build U-Boot images from a 'ramdisk.image.gz' filewhen your kernel is intended to use an initial ramdisk:-> tools/mkimage -n 'Simple Ramdisk Image' \
> -A ppc -O linux -T ramdisk -C gzip \ > -d /LinuxPPC/images/SIMPLE-ramdisk.image.gz examples/simple-initrd Image Name: Simple Ramdisk Image Created: Wed Jan 12 14:01:50 2000 Image Type: PowerPC Linux RAMDisk Image (gzip compressed) Data Size: 566530 Bytes = 553.25 kB = 0.54 MB Load Address: 0x00000000 Entry Point: 0x00000000 Installing a Linux Image:-------------------------To downloading a U-Boot image over the serial (console) interface,
you must convert the image to S-Record format:objcopy -I binary -O srec examples/image examples/image.srec
The 'objcopy' does not understand the information in the U-Boot
image header, so the resulting S-Record file will be relative toaddress 0x00000000. To load it to a given address, you need tospecify the target address as 'offset' parameter with the 'loads'command.Example: install the image to address 0x40100000 (which on the
TQM8xxL is in the first Flash bank):=> erase 40100000 401FFFFF
.......... done
Erased 8 sectors=> loads 40100000
## Ready for S-Record download ... ~>examples/image.srec 1 2 3 4 5 6 7 8 9 10 11 12 13 ... ... 15989 15990 15991 15992 [file transfer complete] [connected] ## Start Addr = 0x00000000 You can check the success of the download using the 'iminfo' command;this includes a checksum verification so you can be sure no datacorruption happened:=> imi 40100000
## Checking Image at 40100000 ...
Image Name: 2.2.13 for initrd on TQM850L Image Type: PowerPC Linux Kernel Image (gzip compressed) Data Size: 335725 Bytes = 327 kB = 0 MB Load Address: 00000000 Entry Point: 0000000c Verifying Checksum ... OK Boot Linux:-----------The "bootm" command is used to boot an application that is stored in
memory (RAM or Flash). In case of a Linux kernel image, the contentsof the "bootargs" environment variable is passed to the kernel asparameters. You can check and modify this variable using the"printenv" and "setenv" commands: => printenv bootargs bootargs=root=/dev/ram=> setenv bootargs root=/dev/nfs rw nfsroot=10.0.0.2:/LinuxPPC nfsaddrs=10.0.0.99:10.0.0.2
=> printenv bootargs
bootargs=root=/dev/nfs rw nfsroot=10.0.0.2:/LinuxPPC nfsaddrs=10.0.0.99:10.0.0.2=> bootm 40020000
## Booting Linux kernel at 40020000 ... Image Name: 2.2.13 for NFS on TQM850L Image Type: PowerPC Linux Kernel Image (gzip compressed) Data Size: 381681 Bytes = 372 kB = 0 MB Load Address: 00000000 Entry Point: 0000000c Verifying Checksum ... OK Uncompressing Kernel Image ... OK Linux version 2.2.13 (wd@denx.local.net) (gcc version 2.95.2 19991024 (release)) #1 Wed Jul 19 02:35:17 MEST 2000 Boot arguments: root=/dev/nfs rw nfsroot=10.0.0.2:/LinuxPPC nfsaddrs=10.0.0.99:10.0.0.2 time_init: decrementer frequency = 187500000/60 Calibrating delay loop... 49.77 BogoMIPS Memory: 15208k available (700k kernel code, 444k data, 32k init) [c0000000,c1000000] ...If you want to boot a Linux kernel with initial RAM disk, you pass
the memory addresses of both the kernel and the initrd image (PPBCOOTformat!) to the "bootm" command:=> imi 40100000 40200000
## Checking Image at 40100000 ...
Image Name: 2.2.13 for initrd on TQM850L Image Type: PowerPC Linux Kernel Image (gzip compressed) Data Size: 335725 Bytes = 327 kB = 0 MB Load Address: 00000000 Entry Point: 0000000c Verifying Checksum ... OK## Checking Image at 40200000 ...
Image Name: Simple Ramdisk Image Image Type: PowerPC Linux RAMDisk Image (gzip compressed) Data Size: 566530 Bytes = 553 kB = 0 MB Load Address: 00000000 Entry Point: 00000000 Verifying Checksum ... OK=> bootm 40100000 40200000
## Booting Linux kernel at 40100000 ... Image Name: 2.2.13 for initrd on TQM850L Image Type: PowerPC Linux Kernel Image (gzip compressed) Data Size: 335725 Bytes = 327 kB = 0 MB Load Address: 00000000 Entry Point: 0000000c Verifying Checksum ... OK Uncompressing Kernel Image ... OK ## Loading RAMDisk Image at 40200000 ... Image Name: Simple Ramdisk Image Image Type: PowerPC Linux RAMDisk Image (gzip compressed) Data Size: 566530 Bytes = 553 kB = 0 MB Load Address: 00000000 Entry Point: 00000000 Verifying Checksum ... OK Loading Ramdisk ... OK Linux version 2.2.13 (wd@denx.local.net) (gcc version 2.95.2 19991024 (release)) #1 Wed Jul 19 02:32:08 MEST 2000 Boot arguments: root=/dev/ram time_init: decrementer frequency = 187500000/60 Calibrating delay loop... 49.77 BogoMIPS ... RAMDISK: Compressed image found at block 0 VFS: Mounted root (ext2 filesystem).bash#
Boot Linux and pass a flat device tree:
-----------First, U-Boot must be compiled with the appropriate defines. See the section
titled "Linux Kernel Interface" above for a more in depth explanation. Thefollowing is an example of how to start a kernel and pass an updatedflat device tree:=> print oftaddr
oftaddr=0x300000=> print oftoft=oftrees/mpc8540ads.dtb=> tftp $oftaddr $oftSpeed: 1000, full duplexUsing TSEC0 deviceTFTP from server 192.168.1.1; our IP address is 192.168.1.101Filename 'oftrees/mpc8540ads.dtb'.Load address: 0x300000Loading: #doneBytes transferred = 4106 (100a hex)=> tftp $loadaddr $bootfileSpeed: 1000, full duplexUsing TSEC0 deviceTFTP from server 192.168.1.1; our IP address is 192.168.1.2Filename 'uImage'.Load address: 0x200000Loading:############doneBytes transferred = 1029407 (fb51f hex)=> print loadaddrloadaddr=200000=> print oftaddroftaddr=0x300000=> bootm $loadaddr - $oftaddr## Booting image at 00200000 ... Image Name: Linux-2.6.17-dirty Image Type: PowerPC Linux Kernel Image (gzip compressed) Data Size: 1029343 Bytes = 1005.2 kB Load Address: 00000000 Entry Point: 00000000 Verifying Checksum ... OK Uncompressing Kernel Image ... OKBooting using flat device tree at 0x300000Using MPC85xx ADS machine descriptionMemory CAM mapping: CAM0=256Mb, CAM1=256Mb, CAM2=0Mb residual: 0Mb[snip]