U-Boot/ru
From Openmoko
(→Информация загрузчика) |
m (→MMC/SD) |
||
Line 359: | Line 359: | ||
==== MMC/SD ==== | ==== MMC/SD ==== | ||
− | Для инициализации (форматирования) карт MMC/SD используйте команду | + | Для инициализации (форматирования) карт MMC/SD используйте команду ''mmcinit''. |
<pre> | <pre> | ||
GTA01Bv3 # mmcinit | GTA01Bv3 # mmcinit |
Revision as of 10:31, 10 September 2008
Фаза 0. Быстрый старт
- Убедитесь, что не забыли вставить батарейку, а USB-кабель не был ни к чему подключен в течение последних 30 секунд.
- Присоедените Neo (не панель отладки) USB-кабелем к машине с Linux-ом.
- Удерживайте AUX во время загрузки для получения доступа к меню.
- Переключите консоль на USB.
- Подключитесь к /dev/ttyACM0 терминальной программой на Linux-машине (возможно, потребуется сделать chown uucp.uucp /dev/ttyACM0 )
- Учтите, что доступ к /dev/ttyACM0 исзчезнет во время загрузки, и в дальнейшем необходимо использовать сетевое устройство usb0.
- Вы увидите строку приглашения к загрузке.
- Установите задержку загрузчика переменных среды uboot в -1, если необходимо, чтобы меню появлялось при каждой загрузке.
Общие сведения
Модель GTA01 использует загрузчик u-boot, дополнительную информацию о котором можно найти по следующим адресам:
- http://www.denx.de/wiki/DULG
- http://www.gumstix.org/tikiwiki/tiki-index.php?page=U-Boot
- http://linuxdevices.com/articles/AT5085702347.html
Дополнительно к оригинальному 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 сейчас работает над этими проблемами, и, скорее всего, большинство из них уже имеет какое-то решение.
Исходный код загрузчика
Патчи к загрузчику 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.
Программный код загрузчика
Последние версии собранных образов загрузчика можно найти по адресу http://buildhost.openmoko.org/tmp/deploy/images/ ; записывать в NAND их надо по смещению 0x00000000 (размер 0x30000).
Разработка загрузчика
QT2410
Если вы хотите заняться разработкой загрузчика на QT2410, легче будет не прошивать его во флеш-память, а работать с его образом, закаченным через USB в оперативную память.
Для этого надо отредактировать файл u-boot/include/configs/qt2410.h: изменить 32-ю строку с "if 0" на "if 1", и пересобрать образ: "make".
Получившийся образ "u-boot.bin" НЕ ПРЕДНАЗНАЧЕН для записи в NAND-флеш и может быть исполнен только в памяти, например с помощью s3c2410_boot_usb.
GTA01
Ситуация с работой с загрузчиком на самом устройстве GTA01 немного сложнее: во-первых у нас нет здесь NOR-флеши, во-вторых не существует возможности загрузиться ни с чего, кроме NAND. Следовательно, нет в нашем распоряжении и USB-загрузчика, как на QT2410.
Проблема заключается в том, что S3C2410 Steppingstone безусловно копирует первые 4 Кб с флеши в свою внутреннюю память, SRAM. Этот сегмент SRAM-памяти так же безусловно связывается с физическим адресом 0. Как это обойти?
Использование 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 #
Создание загрузочных образов
Для нормальной работы 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
Меню загрузки
На момент выпуска Phase-0 наша версия u-boot имеет возможность выводить на экран загрузочное меню.
Получение доступа к меню
Чтобы войти в меню, надо перед включением аппарата нажать и удерживать кнопку AUX button, а затем нажать кнопку включения питания.
Использование
Последовательными нажатиями кнопки AUX button можно ходить по пунктам меню. Для выбора нужного пункта необходимо нажать кнопку POWER.
Добавление пунктов в меню
Для добавления новых пунктов к существующему меню нужно установить соответствующие переменные среды. Общепринятый синтаксис таков: menu_<номер> <Название>: Команда-U-Boot
Например, следующая команда добавит пункт загрузочного меню, который будет переключать телефон в режим быстрой зарядки (autofast charging) и выключать подсветку экрана:
setenv menu_6 Autofast-Charge and Backlight Off: neo1973 charger autofast\; neo1973 backlight off saveenv
Информация загрузчика
Получение загрузочной информации
Строка приглашения загрузчика доступна либо через серийную консоль (см. Debug Board), либо как виртуальное серийное устройство USB (USB CDC_ACM); способ соединения зависит от значений переменных окружения stdin, stdout и stderr.
Независимо от того, используете ли вы usbtty или нет, первые несколько сообщений будут выведены в поток серийной консоли.
Загрузчик по умолчанию настроен на 3-секундное ожидание. Если в течение этого времени на stdin будет получено нажатие какой-либо клавиши, загрузка прерывается.
Использование 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.
# 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
Пример сообщений 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 #
Команды загрузчика
Автозагрузка
Автозагрузка по ходу своей работы исполняет команды, указанные в переменной окружения bootcmd. Вот конфигурация по умолчанию:
GTA01Bv3 # printenv bootcmd=setenv bootargs ${bootargs_base} ${mtdparts}; nand read.e 0x32000000 kernel; bootm 0x32000000
Коротко говоря, тут сказано, что будет производиться загрузка содержимого с раздела NAND kernel в память по адресу 0x32000000, а затем этому коду будет передано исполнение.
Среда окружения
Работа 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
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
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
Следующие команды загружают файл 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}
Запись ядра в 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
Languages: |
English • العربية • Български • Česky • Dansk • Deutsch • Esperanto • Eesti • Español • فارسی • Suomi • Français • עברית • Magyar • Italiano • 한국어 • Nederlands • Norsk (bokmål) • Polski • Português • Română • Русский • Svenska • Slovenčina • Українська • 中文(中国大陆) • 中文(台灣) • Euskara • Català |