МАРСОХОД

Open Source Hardware Project

ARM System-on-Chip

Линукс на плате Марсоход2 успешно стартует и монтирует RAM Disk

linux pinguin
Итак, Линукс на плате Марсоход2 успешно стартует и монтирует RAM Disk и запускает пользовательскую программу sbin/init с RAM диска.

Честно говоря не думал, что это будет так трудно. Потратил все новогодние праздники. Самое главное не очень понятно почему это так происходит. Оригинальные инструкции проекта Amber с сайта OpenCores то ли не совсем корректные, то ли каким-то образом устарели. Если следовать им, то не получается откомпилировать ядро, возникает масса проблем при компиляции и конфигурировании ядра. Проходилось много дебажить. Последняя проблема, которую я встретил – неправильно выполнялся mmap исполняемого пользовательского файла. В конце концов похоже все работает.

Теперь все позади.
Я слелал коммиты на нашей странице GitHub посвященной Amber и линуксу на плате Марсоход2. Теперь, я надеюсь, Вы сможете без проблем сами откомпилировать ядро и запустить его.


Теперь RAM диск успешно монтируется и с него запускается уже «пользовательская программа» init. В нашем случае она ничего особо толкового не делает, просто пишет “Hello, World! Hello, Marsohod!

Вот собственно вывод из консоли терминала (я использую программу TeraTerm):


Linux version 2.4.27-vrs1 (nick@ubuntu) (gcc version 4.5.2 (Sourcery G++ Lite 2011.03-46) ) #1 Tue Jan 22 23:48:37 PST 2013
CPU: Amber 2 revision 0
Machine: Amber-FPGA-System
On node 0 totalpages: 256
zone(0): 256 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: console=ttyAM0 mem=8M root=/dev/ram
19.91 BogoMIPS (preset value used)
Memory: 8MB = 8MB total
Memory: 6304KB available (783K code, 222K data, 64K init)
Dentry cache hash table entries: 4096 (order: 0, 32768 bytes)
Inode cache hash table entries: 4096 (order: 0, 32768 bytes)
Mount cache hash table entries: 4096 (order: 0, 32768 bytes)
Buffer cache hash table entries: 8192 (order: 0, 32768 bytes)
Page-cache hash table entries: 8192 (order: 0, 32768 bytes)
POSIX conformance testing by UNIFIX
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Initializing RT netlink socket
Starting kswapd
ttyAM0 at MMIO 0x16000000 (irq = 1) is a WSBN
pty: 256 Unix98 ptys configured
Serial driver version 5.05c (2001-07-08) with no serial options enabled
ttyS00 at 0x03f8 (irq = 10) is a 16450
ttyS01 at 0x02f8 (irq = 10) is a 16450
RAMDISK driver initialized: 16 RAM disks of 208K size 1024 blocksize
NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: ICMP, UDP, TCP
IP: routing cache hash table of 4096 buckets, 32Kbytes
TCP: Hash tables configured (established 4096 bind 8192)
NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
RAMDISK: ext2 filesystem found at block 0
RAMDISK: Loading 200 blocks [1 disk] into ram disk... done.
Freeing initrd memory: 208K
VFS: Mounted root (ext2 filesystem) readonly.
Freeing init memory: 64K
BINFMT_FLAT: Loading file: /sbin/init
Mapping is 2b0000, Entry point is 8068, data_start is 8e4c
Load /sbin/init: TEXT=2b0040-2b8e4c DATA=2b8e50-2b8e83 BSS=2b8e83-2b8e88
start_thread(regs=0x21f9fa4, entry=0x2b8068, start_stack=0x2affb4)
Hello, World!
Hello, Marsohod!



Итак, на GitHub есть теперь такой таг: linux-mounts-ramdisk-with-hello-world

Это на сегодня последняя версия системы на кристалле Amber в плате Марсоход2.
В новой папке sw/vmlinux-my теперь мои файлы и моя инструкция.
Я использую ОС Ubuntu, как рабочее место для сборки ядра.

Чтобы построить ядро Linux для Amber ARM нужно:

  • Задать переменную окружения ссылающуюся на нашу рабочую папку Amber-Marsohod2, например:

export AMBER_BASE=/home/nick/Amber-Marsohod2/

  • Создать папку для работы с ядром и перейти туда, например

mkdir /home/nick/my-linux
export LINUX_WORK_DIR=/home/nick/my-linux
cd ${LINUX_WORK_DIR}

  • Взять архив ядра Линукс по ссылке:

wget http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.27.tar.gz

  • Разархивировать и создать символическую ссылку для удобства

tar zxf linux-2.4.27.tar.gz
ln -s linux-2.4.27 linux

  • Cкопировать сюда, в  ${LINUX_WORK_DIR}, патчи

cp ${AMBER_BASE}/sw/vmlinux-my/patch-2.4.27-vrs1.bz2 .
cp ${AMBER_BASE}/sw/vmlinux-my/patch-2.4.27-myamber2.tar-gz .

  • Разархивировать патчи

bzip2 -d patch-2.4.27-vrs1.bz2
tar -zxf patch-2.4.27-myamber2.tar.gz


Первый патч от компании ARM, второй патч patch-2.4.27-myamber2.tar.gz создан мной, по результатам моих исследований. Он включает в себя все изменения из оригинального проекта Amber, но имеет и мои исправления.

  • Зайти в папку Linux и наложить патчи

cd ${LINUX_WORK_DIR}/linux
patch -p1 < ../patch-2.4.27-vrs1
patch -p1 < ../patch-2.4.27-myamber2

  • Выбрать конфирурацию ядра

make a5k_config

  • Применить конфигурацию – это довольно странный шаг, но ничего умнее я не придумал

make menuconfig

Появляется диалоговое меню для редактирования конфигурации, но ничего делать не нужно, просто выйти и сохранить.

  • Просканировать зависимости

make dep

  • Компилировать ядро

make vmlinux

Все, готово! Появляется нужный нам файл vmlinux.

Создания образа initrd, initial ram disk.


Для этой процедуры я сделал скрипт, который нужно просто запустить: create_initrd.
Есть правда и ложка дегтя.
Запускаемый файл /sbin/init должен быть формата FLT – это специальный простой формат исполняемого файла, который обычно используется не в Linux, а в uClinux.

Все бы было хорошо, но используемый мною компилятор arm-none-linux-gnueabi-gcc не умеет создавать файлы такого типа. В принципе не умеет. Умеет только ELF файлы создавать, а они у меня все еще не запускаются.

Пришлось все таки с сайта Mentor скачивать другой компилятор для ОС uClinux.
Это Sourcery_G++_Lite. Сам компилятор это arm-uclinuxeabi-gcc.

Вот им компилятором теперь и нужно все делать.
Нужно сперва им откомпилировать sw/hello-world – получаем исполняемый файл hello-world-flt.

Потом уже создаем initrd запуская мой скрипт sw/vmlinux-my/create_initrd
После запуска скрипта появляется папка disk, а в ней initrd.

Как пробовать в плате Марсоход2 (это я уже делаю на другой машине в Windows 7).

  • Запускаем терминал TeraTerm и открываем последовательный порт который ведет на плату Марсоход2. Еще раз замечу, что на плате установлена двухканальная микросхема FTDI. Теоретически там видно два последовательных порта. Однако первый канал занят под JTAG программатор MBFTDI. Второй порт подключен к микросхеме Cyclone III FPGA на плате и собственно используется как консоль для проекта системы на кристалле Amber. Открывать нужно второй порт на скорости 921600 бит/сек.
  • Загружаем в плату в FPGA образ hardware через JTAG из программатора Altera Quartus II. При этом в консоли последовательного порта появляется «интерактивный монитор». Можно читать или писать в ячейки памяти, загружать файлы через последовательный порт по протоколу XMODEM/1K – как раз терминал TeraTerm это умеет.
  • Загружаем образ initrd в память системы в 7-й мегабайт:

>b 700000

В программе TeraTerm используем меню File=>Transfer=>XMODEM=>Send выбираю мой файл initrd для отправки в плату

  • Загружаю образ линукс (буква L только маленькая, load)

>l

Принцип тот же, только используется другая команда «монитора» “l”, которая не только помещает образ в память, но и делает разбор ELF файла ядра. В программе TeraTerm используем меню File=>Transfer=>XMODEM=>Send выбираю мой файл vmlinux для отправки в плату.

  • Запуск системы – это переход по адресу 0x80000. Использую команду монитора:

>j 80000

Вот пожалуй и все. Linux стартует.

В принципе конечно, есть некое удовлетворение от проделанной работы – ядро стартует, ram disk монтируется, пользовательская программа /sbin/init запускается.

Но есть и небольшое расстройство.

Во-первых, все таки пока только FLT файл может запускаться в системе. ELF запустить не удается.

Во-вторых, теперь уже понятно, что моя пользовательская программа init довольно ограниченна в возможностях. На самом деле получается, что всеми возможностями ядра она и пользоваться то не может. Для использования функций ядра нужна библиотека libc или ее аналоги.

Я уже рассмитриваю возможность перейти на использование uClinux – там похоже уже сейчас и ядро посвежее, и встроенные библиотеки libc или uclibc имеются. Опыт теперь уже есть. В общем, есть куда двигаться дальше и как развивать систему.

 

Комментарии  

0 #18 armleo 29.12.2016 12:58
nckma вы оказались правы... Не помещается - Требует 12КLE, а у меня всего 8К
0 #17 nckm 20.11.2016 19:17
Цитирую Armleo:
Скачал проект с гитхаба.
(напомним у меня платформа на базе EP2C8 и SDRAM w9825g6ch-75)
Начал компиляцию. Даже без изменений уже ~30 Минут идет компиляция (Паралельная компиляция отключена)
Застрял на стадии фиттинга. Что мне делать?

PS: Мне срочно нужен ARM ядро. Уже 3ий день мучаюсь с компиляцией. Даже с другими ядрами разобратся не могу... (Один требует переписать чуть ли не всю логику, другой не помещается все попытки оптимизировать заканчиваются неудачей, другой требует SDRAM КОнтроллер который никак заставить работать не могу из-за того что типо не поддерживается 13C + 9R SDRAM). Так всегда было в жизни разработчика на FPGA? Или я такой неудачник?

Очень может быть, что проект просто не помещается в вашу микросхему. Поэтому фитер так долго пытается разместить. Попробуйте например выключить SDRAM модуль через меню квартуса Assignments => Settings => слева Analysis & Synthesis => Verilog Input => удалите Verilog макрос SDRAM. Тогда система останется без внешней памяти - только будет boot_mem.
0 #16 Armleo 20.11.2016 10:26
Скачал проект с гитхаба.
(напомним у меня платформа на базе EP2C8 и SDRAM w9825g6ch-75)
Начал компиляцию. Даже без изменений уже ~30 Минут идет компиляция (Паралельная компиляция отключена)
Застрял на стадии фиттинга. Что мне делать?

PS: Мне срочно нужен ARM ядро. Уже 3ий день мучаюсь с компиляцией. Даже с другими ядрами разобратся не могу... (Один требует переписать чуть ли не всю логику, другой не помещается все попытки оптимизировать заканчиваются неудачей, другой требует SDRAM КОнтроллер который никак заставить работать не могу из-за того что типо не поддерживается 13C + 9R SDRAM). Так всегда было в жизни разработчика на FPGA? Или я такой неудачник?
0 #15 nckm 19.11.2016 14:11
Цитирую Armleo:
Вообщем ваш проект не правильный и содержит модули которые НЕ используются. Так же есть много проблем. Пытался запустить не получилось. offtop И еще я ненавижу global scoping. Вроде модуль то использован а из какого файла не понятно. Вроде в проекте не используется а в файлах есть и квартус его компилит... /offtop

Взял проект с github - без проблем скомпилировал. Что у вас не получается? Какие модули не используются?
Проект mARM лежит в папке Amber-Marsohod2 \hw\marsohod2\
0 #14 Armleo 18.11.2016 16:53
Вообщем ваш проект не правильный и содержит модули которые НЕ используются. Так же есть много проблем. Пытался запустить не получилось. offtop И еще я ненавижу global scoping. Вроде модуль то использован а из какого файла не понятно. Вроде в проекте не используется а в файлах есть и квартус его компилит... /offtop
0 #13 nckm 14.11.2016 06:06
Цитирую Armleo:
Не поможете? У меня тут Quartus 13.0SP1 на платформе EP2C8 выдает ошибку
Error (10172): Verilog HDL unsupported feature error at clocks_resets.v(242): real variable data type values are not supported
Что делать?

по идее clocks_resets.v не должен вообще использоваться в проекте. Модуль верхнего уровня для альтеровского проекта msystem.v лежит в папке hw/marsohod2 и там же есть проект для квартуса mARM.qpf
0 #12 Armleo 13.11.2016 09:25
Не поможете? У меня тут Quartus 13.0SP1 на платформе EP2C8 выдает ошибку
Error (10172): Verilog HDL unsupported feature error at clocks_resets.v (242): real variable data type values are not supported
Что делать?
0 #11 MadProgrammer 21.09.2016 10:08
Запуск Linux 4.8.0 с BusyBox на Amber SoC
https://habrahabr.ru/post/310056/
0 #10 Дмитрий 20.03.2013 22:14
Цитирую nckma:

Я вот то же переместил регистры в память, но смог сохранить только 1000 регистров таким способом. Как у Вас так получилось на много меньше?


Регистры в моём случае дали выигрыш 1300 LUTs и 700 регистров, barrel shifter - порядка 700 LUTs. Я послал код, если что :).
0 #9 nckma 20.03.2013 08:34
Цитирую Дмитрий Тарнягин:
Здравствуйте.

Спасибо за проект :). Амбер - интересное ядро с хорошим потенциалом. Я сейчас работаю над его оптимизацией для Cyclone, если есть желание и интерес - могу послать патчи на пробу и ревью перед посылкой на opencores.

Сделано (на базе 23-го ядра):
- Оптимизирован barrel shifter
- Register file в статической памяти
- Pipelined wishbone интерфейс.

В результате ядро с минимальным кешем умещается в 4К LEs на Cyclone III, что уже неплохо.

Да, интересная работа.
Я вот то же переместил регистры в память, но смог сохранить только 1000 регистров таким способом. Как у Вас так получилось на много меньше?
0 #8 Дмитрий Тарнягин 17.03.2013 11:33
Здравствуйте.

Спасибо за проект :). Амбер - интересное ядро с хорошим потенциалом. Я сейчас работаю над его оптимизацией для Cyclone, если есть желание и интерес - могу послать патчи на пробу и ревью перед посылкой на opencores.

Сделано (на базе 23-го ядра):
- Оптимизирован barrel shifter
- Register file в статической памяти
- Pipelined wishbone интерфейс.

В результате ядро с минимальным кешем умещается в 4К LEs на Cyclone III, что уже неплохо.
+2 #7 nckma 06.02.2013 05:18
Цитирую Ra3wum:
Подскажите, сколько занимает данный проект ресурсов плис?

В данный момент вот так:
Total logic elements 9,911 / 10,320 ( 96 % )
Total memory bits 218,112 / 423,936 ( 51 % )
Да, это многовато, но я сейчас работаю над уменьшением числа занятых элементов. Это можно сделать, например, переместив регистры в статическую память (если получится). Или вот еще вариант - выключить регистры FIRQ - они все равно сейчас не используются.
0 #6 Ra3wum 05.02.2013 18:25
Подскажите, сколько занимает данный проект ресурсов плис?
0 #5 Alexander 28.01.2013 11:00
А python может там обитать?
0 #4 nckma 24.01.2013 17:04
Цитирую Alex:
Чтобы не заморачиваться с uClibc можно использовать статическую линковку - как вариант. libc полюбму с тулчейном идет.

хорошая мысль, надо попробовать
+1 #3 Alex 24.01.2013 14:12
Чтобы не заморачиваться с uClibc можно использовать статическую линковку - как вариант. libc полюбму с тулчейном идет.
0 #2 nckma 24.01.2013 10:48
Цитирую Alexey:
Круто !!! Я так точно не смогу. Может Автор подскажет с чего лучше подойти к приручению такого "маленького" (для встроенных систем) линукса ?

если Вы будете пробовать на плате Марсоход2 - тогда просто попытайтесь запустить линукс следуя инструкциям. Он на GitHub есть уже откомпилированн ый.
0 #1 Alexey 24.01.2013 09:30
Круто !!! Я так точно не смогу. Может Автор подскажет с чего лучше подойти к приручению такого "маленького" (для встроенных систем) линукса ?

Добавить комментарий


Защитный код
Обновить


GitHub YouTube Twitter
Вы здесь: Начало Проекты Проект Марсоход2 Amber ARM SoC Линукс на плате Марсоход2 успешно стартует и монтирует RAM Disk