По умолчанию плата 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 0x31000000239016u здесь меняем размер бинарного файла на свой (вместо выделенного красным)
Цитата:
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
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
ИМХО можно избавиться от первой записи убута в нанд и лишнего переключения NOR/NAND и лишних перегрузов сделав load ram 0x31000000 size_of_u-boot_in_bytes u go 0x31000000 загрузив тем самым убут сразу в ОЗУ (а не сначала в нанд, а затем при ребуте в ОЗУ) И можно сразу приступать к пункту MINI2440 # nand scrub
ЗЫ Я почему-то думал что [x] в vivi как раз таки и скрабит нанд с созданием ббт...
З.З.Ы А у этого загрузчика нет красивой полосочки для визуализации процесса загрузки, как у виндового н-бута?
_________________ Любой прибор, защищённый плавким предохранителем, сможет защитить этот предохранитель, сгорев первым.
описал именно этот способ поскольку у меня на заработала загрузка бинарника после > go 0x31000000 мертво виснет после описания аргументов
пробовал разные бинарники (с диска устройства, с родного сайта, самосборный) пробовал грузить на разные адреса, причем загрузку адреса указывал как через load так и через параметр usbpush
Добавлено спустя 4 минуты 33 секунды: про полосочку загрузки (splash screen) читать тут чуть позже тоже статью напишу
Думаю имеет место оба варианта, просто с прямой загруйзой в RАМ быстрее да и нанд лишний раз не трогается. Если ты не против, RАМ стоит сделать базовым методом, а если у кого также глючит борда, то сделать приметку с "черезжопным" способом, как на буржуйском форуме
ЗЫ за полосочку спасибо, почитаемс
_________________ Любой прибор, защищённый плавким предохранителем, сможет защитить этот предохранитель, сгорев первым.
перед переходом на этот режим убедитесь что в линуксе (x86) виден последовательный порт типа cdc_acm # lsmod |grep cdc_acm cdc_acm 12766 1 # ls /dev/ttyACM* /dev/ttyACM0
ну и работаем уже с портом /dev/ttyACM0 # screen /dev/ttyACM0 115200
из минусов - консоль закрывается при перезапуске устройства (последовательное соединение держится, тк порт аппаратный)
Есть еще простой метод. Писать все через DNW. Тот что описан в мануале. В виртуалке только бинарник делать, а там под виндой запускем DNW также через USB с помощью vivi кидаем на mini.
это абсолютно тоже самое что описано, DNW заменяет лишь одну команду "./usbpush ~/images/u-boot.bin" действительно без разницы аплоадить бинарник из форточек или виртуального линукса, но этот метод не проще
Для Linux_оида да, а вот для человека котрый только начинает вместе с mini все это изучать винда кажится проще и привычнее и драйвер для mini под винду тоже будет проще постивить.
Для Linux_оида да, а вот для человека котрый только начинает вместе с mini все это изучать винда кажится проще и привычнее и драйвер для mini под винду тоже будет проще постивить.
ровно одна команда и установка драйверов которые после этой одной команды больше не будут работать ибо протокол обмена для u-boot отличается от vivi и драйвер, ровно как DNW больше не нужны
Андрей, зачем вы это пишете? если бы Вы потрудились прочитать мою статью по поняли бы что описываете тоже самое. я тоже мог сократить статью до "грузимся в NOR заливаем бинарник и копируем в NAND" только кому с этого польза ?
Ну прошу прощения Я тоже поначалу пытался поподробнее и попроще, но тут стали резать И решил я с этим завязать. Хотел сделать так чтобы народ не наступал на теже грабли поначалу, что и я.
Добавлено спустя 1 минуту: go у меня тоже не работало
Сейчас этот форум просматривают: Google [Bot] и гости: 6
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения