U-Boot
From Openmoko
(→Environment) |
(→Environment) |
||
Line 99: | Line 99: | ||
</pre> | </pre> | ||
− | Note: When setting multiple commands, e.g. for bootcmd, you need | + | Note: When setting multiple commands, e.g. for bootcmd, you need to escape the ';', for instance |
+ | |||
+ | <pre> | ||
+ | QT2410 # setenv bootcmd=mmcinit\; ext2load mmc 0 0x32000000 uImage\; bootm 0x32000000 | ||
+ | </pre> | ||
=== MMC/SD === | === MMC/SD === |
Revision as of 14:24, 14 September 2006
Contents |
General
The GTA01 uses the u-boot bootloader.
More information on u-boot can be found at [1], [2] and [3].
However, the vanilla u-boot doesn't support many of the features that GTA01 needs, such as
- Support for boot from NAND flahs using S3C2410 Steppingstone
- Support for reading kernel/initrd from SD/Transflash
- Support for S3C2410 NAND flash
- Support for downloading programs via S3C2410 USB Device Controller
- Support to display bootup logo / status on S3C2410 Framebuffer
User:HaraldWelte is working on those issues, and in fact most of them have already been implemented.
Bootloader source code
The current bootloader source code can be found at [4]. You will need the original tar.bz2 archive as well as the u-boot-qt2410.patch.
Untar the sources, apply the patch. run "make qt2410_config", run "make". You will get a resulting "u-boot.bin" image, which you can directly flash (either using existing bootloader or sjf2410-linux) into NAND.
Bootloader binary
The latest bootloader binary (for NAND) can be found at [5]. It should be written to the NAND flash address 0x00000000 (size 0x30000)
Bootloader development
If you want to do bootloader development on the QT2410, it's easier to work with a bootloader image that can be downloaded via USB into RAM instead of flashing.
To do so, you need to edit the u-boot/include/configs/qt2410.h file, and change the "if 0" in Line 32 into a "if 1", then recompile with "make".
The resulting "u-boot.bin" is _NOT SUITABLE_ for NAND flash, but only for direct execution from within ram, e.g. by using the s3c2410_boot_usb program.
Creating bootable images
u-boot needs bootable images (such as kernels, but also initrd and others) in form of a so-called uImage. In order to create a uImage from e.g. a vmlinux kernel image, you can proceed as follows:
objcopy -O binary -R .note -R .comment -S vmlinux linux.bin gzip -9 linux.bin u-boot/tools/mkimage -A arm -O linux -T kernel -C gzip -a 30008000 -e 30008000 -n "Kernel Image QT2410" -d linux.bin.gz uImage
Bootloader prompt
The bootloader is currently configured to waid for three seconds. If a key press on the serial port is received within those three seconds, auto-boot is aborted.
U-Boot 1.1.4-ga2c95a72-dirty (Aug 6 2006 - 22:05:48) DRAM: 64 MB Flash: 512 kB NAND: 64 MiB In: serial Out: serial Err: serial cs8900a chipid 0x630e Hit any key to stop autoboot: 0 QT2410 #
Auto-boot
Auto-boot executes the command[s] specified in the bootcmd environment variable. The default configuration is:
QT2410 # printenv bootcmd=mmcinit; ext2load mmc 0 0x32000000 uImage; bootm 0x32000000
This basically tells us that it will copy a file called "uImage" from the SD-Card to memory address 0x32000000 and then try to boot it.
Environment
u-boot is configured to manage a non-volatile environment that is stored in NAND flash. You can use the commands to read/alter/store the environment in the following example:
QT2410 # printenv bootcmd=mmcinit; ext2load mmc 0 0x32000000 uImage; bootm 0x32000000 bootdelay=3 baudrate=115200 ipaddr=10.0.0.110 serverip=10.0.0.1 netmask=255.255.255.0 bootargs=root=/dev/mmcblk0p1 console=ttySAC0,115200 loglevel=8 rootdelay=10 stdin=serial stdout=serial stderr=serial Environment size: 271/16380 bytes QT2410 # setenv bootdelay 10 QT2410 # printenv bootdelay bootdelay=10 QT2410 # saveenv Saving Environment to NAND... Erasing Nand...Writing to Nand... done QT2410 #
Note: When setting multiple commands, e.g. for bootcmd, you need to escape the ';', for instance
QT2410 # setenv bootcmd=mmcinit\; ext2load mmc 0 0x32000000 uImage\; bootm 0x32000000
MMC/SD
in order to initialize a MMC/SD card, you have to use the ``mmcinit command.
QT2410 # mmcinit trying to detect SD Card... MMC found. Card desciption is: Manufacturer ID = 58d564 HW/FW Revision = 3 8 Product Name = 21DN!@X� Serial Number = 445303 Month = 5 Year = 2000 READ_BL_LEN=15, C_SIZE_MULT=7, C_SIZE=3197 size = 4208984064
afterwards, you can read ext2 and fat filesystems like:
QT2410 # ext2ls mmc 0 <DIR> 1024 . <DIR> 1024 .. <DIR> 12288 lost+found 1544788 uImage
NAND
QT2410 # help nand nand info - show available NAND devices nand device [dev] - show or set current device nand read[.jffs2] - addr off size nand write[.jffs2] - addr off size - read/write `size' bytes starting at offset `off' to/from memory address `addr' nand erase [clean] [off size] - erase `size' bytes from offset `off' (entire device if not specified) nand bad - show bad blocks nand dump[.oob] off - dump page nand scrub - really clean NAND erasing bad blocks (UNSAFE) nand markbad off - mark bad block at offset (UNSAFE) nand biterr off - make a bit error at offset (UNSAFE)
Loading Kernel from NAND
QT2410 # nand read 0x32000000 0x34000 0x200000 NAND read: device 0 offset 212992, size 2097152 ... 2097152 bytes read: OK QT2410 # bootm 0x32000000 ## Booting image at 32000000 ... Image Name: Kernel Image QT2410 Created: 2006-08-06 20:23:01 UTC Image Type: ARM Linux Kernel Image (gzip compressed) Data Size: 1546258 Bytes = 1.5 MB Load Address: 30008000 Entry Point: 30008000 Verifying Checksum ... OK Uncompressing Kernel Image ... OK Starting kernel ...
Writing new bootloader to NAND
The following set of commands loads the file u-boot.bin from ext2/mmc and flashes it into the bootloader flash partition:
QT2410 # ext2load mmc 0 0x32000000 u-boot.bin QT2410 # nand erase 0x00000000 0x30000 QT2410 # nand write 0x32000000 0x00000000 0x30000
Writing kernel to NAND
The following set of commands loads the file uImage from ext2/mmc and flashes it into the kernel flash partition:
QT2410 # ext2load mmc 0 0x32000000 uImage QT2410 # nand erase 0x00034000 0x200000 QT2410 # nand write 0x32000000 0x00034000 0x200000
TFTP
The QT2410 cs8900a Ethernet can be used to download images via network.
First, you have to make sure that ipaddr, serverip, ethaddr' and netmaskk are set correctly in the environment:
QT2410 # printenv ethaddr=00:01:02:03:04:05 netmask=255.255.255.0 ipaddr=192.168.100.100 serverip=192.168.100.1
TFTP kernel download
QT2410 # tftpboot 0x32000000 *** Warning: no boot file name; using 'C0A86464.img' TFTP from server 192.168.100.1; our IP address is 192.168.100.100 Filename 'C0A86464.img'. Load address: 0x32000000 Loading: ################################################################# ################################################################# ################################################################# ################################################################# ########################################## done Bytes transferred = 1544788 (179254 hex)
you can then commence booting via
QT2410# bootm 0x32000000