Обзор отечественного одноплатного компьютера MB 77.07: От распаковки и прошивки, до написания первой DSP программы
В наше время рынок SBC (Single Board Computer) сильно разросся, и появилось огромное количество одноплатных компьютеров на самых различных процессорах, от старых и всем известных, до совсем новых и специализированных. Недавно ко мне попал Module MB 77.07 – одноплатный компьютер от НТЦ «Модуль» на процессоре отечественного производства К1879ХБ1Я, про который на хабре уже однажды оставили небольшую заметку люди из компании Promwad. С момента того поста плату стали продавать всем желающим и было выложено ПО на официальный github компании – http://github.com/RC-MODULE
В статье будет дано описание железа и софта, от распаковки и прошивки, до написания простого примера – аудио-эффекта эха на встроенном в используемый процессор DSP ядре NeuroMatrix.
Комплектация
Плата поставляется в цветной фирменной коробочке. Внутри находятся:
- плата MB 77.07
- Ethernet патчкорд
- 5V/2A блок питания
- USB-UART для тех, кто знакомится с embedded миром впервые
Железо
Теперь стоит рассмотреть саму плату. На борту платы находится ARM1176, такое же ядро используется в Raspberry Pi. Можно запускать заточенные под r-pi дистрибутивы, естественно с оговоркой на то, что нужно будет подсунуть драйвера для местных IP core, использованных в процессоре. Для облегчения этой задачи, разработчик процессора, НТЦ «Модуль», предоставляет готовые образы Debian Jessie и Raspbian Wheezy, пакеты периодически обновляются.
Рядом с самим К1879ХБ1Я распаяно два чипа DDR2 оперативной памяти по 128MB, 1GB NAND памяти, USB-hub на 4 порта, Ethernet PHY и обвязка.
На пинах, расположенных по двум сторонам платы разместились различные внешние интерфейсы:
- JTAG
- 2xUSB – pinout точно такой же как и на материнских платах, доставайте планки из ящиков
- UART с boot консолью
- 8x GPIO
- 1x Transport Stream Interface(очень подробно здесь)
- 1x I2C
- 1x SPI
- 1x I2S
- 1x SPDIF
- 1x External Interrupt
- 1.5x UART – один UART полный, второй только RX
- 1x RESET
- 5V
- 3.3V — за данный канал отвечает выделенный канал импульсного источника питания, выдающий 800мА, реально зная современные китайские компоненты, я бы не стал вешать сюда больше 500мА
Рассмотрим GPIO подробнее, так как это самое первое место, которое захочется пощупать самому. GPIO здесь два разных типа. Первый тип, это те, что выведены на гребенку, их подцепляет драйвер gpio-pl061 (IP core ARM PrimeCell™ General Purpose Input/Output PL061). Эти GPIO могут дергать прерывания к ARM ядру, что иногда бывает полезным. Кроме того, если вам не нужен Transport Stream, то его _D[0-7] пины можно мультиплексировать в GPIO, итого, можно получить 16 управляемых ножек.
Нумерация GPIO ног в sysfs есть в документах выше по ссылке, и при желании можно подергать их через sysfs:
Второй тип GPIO – более упрощенные, управляемые другим IP core, они не могут дергать прерывания. На эти GPIO заведены два наплатных светодиода, один из них регистрируется через LED framework ядра Linux как heartbeat и показывает Load Average. Полезно при дебаге визуально видеть, не зависло ли всё.
Отдельное место на плате занимают два пина для джампера boot.
Загрузка сделана просто и надежно: когда джампера нет – происходит загрузка из NAND памяти, когда джампер надет – плата ожидает загрузки через JTAG или EDCL. Положение джампера считывается при ресете платы. О последнем режиме стоит рассказать подробнее, так как возможно, вы с ним не сталкивались.
EDCL или Ethernet Debug Communications Link – это аппаратная функция, встроенная в Ethernet контроллер, которая позволяет писать и читать физическую память, отправляя правильно сформированные Ethernet пакеты. Данная функция шла в комплекте с IP Core используемого Ethernet контроллера – greth. Сам по себе EDCL достаточно удобен, но если оставить его включенным в продакшене – получится очень большая дыра в безопасности (интересно, сколько процессоров с таким же Ethernet контроллером работают с включенным EDCL в продакшене?).
Поверх EDCL работает любопытный инструмент edcltool, который дает со стороны хоста lua API к edcl. Данная технология используется для анбрика и прошивки плат. Сам edcltool изначально предназначен для Linux, в отличие от популярных производителей SoC-ов, предоставляющих вам какой-нибудь livesuit/phoenixsuit или rkbatch.
Есть версия для Windows, но она эксперементальна, собрана на скорую руку через mingw и требует установки WinPCAP. Кроме того, работает довольно медленно.
Linux версия ставится стандартными ./bootstrap && ./configure --prefix=/usr && make && sudo make install и просит лишь lua5.1-dev или lua5.2-dev и libelf. Последний нужен если требуется работа с NeuroMatrix DSP, о котором речь пойдет ниже.
Сам edcltool исполняет edcl скрипты, которые на самом деле – обычные lua скрипты, выглядят очень просто и читаемо. Например, вот так выглядит скрипт, запускающий код на голом ARM:
Далее, вот так выглядит прошивка загрузчика mboot:
Создание таблицы разделов в NAND, запись ядра, dtb и корневой файловой системы:
Вот так выглядит запуск кода на голом NeuroMatrix (сокращенно – NMC):
Запуск самих скриптов очень прост:
Если забыть имя интерфейса, edcltool будет использовать eth0 (на Windows – 0-вой интерфейс). Полезной может оказаться команда edcltool –l перечисляющая доступные интерфейсы, особенно полезно на Windows, где может быть не очень понятно в панели управления, какой интерфейс под каким номером зарегистрирован в системе.
Кроме вышеперечисленных, в комплекте идут другие скрипты для DSP, фактически для разработки DSP кода можно не загружать Linux. Для написания своих скриптов в архиве с edcltool лежит файлик SCRIPTING.TXT, в котором подробно описаны доступные из edcl окружения функции.
Прошивки
Теперь поговорим о главном, что требуется от разработчика процессора после его выпуска – поддержке прошивок и комплекта их поставки. Каждая прошивка с официального сайта содержит полное окружение, включая загрузчик, ядро, скрипт edcl для прошивки, win-версию на всякий случай и README.
Подробная инструкция о текущем комплекте прошивки идет в каждом архиве, но цитировать её нет смысла, так как всё сводится к одному:
- замкнуть джампер boot
- нажать ресет на плате
- запустить edcltool –f eupgrade.edcl
- попить чаю 7-10 минут
- снять джампер и нажать ресет
Окружение
/x-tools. Далее нужно положить туда скачанный тулчейн от Модуля и не забыть прописать очередной bin в свой PATH:
Дистрибутивы
Производитель процессора придерживается минимализма при сборке своих дистрибутивов и по умолчанию, Debian и Raspbian идут в минимальной комплектации с поддержкой сети и ssh. X11 на 324MHz как-то медленно работает, плюс, загрузчик не умеет ничего рисовать на экран. Главным способом связи с платой является её serial console, ради которой в комлпект поставки и был положен UART. По умолчанию сеть дистрибутивами от производителя поднимается с адресом платы 192.168.0.7, логин root, пароль 12345678.
Репозитории производителя выставляются следующим образом в sources.list:
Загрузка системы
Теперь немного о том, как система грузится с NAND. Первым исполняется IPL загрузчик и проверяет положение джампера boot и:
- ждет по волшебному адресу 0x00100000 (начальный адрес первого SRAM банка памяти IM0) от edcl/jtag 32-битного адреса куда прыгнуть, если джампер установлен
- загружает из NAND загрузчик в IM0, проверяет md5 и начинает его исполнение, если джампер не установлен
- IM0 – память, откуда работает загрузчик, после загрузки не используется и простаивает, можно использовать для своих корыстных целей.
- IM1, IM3 – память NeuroMatrix, откуда предполагается запускать NMC код, NMC имеет приоритет при обращении к ней.
- IM2 – используется декодером h264. Если декодер не используется – можно использовать для своих нужд
Последнее, что можно сказать о загрузчике, это то, что кроме команды pmgr есть еще пара команд для апдейта – fwupgrade и eupgrade, предназначены для прошивки по tftp образов, которые могут быть больше чем размер доступной на плате DDR памяти, такое тоже случается. В остальном, это обычный u-boot, к которому многие привыкли. Из загрузчика доступна сеть, работа с NAND, SPI Flash (которого на MB77.07, к сожалению, не положили) и немного usb, без поддержки файловых систем.
Вернемся к памяти, в адресном пространстве сразу после IM0 идет IM1, а потом сразу IM3, это стоит помнить при написании низкоуровневого кода, работающего с SRAM, так же при написании подобного кода стоит помнить, что тут действительно много SRAM памяти, на каком-нибудь старом добром AT91RM9200 накристальной памяти было всего 4К. Именно по этой причине, загрузчик здесь работает напрямую в SRAM, без SPL. Такой подход очень полезен, так как в отличие от DDR, что у ARM, что у NeuroMatrix время доступа будет всего пару тактов. Другими словами – код оттуда будет работать очень и очень быстро. Более того, если код для NMC будет работать только из IM1/IM3, не обращаясь никак к DDR – на NMC можно будет крутить какую-нибудь очень жесткую realtime часть.
Далее, стоит рассмотреть NAND подробнее, он разбит на разделы, первыми идут boot, env и dtb. Они жестко забиты и изменять их размеры нельзя. В первом лежит загрузчик, во втором его окружение, в третьем скомпилированный Device Tree Blob. Остальное разбивается интерактивно командой загрузчика pmgr, либо автоматом при прошивке образа из edcl скрипта. Заданные разделы загрузчик передает ядру, дописывая в cmdline стандартные mtdparts.
С NAND вообще ожидалось увидеть что-нибудь станное. По опыту работы с linux-sunxi и linux-rockchip, NAND и там, и там был в ужасающем состоянии. Allwinner сделали из NAND свой собственный block device с частично закрытым FTL (flash translation layer), с своими накостылеными алгоритмами wear-leveling’а и прочего. Rockchip вообще предоставляет NAND только в виде закрытого модуля rknand.ko, исходников которого не дают даже под NDA партнерам компании, как мне рассказали в #linux-rockhip@freenode. Здесь же NAND представляет собой обычный standalone mtd device, поверх которого используется ставший уже стандартом UBIFS, что не может не радовать.
Теперь собственно о самой загрузке. Думаю, многим было бы интересно посмотреть на dmesg:
Первое, что привлекает внимание это строчка «EasyNMC DSP Framework © RC Module 2014». Далее в лог пишется, сколько NMC ядер найдено и исходя из этого, можно предположить, что драйвера и утилиты заточены на то, что ядер NMC когда-нибудь будет много. В процессоре на этой плате ядро NMC только одно.
Следующим многим было бы интересно узнать, как NMC взаимодействует с Linux. У разработчиков была выпытана следующая информация: к NMC от ARM идет три прерывания. Немаскируемое NMI, HP (High Priority) и LP (Low Priority). В обратную сторону так же HP и LP. Для запуска DSP ядра необходимо подать начальный сброс и дернуть NMI. Так запускается IPL код NeuroMatrix. После первого запуска, NMC крутится в этом начальном коде, который обрабатывает NMI прерывание. Через этот начальный код организуется перезапуск приложения. Все довольно просто.
Время для DSP
В половине статьи постоянно упоминается DSP, теперь пришло время подробно рассмотреть, как же с ним работать. Для работы с ним есть пакет nmc-utils, состоит из двух утилит и библиотеки:
- nmctl
- nmrun
- libeasynmc (используется самими утилитами)
nmctl
# nmctl --help nmctl — The EasyNMC control utility © 2014 RC Module | Andrew 'Necromant' Andrianov <andrew@ncrmnt.org> This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. License: LGPLv2 Usage: ./nmctl [options] [actions] — operate on core 0 (default) ./nmctl --core=n [options] — operate on selected core ./nmctl --core=all [options] — operate all cores Valid options are: --core=id — Select a core to operate on (--core=all selects all cores) --list — list available nmc cores in this system and their state --help — Show this help --force — Disable internal seatbelts (DANGEROUS!) --nostdio — Do not auto-attach stdio --debug — print lots of debugging info (nmctl) --debug-lib — print lots of debugging info (libeasynmc) Valid actions are: --boot — Load initcode and boot a core (all cores) --reset-stats — Reset driver statistics for core (all cores) --load=file.abs — Load abs file to core internal memory --start=file.abs — Load abs file to core internal memory and start it --irq=[nmi,lp,hp] — Send an interrupt to NMC --kill — Abort nmc program execution --mon — Monitor IRQs from NMC --dump-ldr-regs — Dump init code memory registers
ProTIP(tm): You can supply init code file to use via NMC_STARTUPCODE env var When no env is set nmctl will search a set of predefined paths
# ./nmctl --list 0. name: K1879-nmc type: nmc3 (cold) IRQs Recv: HP: 0 LP: 0 IRQs Sent: NMI: 0 HP: 0 LP: 0
nmrun
# ./nmrun --help nmrun — The EasyNMC app runner wrapper © 2014 RC Module | Andrew 'Necromant' Andrianov <andrew@ncrmnt.org> This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. License: LGPLv2 Usage: ./nmrun [options] myapp.abs [arguments] — operate on core 0 (default) Valid options are: --help — Show this help --core=id — Select a core to operate on (Default — use first usused core) --force — Disable internal seatbelts (DANGEROUS!) --nostdio — Do not auto-attach stdio --nosigint — Do not catch SIGINT --detach — Run app in background (do not attach console) Debugging options: --debug — Print lots of debugging info (nmctl) --debug-lib — Print lots of debugging info (libeasynmc)
Это враппер для DSP кода. Он запускает .abs файлы на NMC таким образом, что весь printf с NMC происходит в stdout этой обертки, а всё, что мы отправим на stdin – получает NMC. Есть поддержка передачи параметров, если после .abs файла перечислять параметры – они передадуться в NMC в виде аргументов argv. Return из main() выполняющегося на NMC передается nmrun, который он так же возвращает в систему в виде обычного return кода. Всё это моментально превращает сложную DSP программу в обычную command line утилиту, с которой справится даже новичок в DSP. Порог вхождения снижается в разы, ничего ненужно перешивать или специально обрабатывать.
Попробуем запустить простейший пример:
Сами ядра NMC присутствуют в системе в виде /dev/nmc0io и /dev/nmc0mem, где:
- /dev/nmc0mem – память NMC, те самые банки SRAM – IM1 + IM3, о которых речь велась выше. Просто выполнив cat /dev/nmc0mem > dump.bin можно снять дамп памяти DSP
- /dev/nmc0io – виртуальный последовательный порт, можно писать и читать stdio, в том числе и в неблокирующем виде через poll/epoll
Сами утилиты построенны на этой библиотеке, исходники так же полностью открыты под LGPLv2. Беглый осмотр показывает, что внутри кроется достаточно простой и понятный синхронный API. Казалось бы, зачем нам синхронный API во времена node.js? Оказалось, драйвера DSP поддерживают epoll/select не только для stdio, все события от NMC (прерывания, факт отправки NMI другим процессом) можно получать через poll/epoll. Соответственно, этот дескриптор можно подсунуть любимым libevent, libuv и т.д.
Action
Теперь, вооружившись этими зананиями, попробуем развернуть окружение для разработки и собрать чего-нибудь для NMC. Допустим, в MB77.07 мы прошили Raspbian, установили тулчейны.
Начнем с nmc-utils.
Осмотримся в том что мы склонировали с github:
- в корне лежат исходники libeasynmc, их не особенно много, так как библиотека предельно простая. Исходный код nmctl можно использовать как простой пример работы с libeasynmc во всех его вариантах
- в libeasynmc-nmc лежат исходники NMC части библиотеки, которую мы будем подключать к нашим NMC проектам
- в doc/ есть подробное описание порядка работы с библиотекой и того, как комплировать. Особенно полезным будет на начальных этапах возможность статической сборки nm* утилит
- в ipl/ лежат исходники начального кода, который крутится на NMC
- в examples/ есть пачка простых примеров
Если необходимо собрать все утилиты (nmctl, mnrun) статически:
Если плата загружена по NFS и корень доступен где-то рядом, то можно установить все в него запустив следующее:
Далее, при желании, на .deb based системах, можно собрать пачку deb-пакетов:
При сборке deb пакетов требуется наличие в системе dpkg-deb и надо указывать deb-архитектуру, которая будет фигурировать в пакете: armhf для Raspbian, armel для Debian. На выходе получим файлы:
- nmc-utils-abs-0.1-armhf.deb — Бинарники примеров, ставятся в /usr/share/examples/easynmc-0.1
- nmc-utils-bin-0.1-armhf.deb — nmctl, nmrun и сама библиотека libeasynmc.so
- nmc-utils-dev-0.1-armhf.deb — Заголовочные файлы, pkg-config .pc файл и прочее
- nmc-utils-doc-0.1-armhf.deb — README и все содержимое doc/
- nmc-utils-ipl-0.1-armhf.deb — IPL, ставится в /usr/share/easynmc-0.1/ipl/
Для первой своей программы на NMC было решено поиграться со звуком и сделать нечто, что будет в реальном времени на NMC добавлять эффект эхо. Можно использовать следующий pipeline:
Где arecord будет записывать данные с микрофона и передавать прямиком на наш DSP, который будет добавлять эхо и выдавать сэмплы на выход, далее передаем их на воспроизведение в aplay. Для захвата звука была использована дешевая китайская USB звуковая карта, валявшаяся годами на полке. В данном примере использовать libeasynmc не потребуется, хватит обычного nmrun.
Прежде чем продолжить, нужно сделать отступление и рассказать кое что о производительности такого решения. stdin/stdout хоть и являются самым простым способом обмена данными, но все же достаточно медленны. Они используют два кольцевых буфера, каждый байт должен быть сначала записан ARM ядром в кольцевой буфер, потом считан оттуда в другой буфер NMC ядром, обработан, результат записан в другой кольцевой буфер, откуда в свою очередь будет скопирован опять ARM. Мягко говоря, это не очень быстро, хоть кольцевые буферы и лежат в SRAM памяти. По этому, если нужна будет максимальная производительность, то придется все же забыть про stdio и командную строку и использовать libeasynmc.
При разработке на C/С++ под NeuroMatrix надо учитывать несколько особенностей, которые могут повергнуть многих, кто никогда ничего не писал под DSP процессоре, в культурный шок. Далее собран список граблей, на которые можно наступить:
- Отсутствует байтовая адресация. sizeof(char) == 1, sizeof(short) == 1. Указатель в случае NMC указывает на 32-х битные ячейки памяти. Соответственно адрес в пространстве NMC можно получить сдвигом на два бита вправо
- Из за предыдущего пункта все ASCII представляют собой массив uint32_t[] в младшем байте каждого нужный нам символ, в старших нули
- nmrun по умолчанию говорит драйверу делать переформатирование строк туда и обратно для stdin и stdout (можно отключить)
- NMC не имеет MMU и адресует физическую память. Потому, просто передать указатель на буфер с данными из приложения мы не можем
- Если использовать NMC ядром какую-нибудь периферию напрямую, то лучше выгрузить соответствующие драйвера со стороны Linux. Ни один драйвер не ожидает, что с его регистрами будет работать кто-то еще, кроме него самого
- В чипе есть некоторые блоки (несколько таймеров, например) доступные только со стороны NMC. API можно посмотреть в nc_int_soc.h из состава тулчейна
- Библиотека языка С достаточно спартанская
- Так как NeuroMatrix имеет доступ ко всему адресному пространству, ошибка в коде для него может легко завалить всю систему и вызвать необходимость перезапуска
- Исходя из предыдущего, если выставить плату в интернет, то удаленный атакующий получив доступ к NMC, может потенциально заставить его пропатчить память ядра для поднятия прав в системе. Соответственно права на /dev/nmc надо выставлять очень аккуратно. Иначе получится как в прошлый раз у Samsung с /dev/exynos-mem
- NeuroMatrix состоит из RISC части и векторного ядра. Все, что пишется на C, исполняется на не особенно быстрой RISC части, от которой не следует ожидать чудес производительности. Исполняя код на DSP вы не делаете его по взмаху волшебной палочки идеально быстрым. Реальный выигрыш можно получить только задействовав векторное ядро, на ассемблере. Не все алгоритмы хорошо ложаться на то, что может сделать векторное ядро
- Makefile – основной мейкфайл
- colorizer.mk – инклюдится в Makefile, тут лежит вся расцветка вывода. Расцветка реализована переносимо для Windows/Linux/Mac, потому выглядит весьма хакерски. Под Windows она использует cecho
- easyconf.asm – ассемблерный файл с конфигурацией io/args. Содержит всего пару макросов, задающих размер области для argc/argv и размер кольцевых буферов для stdio.
- K1879.cfg – конфигурационный файл линковщика (о нем ниже)
- main.c – собственно наш файл с main()
Обращаю внимание на путь к библиотекек easynmc.lib – без нее у нас не заработают stdin/stdout, argc/argv и код возврата, так же в документации указано, что она должна идти перед библиотекой языка C.
Второй по значимости файл – mb7707brd.cfg, для компилятора NeuroMatrix выполняет ту же роль, что для gcc LD скрипт. Здесь можно разложить секции по разным местам в памяти. Значения по умолчанию вполне вменяемы и можно их спокойно использовать:
После сборки командой make на выходе получаются два файла – hello.abs и hello.dump. abs файл – ELF с абсолютными адресами в адресном пространстве NMC. Его можно загрузить в банки IM1 или IM3, когда работаем из Linux на плате, так как за всю остальную память отвечает ядро Linux, в то время как при работе с edcl правила легче, и мы можем раскладывать секции по всему адресному пространству. dump – это дизассемблированный листинг, который может быть полезен тому, кто знает ассемблер под NMC.
Движемся дальше, к проекту подключается один ассемблерный файл – easyconf.asm. Ассемблер здесь достаточно навороченный, с макросами и прочими радостями жизни. В easyconf лежит настройка stdio и аргументов, что делается буквально двумя макросами:
Этот код резервирует место в abs файле для аргументов и кольцевых буферов, можно заметить, что на stdio выдается 128 байт, как и на аргументы. Если nmrun при запуске этой программы передать аргументов больше, чем 128 символов – nmrun выдаст ошибку.
Наконец, рассмотрим main.c, который выглядит довольно просто:
Это был стандартный проект hello world, теперь пришло время его модифицировать под нашу задачу. Поступим следующим образом, размер буфера задержки дадим где-то 200мс, с частотой дискретизации это будет около 1600 сэмплов. Округляем до ближайшего значения степени двойки и получаем 2048. Так как в плавающей точке NMC скорее всего не силен (хотя компилятор кушает float’ы), то сделаем все в целых числах, затухание сделаем битовым сдвигом.
Получится что-то в духе этого:
Собираем, копируем abs на плату. По умолчанию у платы есть только одно ALSA устройство – HDMI. Мы же хотим вывод/ввод использовать от USB звуковой карты. Необходимо её название в ALSA, делается это достаточно просто, с помощью -L к arecord или aplay. В итоге должно получиться вот так:
Подключаем микрофон и наушники и наслаждаемся, только что нами было написано первое приложение для отечественного DSP процессора.
Заключение
Пожалуй, это всё на сегодня. Осталось сделать выводы. MB77.07 оставляет положительное впечатление, если, конечно, закрыть глаза на довольно слабоватый ARM. Перечислим общие плюсы и минусы:
+ Официально открытые исходники всего, что только можно, от загрузчика до IPL кода DSP процессора. На github от производителя чипа. Из других производителей такое существует разве что у Freescale и у Qualcomm (Code Aurora). Обычно все вываливают в лучшем случае в виде GPL source-drop в виде запакованных в rar tar’ов на ftp сервера, разгребать потом это – отдельное удовольствие. Еще, бывает, скидывают все огромной папкой вместе .git индексом.
+ DSP ядро, компилятор и инструментарий для него. Изначально продуман так, что бы новичку было работать очень просто, для старта хватит прочитанного по диагонали K&R. Особенно учитывая, что NMC в такой конфигурации может легко обеспечить жесткий realtime – для робототехников и станочников это просто находка.
+ Драйвера. Нельзя сказать, что идеал, но откровенной жути как у Allwinner (libnand), Rockchip (rk_fb, rknand), Mediatek (вообще всё) и им подобным замеченно не было. Везде стараются использовать стандартные подсистемы ядра. При наличии сообщества или желания разработчиков, большая часть может без проблем попасть в mainline. Проприетарные блобы в ядре отсутствуют.
+ Версия ядра. Сейчас есть 3.10 LTS, осенью разработчики пообщелаи подумать насчет следующего LTS. Для сравнения, в linux-sunxi коммьюнити ядро – 3.4, а в upstream практически нет мультимедиа. Rockchip только недавно выдавил из себя 3.10.x с очень большим скрипом и только для rk3288. Все попытки завести это дело популярном rk3188 провалилсь – не работает MMC контроллер. HardKernel ODROID сидит на 3.8.y linux-stable + ubuntu merge, хотя есть и движение в сторону поддержки в mainline.
+ Неубиваемость. Даже если физически убить NAND или отпаять, MB77.07 можно будет оживить и загрузить по EDCL. По этому, такая плата может оказаться полезной новичкам, желающим узнать, как на голом железе поднять загрузчик, операционную систему и т.д. Можно не бояться убить плату. Коротить ноги NAND в случае косяков как на RK3188 для перепрошивки загрузчика здесь не потребуется никогда.
+ deb-пакеты, репозитории и прочее. Многое сделано не дожидаясь появления коммьюнити, многое еще предстоит сделать.
+ Интересно разведено, все разъемы на одной стороне, намного удобнее чем на r-pi.
— Цена. Этот факт, конечно, малину портит (pun intended)
— Нет RTC. Для многих проектов может оказаться неважно, но может потребоваться. Плюс в системе первым приходится поднимать ntp.
— Производительность. Да, 324MHz ARM1176 это не особенно весело. Отчасти компенсируется тем, что как ARM, так и NMC могут выполнять свой код из накристальной памяти, откуда работают просто реактивно, но тем не менее. Будем надеятся что дальше будет интереснее и Модуль не бросит OpenSource и мы увидим следующие их проекты, уже на более производительных решениях.
— Сложность заказа. Тут уже чисто вопрос удобства и скорее вопрос к маркетингу, чем к инженерам. На сайте Модуля нехватает огромной жирной кнопки «купить» в полэкрана и моментальной оплаты через qiwi.