roboforum.ru

Технический форум по робототехнике.

mini2440 Установка загрузчика u-boot в NAND

mini2440 Установка загрузчика u-boot в NAND

Сообщение setar » 05 июл 2010, 22:08

Смена загрузчика в NAND

По умолчанию плата Mini2440 содержит загрузчик vivi от компани samsung.
Обычно имеет смысл его заменить - он достаточно древний и не обладает достаточным количеством функций которые присутствуют в современных загрузчиках, таких как u-boot.

Что нам потребуется
1.разумеется сама плата mini2440 (c дисплеем или даже без него)
2.некий внешний линукс (x86).
в качестве готовой системы можно использовать Calculate Linux Roboforum Build (forum10/topic8216.html)
с этого образа производится загрузка виртуальной машины (например VirtualBox)
и делается установка линукса на виртуальную систему
3.нам потребуется последовательный порт на компьютере это может быть встроенный порт либо порт через переходник. При использовании переходника разумеется в хостовой системе (родительской, в которой запущена виртуалка) должны быть установлены соответствующие драйвера.
Для виртуальной системы создается связь с внешним портом
4.образ загрузчика u-boot (можно взять с диска комплекта платы mini2440 /OpenSourceBootloader/u-boot.bin) или загрузить из этого поста
5.прямой кабель RS232 и кабель A-B USB (оба кабеля из комплекта платы)
6.USB аплоадер - из этой статьи (скомпилирован i686) или с родного сайта http://www.friendlyarm.net/dl.php?file=usbpush.tar.gz (исходник)


Установка соединения с контроллером
Подключаем к mini2440 кабели rs232 и USB

Запускаем имеющийся у нас линукс на виртуальной машине.
Для линукса всегда рекомендуется работать рядовым пользователем, но привилегии суперпользователя (root) нам всё же потребуются, для этого убедимся что рядовой пользователь имеет право использовать повышение привилегий:
из под пользователя root даем следующую команду
# usermod -G wheel user
что позволит пользователю «user» в случае надобности использовать команду sudo
входим в систему рядовым пользователем.


Для подключения к последовательной консоли управления из под линукса будем использовать команду minicom, но прежде нужно определить с каким портом в виртуальной машине нам предстоит работать.
Выполним команду
$ ls /dev/tty*
в выводе нас интересуют устройства типа ttyS0 , ttyS1 (последовательные порты) или ttyUSB0 , tty.usbserial (для конверторов usb-serial)
Запоминаем название устройства, учитывая что регистр важен!
Далее настроим миником для работы с требуемым устройством:
$ minicom -s
в появившемся окошке переходим на пункт «serial port setup», нажимаем клавишу «a» и меняем название порта с которым предстоит работать на требуемый, у меня это /dev/ttyUSB0.
Так же нужно удостовериться что в пункте «е» параметры скорости соответствуют значению «115200 8N1»
Аппаратное управление потоком «F» и Програмное управление потоком «G» отключаем!
выходим из этого меню (Esc) и сохраняем изменения «Save setup as dfl».
Далее делаем «Exit» и попадаем в режим обмена с выбранным портом.
Мы готовы к подключению микроконтроллера.
Переводим переключатель режимов работы в положение NOR (на выключенном устройстве !) и включаем питание.
Если всё прошло правильно, то наслаждаемся отобразившимся текстовым меню загрузчика vivi

Альтернативно консоль управления можно открыть командой screen :
$ screen /dev/ttyUSB0 115200
результат абсолютно аналогичный
клавиши screen:
временный выход без сброса — Ctrl+a;d (серия нажатий сначала две одновременно, затем одна клавиша)
вернуться — из консоли $ screen -r
прервать соединение — выходим а затем из консоли $ killall -9 screen

USB аплоадер
Ещё нам потребуется линуксовая программка usbpush
для этого переключаемся во вторую консоль (alt+f2)
входим рядовым пользователем
и далее производим закачку и сборку утилиты
$ cd ~/mini2440
$ mkdir usbpush
$ cd usbpush
$ wget {здесь подставить адрес архива из приложения}
$ tar -xvzf ./usbpush.tar.gz
$ make
удостоверимся что сборка прошла без ошибок и у нас имеется рабочая утилита:
$ ~/mini2440/usbpush/usbpush
в ответ утилита должна показать пример использования.

Сборка u-boot
На самом деле этот раздел можно пропустить и взять готовый бинарник,
рассказываю из любви к искусству :)
$ cd ~/mini2440
$ mkdir uboot ; cd uboot
$ git clone git://repo.or.cz/u-boot-openmoko/mini2440.git
$ export CROSS_COMPILE=armv4tl-softfloat-linux-gnueabi-
$ cd mini2440

вроде не требуется ибо то же самое :
$ mcedit include/configs/mini2440.h
проверить ремарку CONFIG_USE_IRQ
было
#define USE_920T_MMU
//#define CONFIG_USE_IRQ 1 /* Needed for USB device! */
стало
#define USE_920T_MMU
#define CONFIG_USE_IRQ 0 /* Needed for USB device! */


$ make mini2440_config
$ make all
на выходе получаем u-boot.bin и размещаем его копию в каталоге ~/mini2440/images

Так же, из подготовительных мероприятий поместим бинарный образ загрузчика u-boot.bin
в папку mini2440/images домашнего каталога пользователя.
Не буду подробно останавливаться как скопировать файлы с хостового компьютера на виртуальный линукс,
подскажу лишь что использование файловой оболочки mc сильно облегчит задачу. Так же нужно помнить что расшареные для виртуальной машины диски хостовой системы скорее всего будут доступны в папке /media

Если всё хорошо — продолжаем:
возвращаемся в первую консоль (alt+f1)
и если успели закрыть — открываем консоль на контроллер и наблюдаем меню загрузчика vivi

На данный момент есть два варианта загрузки бинарного кода u-boot.bin

первый из них через загрузку в NOR (load) запуск u-boot в ram (go) с последующим копированием в NAND (nand write)
второй через подмену подмену бинарником u-boot ожидаемого к загрузке supervivi


Первый метод установки (load / go / nand write)

Загрузив контроллер в режиме NOR и получив консольное управление к vivi переходим в командный режим нажатием клавиши "q"

далее :
Supervivi> load ram 0x31000000 239016 u
здесь меняем размер бинарного файла на свой (вместо выделенного красным)
USB host is connected. Waiting a download.


Теперь из второй консоли (alt+f2) производим отправку загрузчика uboot
$ cd ~/mini2440/usbpush
$ ./usbpush ~/images/u-boot.bin
csum = 0xd542
send_file: addr = 0x33f80000, len = 0x0003a5a8


возвращаемся в vivi (alt+f1)

и наблюдаем похожее:
Now, Downloading [ADDRESS:31000000h,TOTAL:239026]
RECEIVED FILE SIZE: 239026 (233KB/S, 1S)
Downloaded file at 0x31000000, size = 239016 bytes


далее:
Supervivi> go 0x31000000
и наблюдаем
go to 0x31000000
argument 0 = 0x00000000
argument 1 = 0x00000000
argument 2 = 0x00000000
argument 3 = 0x00000000

U-Boot 1.3.2-dirty-moko12 (Apr 16 2009 - 18:14:52)

I2C: ready
DRAM: 64 MB
Flash: 2 MB
NAND: Bad block table not found for chip 0
Bad block table not found for chip 0
64 MiB
Found Environment offset in OOB..
USB: S3C2410 USB Deviced
In: serial
Out: serial
Err: serial
MAC: 08:08:11:18:12:27
Hit any key to stop autoboot: 0

здесь нужно нажать любую клавишу чтобы прервать процесс автозапуска
Если надпись "U-Boot 1.3.2 ... " не появляется то переходим ко второму методу установки (ниже)

При удачной загрузке мы попадаем в консоль загрузчика u-boot, о чем свидетельствует приглашение MINI2440 #

далее произведем очистку NAND , создание таблицы сбойных блоков
MINI2440 # nand scrub
MINI2440 # nand createbbt
(обе команды потребуют подтверждения - "y","Enter")
поиск сбойных блоков может быть длительным, мин около двух

создадим таблицу разделов по умолчанию
MINI2440 # mtdparts

перепишем код u-boot из ram в NAND

MINI2440 # nand write.e 0x31000000 u-boot
обращаю внимание .e позволяет делать обход bad блоков

и сохраним переменные окружения загрузчика
MINI2440 # saveenv

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

В случае успешной установки проходить второй метод не требуется !

Ну а если при выполнении инструкций по первому методу дальше команды go продвинуться не удалось
то переходим ко второму методу установки:

Описываемый способ работоспособен но в результате экспериментов может привести к тому что микроконтроллер
перестанет принимать новые файлы прошивок - примет состояние кирпича (brick).
Нам это не сильно страшно поскольку у нас в комплекте имеется волшебная платка JTAG - низкоуровневый программатор
(удостоверьтесь в его наличии прежде чем приступать !).
Указанное состояние может произойти потому что при загрузке u-boot через "v" его часть меняет родной для vivi функционал загрузки через USB и мы не сможем передать файл ни через usbpush (аналог win DNW) ни через родную утилиту u-boot`а dfu-tool.
в итоге если мы загрузим u-boot с переписыванием его в NAND а затем он там поломается (ясное дело поломать его можно только ручками :) самостоятельно ), то второй возможности загрузить его не будет


Нажимаем «v» и попадаем в режим ожидания загрузчика vivi
но мы схитрим и вместо vivi подложим u-boot.bin

Теперь из второй консоли (alt+f2) производим отправку загрузчика uboot
$ cd ~/mini2440/usbpush
$ ./usbpush ~/images/u-boot.bin

вернувшись в первую консоль наблюдаем:

Enter your selection: v
USB host is connected. Waiting a download.

Now, Downloading [ADDRESS:30000000h,TOTAL:243178]
RECEIVED FILE SIZE: 243178 (39KB/S, 6S)
Downloaded file at 0x30000000, size = 243168 bytes
Found block size = 0x00040000
Erasing... ... done
Writing... ... done
Written 243168 bytes


выключаем контроллер и переключаемся в режим NAND
включаемся

U-Boot 1.3.2-mini2440 (Jul 5 2010 - 18:12:58)

I2C: ready
DRAM: 64 MB
NOR Flash not found. Use hardware switch and 'flinit'
Flash: 0 kB
NAND: Bad block table not found for chip 0
Bad block table not found for chip 0
128 MiB
*** Warning - bad CRC or NAND, using default environment

USB: S3C2410 USB Deviced
In: serial
Out: serial
Err: serial
MAC: 08:08:11:18:12:27
Hit any key to stop autoboot: 0
MINI2440 #


на ошибки внимание не обращаем :)

далее в консоли (для подтверждения нажимаем «y» и «Enter»)
MINI2440 # nand scrub

NAND scrub: device 0 whole chip
Warning: scrub option will erase all factory set bad blocks!
There is no reliable way to recover them.
Use this command only for testing purposes if you
are sure of what you are doing!

Really scrub this NAND flash? <y/N>
Erasing at 0x4cc0000 -- 60% complete.
NAND 128MiB 3,3V 8-bit: MTD Erase failure: -5
Erasing at 0x7fe0000 -- 100% complete.
Bad block table not found for chip 0
Bad block table not found for chip 0
OK


MINI2440 # nand createbbt
Create BBT and erase everything ? <y/N>
Skipping bad block at 0x04d20000
Skipping bad block at 0x07f80000
Skipping bad block at 0x07fa0000
Skipping bad block at 0x07fc0000
Skipping bad block at 0x07fe0000

Creating BBT. Please wait …


переключаемся в режим NOR и повторяем заливку u-boot.bin по клавише «v»

Enter your selection: v
USB host is not connected yet.
USB host is connected. Waiting a download.

Now, Downloading [ADDRESS:30000000h,TOTAL:243178]
RECEIVED FILE SIZE: 243178 (39KB/S, 6S)
Downloaded file at 0x30000000, size = 243168 bytes
Found block size = 0x00040000
Erasing... ... done
Writing... ... done
Written 243168 bytes



переключаемся в NAND и после загрузки последовательно выполняем команды:
MINI2440# dynpart
MINI2440# dynenv set u-boot_env
MINI2440# saveenv


MINI2440 # dynpart
mtdparts mtdparts=mini2440-nand:0x00040000(u-boot),0x00020000(u-boot_env),0x00500000(kernel),0x07aa0000(rootfs)
MINI2440 # dynenv set u-boot_env
device 0 offset 0x40000, size 0x20000
45 4e 56 30 - 00 00 04 00
MINI2440 # saveenv
Saving Environment to NAND...
Erasing Nand...Writing to Nand... done


Поздравляю, теперь загрузка микроконтроллера в режиме NAND начинается с загрузчика u-boot


U-Boot 1.3.2-mini2440 (Jul 5 2010 - 18:12:58)

I2C: ready
DRAM: 64 MB
NOR Flash not found. Use hardware switch and 'flinit'
Flash: 0 kB
NAND: 128 MiB
Found Environment offset in OOB..
USB: S3C2410 USB Deviced
In: serial
Out: serial
Err: serial
MAC: 08:08:11:18:12:27
Hit any key to stop autoboot: 0
MINI2440
#

ссылки :
http://bill.station51.net/index.php?pos ... n-Mini2440
Вложения
u-boot.bin.zip
(128.93 КиБ) Скачиваний: 0
usbpush.zip
(3.87 КиБ) Скачиваний: 0
Аватара пользователя
setar
Site Admin
 
Сообщения: 10989
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Re: Установка загрузчика u-boot

Сообщение Resident » 05 июл 2010, 22:33

ИМХО можно избавиться от первой записи убута в нанд и лишнего переключения NOR/NAND и лишних перегрузов сделав
load ram 0x31000000 size_of_u-boot_in_bytes u
go 0x31000000
загрузив тем самым убут сразу в ОЗУ (а не сначала в нанд, а затем при ребуте в ОЗУ)
И можно сразу приступать к пункту MINI2440 # nand scrub

ЗЫ Я почему-то думал что [x] в vivi как раз таки и скрабит нанд с созданием ббт... :oops:

З.З.Ы А у этого загрузчика нет красивой полосочки для визуализации процесса загрузки, как у виндового н-бута?
Любой прибор, защищённый плавким предохранителем, сможет защитить этот предохранитель, сгорев первым.
Resident
 
Сообщения: 167
Зарегистрирован: 14 июн 2010, 17:19
прог. языки: Qt/C/C++

Re: Установка загрузчика u-boot

Сообщение setar » 05 июл 2010, 22:59

описал именно этот способ поскольку у меня на заработала загрузка бинарника
после
> go 0x31000000
мертво виснет после описания аргументов

пробовал разные бинарники (с диска устройства, с родного сайта, самосборный)
пробовал грузить на разные адреса, причем загрузку адреса указывал как через load так и через параметр usbpush

Добавлено спустя 4 минуты 33 секунды:
про полосочку загрузки (splash screen) читать тут
чуть позже тоже статью напишу
Аватара пользователя
setar
Site Admin
 
Сообщения: 10989
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Re: Установка загрузчика u-boot

Сообщение Resident » 05 июл 2010, 23:01

Думаю имеет место оба варианта, просто с прямой загруйзой в RАМ быстрее да и нанд лишний раз не трогается.
Если ты не против, RАМ стоит сделать базовым методом, а если у кого также глючит борда, то сделать приметку с "черезжопным" способом, как на буржуйском форуме :)

ЗЫ за полосочку спасибо, почитаемс :)
Любой прибор, защищённый плавким предохранителем, сможет защитить этот предохранитель, сгорев первым.
Resident
 
Сообщения: 167
Зарегистрирован: 14 июн 2010, 17:19
прог. языки: Qt/C/C++

Re: Установка загрузчика u-boot

Сообщение setar » 06 июл 2010, 01:25

обновил статью, добавив базовый метод установки

Добавлено спустя 1 час 32 минуты 40 секунд:
надоело пользоваться usb-serial переходником,
полностью перешел на управление с USB так :
Код: Выделить всёРазвернуть
MINI2440 # setenv stderr usbtty
MINI2440 # setenv stdout usbtty
MINI2440 # setenv stdin usbtty
MINI2440 # saveenv

перед переходом на этот режим убедитесь что в линуксе (x86) виден последовательный порт типа cdc_acm
# lsmod |grep cdc_acm
cdc_acm 12766 1
# ls /dev/ttyACM*
/dev/ttyACM0

ну и работаем уже с портом /dev/ttyACM0
# screen /dev/ttyACM0 115200

из минусов - консоль закрывается при перезапуске устройства (последовательное соединение держится, тк порт аппаратный)
Аватара пользователя
setar
Site Admin
 
Сообщения: 10989
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Re: Установка загрузчика u-boot

Сообщение Andrey37 » 06 июл 2010, 12:21

Есть еще простой метод. Писать все через DNW. Тот что описан в мануале. В виртуалке только бинарник делать, а там под виндой запускем DNW также через USB с помощью vivi кидаем на mini.
Andrey37
 
Сообщения: 89
Зарегистрирован: 13 апр 2009, 09:29
Откуда: Иваново
Skype: b_andrey_37

Re: Установка загрузчика u-boot

Сообщение Resident » 06 июл 2010, 12:34

Andrey37 писал(а):Есть еще простой метод.
Это есть у тебя на хост-машине вынь стоит.
DNW это виндовый аналог usbpush.
Любой прибор, защищённый плавким предохранителем, сможет защитить этот предохранитель, сгорев первым.
Resident
 
Сообщения: 167
Зарегистрирован: 14 июн 2010, 17:19
прог. языки: Qt/C/C++

Re: Установка загрузчика u-boot

Сообщение setar » 06 июл 2010, 12:34

это абсолютно тоже самое что описано,
DNW заменяет лишь одну команду "./usbpush ~/images/u-boot.bin"
действительно без разницы аплоадить бинарник из форточек или виртуального линукса,
но этот метод не проще :)
Аватара пользователя
setar
Site Admin
 
Сообщения: 10989
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Re: Установка загрузчика u-boot

Сообщение Andrey37 » 06 июл 2010, 12:45

Для Linux_оида :) да, а вот для человека котрый только начинает вместе с mini все это изучать винда кажится проще и привычнее и драйвер для mini под винду тоже будет проще постивить. :)
Andrey37
 
Сообщения: 89
Зарегистрирован: 13 апр 2009, 09:29
Откуда: Иваново
Skype: b_andrey_37

Re: Установка загрузчика u-boot

Сообщение Resident » 06 июл 2010, 13:25

Andrey37 писал(а): и драйвер для mini под винду тоже будет проще постивить. :)
А есть драйвер для мини под линух? О_о
кажется я что-то пропустил :Search:
Любой прибор, защищённый плавким предохранителем, сможет защитить этот предохранитель, сгорев первым.
Resident
 
Сообщения: 167
Зарегистрирован: 14 июн 2010, 17:19
прог. языки: Qt/C/C++

Re: Установка загрузчика u-boot

Сообщение setar » 06 июл 2010, 13:49

Andrey37 писал(а):Для Linux_оида :) да, а вот для человека котрый только начинает вместе с mini все это изучать винда кажится проще и привычнее и драйвер для mini под винду тоже будет проще постивить. :)

ровно одна команда и установка драйверов которые после этой одной команды больше не будут работать :)
ибо протокол обмена для u-boot отличается от vivi и драйвер, ровно как DNW больше не нужны :)
Аватара пользователя
setar
Site Admin
 
Сообщения: 10989
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Re: Установка загрузчика u-boot

Сообщение Andrey37 » 06 июл 2010, 17:12

меню vivi
##### FriendlyARM BIOS 2.0 for 2440 #####

[x] format NAND FLASH for Linux

[v] Download vivi

[k] Download linux kernel

[y] Download root_yaffs image

[a] Absolute User Application

[n] Download Nboot for WinCE

[l] Download WinCE boot-logo

[w] Download WinCE NK.bin

[d] Download & Run

[z] Download zImage into RAM

[g] Boot linux from RAM

[f] Format the nand flash

[b] Boot the system

[s] Set the boot parameters

[u] Backup NAND Flash to HOST through USB(upload)

[r] Restore NAND Flash from HOST through USB

[q] Goto shell of vivi

[i] Version: 0945-2K

Enter your selection:

V

После этого в DNW - usbport - transmit выбираешь u-boot.bin ентер, смотришь загрузку и все на месте. :) И так сколько хочешь :)
Andrey37
 
Сообщения: 89
Зарегистрирован: 13 апр 2009, 09:29
Откуда: Иваново
Skype: b_andrey_37

Re: Установка загрузчика u-boot

Сообщение Resident » 06 июл 2010, 17:21

Andrey37 писал(а):После этого в DNW - usbport - transmit выбираешь u-boot.bin ентер, смотришь загрузку и все на месте. :) И так сколько хочешь :)
После этого в консоли набираешь ./usbpush u-boot.bin ентер, смотришь загрузку и все на месте. :) И так сколько хочешь :)
Любой прибор, защищённый плавким предохранителем, сможет защитить этот предохранитель, сгорев первым.
Resident
 
Сообщения: 167
Зарегистрирован: 14 июн 2010, 17:19
прог. языки: Qt/C/C++

Re: Установка загрузчика u-boot

Сообщение setar » 06 июл 2010, 17:23

:) Андрей, зачем вы это пишете?
если бы Вы потрудились прочитать мою статью по поняли бы что описываете тоже самое.
я тоже мог сократить статью до "грузимся в NOR заливаем бинарник и копируем в NAND"
только кому с этого польза ?
Аватара пользователя
setar
Site Admin
 
Сообщения: 10989
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Re: Установка загрузчика u-boot

Сообщение Andrey37 » 06 июл 2010, 17:27

Ну прошу прощения :) Я тоже поначалу пытался поподробнее и попроще, но тут стали резать :) И решил я с этим завязать. Хотел сделать так чтобы народ не наступал на теже грабли поначалу, что и я.

Добавлено спустя 1 минуту:
go у меня тоже не работало :)
Andrey37
 
Сообщения: 89
Зарегистрирован: 13 апр 2009, 09:29
Откуда: Иваново
Skype: b_andrey_37

След.

Вернуться в mini2440

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2