U-Boot/ru

From Openmoko

(Difference between revisions)
Jump to: navigation, search
 

Latest revision as of 15: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