U-Boot
From Openmoko
m (→Phase0 Quick Start) |
m (→U-Boot source code) |
||
(137 intermediate revisions by 55 users not shown) | |||
Line 1: | Line 1: | ||
− | + | {{Languages|U-Boot}} | |
+ | {{Bootloader}} | ||
− | == | + | Just want to note that I (gena2x) decided to provide and support U-Boot as far as I can. To find info on my latest U-Boot version with bug-fixes, description how to setup u-boot, list of known bugs please visit '''[[U-boot-gena2x]]''' |
− | * | + | |
+ | {{outdated}} | ||
+ | |||
+ | [[Image:GTA01-U-Boot.JPG|thumb|300px|U-Boot menu on Neo 1973]] [[Image:Neo1973 uboot splash closeup.jpg|thumb|300px|[[Configuring_the_boot_splash_screens#U-Boot_Splash|U-Boot splash screen]] on Neo 1973]] | ||
+ | |||
+ | '''U-Boot''' is a [[bootloader]] which can be used on the [[Neo 1973]] and [[Neo FreeRunner]]. It takes care of device functionality until the operating system is booted. This includes [[USB DFU]] for [[Flashing the Neo FreeRunner]], a [[Configuring_the_boot_splash_screens#U-Boot_Splash|splash screen]], a boot menu, a console for [[U-Boot commands]], configuration via [[U-Boot environment]], and loading a [[kernel]]. | ||
+ | |||
+ | == Booting into U-Boot == | ||
+ | |||
+ | * Make sure that your phone has had the battery and USB cable removed for at least 30 seconds. | ||
* Hold in the AUX button on power-up to access the boot menu. | * Hold in the AUX button on power-up to access the boot menu. | ||
+ | * Connect the Neo (ie not Debug Board) to a Linux host with the USB cable. | ||
* Set the console to USB. | * Set the console to USB. | ||
− | * Connect to /dev/ttyACM0 with a terminal program on the Linux host | + | * Connect to /dev/ttyACM0 with a terminal program on the Linux host (you might need to chown uucp.uucp /dev/ttyACM0; see also below) |
* Note that the cdc_acm /dev/ttyACM0 access disappears as soon as the Neo boots, and is replaced by the cdc_ether usb0 network access. | * Note that the cdc_acm /dev/ttyACM0 access disappears as soon as the Neo boots, and is replaced by the cdc_ether usb0 network access. | ||
− | * You're now at the | + | * You're now at the U-Boot prompt. |
− | * Set the bootdelay | + | * Set the bootdelay U-Boot environment variable to -1 if you want it to always halt at the U-Boot on power-up. |
== General == | == General == | ||
− | + | More information on U-Boot can be found at | |
− | + | ||
− | More information on | + | |
* http://www.denx.de/wiki/DULG | * http://www.denx.de/wiki/DULG | ||
* http://www.gumstix.org/tikiwiki/tiki-index.php?page=U-Boot | * http://www.gumstix.org/tikiwiki/tiki-index.php?page=U-Boot | ||
* http://linuxdevices.com/articles/AT5085702347.html | * http://linuxdevices.com/articles/AT5085702347.html | ||
− | + | Additions to the vanilla U-Boot already implemented include: | |
* Support for boot from NAND flash using [[S3C2410 Steppingstone]] | * Support for boot from NAND flash using [[S3C2410 Steppingstone]] | ||
− | |||
* Support for S3C2410 NAND flash | * Support for S3C2410 NAND flash | ||
* Support for downloading programs via S3C2410 USB Device Controller | * Support for downloading programs via S3C2410 USB Device Controller | ||
* Support to display bootup logo / status on S3C2410 Framebuffer | * Support to display bootup logo / status on S3C2410 Framebuffer | ||
− | + | However, U-Boot still doesn't support many of the features that GTA01 needs, such as | |
+ | * Support for reading kernel/initrd from SD/Transflash | ||
− | + | [[User:HaraldWelte|HaraldWelte]] is working on those issues, and in fact most of them have already been implemented. | |
− | + | == U-Boot source code == | |
− | + | The current U-Boot source can be found at http://git.openmoko.org/?p=u-boot.git;a=shortlog;h=stable . | |
− | + | To get U-Boot by git: | |
− | + | git clone git://git.openmoko.org/git/u-boot.git openmoko/u-boot | |
− | == | + | To build U-Boot: |
+ | * Clone the git tree and check out the stable branch (commands from above) | ||
+ | git checkout origin/stable | ||
+ | * Set the CROSS_COMPILE environment variable to specify the prefix to your toolchain binaries | ||
+ | * Run "make gta02v5_config" (or gta01bv4_config, or whatever hardware revision you have) | ||
+ | * Run "make u-boot.udfu". This will give you an image which you can install with dfu-util, or which you can upload into memory via JTAG (with a debug board) | ||
+ | |||
+ | All together: | ||
+ | |||
+ | git clone git://git.openmoko.org/git/u-boot.git openmoko/u-boot | ||
+ | cd openmoko/u-boot | ||
+ | git checkout origin/stable | ||
+ | export CROSS_COMPILE=arm-angstrom-linux-gnueabi- | ||
+ | make gta02v5_config | ||
+ | make u-boot.udfu | ||
+ | |||
+ | == U-Boot binary == | ||
+ | |||
+ | The latest U-Boot binary builds can be found under: | ||
+ | * Before 20100131? Are there any newer that supports ubifs? Can it be replaced by [[Qi]]?: | ||
+ | ** http://downloads.openmoko.org/distro/unstable/daily/ | ||
+ | |||
+ | All versions of the GTA02 (Neo FreeRunner) that have been sold to the public are version 5 hardware, so look for a file with "gta02" and "v5" in the name, for example: | ||
+ | uboot-gta02v5-latest.bin | ||
+ | |||
+ | The file should be written to the NAND flash address 0x00000000 (size 0x30000) (the first [[Partitions|partition]]). | ||
+ | |||
+ | == U-Boot development == | ||
=== QT2410 === | === QT2410 === | ||
− | If you want to do | + | If you want to do U-Boot development on the QT2410, it's easier to work with a U-Boot 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". | 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". | ||
Line 47: | Line 83: | ||
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. | 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. | ||
− | === | + | === Neo 1973 === |
− | Doing | + | Doing U-Boot development on the [[Neo 1973]] is a bit more tricky. First, we don't have any NOR flash. Second, there is no other way to boot _but_ from NAND. Therefore, we also don't have a USB downloader like the QT2410. |
The main problem is: The [[S3C2410 Steppingstone]] unconditionally copies the first 4k of flash into its internal SRAM. That SRAM segment stays unconditionally mapped at physical address zero. How do we get around this | The main problem is: The [[S3C2410 Steppingstone]] unconditionally copies the first 4k of flash into its internal SRAM. That SRAM segment stays unconditionally mapped at physical address zero. How do we get around this | ||
+ | |||
+ | === Neo FreeRunner === | ||
+ | {{main|Neo_FreeRunner_Memory_Mapping}} | ||
==== Using JTAG to boot from RAM ==== | ==== Using JTAG to boot from RAM ==== | ||
− | So how can we boot from RAM? We use JTAG / OpenOCD to | + | So how can we boot from RAM? We use JTAG / OpenOCD to: |
− | * | + | * Reset and halt the cpu at PC=0 |
<pre> | <pre> | ||
> reset halt | > reset halt | ||
Line 65: | Line 104: | ||
</pre> | </pre> | ||
− | * | + | * Download a small piece of code for low-level SDRAM timing initialization (overwrite 4k SRAM of steppingstone) |
<pre> | <pre> | ||
− | > load_binary /space/misc/gta01/u-boot.git/ | + | > load_binary /space/misc/gta01/u-boot.git/board/gta01/lowlevel_foo.bin 0 |
downloaded 332 byte in 0s 21899us | downloaded 332 byte in 0s 21899us | ||
</pre> | </pre> | ||
− | * | + | * Assert a break point at address 0x33f80000 (which indicates that the low-level code has finished) |
<pre> | <pre> | ||
> bp 0x33f80000 4 hw | > bp 0x33f80000 4 hw | ||
Line 77: | Line 116: | ||
</pre> | </pre> | ||
− | * | + | * Run the code up to the break point |
<pre> | <pre> | ||
> resume | > resume | ||
Line 87: | Line 126: | ||
</pre> | </pre> | ||
− | * | + | * Download the U-Boot RAM image to 0x33f80000 |
<pre> | <pre> | ||
> load_binary /space/misc/gta01/u-boot.git/u-boot.bin 0x33f80000 | > load_binary /space/misc/gta01/u-boot.git/u-boot.bin 0x33f80000 | ||
Line 93: | Line 132: | ||
</pre> | </pre> | ||
− | * | + | * Resume processing |
<pre> | <pre> | ||
> resume | > resume | ||
Line 110: | Line 149: | ||
Out: serial | Out: serial | ||
Err: serial | Err: serial | ||
− | Hit any key to stop autoboot: 0 | + | Hit any key to stop autoboot: 0 |
− | GTA01Bv2 # | + | GTA01Bv2 # |
</pre> | </pre> | ||
== Creating bootable images == | == 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: | |
<pre> | <pre> | ||
Line 125: | Line 164: | ||
== Boot menu == | == Boot menu == | ||
− | [[Image:Neo1973 uboot menu.jpg|thumb|400px| | + | [[Image:Neo1973 uboot menu.jpg|thumb|400px|U-Boot boot menu on Neo1973]] |
− | As of the Phase-0 release, our | + | As of the Phase-0 release, our U-Boot version now features an on-screen boot menu. The items are defined by [[U-Boot environment#menu|menu entries in the environment]]. |
=== Accessing the boot menu === | === Accessing the boot menu === | ||
− | You can access the boot | + | You can access the boot menu by pressing and holding the [[Neo1973 AUX Button]] together with the power button while switching the phone on. |
=== Using the boot menu === | === Using the boot menu === | ||
− | By pressing the [[Neo1973 AUX | + | By pressing the [[Neo1973 AUX Button]] you can cycle through the menu items. Use the ''POWER'' button to select one item. |
− | == | + | == U-Boot prompt == |
− | + | === Accessing the U-Boot prompt === | |
− | + | The U-Boot prompt is available either on the serial console (via [[Debug Board]]), or as virtual USB Serial device (USB CDC_ACM). | |
− | + | Whether the serial port or usb is used depends on the U-Boot environment variables '''stdin''', '''stdout''' and '''stderr'''. | |
− | + | ||
− | === Accessing the | + | |
− | The | + | |
− | Whether the serial port or usb | + | |
Whether or not you use usbtty, the first couple of messages will always be displayed on the serial console. | Whether or not you use usbtty, the first couple of messages will always be displayed on the serial console. | ||
− | The | + | The U-Boot is currently configured to wait for three seconds. If a key press on the '''stdin''' is received within those three seconds, auto-boot is aborted. |
==== Using usbtty from Linux ==== | ==== Using usbtty from Linux ==== | ||
− | Just by connecting the phone in | + | Just by connecting the phone in U-Boot mode to your Linux pc should make it detect a [[CDC ACM]] device, and you should get a new tty device called /dev/ttyACM0. If not, check that module cdc_acm is loaded or CONFIG_USB_ACM=y (Device Drivers -> USB support -> USB Modem (CDC ACM) support). (Instructions for MacOS users are [[MacOS_X#USB_Serial|here]]) |
− | First, you should try to check whether the USB device shows up in 'lsusb' while you're running in | + | Use your favourite terminal emulator (minicom, cu, zc, screen ...) to access it like any other serial port. Clear any modem intialisation strings (minicom). |
+ | |||
+ | You can adapt the instructions for USB-serial from the [[MacOS_X#USB_Serial|Mac OS]] page. | ||
+ | If you don't have a favorite, try just "cu -l dev/ttyACM0". It is in the taylor-uucp package, use "apt-get install cu" if it is not yet installed | ||
+ | |||
+ | Enter Bootprompt with: | ||
+ | <pre> | ||
+ | cu -l /dev/ttyACM0 | ||
+ | </pre> | ||
+ | You might need to | ||
+ | chown uucp.uucp /dev/ttyACM0 | ||
+ | to get the necessary rights (even as root, must be done each time). For example, if cu prints "cu: /dev/ttyACM0: Line in use", then try chowning /dev/ttyACM0 to uucp.uucp; apparently cu can be pretty picky about permissions. | ||
+ | |||
+ | A nice alternative for cu is Werner Almesberger's [[NeoCon|neocon]]. | ||
+ | |||
+ | First, you should try to check whether the USB device shows up in 'lsusb' while you're running in U-Boot mode: | ||
<pre> | <pre> | ||
# lsusb -d 1457:5119 | # lsusb -d 1457:5119 | ||
− | Bus 005 Device 079: ID 1457:5119 | + | Bus 005 Device 079: ID 1457:5119 |
</pre> | </pre> | ||
+ | '''Note''': The Neo Freerunner (GTA02) has the ID 1d50:5119 | ||
+ | |||
+ | Second, let's see some more details about the available endpoints and configurations: | ||
<pre> | <pre> | ||
# lsusb -v -d 1457:5119 | # lsusb -v -d 1457:5119 | ||
− | Bus 005 Device 079: ID 1457:5119 | + | Bus 005 Device 079: ID 1457:5119 |
Device Descriptor: | Device Descriptor: | ||
− | + | bLength 18 | |
− | + | bDescriptorType 1 | |
− | + | bcdUSB 1.10 | |
− | + | bDeviceClass 2 Communications | |
− | + | bDeviceSubClass 0 | |
− | + | bDeviceProtocol 0 | |
− | + | bMaxPacketSize0 16 | |
− | + | idVendor 0x1457 | |
− | + | idProduct 0x5119 | |
− | + | bcdDevice 0.00 | |
− | + | iManufacturer 1 Openmoko, Inc | |
− | + | iProduct 2 Neo1973 Bootloader U-Boot 1.2.0-g6c7cac8c-dirty-moko3 | |
− | + | iSerial 3 0000000 | |
− | + | bNumConfigurations 1 | |
− | + | Configuration Descriptor: | |
− | + | bLength 9 | |
− | + | bDescriptorType 2 | |
− | + | wTotalLength 85 | |
− | + | bNumInterfaces 3 | |
− | + | bConfigurationValue 1 | |
− | + | iConfiguration 4 TTY via USB | |
− | + | bmAttributes 0xc0 | |
− | + | Self Powered | |
− | + | MaxPower 0mA | |
− | + | Interface Descriptor: | |
− | + | bLength 9 | |
− | + | bDescriptorType 4 | |
− | + | bInterfaceNumber 0 | |
− | + | bAlternateSetting 0 | |
− | + | bNumEndpoints 1 | |
− | + | bInterfaceClass 2 Communications | |
− | + | bInterfaceSubClass 2 Abstract (modem) | |
− | + | bInterfaceProtocol 1 AT-commands (v.25ter) | |
− | + | iInterface 6 Control Interface | |
− | + | CDC Header: | |
− | + | bcdCDC 0.6e | |
− | + | CDC Call Management: | |
− | + | bmCapabilities 0x00 | |
− | + | bDataInterface 1 | |
− | + | CDC ACM: | |
− | + | bmCapabilities 0x00 | |
− | + | CDC Union: | |
− | + | bMasterInterface 0 | |
− | + | bSlaveInterface 1 | |
− | + | Endpoint Descriptor: | |
− | + | bLength 7 | |
− | + | bDescriptorType 5 | |
− | + | bEndpointAddress 0x81 EP 1 IN | |
− | + | bmAttributes 3 | |
− | + | Transfer Type Interrupt | |
− | + | Synch Type None | |
− | + | Usage Type Data | |
− | + | wMaxPacketSize 0x0010 1x 16 bytes | |
− | + | bInterval 255 | |
− | + | Interface Descriptor: | |
− | + | bLength 9 | |
− | + | bDescriptorType 4 | |
− | + | bInterfaceNumber 1 | |
− | + | bAlternateSetting 0 | |
− | + | bNumEndpoints 2 | |
− | + | bInterfaceClass 10 CDC Data | |
− | + | bInterfaceSubClass 0 Unused | |
− | + | bInterfaceProtocol 0 | |
− | + | iInterface 5 Bulk Data Interface | |
− | + | Endpoint Descriptor: | |
− | + | bLength 7 | |
− | + | bDescriptorType 5 | |
− | + | bEndpointAddress 0x02 EP 2 OUT | |
− | + | bmAttributes 2 | |
− | + | Transfer Type Bulk | |
− | + | Synch Type None | |
− | + | Usage Type Data | |
− | + | wMaxPacketSize 0x0010 1x 16 bytes | |
− | + | bInterval 255 | |
− | + | Endpoint Descriptor: | |
− | + | bLength 7 | |
− | + | bDescriptorType 5 | |
− | + | bEndpointAddress 0x83 EP 3 IN | |
− | + | bmAttributes 2 | |
− | + | Transfer Type Bulk | |
− | + | Synch Type None | |
− | + | Usage Type Data | |
− | + | wMaxPacketSize 0x0010 1x 16 bytes | |
− | + | bInterval 255 | |
− | + | Interface Descriptor: | |
− | + | bLength 9 | |
− | + | bDescriptorType 4 | |
− | + | bInterfaceNumber 2 | |
− | + | bAlternateSetting 0 | |
− | + | bNumEndpoints 0 | |
− | + | bInterfaceClass 254 Application Specific Interface | |
− | + | bInterfaceSubClass 1 Device Firmware Update | |
− | + | bInterfaceProtocol 1 | |
− | + | iInterface 7 USB Device Firmware Upgrade | |
Device Status: 0x0001 | Device Status: 0x0001 | ||
− | + | Self Powered | |
</pre> | </pre> | ||
Next, you can access it using your favourite terminal program. | Next, you can access it using your favourite terminal program. | ||
− | Then, if the environment is not set correctly, you will need to use the current console (e.g. serial console) to | + | Then, if the environment is not set correctly, you will need to use the current console (e.g. serial console) to change the [[U-Boot environment#console|console entries in the environment]]: |
<pre> | <pre> | ||
GTA01Bv2 # setenv stderr usbtty | GTA01Bv2 # setenv stderr usbtty | ||
Line 273: | Line 326: | ||
</pre> | </pre> | ||
− | ==== Typical | + | ==== Typical U-Boot prompt ==== |
<pre> | <pre> | ||
Line 286: | Line 339: | ||
Out: serial | Out: serial | ||
Err: serial | Err: serial | ||
− | Hit any key to stop autoboot: 0 | + | Hit any key to stop autoboot: 0 |
GTA01Bv3 # | GTA01Bv3 # | ||
</pre> | </pre> | ||
− | === Commands on the | + | === Commands on the U-Boot prompt === |
− | + | :''See [[U-Boot commands]].'' | |
− | + | === What if I borked my U-Boot environment and don't get a prompt anymore? === | |
− | + | {{Note|This solution applies to a changed U-Boot environment which prevents NAND U-Boot to successfully boot. The Debian U-Boot configuration script may be a cause of this issue.}} | |
− | + | Found a solution here: | |
− | + | [[http://markmail.org/message/gqypwiohdet6x4am?q=almesberger+partition&page=1&refer=xbamkzwwsaobv7wa]] | |
− | + | ||
− | + | It works the following way: | |
+ | * Get the [[devirginator]]: | ||
+ | svn co http://svn.openmoko.org/trunk/src/host/devirginator | ||
+ | cd devirginator | ||
+ | * Read the U-Boot environment from the device: | ||
+ | dfu-util -a u-boot_env -R -U env.in | ||
+ | * Create a file that contains everything you want to change in your U-Boot environment or get it by issuing the following command: | ||
+ | wget http://svn.openmoko.org/trunk/src/host/devirginator/environment.in | ||
+ | * Now let devirginator generate a new u-boot_env partition for us, - that contains the partition table from our u-boot_env, - and all changes we wanted to make; Note that the -D GTA02 is needed for the neo FreeRunner only, and has to come before the other options. | ||
+ | ./envedit.pl -D GTA02 -i env.in -f environment.in -o env.out | ||
+ | * On my box the partition layout didn't seem to match the idea of envedit.pl, so it issued 2 warnings: | ||
+ | warning: environment is 262144 bytes, expected 16384 | ||
+ | CRC error: expected 0xc33e35fc, got 0x93097bfb | ||
+ | * In this case jut add an additional argument to the command line - that has to be the 1st argument, though, and that contains the size information we got from the warning: | ||
+ | ./envedit.pl -s 262144 -D GTA02 -i env.in -f environment.in -o env.out | ||
+ | * Now the perl script should produce no more output anything but write a new u-boot_env partition that we can upload to the device by: | ||
+ | dfu-util -a u-boot_env -R -D env.out | ||
− | == | + | == Device Firmware Upgrade == |
− | + | Our version of U-Boot also implements [[USB DFU]]. This can be useful to | |
− | + | load files and kernel for quick testing. | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | To find out whether your version of U-Boot supports this, use the output of | |
− | + | $ lsusb -v -d 1457:5119 | |
− | + | while the phone is in u-boot mode. | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
+ | If it supports DFU, you should see the following snippet towards the end of the output: | ||
<pre> | <pre> | ||
− | + | Interface Descriptor: | |
+ | bLength 9 | ||
+ | bDescriptorType 4 | ||
+ | bInterfaceNumber 2 | ||
+ | bAlternateSetting 0 | ||
+ | bNumEndpoints 0 | ||
+ | bInterfaceClass 254 Application Specific Interface | ||
+ | bInterfaceSubClass 1 Device Firmware Update | ||
+ | bInterfaceProtocol 1 | ||
+ | iInterface 0 | ||
</pre> | </pre> | ||
− | + | For information on how to do firmware upgrades, please see [[dfu-util]]. For neo 1973 you may see [[Flashing the Neo 1973#Actually_flashing_things_into_the_device]], and for the FreeRunner : [[Flashing the Neo FreeRunner]]. | |
− | + | === Booting files over DFU === | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | To load a file at memory address 0x32000000: | |
<pre> | <pre> | ||
− | + | dfu-util -a 0 -D fileToLoad -R | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
</pre> | </pre> | ||
− | + | After that, send 'bootm 0x32000000' to u-boot or 'bootelf 0x32000000' if | |
+ | its an elf file. | ||
− | + | Simple python script that can boot an ELF image - avoiding a ACM bug that breaks on large packets. | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
<pre> | <pre> | ||
− | + | #!/usr/bin/python | |
+ | import sys | ||
+ | import os | ||
+ | import time | ||
− | + | cmd1 = "neo backlight off\n" | |
− | + | cmd2 = "bootelf 0x32000000\n" | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | def output(tty, str): | |
+ | for x in str: | ||
+ | tty.write(x) | ||
+ | tty.flush() | ||
− | + | if len(sys.argv) == 2: | |
− | + | print "Loading %s..." % sys.argv[1] | |
− | + | loadfile = "dfu-util -a 0 -D %s -R" % sys.argv[1] | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | os.system(loadfile) | |
− | + | time.sleep(3) | |
− | + | ||
− | + | tty = open("/dev/ttyACM0", "a") | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | output(tty, cmd1) | |
+ | output(tty, cmd2) | ||
− | + | tty.close() | |
− | + | else: | |
− | + | print "Usage: %s elffile" % sys.argv[0] | |
− | + | print "" | |
− | + | sys.exit(2) | |
− | + | ||
− | + | ||
</pre> | </pre> | ||
− | + | == Troubleshooting == | |
− | === | + | === USB connectivity problems === |
− | + | I once got errors like this (in dmesg or /var/log/messages) on the host side while connecting the Neo in U-Boot: | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | usb 2-1: device descriptor read/64, error -110 | |
+ | usb usb2: Controller not stopped yet! | ||
− | + | or | |
− | + | ||
− | + | hub 4-0:1.0: port 1 disabled by hub (EMI?), re-enabling... | |
+ | usb 4-1: USB disconnect, address 2 | ||
− | + | A possible solution is given below. Please note that if you have a usb keyboard or mouse then the command might cause trouble. | |
− | + | rmmod uhci_hcd ; modprobe uhci_hcd | |
− | + | Another option is to plug the FR into a different USB port on the host, preferably one on the Motherboard not the hub. | |
− | + | Disconnecting the Neo's USB while powering up may prevent this problem in the future. | |
− | + | ||
− | + | == Related pages == | |
− | + | See [[Flashing the Neo 1973]] and [[Flashing the Neo FreeRunner]] for instructions on using dfu-util to install a new U-Boot in your phone. | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | and | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | [[Category:Bootloaders]] | |
− | + |
Latest revision as of 01:26, 15 April 2012
![]() |
Languages: |
English • العربية • Български • Česky • Dansk • Deutsch • Esperanto • Eesti • Español • فارسی • Suomi • Français • עברית • Magyar • Italiano • 한국어 • Nederlands • Norsk (bokmål) • Polski • Português • Română • Русский • Svenska • Slovenčina • Українська • 中文(中国大陆) • 中文(台灣) • Euskara • Català |
Bootloaders |
---|
Just want to note that I (gena2x) decided to provide and support U-Boot as far as I can. To find info on my latest U-Boot version with bug-fixes, description how to setup u-boot, list of known bugs please visit U-boot-gena2x
Outdated warning ! This article or section is significantly outdated, either by significant hardware or software changes. Procedures mentioned in this page may well not work for current hardware/software. |
![](/images/thumb/e/e5/Neo1973_uboot_splash_closeup.jpg/300px-Neo1973_uboot_splash_closeup.jpg)
U-Boot is a bootloader which can be used on the Neo 1973 and Neo FreeRunner. It takes care of device functionality until the operating system is booted. This includes USB DFU for Flashing the Neo FreeRunner, a splash screen, a boot menu, a console for U-Boot commands, configuration via U-Boot environment, and loading a kernel.
Contents |
[edit] Booting into U-Boot
- Make sure that your phone has had the battery and USB cable removed for at least 30 seconds.
- Hold in the AUX button on power-up to access the boot menu.
- Connect the Neo (ie not Debug Board) to a Linux host with the USB cable.
- Set the console to USB.
- Connect to /dev/ttyACM0 with a terminal program on the Linux host (you might need to chown uucp.uucp /dev/ttyACM0; see also below)
- Note that the cdc_acm /dev/ttyACM0 access disappears as soon as the Neo boots, and is replaced by the cdc_ether usb0 network access.
- You're now at the U-Boot prompt.
- Set the bootdelay U-Boot environment variable to -1 if you want it to always halt at the U-Boot on power-up.
[edit] General
More information on U-Boot can be found at
- http://www.denx.de/wiki/DULG
- http://www.gumstix.org/tikiwiki/tiki-index.php?page=U-Boot
- http://linuxdevices.com/articles/AT5085702347.html
Additions to the vanilla U-Boot already implemented include:
- Support for boot from NAND flash using S3C2410 Steppingstone
- Support for S3C2410 NAND flash
- Support for downloading programs via S3C2410 USB Device Controller
- Support to display bootup logo / status on S3C2410 Framebuffer
However, U-Boot still doesn't support many of the features that GTA01 needs, such as
- Support for reading kernel/initrd from SD/Transflash
HaraldWelte is working on those issues, and in fact most of them have already been implemented.
[edit] U-Boot source code
The current U-Boot source can be found at http://git.openmoko.org/?p=u-boot.git;a=shortlog;h=stable .
To get U-Boot by git:
git clone git://git.openmoko.org/git/u-boot.git openmoko/u-boot
To build U-Boot:
- Clone the git tree and check out the stable branch (commands from above)
git checkout origin/stable
- Set the CROSS_COMPILE environment variable to specify the prefix to your toolchain binaries
- Run "make gta02v5_config" (or gta01bv4_config, or whatever hardware revision you have)
- Run "make u-boot.udfu". This will give you an image which you can install with dfu-util, or which you can upload into memory via JTAG (with a debug board)
All together:
git clone git://git.openmoko.org/git/u-boot.git openmoko/u-boot cd openmoko/u-boot git checkout origin/stable export CROSS_COMPILE=arm-angstrom-linux-gnueabi- make gta02v5_config make u-boot.udfu
[edit] U-Boot binary
The latest U-Boot binary builds can be found under:
- Before 20100131? Are there any newer that supports ubifs? Can it be replaced by Qi?:
All versions of the GTA02 (Neo FreeRunner) that have been sold to the public are version 5 hardware, so look for a file with "gta02" and "v5" in the name, for example:
uboot-gta02v5-latest.bin
The file should be written to the NAND flash address 0x00000000 (size 0x30000) (the first partition).
[edit] U-Boot development
[edit] QT2410
If you want to do U-Boot development on the QT2410, it's easier to work with a U-Boot 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.
[edit] Neo 1973
Doing U-Boot development on the Neo 1973 is a bit more tricky. First, we don't have any NOR flash. Second, there is no other way to boot _but_ from NAND. Therefore, we also don't have a USB downloader like the QT2410.
The main problem is: The S3C2410 Steppingstone unconditionally copies the first 4k of flash into its internal SRAM. That SRAM segment stays unconditionally mapped at physical address zero. How do we get around this
[edit] Neo FreeRunner
- Main article: Neo_FreeRunner_Memory_Mapping
[edit] Using JTAG to boot from RAM
So how can we boot from RAM? We use JTAG / OpenOCD to:
- Reset and halt the cpu at PC=0
> reset halt target halted in ARM state due to debug request, current mode: Supervisor cpsr: 0x400000d3 pc: 0x00000000 MMU: disabled, D-Cache: disabled, I-Cache: disabled
- Download a small piece of code for low-level SDRAM timing initialization (overwrite 4k SRAM of steppingstone)
> load_binary /space/misc/gta01/u-boot.git/board/gta01/lowlevel_foo.bin 0 downloaded 332 byte in 0s 21899us
- Assert a break point at address 0x33f80000 (which indicates that the low-level code has finished)
> bp 0x33f80000 4 hw breakpoint added at address 0x33f80000
- Run the code up to the break point
> resume Target 0 resumed > Target 0 halted target halted in ARM state due to breakpoint, current mode: Supervisor cpsr: 0x600000d3 pc: 0x33f80000 MMU: disabled, D-Cache: disabled, I-Cache: enabled
- Download the U-Boot RAM image to 0x33f80000
> load_binary /space/misc/gta01/u-boot.git/u-boot.bin 0x33f80000 downloaded 135692 byte in 6s 567264us
- Resume processing
> resume Target 0 resumed
At this point, the display backlight gets bright and we see the following familiar prompt on the serial console:
U-Boot 1.1.6 (Jan 13 2007 - 23:44:23) DRAM: 128 MB NAND: 64 MiB *** Warning - bad CRC or NAND, using default environment In: serial Out: serial Err: serial Hit any key to stop autoboot: 0 GTA01Bv2 #
[edit] 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
[edit]
As of the Phase-0 release, our U-Boot version now features an on-screen boot menu. The items are defined by menu entries in the environment.
[edit]
You can access the boot menu by pressing and holding the Neo1973 AUX Button together with the power button while switching the phone on.
[edit]
By pressing the Neo1973 AUX Button you can cycle through the menu items. Use the POWER button to select one item.
[edit] U-Boot prompt
[edit] Accessing the U-Boot prompt
The U-Boot prompt is available either on the serial console (via Debug Board), or as virtual USB Serial device (USB CDC_ACM). Whether the serial port or usb is used depends on the U-Boot environment variables stdin, stdout and stderr.
Whether or not you use usbtty, the first couple of messages will always be displayed on the serial console.
The U-Boot is currently configured to wait for three seconds. If a key press on the stdin is received within those three seconds, auto-boot is aborted.
[edit] Using usbtty from Linux
Just by connecting the phone in U-Boot mode to your Linux pc should make it detect a CDC ACM device, and you should get a new tty device called /dev/ttyACM0. If not, check that module cdc_acm is loaded or CONFIG_USB_ACM=y (Device Drivers -> USB support -> USB Modem (CDC ACM) support). (Instructions for MacOS users are here)
Use your favourite terminal emulator (minicom, cu, zc, screen ...) to access it like any other serial port. Clear any modem intialisation strings (minicom).
You can adapt the instructions for USB-serial from the Mac OS page. If you don't have a favorite, try just "cu -l dev/ttyACM0". It is in the taylor-uucp package, use "apt-get install cu" if it is not yet installed
Enter Bootprompt with:
cu -l /dev/ttyACM0
You might need to
chown uucp.uucp /dev/ttyACM0
to get the necessary rights (even as root, must be done each time). For example, if cu prints "cu: /dev/ttyACM0: Line in use", then try chowning /dev/ttyACM0 to uucp.uucp; apparently cu can be pretty picky about permissions.
A nice alternative for cu is Werner Almesberger's neocon.
First, you should try to check whether the USB device shows up in 'lsusb' while you're running in U-Boot mode:
# lsusb -d 1457:5119 Bus 005 Device 079: ID 1457:5119
Note: The Neo Freerunner (GTA02) has the ID 1d50:5119
Second, let's see some more details about the available endpoints and configurations:
# lsusb -v -d 1457:5119 Bus 005 Device 079: ID 1457:5119 Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 2 Communications bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 16 idVendor 0x1457 idProduct 0x5119 bcdDevice 0.00 iManufacturer 1 Openmoko, Inc iProduct 2 Neo1973 Bootloader U-Boot 1.2.0-g6c7cac8c-dirty-moko3 iSerial 3 0000000 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 85 bNumInterfaces 3 bConfigurationValue 1 iConfiguration 4 TTY via USB bmAttributes 0xc0 Self Powered MaxPower 0mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 2 Communications bInterfaceSubClass 2 Abstract (modem) bInterfaceProtocol 1 AT-commands (v.25ter) iInterface 6 Control Interface CDC Header: bcdCDC 0.6e CDC Call Management: bmCapabilities 0x00 bDataInterface 1 CDC ACM: bmCapabilities 0x00 CDC Union: bMasterInterface 0 bSlaveInterface 1 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0010 1x 16 bytes bInterval 255 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 10 CDC Data bInterfaceSubClass 0 Unused bInterfaceProtocol 0 iInterface 5 Bulk Data Interface Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x02 EP 2 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0010 1x 16 bytes bInterval 255 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0010 1x 16 bytes bInterval 255 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 2 bAlternateSetting 0 bNumEndpoints 0 bInterfaceClass 254 Application Specific Interface bInterfaceSubClass 1 Device Firmware Update bInterfaceProtocol 1 iInterface 7 USB Device Firmware Upgrade Device Status: 0x0001 Self Powered
Next, you can access it using your favourite terminal program.
Then, if the environment is not set correctly, you will need to use the current console (e.g. serial console) to change the console entries in the environment:
GTA01Bv2 # setenv stderr usbtty GTA01Bv2 # setenv stdout usbtty GTA01Bv2 # setenv stdin usbtty
[edit] Typical U-Boot prompt
U-Boot 1.2.0-moko1 (Feb 16 2007 - 00:36:13) DRAM: 128 MB NAND: 64 MiB Found Environment offset in OOB.. Video: 640x480x8 31kHz 59Hz USB: S3C2410 USB Deviced In: serial Out: serial Err: serial Hit any key to stop autoboot: 0 GTA01Bv3 #
[edit] Commands on the U-Boot prompt
- See U-Boot commands.
[edit] What if I borked my U-Boot environment and don't get a prompt anymore?
NOTE: This solution applies to a changed U-Boot environment which prevents NAND U-Boot to successfully boot. The Debian U-Boot configuration script may be a cause of this issue. |
Found a solution here:
[[1]]
It works the following way:
- Get the devirginator:
svn co http://svn.openmoko.org/trunk/src/host/devirginator cd devirginator
- Read the U-Boot environment from the device:
dfu-util -a u-boot_env -R -U env.in
- Create a file that contains everything you want to change in your U-Boot environment or get it by issuing the following command:
wget http://svn.openmoko.org/trunk/src/host/devirginator/environment.in
- Now let devirginator generate a new u-boot_env partition for us, - that contains the partition table from our u-boot_env, - and all changes we wanted to make; Note that the -D GTA02 is needed for the neo FreeRunner only, and has to come before the other options.
./envedit.pl -D GTA02 -i env.in -f environment.in -o env.out
- On my box the partition layout didn't seem to match the idea of envedit.pl, so it issued 2 warnings:
warning: environment is 262144 bytes, expected 16384 CRC error: expected 0xc33e35fc, got 0x93097bfb
- In this case jut add an additional argument to the command line - that has to be the 1st argument, though, and that contains the size information we got from the warning:
./envedit.pl -s 262144 -D GTA02 -i env.in -f environment.in -o env.out
- Now the perl script should produce no more output anything but write a new u-boot_env partition that we can upload to the device by:
dfu-util -a u-boot_env -R -D env.out
[edit] Device Firmware Upgrade
Our version of U-Boot also implements USB DFU. This can be useful to load files and kernel for quick testing.
To find out whether your version of U-Boot supports this, use the output of $ lsusb -v -d 1457:5119 while the phone is in u-boot mode.
If it supports DFU, you should see the following snippet towards the end of the output:
Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 2 bAlternateSetting 0 bNumEndpoints 0 bInterfaceClass 254 Application Specific Interface bInterfaceSubClass 1 Device Firmware Update bInterfaceProtocol 1 iInterface 0
For information on how to do firmware upgrades, please see dfu-util. For neo 1973 you may see Flashing the Neo 1973#Actually_flashing_things_into_the_device, and for the FreeRunner : Flashing the Neo FreeRunner.
[edit] Booting files over DFU
To load a file at memory address 0x32000000:
dfu-util -a 0 -D fileToLoad -R
After that, send 'bootm 0x32000000' to u-boot or 'bootelf 0x32000000' if its an elf file.
Simple python script that can boot an ELF image - avoiding a ACM bug that breaks on large packets.
#!/usr/bin/python import sys import os import time cmd1 = "neo backlight off\n" cmd2 = "bootelf 0x32000000\n" def output(tty, str): for x in str: tty.write(x) tty.flush() if len(sys.argv) == 2: print "Loading %s..." % sys.argv[1] loadfile = "dfu-util -a 0 -D %s -R" % sys.argv[1] os.system(loadfile) time.sleep(3) tty = open("/dev/ttyACM0", "a") output(tty, cmd1) output(tty, cmd2) tty.close() else: print "Usage: %s elffile" % sys.argv[0] print "" sys.exit(2)
[edit] Troubleshooting
[edit] USB connectivity problems
I once got errors like this (in dmesg or /var/log/messages) on the host side while connecting the Neo in U-Boot:
usb 2-1: device descriptor read/64, error -110 usb usb2: Controller not stopped yet!
or
hub 4-0:1.0: port 1 disabled by hub (EMI?), re-enabling... usb 4-1: USB disconnect, address 2
A possible solution is given below. Please note that if you have a usb keyboard or mouse then the command might cause trouble.
rmmod uhci_hcd ; modprobe uhci_hcd
Another option is to plug the FR into a different USB port on the host, preferably one on the Motherboard not the hub.
Disconnecting the Neo's USB while powering up may prevent this problem in the future.
[edit] Related pages
See Flashing the Neo 1973 and Flashing the Neo FreeRunner for instructions on using dfu-util to install a new U-Boot in your phone.