U-Boot

From Openmoko

(Difference between revisions)
Jump to: navigation, search
(Added new troubleshooting section)
m (U-Boot source code)
 
(105 intermediate revisions by 43 users not shown)
Line 1: Line 1:
[[Image:GTA01-U-Boot.JPG|thumb|300px|u-boot on Neo1973 console]] [[Image:Neo1973 uboot splash closeup.jpg|thumb|300px|u-boot boot splash on Neo1973]]
+
{{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 ==
  
== Phase0 Quick Start ==
 
 
* Make sure that your phone has had the battery and USB cable removed for at least 30 seconds.
 
* Make sure that your phone has had the battery and USB cable removed for at least 30 seconds.
* Connect the Neo (ie not Debug Board) to a Linux host with the USB cable.
 
 
* 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 (you might need to chown uucp.uucp /dev/ttyACM0 )
+
* 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 bootloader prompt.
+
* You're now at the U-Boot prompt.
* Set the bootdelay uboot environment variable to -1 if you want it to always halt at the bootloader on power-up.
+
* 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 ==
  
The GTA01 uses the [http://u-boot.sourceforge.net/ u-boot] bootloader.
+
More information on U-Boot can be found at
 
+
More information on u-boot can be found at  
+
 
* 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:  
+
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
Line 26: Line 34:
 
* 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
+
However, U-Boot still doesn't support many of the features that GTA01 needs, such as
 
* Support for reading kernel/initrd from SD/Transflash
 
* Support for reading kernel/initrd from SD/Transflash
* Support for downloading programs via S3C2410 USB Device Controller
 
  
[[User:HaraldWelte]] is working on those issues, and in fact most of them have already been implemented.
+
[[User:HaraldWelte|HaraldWelte]] is working on those issues, and in fact most of them have already been implemented.
  
== Bootloader source code ==
+
== U-Boot source code ==
  
The current bootloader patches can be found at http://svn.openmoko.org/trunk/src/target/u-boot/patches/.  
+
The current U-Boot source can be found at http://git.openmoko.org/?p=u-boot.git;a=shortlog;h=stable .
  
Untar the sources, apply the patch.  run "make gta01bv3_config" (or gta01bv2_config, or whatever hardware revision you have), 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.
+
To get U-Boot by git:
  
== Bootloader binary ==
+
  git clone git://git.openmoko.org/git/u-boot.git openmoko/u-boot
  
The latest bootloader binary builds can be found at http://buildhost.openmoko.org/tmp/deploy/images/ .  It should be written to the NAND flash address 0x00000000 (size 0x30000)
+
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)
  
== Bootloader development ==
+
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 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.
+
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 51: 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.
  
=== GTA01 ===
+
=== Neo 1973 ===
  
Doing bootloader development on the GTA01 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.
+
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
+
* Reset and halt the cpu at PC=0
 
<pre>
 
<pre>
 
> reset halt
 
> reset halt
Line 69: Line 104:
 
</pre>
 
</pre>
  
* download a small piece of code for low-level SDRAM timing initialization (overwrite 4k SRAM of steppingstone)
+
* 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/foo.bin 0          
+
> 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)
+
* 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 81: Line 116:
 
</pre>
 
</pre>
  
* run the code up to the break point
+
* Run the code up to the break point
 
<pre>
 
<pre>
 
> resume
 
> resume
Line 91: Line 126:
 
</pre>
 
</pre>
  
* download the u-boot RAM image to 0x33f80000
+
* 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 97: Line 132:
 
</pre>
 
</pre>
  
* resume processing
+
* Resume processing
 
<pre>
 
<pre>
 
> resume
 
> resume
Line 114: 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:
+
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 129: Line 164:
  
 
== Boot menu ==
 
== Boot menu ==
[[Image:Neo1973 uboot menu.jpg|thumb|400px|u-boot boot menu on Neo1973]]
+
[[Image:Neo1973 uboot menu.jpg|thumb|400px|U-Boot boot menu on Neo1973]]
  
As of the Phase-0 release, our u-boot version now features an on-screen boot menu.
+
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 ===
Line 141: Line 176:
 
By pressing the [[Neo1973 AUX Button]] you can cycle through the menu items.  Use the ''POWER'' button to select one item.
 
By pressing the [[Neo1973 AUX Button]] you can cycle through the menu items.  Use the ''POWER'' button to select one item.
  
=== Adding items to the boot menu ===
+
== U-Boot prompt ==
  
You can add items to the boot menu by setting environment variables. The canonical form is ''menu_<number> <Title>: U-Boot-Commands''
+
=== 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'''.
  
For example the following command will add a boot menu entry that switches to autofast charging and turns off the backlight:
+
Whether or not you use usbtty, the first couple of messages will always be displayed on the serial console.
  setenv menu_6 Autofast-Charge and Backlight Off: neo1973 charger autofast\; neo1973 backlight off
+
  saveenv
+
  
== Bootloader prompt ==
+
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.
  
=== Accessing the bootloader prompt ===
+
==== Using usbtty from Linux ====
The bootloader 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.
+
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]])
  
The bootloader 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.
+
Use your favourite terminal emulator (minicom, cu, zc, screen ...) to access it like any other serial port. Clear any modem intialisation strings (minicom).
  
==== Using usbtty from Linux ====
+
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
  
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, enable the CONFIG_USB_ACM (Device Drivers -> USB support -> USB Modem (CDC ACM) support).
+
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.
  
Use your favourite terminal emulator (minicom, cu, zc, screen ...) to access it like any other serial port. If you don't have a favorite, try just: (cu is in the taylor-uucp package)
+
A nice alternative for cu is Werner Almesberger's [[NeoCon|neocon]].
cu -l /dev/ttyACM0
+
  
First, you should try to check whether the USB device shows up in 'lsusb' while you're running in u-boot mode:
+
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
+
<pre>
Bus 005 Device 079: ID 1457:5119
+
# lsusb -d 1457:5119
 +
Bus 005 Device 079: ID 1457:5119
 +
</pre>
 +
'''Note''': The Neo Freerunner (GTA02) has the ID 1d50:5119
  
Second, lets see some more details about the available endpoints and configurations:
+
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
+
bLength                18
  bDescriptorType        1
+
bDescriptorType        1
  bcdUSB              1.10
+
bcdUSB              1.10
  bDeviceClass            2 Communications
+
bDeviceClass            2 Communications
  bDeviceSubClass        0  
+
bDeviceSubClass        0
  bDeviceProtocol        0  
+
bDeviceProtocol        0
  bMaxPacketSize0        16
+
bMaxPacketSize0        16
  idVendor          0x1457  
+
idVendor          0x1457
  idProduct          0x5119  
+
idProduct          0x5119
  bcdDevice            0.00
+
bcdDevice            0.00
  iManufacturer          1 OpenMoko, Inc
+
iManufacturer          1 Openmoko, Inc
  iProduct                2 Neo1973 Bootloader U-Boot 1.2.0-g6c7cac8c-dirty-moko3
+
iProduct                2 Neo1973 Bootloader U-Boot 1.2.0-g6c7cac8c-dirty-moko3
  iSerial                3 0000000
+
iSerial                3 0000000
  bNumConfigurations      1
+
bNumConfigurations      1
  Configuration Descriptor:
+
Configuration Descriptor:
    bLength                9
+
bLength                9
    bDescriptorType        2
+
bDescriptorType        2
    wTotalLength          85
+
wTotalLength          85
    bNumInterfaces          3
+
bNumInterfaces          3
    bConfigurationValue    1
+
bConfigurationValue    1
    iConfiguration          4 TTY via USB
+
iConfiguration          4 TTY via USB
    bmAttributes        0xc0
+
bmAttributes        0xc0
      Self Powered
+
Self Powered
    MaxPower                0mA
+
MaxPower                0mA
    Interface Descriptor:
+
Interface Descriptor:
      bLength                9
+
bLength                9
      bDescriptorType        4
+
bDescriptorType        4
      bInterfaceNumber        0
+
bInterfaceNumber        0
      bAlternateSetting      0
+
bAlternateSetting      0
      bNumEndpoints          1
+
bNumEndpoints          1
      bInterfaceClass        2 Communications
+
bInterfaceClass        2 Communications
      bInterfaceSubClass      2 Abstract (modem)
+
bInterfaceSubClass      2 Abstract (modem)
      bInterfaceProtocol      1 AT-commands (v.25ter)
+
bInterfaceProtocol      1 AT-commands (v.25ter)
      iInterface              6 Control Interface
+
iInterface              6 Control Interface
      CDC Header:
+
CDC Header:
        bcdCDC              0.6e
+
bcdCDC              0.6e
      CDC Call Management:
+
CDC Call Management:
        bmCapabilities      0x00
+
bmCapabilities      0x00
        bDataInterface          1
+
bDataInterface          1
      CDC ACM:
+
CDC ACM:
        bmCapabilities      0x00
+
bmCapabilities      0x00
      CDC Union:
+
CDC Union:
        bMasterInterface        0
+
bMasterInterface        0
        bSlaveInterface        1  
+
bSlaveInterface        1
      Endpoint Descriptor:
+
Endpoint Descriptor:
        bLength                7
+
bLength                7
        bDescriptorType        5
+
bDescriptorType        5
        bEndpointAddress    0x81  EP 1 IN
+
bEndpointAddress    0x81  EP 1 IN
        bmAttributes            3
+
bmAttributes            3
          Transfer Type            Interrupt
+
Transfer Type            Interrupt
          Synch Type              None
+
Synch Type              None
          Usage Type              Data
+
Usage Type              Data
        wMaxPacketSize    0x0010  1x 16 bytes
+
wMaxPacketSize    0x0010  1x 16 bytes
        bInterval            255
+
bInterval            255
    Interface Descriptor:
+
Interface Descriptor:
      bLength                9
+
bLength                9
      bDescriptorType        4
+
bDescriptorType        4
      bInterfaceNumber        1
+
bInterfaceNumber        1
      bAlternateSetting      0
+
bAlternateSetting      0
      bNumEndpoints          2
+
bNumEndpoints          2
      bInterfaceClass        10 CDC Data
+
bInterfaceClass        10 CDC Data
      bInterfaceSubClass      0 Unused
+
bInterfaceSubClass      0 Unused
      bInterfaceProtocol      0  
+
bInterfaceProtocol      0
      iInterface              5 Bulk Data Interface
+
iInterface              5 Bulk Data Interface
      Endpoint Descriptor:
+
Endpoint Descriptor:
        bLength                7
+
bLength                7
        bDescriptorType        5
+
bDescriptorType        5
        bEndpointAddress    0x02  EP 2 OUT
+
bEndpointAddress    0x02  EP 2 OUT
        bmAttributes            2
+
bmAttributes            2
          Transfer Type            Bulk
+
Transfer Type            Bulk
          Synch Type              None
+
Synch Type              None
          Usage Type              Data
+
Usage Type              Data
        wMaxPacketSize    0x0010  1x 16 bytes
+
wMaxPacketSize    0x0010  1x 16 bytes
        bInterval            255
+
bInterval            255
      Endpoint Descriptor:
+
Endpoint Descriptor:
        bLength                7
+
bLength                7
        bDescriptorType        5
+
bDescriptorType        5
        bEndpointAddress    0x83  EP 3 IN
+
bEndpointAddress    0x83  EP 3 IN
        bmAttributes            2
+
bmAttributes            2
          Transfer Type            Bulk
+
Transfer Type            Bulk
          Synch Type              None
+
Synch Type              None
          Usage Type              Data
+
Usage Type              Data
        wMaxPacketSize    0x0010  1x 16 bytes
+
wMaxPacketSize    0x0010  1x 16 bytes
        bInterval            255
+
bInterval            255
    Interface Descriptor:
+
Interface Descriptor:
      bLength                9
+
bLength                9
      bDescriptorType        4
+
bDescriptorType        4
      bInterfaceNumber        2
+
bInterfaceNumber        2
      bAlternateSetting      0
+
bAlternateSetting      0
      bNumEndpoints          0
+
bNumEndpoints          0
      bInterfaceClass      254 Application Specific Interface
+
bInterfaceClass      254 Application Specific Interface
      bInterfaceSubClass      1 Device Firmware Update
+
bInterfaceSubClass      1 Device Firmware Update
      bInterfaceProtocol      1  
+
bInterfaceProtocol      1
      iInterface              7 USB Device Firmware Upgrade
+
iInterface              7 USB Device Firmware Upgrade
 
Device Status:    0x0001
 
Device Status:    0x0001
  Self Powered
+
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 set
+
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 284: Line 326:
 
</pre>
 
</pre>
  
==== Typical u-boot prompt ====
+
==== Typical U-Boot prompt ====
  
 
<pre>
 
<pre>
Line 297: 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 bootloader prompt ===
+
=== Commands on the U-Boot prompt ===
  
==== Auto-boot ====
+
:''See [[U-Boot commands]].''
  
Auto-boot executes the command[s] specified in the ''bootcmd'' environment variable. The default configuration is:
+
=== What if I borked my U-Boot environment and don't get a prompt anymore? ===
<pre>
+
{{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.}}
GTA01Bv3 # printenv
+
Found a solution here:
bootcmd=setenv bootargs ${bootargs_base} ${mtdparts}; nand read.e 0x32000000 kernel; bootm 0x32000000
+
[[http://markmail.org/message/gqypwiohdet6x4am?q=almesberger+partition&page=1&refer=xbamkzwwsaobv7wa]]
</pre>
+
  
This basically tells us that it will load the content of the NAND partition '''kernel''' to memory address 0x32000000 and then try to boot it. 
+
It works the following way:
 
+
* Get the [[devirginator]]:
==== Environment ====
+
svn co http://svn.openmoko.org/trunk/src/host/devirginator
 
+
cd devirginator
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:
+
* Read the U-Boot environment from the device:
<pre>
+
dfu-util -a u-boot_env -R -U env.in
GTA01Bv2 # printenv
+
* Create a file that contains everything you want to change in your U-Boot environment or get it by issuing the following command:
baudrate=115200
+
wget http://svn.openmoko.org/trunk/src/host/devirginator/environment.in
bootargs=rootfstype=jffs2 root=/dev/mtdblock4 console=ttySAC0,115200 console=tty0 loglevel=8 dyntick=enable lpj=252416
+
* 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.
usbtty=cdc_acm
+
./envedit.pl -D GTA02 -i env.in -f environment.in -o env.out
bootdelay=10
+
* On my box the partition layout didn't seem to match the idea of envedit.pl, so it issued 2 warnings:
stdout=serial
+
warning: environment is 262144 bytes, expected 16384
stderr=serial
+
CRC error: expected 0xc33e35fc, got 0x93097bfb
stdin=serial
+
* 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:
mtdparts=mtdparts=neo1973-nand:0x00030000(u-boot),0x0000c000(u-boot_env),0x00200000(kernel),0x00130000(splash),0x03c94000(rootfs)
+
./envedit.pl -s 262144 -D GTA02 -i env.in -f environment.in  -o env.out
mtdids=nand0=neo1973-nand
+
* 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:
bootargs_base=rootfstype=jffs2 root=/dev/mtdblock4 console=ttySAC0,115200 console=tty0 loglevel=8 dyntick=enable lpj=252416
+
dfu-util -a u-boot_env -R -D env.out
bootcmd=setenv bootargs ${bootargs_base} ${mtdparts}; nand read.e 0x32000000 kernel; bootm 0x32000000
+
pcf50606_int1=0x40
+
filesize=160C000
+
partition=nand0,0
+
mtddevnum=0
+
mtddevname=u-boot
+
 
+
Environment size: 670/16380 bytes
+
GTA01Bv3 # setenv bootdelay 10
+
GTA01Bv3 # printenv bootdelay
+
bootdelay=10
+
GTA01Bv3 # saveenv
+
Saving Environment to NAND...
+
Erasing Nand...Writing to Nand... done
+
GTA01Bv3 #
+
</pre>
+
 
+
Note: When setting multiple commands, e.g. for bootcmd, you need to escape the ';', for instance
+
 
+
<pre>
+
GTA01Bv3 # setenv bootcmd mmcinit\; ext2load mmc 0 0x32000000 uImage\; bootm 0x32000000
+
</pre>
+
 
+
==== MMC/SD ====
+
 
+
in order to initialize a MMC/SD card, you have to use the ``mmcinit'' command.
+
<pre>
+
GTA01Bv3 # 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
+
GTA01Bv3 #
+
</pre>
+
 
+
afterwards, you can read ext2 filesystems like:
+
<pre>
+
GTA01Bv3 # ext2ls mmc 0
+
<DIR>      1024 .
+
<DIR>      1024 ..
+
<DIR>      12288 lost+found
+
        1544788 uImage
+
</pre>
+
 
+
==== NAND ====
+
 
+
<pre>
+
GTA01Bv3 # 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)
+
</pre>
+
 
+
===== Loading Kernel from NAND =====
+
 
+
<pre>
+
GTA01Bv3 # nand read 0x32000000 kernel
+
 
+
NAND read: device 0 offset 212992, size 2097152 ...  2097152 bytes read: OK
+
GTA01Bv3 # bootm 0x32000000
+
## Booting image at 32000000 ...
+
  Image Name:  OpenMoko Kernel Image Neo1973
+
  Created:      2007-02-15  23:54:18 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 ...
+
</pre>
+
 
+
===== 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:
+
 
+
<pre>
+
GTA01Bv3 # ext2load mmc 0 0x32000000 u-boot.bin
+
GTA01Bv3 # nand erase u-boot
+
GTA01Bv3 # nand write.e 0x32000000 u-boot ${filesize}
+
</pre>
+
 
+
===== Writing kernel to NAND =====
+
 
+
The following set of commands loads the file uImage from ext2/mmc and flashes it into the
+
kernel flash partition:
+
 
+
<pre>
+
GTA01Bv3 # ext2load mmc 0 0x32000000 uImage
+
GTA01Bv3 # nand erase kernel
+
GTA01Bv3 # nand write.e 0x32000000 kernel ${filesize}
+
</pre>
+
 
+
===== Writing rootfs to NAND =====
+
 
+
The following set of commands loads the file rootfs.jffs2 from ext2/mmc and flashes it into the
+
rootfs flash partition:
+
 
+
<pre>
+
GTA01Bv3 # ext2load mmc 0 0x32000000 rootfs.jffs2
+
GTA01Bv3 # nand erase rootfs
+
GTA01Bv3 # nand write.e 0x32000000 rootfs ${filesize}
+
</pre>
+
 
+
Please note that this will only work with root file system sizes that are smaller than the amount of memory above 0x32000000, which in the case of 64MB SDRAM is something like 32MB.
+
 
+
==== Neo1973 related commands ====
+
 
+
Our version of u-boot supports a couple of Neo1973 specific commands:
+
<pre>
+
GTA01Bv2 # help neo1973
+
neo1973 neo1973 info - display phone informantion
+
neo1973 power-off - switch off the phone
+
neo1973 charger status - display charger status
+
neo1973 charger autofast - enable automatic fast (500mA) charging
+
neo1973 charger !autofast - disable automatic fast (500mA) charging
+
neo1973 charger fast - enable fast (500mA) charging
+
neo1973 charger off - disable charging
+
neo1973 backlight (on|off) - switch backlight on or off
+
neo1973 vibrator (on|off) - switch vibrator on or off
+
neo1973 udc pullup (on|off) - switch pull-up on or off
+
</pre>
+
 
+
What's the udc?
+
 
+
 
+
===== Timeouts =====
+
 
+
The boot menu timeout can be changed using
+
<pre>
+
setenv boot_menu_timeout=[seconds?]
+
</pre>
+
 
+
Also, by changing bootdelay you can have more time to take control of u-boot:
+
<pre>
+
setenv bootdelay=[seconds]
+
</pre>
+
 
+
===== Power-off =====
+
 
+
Using
+
neo1973 power-off
+
 
+
you can switch the device off from the bootloader prompt.
+
 
+
===== Battery charger related =====
+
 
+
For a detailed description of the charger basics, see [[Neo1973 Battery Charger]].
+
 
+
====== Inquiring the charger state ======
+
 
+
You can get the current charger status by issuing
+
neo1973 charger status
+
 
+
The following modes are possible:
+
 
+
* idle - no charging
+
* trickle - FIXME
+
* pre - Slow (100mA) charging, works in hardware.
+
* fast_cccv - Fast (500mA) charging, using Constant-Current followed by Constant Voltage (Li-Ion)
+
 
+
====== Disabling battery charging ======
+
 
+
You can disable battery charging (until the next reboot) by issuing
+
neo1973 charger off
+
 
+
====== Forcing fast charge ======
+
 
+
Using
+
neo1973 charger fast
+
you can force the PMU to try to do a fast (500mA) charge of the battery. It will abort if the battery is in over temperature or some other error condition occurs.
+
 
+
====== Enabling / Disabling automatic fast charge ======
+
 
+
Autofast is a feature of the PCF50606 PMU. It means that the fast_cccv mode will be automatically selected if a charger with suitable voltage is plugged in, and the battery not in over temperature condition.
+
 
+
{{warning|This is potentially dangerous.  Only enable autofast if you ARE SURE that you can draw 500mA from the USB connector.  This is the case with a wall outlet charger, or if you are attached to a self-powered hub or a desktop PC root hub.  Bus powered hubs and some laptops only provide 100mA on their USB ports and can thus not support fast charging}}
+
 
+
You can enable or disable autofast by
+
neo1973 charger autofast
+
and
+
neo1973 charger !autofast
+
respectively.
+
 
+
===== Backlight =====
+
 
+
You can switch the backlight on and off by using
+
neo1973 backlight on
+
and
+
neo1973 backlight off
+
respectively.
+
 
+
===== Vibrator =====
+
 
+
You can switch the vibrator on and off by using
+
neo1973 vibrator on
+
and
+
neo1973 vibrator off
+
respectively.
+
 
+
==== S3C2410 specific commands ====
+
 
+
<pre>
+
GTA01Bv2 # help s3c2410
+
s3c2410 speed get - display current PLL speed config
+
s3c2410 speed list - display supporte PLL speed configs
+
s3c2410 speed set - set PLL speed
+
GTA01Bv2 # s3c2410 speed list
+
50 MHz
+
101 MHz
+
202 MHz
+
266 MHz
+
GTA01Bv2 # s3c2410 speed get
+
FCLK = 202 MHz, HCLK = 101 MHz, PCLK = 50 MHz
+
GTA01Bv2 # s3c2410 speed set 101
+
GTA01Bv2 # s3c2410 speed get
+
FCLK = 101 MHz, HCLK = 50 MHz, PCLK = 50 MHz
+
</pre>
+
 
+
===== 266MHz clock =====
+
 
+
You can re-configure the [[S3C2410]] PLL to generate a 266 MHz core cpu clock (rather than the 200MHz default) by using
+
GTA01Bv2 # s3c2410 speed set 266
+
and
+
GTA01Bv2 # s3c2410 speed set 202
+
respectively.
+
 
+
{{warning|The old hardware (Phase 0 - GTA01Bv3) only runs stable at 266MHz if you do not attach anything (esp. the FPC / [[Debug Board]] to the Debug Port}}
+
 
+
==== TFTP on QT2410 ====
+
 
+
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:
+
 
+
<pre>
+
QT2410 # printenv
+
ethaddr=00:01:02:03:04:05
+
netmask=255.255.255.0
+
ipaddr=192.168.100.100
+
serverip=192.168.100.1
+
</pre>
+
 
+
 
+
===== TFTP kernel download =====
+
 
+
<pre>
+
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)
+
</pre>
+
 
+
you can then commence booting via
+
<pre>
+
QT2410# bootm 0x32000000
+
</pre>
+
  
 
== Device Firmware Upgrade ==
 
== Device Firmware Upgrade ==
  
Our version of u-boot also implements [[USB DFU]]. This can be useful to
+
Our version of U-Boot also implements [[USB DFU]]. This can be useful to
 
load files and kernel for quick testing.
 
load files and kernel for quick testing.
  
To find out whether your version of u-boot supports this, use the output of
+
To find out whether your version of U-Boot supports this, use the output of
$ lsusb -v -d 1457:5119
+
$ lsusb -v -d 1457:5119
 
while the phone is in u-boot mode.
 
while the phone is in u-boot mode.
  
 
If it supports DFU, you should see the following snippet towards the end of the output:
 
If it supports DFU, you should see the following snippet towards the end of the output:
 
<pre>
 
<pre>
    Interface Descriptor:
+
Interface Descriptor:
      bLength                9
+
bLength                9
      bDescriptorType        4
+
bDescriptorType        4
      bInterfaceNumber        2
+
bInterfaceNumber        2
      bAlternateSetting      0
+
bAlternateSetting      0
      bNumEndpoints          0
+
bNumEndpoints          0
      bInterfaceClass      254 Application Specific Interface
+
bInterfaceClass      254 Application Specific Interface
      bInterfaceSubClass      1 Device Firmware Update
+
bInterfaceSubClass      1 Device Firmware Update
      bInterfaceProtocol      1  
+
bInterfaceProtocol      1
      iInterface              0  
+
iInterface              0
 
</pre>
 
</pre>
  
For information on how to do firmware upgrades, please see [[dfu-util]].
+
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 ===
 
=== Booting files over DFU ===
Line 657: Line 417:
  
 
def output(tty, str):
 
def output(tty, str):
    for x in str:
+
  for x in str:
        tty.write(x)
+
    tty.write(x)
        tty.flush()
+
    tty.flush()
  
 
if len(sys.argv) == 2:
 
if len(sys.argv) == 2:
    print "Loading %s..." % sys.argv[1]
+
  print "Loading %s..." % sys.argv[1]
  
    loadfile = "dfu-util -a 0 -D %s -R" % sys.argv[1]
+
  loadfile = "dfu-util -a 0 -D %s -R" % sys.argv[1]
  
    os.system(loadfile)
+
  os.system(loadfile)
  
    time.sleep(3)
+
  time.sleep(3)
  
    tty = open("/dev/ttyACM0", "a")
+
  tty = open("/dev/ttyACM0", "a")
  
    output(tty, cmd1)
+
  output(tty, cmd1)
    output(tty, cmd2)
+
  output(tty, cmd2)
  
    tty.close()
+
  tty.close()
 
else:
 
else:
    print "Usage: %s elffile" % sys.argv[0]
+
  print "Usage: %s elffile" % sys.argv[0]
    print ""
+
  print ""
    sys.exit(2)
+
  sys.exit(2)
 
</pre>
 
</pre>
  
Line 686: Line 446:
 
=== USB connectivity problems ===
 
=== 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:
+
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
  
usb 2-1: device descriptor read/64, error -110
+
Another option is to plug the FR into a different USB port on the host, preferably one on the Motherboard not the hub.
usb usb2: Controller not stopped yet!
+
  
The problem disappeared at least for me by the command below on the host side. Please note that if you have usb keyboard or mouse then the command might cause trouble.. I only have PS/2 so I couldn't test it.
+
Disconnecting the Neo's USB while powering up may prevent this problem in the future.
  
rmmod uhci_hcd ; modprobe uhci_hcd
+
== Related pages ==
  
{{Languages|Bootloader}}
+
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.
  
[[Category:Software]]
+
[[Category:Bootloaders]]
[[Category:Guides]]
+

Latest revision as of 23:26, 14 April 2012

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.


U-Boot menu 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 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

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:

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] Boot menu

U-Boot boot menu on Neo1973

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] Accessing the boot menu

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] Using the boot menu

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:

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.

Personal tools
u-boot on Neo1973 console
u-boot boot splash on Neo1973

Phase0 Quick Start

  • Make sure that your phone has had the battery and USB cable removed for at least 30 seconds.
  • Connect the Neo (ie not Debug Board) to a Linux host with the USB cable.
  • Hold in the AUX button on power-up to access the boot menu.
  • 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 )
  • 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 bootloader prompt.
  • Set the bootdelay uboot environment variable to -1 if you want it to always halt at the bootloader on power-up.

General

The GTA01 uses the u-boot bootloader.

More information on u-boot can be found at

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
  • Support for downloading programs via S3C2410 USB Device Controller

User:HaraldWelte is working on those issues, and in fact most of them have already been implemented.

Bootloader source code

The current bootloader patches can be found at http://svn.openmoko.org/trunk/src/target/u-boot/patches/.

Untar the sources, apply the patch. run "make gta01bv3_config" (or gta01bv2_config, or whatever hardware revision you have), 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 builds can be found at http://buildhost.openmoko.org/tmp/deploy/images/ . It should be written to the NAND flash address 0x00000000 (size 0x30000)

Bootloader development

QT2410

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.

GTA01

Doing bootloader development on the GTA01 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

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/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 # 

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

Boot menu

u-boot boot menu on Neo1973

As of the Phase-0 release, our u-boot version now features an on-screen boot menu.

Accessing the boot menu

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

By pressing the Neo1973 AUX Button you can cycle through the menu items. Use the POWER button to select one item.

Adding items to the boot menu

You can add items to the boot menu by setting environment variables. The canonical form is menu_<number> <Title>: U-Boot-Commands

For example the following command will add a boot menu entry that switches to autofast charging and turns off the backlight:

 setenv menu_6 Autofast-Charge and Backlight Off: neo1973 charger autofast\; neo1973 backlight off
 saveenv

Bootloader prompt

Accessing the bootloader prompt

The bootloader 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 bootloader 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

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, enable the CONFIG_USB_ACM (Device Drivers -> USB support -> USB Modem (CDC ACM) support).

Use your favourite terminal emulator (minicom, cu, zc, screen ...) to access it like any other serial port. If you don't have a favorite, try just: (cu is in the taylor-uucp package)

cu -l /dev/ttyACM0

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  

Second, lets 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 set

GTA01Bv2 # setenv stderr usbtty
GTA01Bv2 # setenv stdout usbtty
GTA01Bv2 # setenv stdin usbtty

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 #

Commands on the bootloader prompt

Auto-boot

Auto-boot executes the command[s] specified in the bootcmd environment variable. The default configuration is:

GTA01Bv3 # printenv
bootcmd=setenv bootargs ${bootargs_base} ${mtdparts}; nand read.e 0x32000000 kernel; bootm 0x32000000

This basically tells us that it will load the content of the NAND partition kernel 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:

GTA01Bv2 # printenv
baudrate=115200
bootargs=rootfstype=jffs2 root=/dev/mtdblock4 console=ttySAC0,115200 console=tty0 loglevel=8 dyntick=enable lpj=252416
usbtty=cdc_acm
bootdelay=10
stdout=serial
stderr=serial
stdin=serial
mtdparts=mtdparts=neo1973-nand:0x00030000(u-boot),0x0000c000(u-boot_env),0x00200000(kernel),0x00130000(splash),0x03c94000(rootfs)
mtdids=nand0=neo1973-nand
bootargs_base=rootfstype=jffs2 root=/dev/mtdblock4 console=ttySAC0,115200 console=tty0 loglevel=8 dyntick=enable lpj=252416
bootcmd=setenv bootargs ${bootargs_base} ${mtdparts}; nand read.e 0x32000000 kernel; bootm 0x32000000
pcf50606_int1=0x40
filesize=160C000
partition=nand0,0
mtddevnum=0
mtddevname=u-boot

Environment size: 670/16380 bytes
GTA01Bv3 # setenv bootdelay 10
GTA01Bv3 # printenv bootdelay
bootdelay=10
GTA01Bv3 # saveenv
Saving Environment to NAND...
Erasing Nand...Writing to Nand... done
GTA01Bv3 # 

Note: When setting multiple commands, e.g. for bootcmd, you need to escape the ';', for instance

GTA01Bv3 # 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.

GTA01Bv3 # 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
GTA01Bv3 #

afterwards, you can read ext2 filesystems like:

GTA01Bv3 # ext2ls mmc 0
<DIR>       1024 .
<DIR>       1024 ..
<DIR>      12288 lost+found
         1544788 uImage

NAND

GTA01Bv3 # 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
GTA01Bv3 # nand read 0x32000000 kernel

NAND read: device 0 offset 212992, size 2097152 ...  2097152 bytes read: OK
GTA01Bv3 # bootm 0x32000000
## Booting image at 32000000 ...
   Image Name:   OpenMoko Kernel Image Neo1973
   Created:      2007-02-15  23:54:18 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:

GTA01Bv3 # ext2load mmc 0 0x32000000 u-boot.bin
GTA01Bv3 # nand erase u-boot
GTA01Bv3 # nand write.e 0x32000000 u-boot ${filesize}
Writing kernel to NAND

The following set of commands loads the file uImage from ext2/mmc and flashes it into the kernel flash partition:

GTA01Bv3 # ext2load mmc 0 0x32000000 uImage
GTA01Bv3 # nand erase kernel
GTA01Bv3 # nand write.e 0x32000000 kernel ${filesize}
Writing rootfs to NAND

The following set of commands loads the file rootfs.jffs2 from ext2/mmc and flashes it into the rootfs flash partition:

GTA01Bv3 # ext2load mmc 0 0x32000000 rootfs.jffs2
GTA01Bv3 # nand erase rootfs
GTA01Bv3 # nand write.e 0x32000000 rootfs ${filesize}

Please note that this will only work with root file system sizes that are smaller than the amount of memory above 0x32000000, which in the case of 64MB SDRAM is something like 32MB.

Neo1973 related commands

Our version of u-boot supports a couple of Neo1973 specific commands:

GTA01Bv2 # help neo1973
neo1973 neo1973 info - display phone informantion
neo1973 power-off - switch off the phone
neo1973 charger status - display charger status
neo1973 charger autofast - enable automatic fast (500mA) charging
neo1973 charger !autofast - disable automatic fast (500mA) charging
neo1973 charger fast - enable fast (500mA) charging
neo1973 charger off - disable charging
neo1973 backlight (on|off) - switch backlight on or off
neo1973 vibrator (on|off) - switch vibrator on or off
neo1973 udc pullup (on|off) - switch pull-up on or off

What's the udc?


Timeouts

The boot menu timeout can be changed using

setenv boot_menu_timeout=[seconds?]

Also, by changing bootdelay you can have more time to take control of u-boot:

setenv bootdelay=[seconds]
Power-off

Using

neo1973 power-off

you can switch the device off from the bootloader prompt.

Battery charger related

For a detailed description of the charger basics, see Neo1973 Battery Charger.

Inquiring the charger state

You can get the current charger status by issuing

neo1973 charger status

The following modes are possible:

  • idle - no charging
  • trickle - FIXME
  • pre - Slow (100mA) charging, works in hardware.
  • fast_cccv - Fast (500mA) charging, using Constant-Current followed by Constant Voltage (Li-Ion)
Disabling battery charging

You can disable battery charging (until the next reboot) by issuing

neo1973 charger off
Forcing fast charge

Using

neo1973 charger fast

you can force the PMU to try to do a fast (500mA) charge of the battery. It will abort if the battery is in over temperature or some other error condition occurs.

Enabling / Disabling automatic fast charge

Autofast is a feature of the PCF50606 PMU. It means that the fast_cccv mode will be automatically selected if a charger with suitable voltage is plugged in, and the battery not in over temperature condition.

WARNING: This is potentially dangerous. Only enable autofast if you ARE SURE that you can draw 500mA from the USB connector. This is the case with a wall outlet charger, or if you are attached to a self-powered hub or a desktop PC root hub. Bus powered hubs and some laptops only provide 100mA on their USB ports and can thus not support fast charging


You can enable or disable autofast by

neo1973 charger autofast

and

neo1973 charger !autofast

respectively.

Backlight

You can switch the backlight on and off by using

neo1973 backlight on

and

neo1973 backlight off

respectively.

Vibrator

You can switch the vibrator on and off by using

neo1973 vibrator on

and

neo1973 vibrator off

respectively.

S3C2410 specific commands

GTA01Bv2 # help s3c2410
s3c2410 speed get - display current PLL speed config
s3c2410 speed list - display supporte PLL speed configs
s3c2410 speed set - set PLL speed
GTA01Bv2 # s3c2410 speed list
50 MHz
101 MHz
202 MHz
266 MHz
GTA01Bv2 # s3c2410 speed get
FCLK = 202 MHz, HCLK = 101 MHz, PCLK = 50 MHz
GTA01Bv2 # s3c2410 speed set 101
GTA01Bv2 # s3c2410 speed get
FCLK = 101 MHz, HCLK = 50 MHz, PCLK = 50 MHz
266MHz clock

You can re-configure the S3C2410 PLL to generate a 266 MHz core cpu clock (rather than the 200MHz default) by using

GTA01Bv2 # s3c2410 speed set 266 

and

GTA01Bv2 # s3c2410 speed set 202

respectively.

WARNING: The old hardware (Phase 0 - GTA01Bv3) only runs stable at 266MHz if you do not attach anything (esp. the FPC / Debug Board to the Debug Port


TFTP on QT2410

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

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.

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)

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!

The problem disappeared at least for me by the command below on the host side. Please note that if you have usb keyboard or mouse then the command might cause trouble.. I only have PS/2 so I couldn't test it.

rmmod uhci_hcd ; modprobe uhci_hcd