Одноплатный компьютер своими руками как сделать

Обновлено: 06.07.2024

Одноплатный компьютер — это по своей сути тот же обычный компьютер, но только работающий лишь благодаря одной плате, а не целому огромному системному блоку. Главная его ценность – более низкая цена и компактность. Поэтому многие предприятия ими и пользуются в силу того, что для их задач не нужен большой и дорогой вариант.

Иными словами – это плата, на которой есть только самое необходимое: процессор, видеочип, несколько портов, аудиовыходы, слоты для оперативки и сетевой контроллер.

Всё, что нужно сделать – взять в руки эту плату, подключить к ней блок питания, мышь, клавиатуру, монитор и диск. Желательно поставить все вышеуказанные элементы в какое-нибудь подобие корпуса, но последнее, конечно, необязательно.

Далее ставится операционная система и решается “дальнейшая судьба” устройства: либо одноплатный компьютер подключается к экрану и работает в текстовых редакторах, либо одноплатный компьютер превращается в Wi-Fi-роутер, сетевое хранилище данных или даже беспроводной сетевой плеер.

Главное о потребности, на которую направлен продукт

Когда рынок одноплатных компьютеров только зарождался, то, как правило, “одноплатники”, благодаря своей бюджетности и компактности, применялись в большинстве своём либо на уроках информатики в школах, либо обычными людьми, желающими превратить контроллер, например, в игровую консоль. Тем не менее, позже одноплатные компьютеры решили купить крупные компании для более масштабных целей и больших проектов.

Соответственно, рынок пополнился новыми производителями, а главными желающими купить одноплатный компьютер – стали теперь не только школы и индивидуальные программисты, но и, например, промышленные предприятия.

Поэтому основная потребность компаний: возможность использовать подобный продукт как некий контроллер, который можно подключить к различного рода аппаратуре и управлять предприятием с гораздо меньшими издержками при условии небольшой задействованной площади (в отличие от большого системного блока привычного компьютера).

Как мы исследовали рынок:

В первую очередь, мы исследовали рынок и конкурентов. Одно из самых интересных наблюдений – почти все рекламные кампании были направлены на общий фокус: «производство под заказ», «под любые цели» и другие подобные «месседжи».

Самый популярный представитель «Raspberry» активно позиционирует себя, с одной стороны, как продукт для обучения, а, с другой – как многофункциональная плата, из которой можно сделать почти всё. Другой аспект – что позиционирование этого «всё» будто бы заточено под некое развлечение, но не под промышленную и строительную сферы или для любого другого рода среднего и крупного бизнеса.

Есть и другие конкуренты по типу «PandaBoard» и «Cubieboard», но их графический процессор слабее, среди возможных ОС используются только «Linux» и «Android», а цена выше. Но они также позиционируются как многофункциональные платы, хоть и многофункциональны они в меньшей степени, а фокуса на B2B- и B2G рынок совсем отсутствует.

Возвращаясь к Raspberry. Как мы видим, данному продукту присуща многофункциональность, но направленность на аудиторию – также совсем иная, более B2C и… B2G, но только если говорить о популярности технологии в школах.

В B2B-сегменте всё более сдержано, а многофункциональность представляет собой либо разработку под заказ, либо широкий ассортимент с определённым расфокусом.

Потребности целевой аудитории

После проведенная исследования, мы поняли, что целью нашей работы будет объединение многофункциональности от Raspberry и фокуса на B2B- и B2G-сегмент. В последнем случае речь идёт не о школах, а, напротив, мы фокусируемся на иные структуры, отражая в позиционировании то, что мы российский производитель.

Причина, почему это интересно B2G?

Потому что здесь отдаётся приоритет российскому разработчику.

В данном случае желают купить российский одноплатный компьютер.

Почему это интересно в B2B?

Кроме многофункциональности, компактности и стоимости, если говорить по простому “человеческому”, то избавление от каких-либо нервов и сложностей при установке.

Как мы это выявили? Мы провели глубинные интервью с потребителями и выяснили, что зачастую в больших компаниях существует проблема долгой установки одноплатных компьютеров. Всё, что необходимо целевой аудитории – просто включить и запустить контроллер в работу без каких бы то ни было сложностей и долгих установок.

Как это решается? Выбором наиболее популярного ПО в виде, например, «Zabbix» и «Scada Progea», а также модульной архитектурой и заранее предустановленной ОС на выбор.

Как это позиционировать? Как «Plug and Play»: уже готовое максимально удобное и поддерживаемое ПО для быстрой установки и начала работы.

Фокус: на большие проекты и производительность.

Поэтому в итоге у нас получился некий «iPhone» из мира одноплатных компьютеров для B2B- и B2G-сектора, объединяющий в себя лучшие черты большого количества одноплатных компьютеров, направленных на B2B-рынок и «Raspberry».

Посмотреть на наше позиционирование и технические характеристики можно здесь.

Разработка одноплатного компьютера с нуля. Пособие для начинающих Одноплатный компьютер, Разработка с нуля, Технопрон, Радиолюбители, Technobrother, Длиннопост

Я занимаюсь разработкой электроники. Начал сравнительно недавно — когда микроконтроллеры от Atmel стали известны благодаря платформе Arduino. Тогда меня это не особо заинтересовало — на тот момент я уже программировал их из AVR Studio, читал истории DiHalt и мечтал о разработке собственного автопилота. 3 курс, Новосибирск, НГУ — это было увлекательно…

Но я с интересом наблюдаю за развитием и ростом индустрии встраиваемых и портативных систем: появление RaspberryPI, многообразия SoC и плат на их основах, системы умного дома, интернет вещей, смартфоны с растущей вычислительной мощностью — все это фантастический простор для деятельности. Результатом наблюдения стало желание поучаствовать: попробовать себя в разработке простой платформы, с целью изучения и накопления опыта.

Выбор у меня был небольшой, и определялся сложностью изготовления платы — только выводные корпуса, никаких BGA, максимум четырехслойный дизайн, а все потому, что я собирался прилепить свою платку к одному сравнительно простому рабочему проекту. Еще это означало, что в последующем я получу с производства уже спаянную плату, готовую к экспериментам.

Проектирование

После чтения статей о платформе BlackSwift в потенциальных кандидатах появился Qualcom Atheros AR9331, но смутило отсутствие подробной информации в открытом доступе. Жаль, занимательный кандидат.

Меня интересовала минимальная конфигурация, достаточная, чтобы запустить на ней Linux. Соответственно к процессору была выбрана микросхема памяти на 32 МБ (256 МБит) (по тому простому принципу, что она у нас была в наличии). На тот момент я еще не вычитал на десятках форумов о существовании сложностей с этим процессором, только изучил рекомендации производителя по трассировке и, довольный как слон, делал все по рекомендациям.

Вообще, процессор (или SoC, так правильнее) интереснее с той точки зрения, что при его запуске значительно дороже выходят ошибки проектирования. Например, некорректная разводка DDR памяти может выразиться как минимум в последующих ошибках чтения-записи, как максимум — в невозможности инициализации памяти вообще. Цепи питания процессора — ошибка сожжет процессор при первом включении, интерфейсы — потеря периферии на этих интерфейсах, и так далее.

Поэтому начинать проще с изучения готовых отладочных комплектов, например официальной платы и ее документации. Платы у меня не было, но документация доступна всем желающим. В придачу полезно изучить все инструкции по применению, почитать форумы (это уже жизненный опыт :)) — в общем, изучить всю доступную информацию о жертве. После изучения начинается механическая работа — нарисовать схему, а затем и плату. Четыре слоя, минимальная ширина проводника 0.2мм, зазора 0.2мм, отверстия 0.3мм.

Подключил все, что можно подключить безболезненно – аудио входы и выходы, вывел видеосигнал на контактные площадки, всякую простую периферию — микросхему памяти с I2C интерфейсом, еще одну с SPI, держатель для uSD карты, конфигурационные перемычки, обязательно отладочный порт, и потом на свободное место все что осталось. Плата получилась небольшая — 70х40мм, с минимумом компонентов. Для NAND памяти места не осталось, но я планировал запускаться с SD/MMC. Работы на одну ночь.

Разработка одноплатного компьютера с нуля. Пособие для начинающих Одноплатный компьютер, Разработка с нуля, Технопрон, Радиолюбители, Technobrother, Длиннопост

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

Итак, плата спроектирована, документация на нее оформлена, все это передано в производство, и можно начинать готовиться к поступлению плат с производства. Начинаю изучать материалы на предмет нюансов запуска процессора, и натыкаюсь на стостраничные форумы, с описанием проблем и сложностей в запуске.

Спустя месяц приходят платы, и я начинаю эксперименты. Что-то в уголке подсознания всплывает, связанное с проблемами у монтажного производства.

Разработка одноплатного компьютера с нуля. Пособие для начинающих Одноплатный компьютер, Разработка с нуля, Технопрон, Радиолюбители, Technobrother, Длиннопост

Отступление
Эта система на кристалле приглянулась мне еще и тем, что несет на борту все необходимые для ее жизни регуляторы питания — как DC/DC (импульсные) так и LDO (линейные). В том числе и зарядное устройство для Li-Pol аккумулятора. Заводишь на SoC 5 вольт от USB — получаешь 1V8, 2V5, 3V3 и 4V2 на выходе. Что-то достается самому процессору, что-то уходит на память, можно аккумулятор подзарядить. Удобно. Можно сжечь все и сразу :)

SoC bringup

Прочь сомнения, подать питание!

Начинается самое интересное — bringup. Как этот термин лаконично перевести на русский в данном контексте? Попытка вдохнуть жизнь? Не звучит.

В процессоре есть свой первоначальный загрузчик, который при включении проверяет условия старта — откуда и что грузить. Он же отвечает на запросы по шине USB. Его можно сконфигурировать перемычками на плате, или однократно прошиваемой OTP-памятью. Если перемычки перепаять я еще смогу, то перепрошить неперепрошиваемое вряд ли. Распаиваю перемычки, подаю питание, и о чудо — с отладочного порта приходят первые байты данных! Это значит, что процессор доволен питанием, самые базовые его узлы запустились, и можно что-то делать дальше. Что значат эти коды, я узнал из кривоватого заголовочного файла, в виде PDF документа, с невнятными пояснениям, пропусками и за авторством huashan. Все ясно.

Хорошо, чтобы максимально оперативно работать с платой, оптимальнее будет подключить ее по проводам, и загружать исполняемый код по нажатию одной кнопки. Ок, подключаю по USB к компу. И ничего.

Никаких транзакций по шине USB, даже генерации на кварце. Плохо. Начинаю думать, изучаю плату, вспоминаю все тонкие моменты. Например, на этой плате рядом с процессором я поставил свой DC/DC преобразователь, с расчетом на питание какой-либо потребляющей нагрузки, подключил его к шине питания USB 5V, и ничем не нагрузил. Промеряю осциллографом — на входе 5 вольт, на выходе 5 вольт. Всплывают слова с производства, что-то по поводу резистора. Да, так и есть — в цепи обратной связи нет резистора. (- Капитан, капитан, якорь всплыл! — Хммм, скверная примета…)

Паяю резистор, и о чудо! Плата определяется по USB! До этого я смотрел на уровень напряжения шины питания — 5.1 вольт, никаких существенных помех, никаких пульсаций. Но процессору виднее. После запайки резистора заработал и DC/DC источник, пока без нагрузки, но, по крайней мере, перестал мешать процессору. Хорошо, что дальше.

Утилиты позволяют загрузить эти бутлеты в память процессора и запустить их на исполнение. Все так сложно, потому что после включения встроенный загрузчик ничего не знает про внешнюю оперативную память, а поскольку нет памяти – некуда загружать, к примеру, ядро Linux. Получается цепочка из нескольких звеньев, где на каждом этапе выполняется незначительный шаг вперед.

Разработка одноплатного компьютера с нуля. Пособие для начинающих Одноплатный компьютер, Разработка с нуля, Технопрон, Радиолюбители, Technobrother, Длиннопост

Для подключения к последовательным портам, для реализации всяких внутрисхемных JTAG отладчиков, программаторов и аналогичных задач в другом проекте был реализован USB-UART мост на FT2232. Двухслойный дизайн, выведены оба порта на гребенку с шагом 2 мм. В этом проекте другая история – USB-UART мост + платка сбора данных размещается в центре основной платы, и конструктив прибора предполагает ее удаление.

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

Разработка одноплатного компьютера с нуля. Пособие для начинающих Одноплатный компьютер, Разработка с нуля, Технопрон, Радиолюбители, Technobrother, Длиннопост

Отлично, компилирую исходники, собираю этот конструктор, загружаю, и получаю первые строчки из отладочного порта! Подсистема питания запустилась!

PowerPrep start initialize power…
Battery Voltage = 0.65V
No battery or bad battery detected. Disabling battery voltage measurements.
EMI_CTRL 0x1C084040
FRAC 0x92926152
power 0x00820710
Frac 0x92926152
start change cpu freq
hbus 0x00000003
cpu 0x00010002

Заглядываю в исходники инициализации памяти, разрешаю простейший тест, правлю ручками процедуру инициализации под мою конфигурацию платы, запускаю вновь:

PowerPrep start initialize power…
Battery Voltage = 1.74V
No battery or bad battery detected. Disabling battery voltage measurements.
EMI_CTRL 0x1C084040
FRAC 0x92926152
power 0x00820710
Frac 0x92926152
start change cpu freq
hbus 0x00000003
cpu 0x00010002
start memory test, at 0x40000000
end memory test, at 0x41FFFFFC

Замечательно! Тест памяти пройден! Это очень хорошо, теперь туда можно загрузить что-то посерьезнее.

Посерьезнее у меня это U-Boot. Я знаком с этой системой, мне она кажется вполне адекватной и функциональной. Позволяет работать с периферией — актуальные версии работают с USB, SD/MMC, Ethernet, загружать образы c FAT/ext2 разделов, передавать управление, и главное — моргать светодиодиком — все то, что нужно для счастья и более гибкой отладки на первоначальном этапе.

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

PowerPrep start initialize power…
Battery Voltage = 1.74V
No battery or bad battery detected. Disabling battery voltage measurements.
EMI_CTRL 0x1C084040
FRAC 0x92926152
power 0x00820710
Frac 0x92926152
start change cpu freq
hbus 0x00000003
cpu 0x00010002
start memory test, at 0x40000000
end memory test, at 0x41FFFFFC

U-Boot 2015.04-rc3-00209-ga74ef40 (Mar 16 2015 — 12:47:34)CPU: Freescale i.MX23 rev1.4 at 227 MHz
BOOT: USB
DRAM: 32 MiB
MMC: MXS MMC: 0
MMC0: Bus busy timeout!
MMC0: Bus busy timeout!
MMC0: Bus busy timeout!
MMC0: Bus busy timeout!
Card did not respond to voltage select!
MMC init failed
Using default environmentIn: serial
Out: serial
Err: serial
Net: Net Initialization Skipped
No ethernet found.
Hit any key to stop autoboot: 0
=>

Падает при подаче питания на DDR память. Хм. Где-то я уже читал об этом. А как до этого работало? Ладно, нестабильность найдена, надо разбираться.

Вокруг микросхемы памяти расположены ее законные развязывающие конденсаторы, 8 шт. по 100 nF. Но на выходе встроенного в SoC источника питания для памяти я поставил 2x10 uF, хотя производителем рекомендовано всего 1uF (инструкции читаю, если ничего другое уже не помогает, да). Ломать, не строить: отпаиваю один конденсатор, подключаю аккумулятор, и система стартует!

На самом первом фото виден этот конденсатор — вокруг него грязь, и он припаян только одним контактом.

PowerPrep start initialize power…
Battery Voltage = 3.75V
Boot from battery. 5v input not detected
Try poweron_pll
Try turnon_mem_rail
Try init_clock
EMI_CTRL 0x1C084040
FRAC 0x92926192
Try init_ddr_mt46v32m16_133Mhz
power 0x00820710
Frac 0x92926192
start change cpu freq
hbus 0x00000003
cpu 0x00010001

Хе-хе, работает! Ок, запишу этот факт как причину потенциальных нестабильностей в будущем, ибо остался еще один 10uF, который тоже может усложнять жизнь. Теперь пробую с внешним питанием.

PowerPrep start initialize power…
Battery Voltage = 3.74V
5v source detected.Valid battery voltage detected.Booting from battery voltage source.
Mar 18 2015
07:59:13
Try poweron_pll
Try turnon_mem_rail
Try init_clock
EMI_CTRL 0x1C084040
FRAC 0x92926192
Try init_ddr_mt46v32m16_133Mhz
power 0x00820710
Frac 0x92926192
start change cpu freq

Теперь начались зависания. Более того, ситуация не регулярная, периодически проявляется при питании от аккумулятора, периодически от внешних 5В, периодически стартует и работает. Опять правлю код, отключаю переключение процессора на PLL, ядро остается работать на 24МГц. Все стабильно. Меняю делитель PLL, скручиваю частоту, и плата успешно запускается на 320 МГц. Надо попробовать рекомендацию производителя — конденсатор на 100 pF в цепи импульсного DC/DC. Место на печатной плате под конденсатор я заложил. Позже вернусь к этому вопросу.

Linux kernel

Итак, на текущий момент есть плата, стартующая с карты памяти, и загружающая U-Boot. Дальше по плану надо загружать ядро.

make ARCH=arm CROSS_COMPILE=$ mxs_defconfig
make ARCH=arm CROSS_COMPILE=$ menuconfig
make ARCH=arm CROSS_COMPILE=$ -j4 zImage modules

Вот эти три клика

При настройке ядра надо строго указать слияние ядра+dtb

Boot options ---> Use appended device tree blob to zImage ----> Supplement the appended DTB with traditional ATAG information

Надо включить Kernel low-level debugging functions вместе с early printk

И еще enable dynamic printk() support

И еще видеоподсистему отключить

И еще половину лишних и не очень драйверов

И еще собрать dtb — device tree blob, структуру, описывающую ядру базовые вещи — количество памяти, периферию SoC, и т.д.

make ARCH=arm CROSS_COMPILE=$ imx23-olinuxino.dtb

И собрать все это в один файл

cat arch/arm/boot/zImage arch/arm/boot/dts/imx23-olinuxino.dtb > arch/arm/boot/zImage_dtb

После чего можно копировать ядро на флешь.

Запускаю, и получаю kernel panic. Логично, корневой файловой системы еще нет.

В качестве собственно операционной системы я выбираю Debian. По-моему, отличный дистрибутив — простой и надежный, как деревянная палка. Беру готовую сборку, распаковываю на раздел карточки, и указываю при загрузке ядра, где искать его законную корневую.

Дааа, есть над чем поработать.

Но, тем не менее, система работает, грузится с карточки памяти, размещается во всем диапазоне DDR памяти, и по праву может называться одноплатным компьютером! Это от схемы в голове до реализации в железе.

Итого, ошибок дизайна пока что не обнаружено, хотя нарекания уже есть. Что-ж, для начала, я считаю, достаточно.

Заключение

На самом деле это только начало. Еще есть над чем поработать — разобраться с периферией, в частности интересен аудио и видеовыход, протестировать SoC на штатных частотах, а еще лучше разогнать, измерить потребляемый ток, проверить при минусовых и плюсовых температурах (интересна устойчивость DDR контроллера), проверить на ресурсоемких задачах (например, видеотрансляция с веб камеры по USB WIFI), и в результате сделать на платке WiFi-управляемый танк с камерой и направленным микрофоном. Но не сейчас. Сейчас у меня есть деловое предложение :)

Среди компьютерных гиков тоже есть свои хипстеры. Для них самый актуальный тренд последних сезонов — одноплатные микрокомпьютеры. Объясняем на пальцах, что за зверь такой и можно ли его подарить девушке как свое рукоделие.

Формально говоря, одноплатные компьютеры существуют давно. Даже некоторые большие, «взрослые» настольные компьютеры, по сути, собраны на одной материнской плате, куда вшито все, что нужно для жизни, от видеокарты до оперативной памяти. Само собой, что и ноутбуки следуют той же схеме, особенно компактные.

Однако в последние годы на радиорынках и китайских сайтах появились совсем смешные карманные платы «все включено». Обычно эта штука размером с колоду карт (игральных, не компьютерных). Для многих из нас мощности одноплатного компьютера будет за глаза, а стоит он чуть больше плюшевого мишки.

Сразу дисклеймер: мы не несем ответственности за того, кто подарит такой девайс блондинке в розовом, если только она не кодит на досуге на Java и Python. Потому что, несмотря на простоту, в таком устройстве придется разобраться.

По сути, это плата, на которой есть только самое необходимое: процессор, видеочип, несколько портов, аудиовыходы, слоты для оперативки и сетевой контроллер. Впрочем, комплектации бывают и побогаче. Например, у Raspberry, самого известного одноплатника, есть модели от простой с 256 МБ оперативной памяти до варианта с 512 МБ памяти, HDMI и четырьмя USB. У китайского Cubieboard в базе есть Bluetooth и инфракрасный порт, а к BeagleBone делают массу аксессуаров.

От тебя требуется взять в руки эту крохотную плату, подключить к ней блок питания, мышь, клавиатуру, монитор и диск (обязательно). Желательно засунуть все это в какое-то подобие корпуса (необязательно). После чего начнется свистопляска с софтом.

На любой одноплатник ставится Linux, а дальше можно приаттачить к телевизору и работать в текстовых редакторах, превратить одноплатник в Wi-Fi-роутер, сетевое хранилище данных или беспроводной сетевой плеер. Для устройства ценой в 1—3 тысячи рублей довольно неплохо.

Без гиковского опыта будет трудновато, но тут, как обычно, помогут всякие умные форумы и соцсети. Собственно, самое главное здесь не результат (проще купить сразу готовое), а процесс. Это отличное времяпрепровождение, если на рыбалке тебе мокро, а книга «Миллион судоку» уже решена до конца. И если это заработало, то будет девушке милым кривым подарком категории «сам сделал, от души».

NavQ+, герой сегодняшнего рассказа

NavQ+, герой сегодняшнего рассказа

Я занимаюсь разработкой электроники. Шесть лет назад я написал свою первую статью начинавшуюся этими-же словами и увидел неподдельное внимание. Все эти годы я продолжал оттачивать свое мастерство и на текущий момент я хочу перефразировать вступление:

Я занимаюсь разработкой электроники и мне этого мало.

Чтобы немного понять что я имею ввиду предлагаю заглянуть под кат.</cut>

Первые результаты, которыми можно поделиться.

Первые результаты, которыми можно поделиться.

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

А теперь небольшое отступление, как я вообще докатился до жизни такой. Около двух лет назад наш коллектив влился в разработку электроники и софта для одной международной компании. Проект оказался несколько нервным: заказчики меняли архитектуру железа на лету (например, мы меняли систему питания два раза, с выпуском прототипов в железе, меняли контроллер, с разрабкой софта и для старого и для нового, разумеется с отладкой в железе, а под конец, когда железка уже работала с DDR3L памятью нас попросили переделать под DDR4). Тем не менее, железка вышла в свет, и вы можете не только посмотреть непредвзятый обзор онлайн: тыц, но и купить ее по всему миру. К слову, как разработка схемы, так и трассировка печатной платы были выполнены лично мной. В этой истории есть масса интересных моментов, но не будем отвлекаться: в процессе работы над этим и другими проектами я получил серьезный опыт и у меня сформировалось понимание как процесс разработки аппаратуры можно ускорить и улучшить. В двух словах: человек, который умеет как в железо, так и в софт может ускорить этот процесс в разы. Например, отладка новой железки для программистов это кошмар: непонятные схемы, неизвестность как изменения в софте отражаются в железе, соответственно, сложность с проверкой своего кода и полная потерянность. Отладка железки для железячника этот тот-же кошмар, только в профиль: тонны кода, сложности навигации в нем и уж тем более сложности модификации этого кода, и как результат – потерянность. Сотрудничество двух команд это потерянность в большинстве случаев.

Второй важный навык, который я вынес из этого, и многих других проектов это навык оперативной разработки железа. Возможность выкатить первую версию железа через месяц после утверждения ТЗ это здорово. (Изменения в ТЗ это не здорово, но об этом в другой раз). Например, в проекте выше для первых прототипов мы взяли готовый процессорный модуль от NXP, а все остальные фичи реализовали в простой четырех-слойной плате. Да, на плате немного срач, но для медленных интерфейсов это абсолютно не важно. Важно то, что такую плату могут изготовить за неделю, а собрать и отлаживать такую комбинацию в разы проще: можно декомпозировать и отлаживать по частям:

Плата в стадии EVT (Engineering Validation Test). На этой стадии проверятеся, что ТЗ вообще выполнимо. Платы в стадии DVT (Design Validation Test). На этой стадии дизайн доводится до ума.

Этот проект оказался коммерчески жизнеспособным, хоть и не таким масштабным. Тем не менее идея показалсь интересной, и мы продолжили работу. Отсюда и начинается главное повествование.

Итак, в ходе работы мы установили множество трудовых отношений, в том числе и с компанией NXP (как вы уже увидели по ссылке на гитбук), и когда эти ребята выпустили новый процессор IMX8M Plus (ниже), мы решили что стоит взяться за него посерьезнее, и переиспользовать все наработки, которые были получены как в пилотном проекте NavQ, так и опыт разработки в целом.

IMX8M Plus в одной картинке

IMX8M Plus в одной картинке

Железо

Собственно, в первой ревизии железа (на КДПВ) было реализовано следующее:

Процессор IMX8M Plus (его блок-схема выше)

До 8Гбайт LPDDR4 памяти (32бит, до 4266MTs), до 1ТБ eMMC (8бит, до 3200Mbps)

Два USB-C порта (до 5Gbps на порт), с поддержкой Power Delivery

Два MIPI CSI (Camera Serial Interface), 4 канала данных на каждый порт

Два LVDS порта для вывода видео, 4 канала данных на каждый порт

Один MIPI DSI (Display Serial Interface), 4 канала данных на порт

Один PCIe Gen 3, (1 канал данных, до 8GTs)

Один 1000BASE-T Ethernet, с поддержкой IEEE 1588v2

Один WiFi модуль, 2.4/5GHz, c Bluetooth Low Energy

Масса низкоскортных интерфейсов (UART, SPI, I2C, JTAG)

Питание от USB или от 5-20В внешнего источника питания

Практически все, что есть в процессоре. И это все в сборке размером с кредитку. Разводка всего этого в 6 слоях было тем еще приключением. Собственно, все это отражено на КДПВ. Но на этом решили не останавливаться, и решили еще немного добавить в новой ревизии:

Двухпроводой автомобильный Ethernet (до 100 Mbps)

Два CAN интерфейса, каждый с индивидуальным с PHY

NFC и Trusted Platform модуль (криптография и все такое)

RTC с твердотельным суперконденсатором

Кстати, о разводке: вот лицевая и тыльная сторона платы в том как это вижу я во время проектирования: в таких случаях начитается оптимизация на новых уровнях: например у USB-3.0 высокоскоростные диффпары можно переподключать с «неправильной» полярностью: линк в процессе тренировки подстроится. И это определено в стандарте USB. Такие знания позволяют творить с USB хорошие трюки: например разводка всего USB в одной плоскости. А это хорошо с точки зрения целостности сигналов: меньше переходов на другие слои – меньше искажений полезного сигнала. Да и разводка получается элегантнее и компактнее. И таких трюков десятки.

Да, каждый проводник, каждый разьем, каждый компонент поставлен вручную. Да, это как тетрис, только круче.

Еще один приятный момент: навыки работы в нескольких САПР. Разумеется у каждой САПР есть свои плюсы и минусы. Например, мне нравится Orcad Allegro за его абсолютно серьезный подход к правилам и проверкам дизайна. Система от британцев, а уж они то ребята дисциплинированные. Но еще мне нравится Altium Designer. Разработчики стараются сделать софт приятным в использовании и со всеми современными графическими фичами: вот где еще я могу собрать всю свою поделку, включая хитро выгнутые шлейфы, да так, чтобы выглядело реалистично?

Предыдущее поколение. Кстати, вся работа выполнена в Orcad, но импорт в Allegro нужен именно ради таких рендеров.

Предыдущее поколение. Кстати, вся работа выполнена в Orcad, но импорт в Allegro нужен именно ради таких рендеров.

Сильным подспорьем оказываются и навыки в 3D моделировании: спроектированный корпус для модуля становится как и защитой этого модуля от внешних воздействий: его уже не повредишь случайным касанием, так и придает законченный вид изделию:

Time Of Flight камеры. Реально измеряют время пролета света от лазерного диода до обьектов и обратно до фото-матрицы.

Time Of Flight камеры. Реально измеряют время пролета света от лазерного диода до обьектов и обратно до фото-матрицы.

Но это все покрывает только половину задачи. Следующий шаг – поднять все это в софте.

Софт

Очевидно, что такое обилие новых интерфейсов требует серьезной работы и на стороне софта. Итак, я понял, что я хочу с этим справится. Сборка ядра Linux это уже мелочи на сегодняшний день, никого этим не удивить, сборка Yocto тоже решаема парой пинков в нужных местах (если потребуется), модификация Device Tree Structure, собственно структуры которая сообщает ядру какая периферия для него доступна это тоже не страшно. Всяческие низкоскоростные интерфейсы просто «включаются» в ядре и заводятся в железе сразу. Но вот работа с видеоподсистемой, и особенно с камерами это был серьезный вызов. И я решил себя в этом попробовать. Я догадывался, что это кошмар, но глубину этой «кроличьей норы» оценить не мог. А оценить оказалось что.

Этот новый IMX8M Plus немного отличается от всех своих предшественников в организации всей своей медиа-подсистемы. NXP добавила в процессор так называемые ISI, Image Sensing Interfaces и ISP, Image Signal Processors, оба для обработки видео-потоков с камер. Помимо того, что все это новые модули, они еще сильно связаны с V4L2 (Video For Linux) подсистемой в Linux. И еще над всем этим ведется работа, и каждый релиз BSP от NXP отличается от предыдущего. И люди это пытаются использовать и разумеется это невероятно сложно. Быстрый взгляд в коммьюнити хаб разработчиков открыл страшную картину: я сходу столкнулся с дюжиной тем где люди обращались за помощью к NXP:

И это не праздный интерес «а что это вы тут сделали?», это конкретные вопросы «у нас не работают ваши изобретения на вашем-же железе». В общем, проблема становилась все масштабнее.

Небольшое отступление: разработка железа с моей точки зрения несколько проще: да, разумеется нужно обладать знаниями в области, понимать пути решения задачи и обладать опытом, но в случае когда железо проектируется с нуля присутствует полная свобода выбора: здесь я поставлю процессор, а тут разъемы (немного утрирую, конечно). В софте, особенно в Linux, есть 30 лет истории развития проекта, и в нем всё со всем тесно связано. «Нельзя просто так взять и добавить драйвер» © с нуля, нужно понимать все пути взаимодействия этого драйвера с системой, и систему соответственно. Особенно в таких случаях, когда это массивные штуки вроде медиа-подсистемы.

Невозможно передать всю гамму эмоций в одной статье, но в результате мне потребовалась неделя, чтобы заставить камеру работать. В процессе отладки рушилось все: ядро целиком, видео-подсистема, драйвер, вера в человечество и даже части собственной машины (был в глубокой задумчивости, а не пойти-ли мне в проститутки). Когда я в результате увидел картинку с камеры, я немного испугался: вид у меня был явно помятый:

Да, Ubuntu была поднята практически сразу. Но расскажу я об этом далее.

Да, Ubuntu была поднята практически сразу. Но расскажу я об этом далее.

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

В результате я доказал себе отладка как железа, так и софта одним человеком, особенно на таком уровне сложности ВОЗМОЖНА. Это для меня выглядит как level-up, и вот почему. Есть предположение, что это знание масштабируемо: работая меж двух команд (SW и HW) можно как разрешать многие ошибки на начальных этапах проектирования, так и в последующем значительно ускорять процесс разработки (понимая что и где нужно каждой из команд).

На этом работа над камерой была завершена. Но помимо этого есть еще и вывод видео. И это было второй частью приключения. Вывести картинку не сложно, но вот вывести на монтитор GUI целой операционной системы уже посложнее. Небольшой флэш-бэк из прошлой статьи: “В качестве собственно операционной системы я выбираю Debian. По-моему, отличный дистрибутив — простой и надежный, как деревянная палка. Беру готовую сборку, распаковываю на раздел карточки, и указываю при загрузке ядра, где искать его законную корневую.”

Так вот, с графикой такое не проходит. Графическая подсистема (скажем, оконный менеджер) тесно завязана на десятки библиотек, а эти библиотеки в свою очередь завязаны на ядро Linux, которое в свою очередь обращается к драйверу графического ускорителя. Драйвера собираются под конкретное железо, и могу предлагать только часть возможностей необходимых оконному менеджеру, соответственно, не любая комбинация возможна.

В моем случае мне несказанно повезло: NXP дружит с Wayland, а Ubuntu (прямой потомок Debian) совсем недавно начала поддерживать Wayland со своей стороны.

То есть, пара дней гуглинга и медитаций дали желаемое: я завел Ubuntu на новом процессоре. А это уже открывает окно в целый мир: я сходу поcтавил ROS (Robot Operating System), подключил уже проверенный PCIe модуль с любимыми видео (а потом и аппаратный Neural Network Accelerator) и поставил соответствующий софт. Даже YouTube посмотрел, чего я не мог сделать на своем предыдущем одноплатнике:

Дружно вспомнили мем про видосики

Дружно вспомнили мем про видосики

Таким образом, получилась целая платформа, немного напоминающая Raspberry PI. То есть: подключил клавиатуру, мышь, дисплей и вот у тебя полноценный компьютер. Еще один level-up: я с детства мечтал спроектировать и собрать собственный компьютер, с теми интерфейсами какие я хочу, с той геометрией и тем софтом которым я привык пользоваться. Получилось здорово, мне нравится.

Aftermath

Разумеется, многие интерфейсы еще не проверены, работы непочатый край, разумеется, есть идеи как систему можно расширить благодаря ее модульности. Есть вещи, которые просто обязаны, случится, например Time Of Flight камеры лежат и ждут когда за них возьмутся.

Над проектом ведется работа, и не одним лишь мной. Будет вкусный софт и вся поддержка, и не только со стороны NXP. Всю эту систему с полным набором интерфейсов можно будет получить даже бесплатно, вот как это происходило с предыдущим поколением.

В целом, я рассматриваю это как хороший старт, и надеюсь что я немного раскрыл свою мысль из введения: «я занимаюсь разработкой электроники и мне этого мало». Stay tuned!

Читайте также: