U-Boot/ru

From Openmoko

(Difference between revisions)
Jump to: navigation, search
m
 
(25 intermediate revisions by 5 users not shown)
Line 1: Line 1:
 +
{{Languages|U-Boot}}
 
[[Image:GTA01-U-Boot.JPG|thumb|300px| Консоль загрузчика Neo1973]] [[Image:Neo1973 uboot splash closeup.jpg|thumb|300px|Заставка загрузчика Neo1973]]
 
[[Image:GTA01-U-Boot.JPG|thumb|300px| Консоль загрузчика Neo1973]] [[Image:Neo1973 uboot splash closeup.jpg|thumb|300px|Заставка загрузчика Neo1973]]
 +
 +
Загрузчик, используемый в смартфоне, называется '''U-Boot'''. Он обеспечивает начальную функциональность Openmoko во время загрузки: [[USB DFU]] для [[Flashing the Neo 1973|прошивки внутреннего ПО]] телефона, начальная заставка, загрузочное меню, консоль для [[bootloader commands|введения команд загрузчику]], конфигурировавшие [[bootloader environment|среды загрузчика]] и собственно загрузка [[kernel|ядра]].
 +
 +
Для использования доступно [[bootloader versions|несколько версий]] загрузчика u-boot.
  
 
== Фаза 0. Быстрый старт ==
 
== Фаза 0. Быстрый старт ==
 
* Убедитесь, что не забыли вставить батарейку, а USB-кабель не был ни к чему подключен в течение последних 30 секунд.
 
* Убедитесь, что не забыли вставить батарейку, а USB-кабель не был ни к чему подключен в течение последних 30 секунд.
* Присоедените Neo (не панель отладки) USB-кабелем к машине с Linux-ом.
+
* Присоедините Neo (не [[Debug board]]!) USB-кабелем к машине с Linux-ом.
 
* Удерживайте AUX во время загрузки для получения доступа к меню.
 
* Удерживайте AUX во время загрузки для получения доступа к меню.
 
* Переключите консоль на USB.
 
* Переключите консоль на USB.
 
* Подключитесь к /dev/ttyACM0 терминальной программой на Linux-машине (возможно, потребуется сделать chown uucp.uucp /dev/ttyACM0 )
 
* Подключитесь к /dev/ttyACM0 терминальной программой на Linux-машине (возможно, потребуется сделать chown uucp.uucp /dev/ttyACM0 )
* Учтите, что доступ к /dev/ttyACM0 исзчезнет во время загрузки, и в дальнейшем необходимо использовать сетевое устройство usb0.
+
* Учтите, что доступ к /dev/ttyACM0 исчезнет во время загрузки, и в дальнейшем необходимо использовать сетевое устройство usb0.
 
* Вы увидите строку приглашения к загрузке.
 
* Вы увидите строку приглашения к загрузке.
 
* Установите задержку загрузчика переменных среды uboot в -1, если необходимо, чтобы меню появлялось при каждой загрузке.
 
* Установите задержку загрузчика переменных среды uboot в -1, если необходимо, чтобы меню появлялось при каждой загрузке.
Line 13: Line 18:
 
== Общие сведения ==
 
== Общие сведения ==
  
The GTA01 uses the [http://u-boot.sourceforge.net/ u-boot] bootloader.
+
Модель [[GTA01]] использует загрузчик [http://u-boot.sourceforge.net/ u-boot], дополнительную информацию о котором можно найти по следующим адресам:
 
+
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:  
+
Дополнительно к оригинальному u-boot в GTA01 реализованы следующие возможности:
* Support for boot from NAND flash using [[S3C2410 Steppingstone]]
+
* Загрузка устройства с флеши NAND с использованием [[S3C2410 Steppingstone]].
* Support for S3C2410 NAND flash
+
* Поддержка S3C2410 NAND.
* Support for downloading programs via S3C2410 USB Device Controller
+
* Загрузка ПО через контроллер S3C2410 USB device controller.
* Support to display bootup logo / status on S3C2410 Framebuffer
+
* Отображение при загрузке логотипа или состояния процесса загрузки через S3C2410 framebuffer.
  
However, u-boot still doesn't support many of the features that GTA01 needs, such as
+
u-boot, однако, не поддерживает множество вещей, нужных для GTA01, например:
* Support for reading kernel/initrd from SD/Transflash
+
* Чтение ядра и образа initrd с карт памяти SD/Transflash.
* Support for downloading programs via S3C2410 USB Device Controller
+
* Загрузка ПО с вышеупомянутого контроллера S3C2410 USB device controller.
  
[[User:HaraldWelte]] is working on those issues, and in fact most of them have already been implemented.
+
[[User:HaraldWelte]] сейчас работает над этими проблемами, и, скорее всего, большинство из них уже имеет какое-то решение.
  
 
== Исходный код загрузчика ==
 
== Исходный код загрузчика ==
  
The current bootloader patches can be found at http://svn.openmoko.org/trunk/src/target/u-boot/patches/.  
+
Патчи к загрузчику u-boot, созданные в рамках проекта Openmoko, можно найти тут: 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.
+
Извлеките исходники из архива и запустите сначала "make gta01bv3_config" (или "gta01bv2_config", или с любой другой имеющейся конфигурацией), затем "make". В результате должен появиться файл образа u-boot.bin, который необходимо записать в NAND-флеш устройства, используя либо существующий загрузчик, либо [[sjf2410-linux]].
  
 
== Программный код загрузчика ==
 
== Программный код загрузчика ==
  
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)
+
Последние версии собранных образов загрузчика можно найти по адресу http://downloads.openmoko.org/daily/ ; записывать в NAND их надо по смещению 0x00000000 (размер 0x30000).
  
 
== Разработка загрузчика ==
 
== Разработка загрузчика ==
  
 
=== 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.
+
Если вы хотите заняться разработкой загрузчика на [[QT2410]], легче будет не прошивать его во флеш-память, а работать с его образом, закаченным через USB в оперативную память.
  
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".
+
Для этого надо отредактировать файл u-boot/include/configs/qt2410.h: изменить 32-ю строку с "if 0" на "if 1", и пересобрать образ: "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.
+
Получившийся образ "u-boot.bin" ''НЕ ПРЕДНАЗНАЧЕН'' для записи в NAND-флеш и может быть исполнен только в памяти, например с помощью [[s3c2410_boot_usb]].
  
 
=== GTA01 ===
 
=== 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.
+
Ситуация с работой с загрузчиком на самом устройстве GTA01 немного сложнее: во-первых у нас нет здесь NOR-флеши, во-вторых не существует возможности загрузиться ни с чего, кроме NAND. Следовательно, нет в нашем распоряжении и USB-загрузчика, как на 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
+
Проблема заключается в том, что [[S3C2410 Steppingstone]] безусловно копирует первые 4 Кб с флеши в свою внутреннюю память, SRAM. Этот сегмент SRAM-памяти так же безусловно связывается с физическим адресом 0. Как это обойти?
  
 
==== Использование JTAG для загрузки из оперативной памяти ====
 
==== Использование JTAG для загрузки из оперативной памяти ====
  
So how can we boot from RAM? We use JTAG / OpenOCD to
+
Так как же загрузиться из памяти? Используем JTAG / [[OpenOCD]] для:
  
* reset and halt the cpu at PC=0
+
* сброса и останова CPU на PC=0
 
<pre>
 
<pre>
 
> reset halt
 
> reset halt
Line 69: Line 72:
 
</pre>
 
</pre>
  
* download a small piece of code for low-level SDRAM timing initialization (overwrite 4k SRAM of steppingstone)
+
* загрузки небольшого кода для низкоуровневой инициализации тайминга SDRAM (переписывание первых 4 Кб SRAM у [[S3C2410 Steppingstone|Steppingstone]])
 
<pre>
 
<pre>
> load_binary /space/misc/gta01/u-boot.git/foo.bin 0          
+
> load_binary /space/misc/gta01/u-boot.git/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)
+
* установки точки останова по адресу 0x33f80000 (это означает, что код из предыдущего пункта завершил исполнение)
 
<pre>
 
<pre>
 
> bp 0x33f80000 4 hw
 
> bp 0x33f80000 4 hw
Line 81: Line 84:
 
</pre>
 
</pre>
  
* run the code up to the break point
+
* запуска кода до этой точки
 
<pre>
 
<pre>
 
> resume
 
> resume
Line 91: Line 94:
 
</pre>
 
</pre>
  
* download the u-boot RAM image to 0x33f80000
+
* загрузки образа u-boot в память по адресу 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 100:
 
</pre>
 
</pre>
  
* resume processing
+
* продолжения исполнения кода
 
<pre>
 
<pre>
 
> resume
 
> resume
Line 103: Line 106:
 
</pre>
 
</pre>
  
At this point, the display backlight gets bright and we see the following familiar prompt on the serial console:
+
В этот момент подсветка экрана зажигается и мы видим примерно такое сообщение на серийной консоли:
 
<pre>
 
<pre>
 
U-Boot 1.1.6 (Jan 13 2007 - 23:44:23)
 
U-Boot 1.1.6 (Jan 13 2007 - 23:44:23)
Line 114: Line 117:
 
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>
  
 
== Создание загрузочных образов ==
 
== Создание загрузочных образов ==
  
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 требуется загрузочные образы (такие как ядро, но также initrd и др.) в форме так называемых ''uImage''. Чтобы создать этот формат из, например, образа ядра ''vmlinux'', надо сделать следующее:
  
 
<pre>
 
<pre>
Line 129: Line 132:
  
 
== Меню загрузки ==
 
== Меню загрузки ==
[[Image:Neo1973 uboot menu.jpg|thumb|400px|u-boot boot menu on Neo1973]]
+
[[Image:Neo1973 uboot menu.jpg|thumb|400px|Загрузочное меню u-boot на экране Neo1973]]
  
As of the Phase-0 release, our u-boot version now features an on-screen boot menu.
+
На момент выпуска [[Neo 1973 Phase 0|Phase-0]] наша версия u-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.
+
Чтобы войти в меню, надо перед включением аппарата нажать и удерживать кнопку AUX button, а затем нажать кнопку включения питания.
  
 
=== Использование ===
 
=== Использование ===
  
By pressing the [[Neo1973 AUX Button]] you can cycle through the menu items. Use the ''POWER'' button to select one item.
+
Последовательными нажатиями кнопки AUX button можно ходить по пунктам меню. Для выбора нужного пункта необходимо нажать кнопку POWER.
  
 
=== Добавление пунктов в меню ===
 
=== Добавление пунктов в меню ===
  
You can add items to the boot menu by setting environment variables. The canonical form is ''menu_<number> <Title>: U-Boot-Commands''
+
Для добавления новых пунктов к существующему меню нужно установить соответствующие переменные среды. Общепринятый синтаксис таков: ''menu_<номер> <Название>: Команда-U-Boot''
  
For example the following command will add a boot menu entry that switches to autofast charging and turns off the backlight:
+
Например, следующая команда добавит пункт загрузочного меню, который будет переключать телефон в режим быстрой зарядки (autofast charging) и выключать подсветку экрана:
  setenv menu_6 Autofast-Charge and Backlight Off: neo1973 charger autofast\; neo1973 backlight off
+
<pre>
  saveenv
+
setenv menu_6 Autofast-Charge and Backlight Off: neo1973 charger autofast\; neo1973 backlight off
 +
saveenv
 +
</pre>
  
 
== Информация загрузчика ==
 
== Информация загрузчика ==
  
 
=== Получение загрузочной информации ===
 
=== Получение загрузочной информации ===
The bootloader prompt is available either on the serial console (via [[Debug Board]]), or as virtual USB Serial device (USB CDC_ACM).
+
Строка приглашения загрузчика доступна либо через серийную консоль (см. [[Debug Board]]), либо как виртуальное серийное устройство USB (USB CDC_ACM); способ соединения зависит от значений переменных окружения '''stdin''', '''stdout''' и '''stderr'''.
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.
+
Независимо от того, используете ли вы usbtty или нет, первые несколько сообщений будут выведены в поток серийной консоли.
  
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.
+
Загрузчик по умолчанию настроен на 3-секундное ожидание. Если в течение этого времени на '''stdin''' будет получено нажатие какой-либо клавиши, загрузка прерывается.
  
 
==== Использование usbtty ====
 
==== Использование usbtty ====
  
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). (Instructions for MacOS users are [[MacOS_X#USB_Serial|here]])
+
Простое подключение телефона в режиме u-boot к компьютеру с Linux должно привести к обнаружению устройства [[CDC ACM]] и появлению нового tty-устройства /dev/ttyACM0. Если этого не случилось, включите опцию ядра CONFIG_USB_ACM (Device Drivers -> USB support -> USB Modem (CDC ACM) support). (Инструкции для пользователей MacOS [[MacOS_X#USB_Serial|тут]].)
 +
 
 +
Затем просто воспользуйтесь любым эмулятором терминала на выбор (minicom, cu, zc, screen ...), подключившись к вышеупомянутому /dev/ttyACM0. Для примера рассмотрим вариант с cu. Если у вас он не установлен (а в Debian он находится в пакете taylor-uucp), выполните обычную команду "apt-get install cu".
 +
 
 +
cu -l /dev/ttyACM0
  
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, use "apt-get install cu" if it is not yet installed)
+
Вам возможно понадобится
cu -l /dev/ttyACM0
+
  
You might need to
+
chown uucp.uucp /dev/ttyACM0
chown uucp.uucp /dev/ttyACM0
+
  
to get the necessary right (even as root).
+
для установки соответствующих прав, даже если вы root.
  
First, you should try to check whether the USB device shows up in 'lsusb' while you're running in u-boot mode:
+
Для начала проверьте, есть ли в списке USB-устройств ваш телефон (команда "lsusb"). Напоминаем, что устройство должно находиться в режиме u-boot.
  
# lsusb -d 1457:5119
+
# lsusb -d 1457:5119
Bus 005 Device 079: ID 1457:5119
+
Bus 005 Device 079: ID 1457:5119
  
Second, lets 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.
+
После этого вы можете запускать свою терминальную программу.
  
Then, if the environment is not set correctly, you will need to use the current console (e.g. serial console) to set
+
Наконец, если переменные среды установлены неверно, используйте соединённую с телефоном консоль (серийную или USB) для выполнения следующих команд:
 
<pre>
 
<pre>
 
GTA01Bv2 # setenv stderr usbtty
 
GTA01Bv2 # setenv stderr usbtty
Line 302: Line 308:
 
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>
Line 310: Line 316:
 
==== Автозагрузка ====
 
==== Автозагрузка ====
  
Auto-boot executes the command[s] specified in the ''bootcmd'' environment variable. The default configuration is:
+
Автозагрузка по ходу своей работы исполняет команды, указанные в переменной окружения ''bootcmd''. Вот конфигурация по умолчанию:
 
<pre>
 
<pre>
 
GTA01Bv3 # printenv
 
GTA01Bv3 # printenv
Line 316: Line 322:
 
</pre>
 
</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.
+
Коротко говоря, тут сказано, что будет производиться загрузка содержимого с раздела NAND '''kernel''' в память по адресу 0x32000000, а затем этому коду будет передано исполнение.
  
 
==== Среда окружения ====
 
==== Среда окружения ====
  
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:
+
Работа u-boot ориентирована на конфигурацию, постоянно хранимую в NAND-флеши. Для чтения, изменения и сохранения этих параметров используйте следующие команды:
 
<pre>
 
<pre>
 
GTA01Bv2 # printenv
 
GTA01Bv2 # printenv
Line 347: Line 353:
 
Saving Environment to NAND...
 
Saving Environment to NAND...
 
Erasing Nand...Writing to Nand... done
 
Erasing Nand...Writing to Nand... done
GTA01Bv3 #  
+
GTA01Bv3 #
 
</pre>
 
</pre>
  
Note: When setting multiple commands, e.g. for bootcmd, you need to escape the ';', for instance
+
Обратите внимание: при установке нескольких команд в одну переменную, например bootcmd (см. подраздел "Автозагрузка" выше), символы ";" должны быть экранированы обратной косой чертой:
  
 
<pre>
 
<pre>
Line 358: Line 364:
 
==== MMC/SD ====
 
==== MMC/SD ====
  
in order to initialize a MMC/SD card, you have to use the ``mmcinit'' command.
+
Для инициализации (форматирования) карт MMC/SD используйте команду ''mmcinit''.
 
<pre>
 
<pre>
 
GTA01Bv3 # mmcinit
 
GTA01Bv3 # mmcinit
Line 374: Line 380:
 
</pre>
 
</pre>
  
afterwards, you can read ext2 filesystems like:
+
После этого на карте можно прочитать файловую систему ext2:
 
<pre>
 
<pre>
 
GTA01Bv3 # ext2ls mmc 0
 
GTA01Bv3 # ext2ls mmc 0
Line 380: Line 386:
 
<DIR>      1024 ..
 
<DIR>      1024 ..
 
<DIR>      12288 lost+found
 
<DIR>      12288 lost+found
        1544788 uImage
+
1544788 uImage
 
</pre>
 
</pre>
  
Line 391: Line 397:
 
nand read[.jffs2]    - addr off size
 
nand read[.jffs2]    - addr off size
 
nand write[.jffs2]    - addr off size - read/write `size' bytes starting
 
nand write[.jffs2]    - addr off size - read/write `size' bytes starting
    at offset `off' to/from memory address `addr'
+
at offset `off' to/from memory address `addr'
 
nand erase [clean] [off size] - erase `size' bytes from
 
nand erase [clean] [off size] - erase `size' bytes from
    offset `off' (entire device if not specified)
+
offset `off' (entire device if not specified)
 
nand bad - show bad blocks
 
nand bad - show bad blocks
 
nand dump[.oob] off - dump page
 
nand dump[.oob] off - dump page
Line 409: Line 415:
 
GTA01Bv3 # bootm 0x32000000
 
GTA01Bv3 # bootm 0x32000000
 
## Booting image at 32000000 ...
 
## Booting image at 32000000 ...
  Image Name:  OpenMoko Kernel Image Neo1973
+
Image Name:  Openmoko Kernel Image Neo1973
  Created:      2007-02-15  23:54:18 UTC
+
Created:      2007-02-15  23:54:18 UTC
  Image Type:  ARM Linux Kernel Image (gzip compressed)
+
Image Type:  ARM Linux Kernel Image (gzip compressed)
  Data Size:    1546258 Bytes =  1.5 MB
+
Data Size:    1546258 Bytes =  1.5 MB
  Load Address: 30008000
+
Load Address: 30008000
  Entry Point:  30008000
+
Entry Point:  30008000
  Verifying Checksum ... OK
+
Verifying Checksum ... OK
  Uncompressing Kernel Image ... OK
+
Uncompressing Kernel Image ... OK
 
Starting kernel ...
 
Starting kernel ...
 
</pre>
 
</pre>
Line 422: Line 428:
 
===== Запись нового загрузчика в NAND =====
 
===== Запись нового загрузчика в NAND =====
  
The following set of commands loads the file u-boot.bin from ext2/mmc and flashes it into the
+
Следующие команды загружают файл u-boot.bin с карты MMC и записывают его во флеш-раздел загрузчика:
bootloader flash partition:
+
  
 
<pre>
 
<pre>
Line 433: Line 438:
 
===== Запись ядра в NAND =====
 
===== Запись ядра в NAND =====
  
The following set of commands loads the file uImage from ext2/mmc and flashes it into the
+
Следующие команды загружают файл uImage с карты MMC и записывают его во флеш-раздел загрузчика:
kernel flash partition:
+
  
 
<pre>
 
<pre>
Line 444: Line 448:
 
===== Запись системного образа в NAND =====
 
===== Запись системного образа в NAND =====
  
The following set of commands loads the file rootfs.jffs2 from ext2/mmc and flashes it into the
+
Следующие команды загружают файл rootfs.jffs2 с карты MMC и записывают его в корневой (rootfs) флеш-раздел загрузчика:
rootfs flash partition:
+
  
 
<pre>
 
<pre>
Line 453: Line 456:
 
</pre>
 
</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.
+
Заметьте, что это работает только для файловых систем размером меньше, чем свободная память выше адреса 0x32000000, что в случае общей памяти в 64Мб равняется 32Мб.
  
 
==== Специфичные команды Neo1973 ====
 
==== Специфичные команды Neo1973 ====
  
Our version of u-boot supports a couple of Neo1973 specific commands:
+
Наша версия u-boot поддерживает несколько специфичных для Neo1973 команд:
 
<pre>
 
<pre>
GTA01Bv2 # help neo1973
+
GGTA01Bv4 # help neo1973
neo1973 neo1973 info - display phone informantion
+
neo1973 neo1973 info - display phone information
 
neo1973 power-off - switch off the phone
 
neo1973 power-off - switch off the phone
 
neo1973 charger status - display charger status
 
neo1973 charger status - display charger status
Line 468: Line 471:
 
neo1973 charger off - disable charging
 
neo1973 charger off - disable charging
 
neo1973 backlight (on|off) - switch backlight on or off
 
neo1973 backlight (on|off) - switch backlight on or off
 +
neo1973 led num (on|off) - switch LED number 'num' on or off
 
neo1973 vibrator (on|off) - switch vibrator on or off
 
neo1973 vibrator (on|off) - switch vibrator on or off
neo1973 udc pullup (on|off) - switch pull-up on or off
+
neo1973 gsm (on|off|version) - switch GSM Modem on/off or print firmware version
 +
neo1973 gps (on|off) - switch GPS system on or off
 +
neo1973 udc pullup (on|off) - switch USB device controller pull-up on or off
 +
 
 
</pre>
 
</pre>
 
What's the udc?
 
 
  
 
===== Задержки =====
 
===== Задержки =====
  
The boot menu timeout can be changed using
+
Время задержки загрузочного меню может быть изменено так:
 
<pre>
 
<pre>
 
setenv boot_menu_timeout=[seconds?]
 
setenv boot_menu_timeout=[seconds?]
 
</pre>
 
</pre>
  
Also, by changing bootdelay you can have more time to take control of u-boot:
+
Также, изменив задержку самой загрузки, можно получить больше времени для манипуляций с u-boot:
 
<pre>
 
<pre>
 
setenv bootdelay=[seconds]
 
setenv bootdelay=[seconds]
Line 489: Line 493:
 
===== Выключение питания =====
 
===== Выключение питания =====
  
Using
+
Исполнив
neo1973 power-off
+
neo1973 power-off
  
you can switch the device off from the bootloader prompt.
+
вы сможете выключить устройство прямо из строки приглашения загрузчика.
  
 
===== Заряд батареи =====
 
===== Заряд батареи =====
  
For a detailed description of the charger basics, see [[Neo1973 Battery Charger]].
+
За детальной информацией об основах зарядки телефона обратитесь к [[Neo1973 Battery Charger|соответствующей странице]].
  
 
====== Получение состояния батареи ======
 
====== Получение состояния батареи ======
  
You can get the current charger status by issuing
+
Следующая команда покажет сам состояние зарядки устройства:
neo1973 charger status
+
neo1973 charger status
  
The following modes are possible:
+
Возможны следующие состояния:
  
* idle - no charging
+
* idle - в данный момент не заряжается
 
* trickle - FIXME
 
* trickle - FIXME
* pre - Slow (100mA) charging, works in hardware.
+
* pre - Медленная зарядка на скорости 100мА/ч., штатный режим.
* fast_cccv - Fast (500mA) charging, using Constant-Current followed by Constant Voltage (Li-Ion)
+
* fast_cccv - Быстрая зарядка, 500мА/ч., используя Constant-Current и Constant Voltage (Li-Ion), также известный как режим ''fast_cccv''.
  
 
====== Запрещение загрузки батареи ======
 
====== Запрещение загрузки батареи ======
  
You can disable battery charging (until the next reboot) by issuing
+
Можно запретить зарядку батареи до следующей перезагрузки:
neo1973 charger off
+
neo1973 charger off
  
 
====== Быстрая зарядка ======
 
====== Быстрая зарядка ======
  
Using
+
Исполнив
neo1973 charger fast
+
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.
+
вы заставите устройство управления питанием (Power management unit, PMU) осуществить зарядку на повышенной скорости в 500мА/ч. Операция автоматически прекратится в случае перегрева аккумулятора или по возникновении другой нештатной ситуации.
  
 
====== Разрешение / Запрещение автоматической быстрой зарядки ======
 
====== Разрешение / Запрещение автоматической быстрой зарядки ======
  
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.
+
Функция быстрой зарядки "Autofast" -- штатное свойство блока [[PCF50606|PCF50606 PMU]]. Это значит, что режим ''fast_cccv'' будет активизирован автоматически, если к телефону будет подсоединено зарядное устройство с соответствующими выходными характеристиками по вольтажу и аккумулятор в данный момент не перегрет.
  
{{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}}
+
{{warning|Такая зарядка потенциально опасна! Включайте её принудительно только в том случае, когда '''вы уверены''', что от подключённого USB-шнура действительно можно получить не менее 500мА, например, когда зарядник подключён к мощному домашнему питанию, или к имеющему самостоятельное питание USB-хабу, или к компьютеру. Некоторые хабы и ноутбуки, однако, дают на выходе USB только 100мА и поэтому быструю зарядку не поддерживают.}}
  
You can enable or disable autofast by
+
Включать/выключать autofast можно командами
neo1973 charger autofast
+
neo1973 charger autofast
and
+
и
neo1973 charger !autofast
+
neo1973 charger !autofast
respectively.
+
соответственно.
  
 
===== Подсветка =====
 
===== Подсветка =====
  
You can switch the backlight on and off by using
+
Подсветка экрана включается и выключается:
neo1973 backlight on
+
neo1973 backlight on
and
+
и
neo1973 backlight off
+
neo1973 backlight off
respectively.
+
  
 
===== Вибро =====
 
===== Вибро =====
  
You can switch the vibrator on and off by using
+
Встроенный в корпус вибратор включается и выключается:
neo1973 vibrator on
+
neo1973 vibrator on
and
+
и
neo1973 vibrator off
+
neo1973 vibrator off
respectively.
+
  
 
==== Специфичные команды S3C2410 ====
 
==== Специфичные команды S3C2410 ====
Line 570: Line 572:
 
===== Установка системного таймера на 266 МГц  =====
 
===== Установка системного таймера на 266 МГц  =====
  
You can re-configure the [[S3C2410]] PLL to generate a 266 MHz core cpu clock (rather than the 200MHz default) by using
+
Вы можете перенастроить блок PLL у [[S3C2410]] на генерацию частоты процессора в 266МГц (вместо 200МГц) с помощью команд
GTA01Bv2 # s3c2410 speed set 266  
+
GTA01Bv2 # s3c2410 speed set 266
and
+
и
GTA01Bv2 # s3c2410 speed set 202
+
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}}
+
{{warning|Старое оборудование ([[GTA01 revisions|Phase 0 - GTA01Bv3]]) стабильно работает на частоте 266МГц только если к аппарату не подключены никакие внешние устройства, особенно [[Debug Board|отладочная панель]] через коннектор FPC}}
  
 
==== TFTP на QT2410 ====
 
==== TFTP на QT2410 ====
  
The QT2410 cs8900a Ethernet can be used to download images via network.
+
Сетевой интерфейс cs8900a устройства [[QT2410]] может быть использован для получения загрузочных образов по сети.
  
First, you have to make sure that ''ipaddr'', ''serverip'', ''ethaddr' and ''netmaskk'' are set correctly in the environment:
+
Для начала установите правильные значения переменных окружения ''ipaddr'', ''serverip'', ''ethaddr'' и ''netmaskk'':
  
 
<pre>
 
<pre>
Line 602: Line 604:
 
Load address: 0x32000000
 
Load address: 0x32000000
 
Loading: #################################################################
 
Loading: #################################################################
        #################################################################
+
#################################################################
        #################################################################
+
#################################################################
        #################################################################
+
#################################################################
        ##########################################
+
##########################################
 
done
 
done
 
Bytes transferred = 1544788 (179254 hex)
 
Bytes transferred = 1544788 (179254 hex)
 
</pre>
 
</pre>
  
you can then commence booting via
+
Далее вы можете осуществить загрузку полученного образа:
 
<pre>
 
<pre>
 
QT2410# bootm 0x32000000
 
QT2410# bootm 0x32000000
 
</pre>
 
</pre>
  
== Обноврение программного обеспечения устройства ==
+
== Обновление программного обеспечения устройства ==
  
Our version of u-boot also implements [[USB DFU]]. This can be useful to
+
Наша версия u-boot имеет также реализацию [[USB DFU]]. Это, в частности, может быть полезно для загрузки файлов и образов ядер для проведения быстрого тестирования.
load files and kernel for quick testing.
+
  
To find out whether your version of u-boot supports this, use the output of
+
Чтобы понять, поддерживает ли ваш u-boot эту функцию, посмотрите на вывод
$ lsusb -v -d 1457:5119
+
$ lsusb -v -d 1457:5119
while the phone is in u-boot mode.
+
в то время как телефон находится в режиме u-boot.
  
If it supports DFU, you should see the following snippet towards the end of the output:
+
Если DFU поддерживается, вы увидите следующий блок текста ближе к концу вывода команды:
 
<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]].
+
Далее читайте страницу [[dfu-util]], где описан процесс обновления версий ПО телефона.
  
 
=== Загрузка через DFU ===
 
=== Загрузка через DFU ===
  
To load a file at memory address 0x32000000:
+
Для загрузки файла в память по адресу 0x32000000:
 
<pre>
 
<pre>
 
dfu-util -a 0 -D fileToLoad -R
 
dfu-util -a 0 -D fileToLoad -R
 
</pre>
 
</pre>
  
After that, send 'bootm 0x32000000' to u-boot or 'bootelf 0x32000000' if
+
После этого отправьте u-boot команду 'bootm 0x32000000', или 'bootelf 0x32000000', если это файл формата [http://ru.wikipedia.org/wiki/Executable_and_Linkable_Format ELF].
its an elf file.
+
  
Simple python script that can boot an ELF image - avoiding a ACM bug that breaks on large packets.
+
Вот простой скрипт на Python, который загружает образ ELF, избегая при этом ошибки в [[The USB Control Device Class Abstract Control Model - CDC ACM|ACM]], приводящей к сбою при передаче больших пакетов.
  
 
<pre>
 
<pre>
Line 662: Line 662:
  
 
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 691: Line 691:
 
=== Проблемы соединения по USB ===
 
=== Проблемы соединения по USB ===
  
I once got errors like this (in dmesg or /var/log/messages) on the host side while connecting the neo in u-boot:
+
Однажды на компьютере, к которому был подключён Neo, во время соединения с использованием u-boot я стал получать следующие ошибки (в dmesg или /var/log/messages):
 
+
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.
+
usb 2-1: device descriptor read/64, error -110
 +
usb usb2: Controller not stopped yet!
  
rmmod uhci_hcd ; modprobe uhci_hcd
+
У себя я решил эту проблему, выполнив на компьютере следующие команды -- выгрузил и заново загрузил в ядро модуль uhci_hcd. Обратите внимание, что если у вас клавиатура или мышь USB, выполнение этих команд может обернуться очевидными неприятностями. У меня были только устройства PS/2, так что я не проверял...
  
{{Languages|Bootloader}}
+
rmmod uhci_hcd ; modprobe uhci_hcd
  
 
[[Category:System Developers/ru]]
 
[[Category:System Developers/ru]]

Latest revision as of 14:35, 1 February 2010

Консоль загрузчика Neo1973
Заставка загрузчика Neo1973

Загрузчик, используемый в смартфоне, называется U-Boot. Он обеспечивает начальную функциональность Openmoko во время загрузки: USB DFU для прошивки внутреннего ПО телефона, начальная заставка, загрузочное меню, консоль для введения команд загрузчику, конфигурировавшие среды загрузчика и собственно загрузка ядра.

Для использования доступно несколько версий загрузчика u-boot.

Contents

[edit] Фаза 0. Быстрый старт

  • Убедитесь, что не забыли вставить батарейку, а USB-кабель не был ни к чему подключен в течение последних 30 секунд.
  • Присоедините Neo (не Debug board!) USB-кабелем к машине с Linux-ом.
  • Удерживайте AUX во время загрузки для получения доступа к меню.
  • Переключите консоль на USB.
  • Подключитесь к /dev/ttyACM0 терминальной программой на Linux-машине (возможно, потребуется сделать chown uucp.uucp /dev/ttyACM0 )
  • Учтите, что доступ к /dev/ttyACM0 исчезнет во время загрузки, и в дальнейшем необходимо использовать сетевое устройство usb0.
  • Вы увидите строку приглашения к загрузке.
  • Установите задержку загрузчика переменных среды uboot в -1, если необходимо, чтобы меню появлялось при каждой загрузке.

[edit] Общие сведения

Модель GTA01 использует загрузчик u-boot, дополнительную информацию о котором можно найти по следующим адресам:

Дополнительно к оригинальному u-boot в GTA01 реализованы следующие возможности:

  • Загрузка устройства с флеши NAND с использованием S3C2410 Steppingstone.
  • Поддержка S3C2410 NAND.
  • Загрузка ПО через контроллер S3C2410 USB device controller.
  • Отображение при загрузке логотипа или состояния процесса загрузки через S3C2410 framebuffer.

u-boot, однако, не поддерживает множество вещей, нужных для GTA01, например:

  • Чтение ядра и образа initrd с карт памяти SD/Transflash.
  • Загрузка ПО с вышеупомянутого контроллера S3C2410 USB device controller.

User:HaraldWelte сейчас работает над этими проблемами, и, скорее всего, большинство из них уже имеет какое-то решение.

[edit] Исходный код загрузчика

Патчи к загрузчику u-boot, созданные в рамках проекта Openmoko, можно найти тут: http://svn.openmoko.org/trunk/src/target/u-boot/patches/.

Извлеките исходники из архива и запустите сначала "make gta01bv3_config" (или "gta01bv2_config", или с любой другой имеющейся конфигурацией), затем "make". В результате должен появиться файл образа u-boot.bin, который необходимо записать в NAND-флеш устройства, используя либо существующий загрузчик, либо sjf2410-linux.

[edit] Программный код загрузчика

Последние версии собранных образов загрузчика можно найти по адресу http://downloads.openmoko.org/daily/ ; записывать в NAND их надо по смещению 0x00000000 (размер 0x30000).

[edit] Разработка загрузчика

[edit] QT2410

Если вы хотите заняться разработкой загрузчика на QT2410, легче будет не прошивать его во флеш-память, а работать с его образом, закаченным через USB в оперативную память.

Для этого надо отредактировать файл u-boot/include/configs/qt2410.h: изменить 32-ю строку с "if 0" на "if 1", и пересобрать образ: "make".

Получившийся образ "u-boot.bin" НЕ ПРЕДНАЗНАЧЕН для записи в NAND-флеш и может быть исполнен только в памяти, например с помощью s3c2410_boot_usb.

[edit] GTA01

Ситуация с работой с загрузчиком на самом устройстве GTA01 немного сложнее: во-первых у нас нет здесь NOR-флеши, во-вторых не существует возможности загрузиться ни с чего, кроме NAND. Следовательно, нет в нашем распоряжении и USB-загрузчика, как на QT2410.

Проблема заключается в том, что S3C2410 Steppingstone безусловно копирует первые 4 Кб с флеши в свою внутреннюю память, SRAM. Этот сегмент SRAM-памяти так же безусловно связывается с физическим адресом 0. Как это обойти?

[edit] Использование JTAG для загрузки из оперативной памяти

Так как же загрузиться из памяти? Используем JTAG / OpenOCD для:

  • сброса и останова CPU на 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
  • загрузки небольшого кода для низкоуровневой инициализации тайминга SDRAM (переписывание первых 4 Кб SRAM у Steppingstone)
> load_binary /space/misc/gta01/u-boot.git/foo.bin 0
downloaded 332 byte in 0s 21899us
  • установки точки останова по адресу 0x33f80000 (это означает, что код из предыдущего пункта завершил исполнение)
> bp 0x33f80000 4 hw
breakpoint added at address 0x33f80000
  • запуска кода до этой точки
> 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
  • загрузки образа u-boot в память по адресу 0x33f80000
> load_binary /space/misc/gta01/u-boot.git/u-boot.bin 0x33f80000
downloaded 135692 byte in 6s 567264us
  • продолжения исполнения кода
> resume
Target 0 resumed

В этот момент подсветка экрана зажигается и мы видим примерно такое сообщение на серийной консоли:

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] Создание загрузочных образов

Для нормальной работы u-boot требуется загрузочные образы (такие как ядро, но также initrd и др.) в форме так называемых uImage. Чтобы создать этот формат из, например, образа ядра vmlinux, надо сделать следующее:

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] Меню загрузки

Загрузочное меню u-boot на экране Neo1973

На момент выпуска Phase-0 наша версия u-boot имеет возможность выводить на экран загрузочное меню.

[edit] Получение доступа к меню

Чтобы войти в меню, надо перед включением аппарата нажать и удерживать кнопку AUX button, а затем нажать кнопку включения питания.

[edit] Использование

Последовательными нажатиями кнопки AUX button можно ходить по пунктам меню. Для выбора нужного пункта необходимо нажать кнопку POWER.

[edit] Добавление пунктов в меню

Для добавления новых пунктов к существующему меню нужно установить соответствующие переменные среды. Общепринятый синтаксис таков: menu_<номер> <Название>: Команда-U-Boot

Например, следующая команда добавит пункт загрузочного меню, который будет переключать телефон в режим быстрой зарядки (autofast charging) и выключать подсветку экрана:

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

[edit] Информация загрузчика

[edit] Получение загрузочной информации

Строка приглашения загрузчика доступна либо через серийную консоль (см. Debug Board), либо как виртуальное серийное устройство USB (USB CDC_ACM); способ соединения зависит от значений переменных окружения stdin, stdout и stderr.

Независимо от того, используете ли вы usbtty или нет, первые несколько сообщений будут выведены в поток серийной консоли.

Загрузчик по умолчанию настроен на 3-секундное ожидание. Если в течение этого времени на stdin будет получено нажатие какой-либо клавиши, загрузка прерывается.

[edit] Использование usbtty

Простое подключение телефона в режиме u-boot к компьютеру с Linux должно привести к обнаружению устройства CDC ACM и появлению нового tty-устройства /dev/ttyACM0. Если этого не случилось, включите опцию ядра CONFIG_USB_ACM (Device Drivers -> USB support -> USB Modem (CDC ACM) support). (Инструкции для пользователей MacOS тут.)

Затем просто воспользуйтесь любым эмулятором терминала на выбор (minicom, cu, zc, screen ...), подключившись к вышеупомянутому /dev/ttyACM0. Для примера рассмотрим вариант с cu. Если у вас он не установлен (а в Debian он находится в пакете taylor-uucp), выполните обычную команду "apt-get install cu".

cu -l /dev/ttyACM0

Вам возможно понадобится

chown uucp.uucp /dev/ttyACM0

для установки соответствующих прав, даже если вы root.

Для начала проверьте, есть ли в списке USB-устройств ваш телефон (команда "lsusb"). Напоминаем, что устройство должно находиться в режиме u-boot.

  1. lsusb -d 1457:5119

Bus 005 Device 079: ID 1457:5119

Затем посмотрите набор возможных конфигурационных опций устройства:

# 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

После этого вы можете запускать свою терминальную программу.

Наконец, если переменные среды установлены неверно, используйте соединённую с телефоном консоль (серийную или USB) для выполнения следующих команд:

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

[edit] Пример сообщений u-boot

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] Команды загрузчика

[edit] Автозагрузка

Автозагрузка по ходу своей работы исполняет команды, указанные в переменной окружения bootcmd. Вот конфигурация по умолчанию:

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

Коротко говоря, тут сказано, что будет производиться загрузка содержимого с раздела NAND kernel в память по адресу 0x32000000, а затем этому коду будет передано исполнение.

[edit] Среда окружения

Работа u-boot ориентирована на конфигурацию, постоянно хранимую в NAND-флеши. Для чтения, изменения и сохранения этих параметров используйте следующие команды:

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 #

Обратите внимание: при установке нескольких команд в одну переменную, например bootcmd (см. подраздел "Автозагрузка" выше), символы ";" должны быть экранированы обратной косой чертой:

GTA01Bv3 # setenv bootcmd mmcinit\; ext2load mmc 0 0x32000000 uImage\; bootm 0x32000000

[edit] MMC/SD

Для инициализации (форматирования) карт MMC/SD используйте команду mmcinit.

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 #

После этого на карте можно прочитать файловую систему ext2:

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

[edit] 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)
[edit] Загрузка ядра из 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 ...
[edit] Запись нового загрузчика в NAND

Следующие команды загружают файл u-boot.bin с карты MMC и записывают его во флеш-раздел загрузчика:

GTA01Bv3 # ext2load mmc 0 0x32000000 u-boot.bin
GTA01Bv3 # nand erase u-boot
GTA01Bv3 # nand write.e 0x32000000 u-boot ${filesize}
[edit] Запись ядра в NAND

Следующие команды загружают файл uImage с карты MMC и записывают его во флеш-раздел загрузчика:

GTA01Bv3 # ext2load mmc 0 0x32000000 uImage
GTA01Bv3 # nand erase kernel
GTA01Bv3 # nand write.e 0x32000000 kernel ${filesize}
[edit] Запись системного образа в NAND

Следующие команды загружают файл rootfs.jffs2 с карты MMC и записывают его в корневой (rootfs) флеш-раздел загрузчика:

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

Заметьте, что это работает только для файловых систем размером меньше, чем свободная память выше адреса 0x32000000, что в случае общей памяти в 64Мб равняется 32Мб.

[edit] Специфичные команды Neo1973

Наша версия u-boot поддерживает несколько специфичных для Neo1973 команд:

GGTA01Bv4 # help neo1973
neo1973 neo1973 info - display phone information
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 led num (on|off) - switch LED number 'num' on or off
neo1973 vibrator (on|off) - switch vibrator on or off
neo1973 gsm (on|off|version) - switch GSM Modem on/off or print firmware version
neo1973 gps (on|off) - switch GPS system on or off
neo1973 udc pullup (on|off) - switch USB device controller pull-up on or off

[edit] Задержки

Время задержки загрузочного меню может быть изменено так:

setenv boot_menu_timeout=[seconds?]

Также, изменив задержку самой загрузки, можно получить больше времени для манипуляций с u-boot:

setenv bootdelay=[seconds]
[edit] Выключение питания

Исполнив neo1973 power-off

вы сможете выключить устройство прямо из строки приглашения загрузчика.

[edit] Заряд батареи

За детальной информацией об основах зарядки телефона обратитесь к соответствующей странице.

[edit] Получение состояния батареи

Следующая команда покажет сам состояние зарядки устройства: neo1973 charger status

Возможны следующие состояния:

  • idle - в данный момент не заряжается
  • trickle - FIXME
  • pre - Медленная зарядка на скорости 100мА/ч., штатный режим.
  • fast_cccv - Быстрая зарядка, 500мА/ч., используя Constant-Current и Constant Voltage (Li-Ion), также известный как режим fast_cccv.
[edit] Запрещение загрузки батареи

Можно запретить зарядку батареи до следующей перезагрузки: neo1973 charger off

[edit] Быстрая зарядка

Исполнив neo1973 charger fast вы заставите устройство управления питанием (Power management unit, PMU) осуществить зарядку на повышенной скорости в 500мА/ч. Операция автоматически прекратится в случае перегрева аккумулятора или по возникновении другой нештатной ситуации.

[edit] Разрешение / Запрещение автоматической быстрой зарядки

Функция быстрой зарядки "Autofast" -- штатное свойство блока PCF50606 PMU. Это значит, что режим fast_cccv будет активизирован автоматически, если к телефону будет подсоединено зарядное устройство с соответствующими выходными характеристиками по вольтажу и аккумулятор в данный момент не перегрет.

WARNING: Такая зарядка потенциально опасна! Включайте её принудительно только в том случае, когда вы уверены, что от подключённого USB-шнура действительно можно получить не менее 500мА, например, когда зарядник подключён к мощному домашнему питанию, или к имеющему самостоятельное питание USB-хабу, или к компьютеру. Некоторые хабы и ноутбуки, однако, дают на выходе USB только 100мА и поэтому быструю зарядку не поддерживают.


Включать/выключать autofast можно командами neo1973 charger autofast и neo1973 charger !autofast соответственно.

[edit] Подсветка

Подсветка экрана включается и выключается: neo1973 backlight on и neo1973 backlight off

[edit] Вибро

Встроенный в корпус вибратор включается и выключается: neo1973 vibrator on и neo1973 vibrator off

[edit] Специфичные команды S3C2410

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
[edit] Установка системного таймера на 266 МГц

Вы можете перенастроить блок PLL у S3C2410 на генерацию частоты процессора в 266МГц (вместо 200МГц) с помощью команд GTA01Bv2 # s3c2410 speed set 266 и GTA01Bv2 # s3c2410 speed set 202 соответственно.

WARNING: Старое оборудование (Phase 0 - GTA01Bv3) стабильно работает на частоте 266МГц только если к аппарату не подключены никакие внешние устройства, особенно отладочная панель через коннектор FPC


[edit] TFTP на QT2410

Сетевой интерфейс cs8900a устройства QT2410 может быть использован для получения загрузочных образов по сети.

Для начала установите правильные значения переменных окружения ipaddr, serverip, ethaddr и netmaskk:

QT2410 # printenv
ethaddr=00:01:02:03:04:05
netmask=255.255.255.0
ipaddr=192.168.100.100
serverip=192.168.100.1


[edit] Загрузка ядра по TFTP
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)

Далее вы можете осуществить загрузку полученного образа:

QT2410# bootm 0x32000000

[edit] Обновление программного обеспечения устройства

Наша версия u-boot имеет также реализацию USB DFU. Это, в частности, может быть полезно для загрузки файлов и образов ядер для проведения быстрого тестирования.

Чтобы понять, поддерживает ли ваш u-boot эту функцию, посмотрите на вывод $ lsusb -v -d 1457:5119 в то время как телефон находится в режиме u-boot.

Если DFU поддерживается, вы увидите следующий блок текста ближе к концу вывода команды:

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

Далее читайте страницу dfu-util, где описан процесс обновления версий ПО телефона.

[edit] Загрузка через DFU

Для загрузки файла в память по адресу 0x32000000:

dfu-util -a 0 -D fileToLoad -R

После этого отправьте u-boot команду 'bootm 0x32000000', или 'bootelf 0x32000000', если это файл формата ELF.

Вот простой скрипт на Python, который загружает образ ELF, избегая при этом ошибки в ACM, приводящей к сбою при передаче больших пакетов.

#!/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] Типовые проблемы

[edit] Проблемы соединения по USB

Однажды на компьютере, к которому был подключён Neo, во время соединения с использованием u-boot я стал получать следующие ошибки (в dmesg или /var/log/messages):

usb 2-1: device descriptor read/64, error -110 usb usb2: Controller not stopped yet!

У себя я решил эту проблему, выполнив на компьютере следующие команды -- выгрузил и заново загрузил в ядро модуль uhci_hcd. Обратите внимание, что если у вас клавиатура или мышь USB, выполнение этих команд может обернуться очевидными неприятностями. У меня были только устройства PS/2, так что я не проверял...

rmmod uhci_hcd ; modprobe uhci_hcd

Personal tools
Консоль загрузчика Neo1973
Заставка загрузчика Neo1973

Фаза 0. Быстрый старт

  • Убедитесь, что не забыли вставить батарейку, а USB-кабель не был ни к чему подключен в течение последних 30 секунд.
  • Присоедените Neo (не панель отладки) USB-кабелем к машине с Linux-ом.
  • Удерживайте AUX во время загрузки для получения доступа к меню.
  • Переключите консоль на USB.
  • Подключитесь к /dev/ttyACM0 терминальной программой на Linux-машине (возможно, потребуется сделать chown uucp.uucp /dev/ttyACM0 )
  • Учтите, что доступ к /dev/ttyACM0 исзчезнет во время загрузки, и в дальнейшем необходимо использовать сетевое устройство usb0.
  • Вы увидите строку приглашения к загрузке.
  • Установите задержку загрузчика переменных среды uboot в -1, если необходимо, чтобы меню появлялось при каждой загрузке.

Общие сведения

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.

Исходный код загрузчика

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.

Программный код загрузчика

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)

Разработка загрузчика

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

Использование JTAG для загрузки из оперативной памяти

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 # 

Создание загрузочных образов

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

Меню загрузки

u-boot boot menu on Neo1973

As of the Phase-0 release, our u-boot version now features an on-screen 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.

Использование

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

Добавление пунктов в меню

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

Информация загрузчика

Получение загрузочной информации

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.

Использование usbtty

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). (Instructions for MacOS users are here)

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, use "apt-get install cu" if it is not yet installed)

cu -l /dev/ttyACM0

You might need to

chown uucp.uucp /dev/ttyACM0

to get the necessary right (even as root).

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

Пример сообщений u-boot

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 #

Команды загрузчика

Автозагрузка

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.

Среда окружения

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)
Загрузка ядра из 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 ...
Запись нового загрузчика в 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}
Запись ядра в 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}
Запись системного образа в 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

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?


Задержки

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]
Выключение питания

Using

neo1973 power-off

you can switch the device off from the bootloader prompt.

Заряд батареи

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

Получение состояния батареи

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)
Запрещение загрузки батареи

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

neo1973 charger off
Быстрая зарядка

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.

Разрешение / Запрещение автоматической быстрой зарядки

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.

Подсветка

You can switch the backlight on and off by using

neo1973 backlight on

and

neo1973 backlight off

respectively.

Вибро

You can switch the vibrator on and off by using

neo1973 vibrator on

and

neo1973 vibrator off

respectively.

Специфичные команды S3C2410

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
Установка системного таймера на 266 МГц

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 на 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
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

Обноврение программного обеспечения устройства

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.

Загрузка через 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)

Типовые проблемы

Проблемы соединения по USB

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