Компьютерная археология
Здравствуй, Хабр!
Заметка для любителей «винтажа», для тех, кто интересуется историей миникомпьютеров. В преддверии новой эры устройств IoT — HummingBoard Pro на процессоре Freescale i.MX6 Quad и с дизайном Raspberry Pi 1 Model B. Особенности и попытка добиться низкого энергопотребления (и даже меньше!), сравнимого с Raspberry Pi 3А+.
Мне очень нравится винтажная электроника: думаю, старенькие компьютеры неплохо справляются с несложными современными задачами и вовсе не являются «электронным мусором». Как еще одно подтверждение — в этом месяце я познакомился с любопытным заморским гостем в солидном для компьютерной электроники возрасте и провел ряд увлекательных экспериментов.
Обычно, когда так или иначе используют в домашних условиях одноплатные устройства, пытаются «ускорить» компьютер, разогнать процессор и шины.
Но меня попросили сделать небольшую станцию, обрабатывающую векторную графику в не сильно нагруженном режиме. Казалось очень важным обеспечить низкое энергопотребление, потому что коробочка девайса должна была работать от аккумуляторов (это фотографическое устройство, если кому интересно, функциональный аналог Nikon WT-4).
На руках у меня была проверенная в боях, легко настраиваемая «малинка» 3A+ , а также по случаю достался старенький компьютер израильской фирмы SolidRun на базе платы HummingBoard Pro.
Кстати, «колибри» управлял каким-то сложным станком ЧПУ, я купил его после списания: старичок был в отличном состоянии, но без проприетарной системы охлаждения. Однако я сделал ее самостоятельно из меди и температура с таким радиатором поддерживается между 40 и 50 C, что вполне приемлемо и почти сопоставимо с Raspberry Pi 3А+ (и все-таки «малинка» лучше справляется с нагревом!).
HummingBoard Pro — редкий гость в России, намного чаще встречается старший брат CuBox-i того же производителя. Однако необходимую документацию легко найти из сторонних источников: SolidRun использует популярные процессоры от Freescale, и поэтому я отправился изучать форум NXP Semiconductors, а также прочитал обширную документацию на устройства с теми же процессорами от Toradex.
Для справки. Этот же процессор используют многие разработчики. Например, Banana PI F2/BPI-F2, PICO-IMX6, Wandboard QuadPLUS
В далеком 2014 году одноплатный компьютер HummingBoard Pro создавался как продвинутый аналог Raspberry Pi 1 Model B, поэтому он, конечно, уступает в скорости Raspberry Pi 3А+, даже если поставить на плату модуль SOM с четырьмя процессорами. Но сейчас стоимость HummingBoard Pro ниже, чем Raspberry Pi 3А+ и данный компьютер неплохо подходит для замены. Кроме всего прочего, аппаратные возможности HummingBoard Pro весьма и весьма симпатичные, а на официальном сайте можно скачать Debian Bullseye для HummingBoard, (я также успешно прошивал новый Armbian). Производитель уже на этапе проектирования продумал возможности масштабирования.
Raspberry Pi 1 Model B
Что на борту?
Старенькая плата содержит большой набор микросхем, хорошо работающих с Линуксом. Кроме всего прочего, конструкция модульная, что позволяет менять по желанию SOM (процессоры с периферией).
Мне досталась двухъядерная версия с промышленным контроллером wi-fi TI WL1837.
Программа hwinfo выводит следующую информацию: сетевой контроллер Qualcomm Atheros AR8035, звуковой чип SGTL5000, хаб usb Cypress CY7C65632/34, блютус и вайфай TI WL1837 (программно ограниченный до 2 ГГц, диапазон 5 ГГц залочен), PCIe бридж от Synopsys, также есть S/PDIF, mSATA, встроенная eMMC на 8 Гб, поддержка HDMI (audio, cec), встроенный IR-receiver, шина Flexcan, графический процессор Vivante, (GPU поддерживается через etnaviv), доступны watchdog, часы RTC.
Развитые для одноплатника аппаратные средства вселяют надежду на возможную быструю оптимизацию питания. Но без какой-либо оптимизации «колибри» потребляет больше «малинки» и при этом процессор ощутимо горячее — если «малинка», настроенная в режиме энергосбережения требует около 0,16–0,18 А (с включенными wi-fi и блютус), то «колибри» выводит на амперметре цифры 0,22–0,24 А, а во время загрузки ток прыгает аж выше 0,5А.
(Raspberry Pi 3А+ позволяет «из коробки» простыми средствами настроить частоты процессора при загрузке, чтобы не перегружать маломощный блок питания, например, порт usb, но «колибри» загружается с помощью «взрослого» u-boot, что требует более тонкой настройки.)
Неужели «колибри» так уж сильно проигрывает Raspberry Pi 3А+? Тем более что «малинка» все-таки имеет четырехъядерный процессор, в полтора раза более мощный, чем у старенького «колибри».
Наверное, все зависит от того, как предполагается использовать компьютер: если насущные задачи требуют постоянного включения, то Raspberry Pi 3А+ скорее всего справится с ними лучше, чем HummingBoard Pro. Однако если требуется режим глубокого сна, гибкая оптимизация питания, то здесь i.MX6 на высоте — процессор Freescale i.MX6 Quad поддерживает несколько спящих режимов и поэтому способен засыпать с минимальным энергопотреблением. (Увы, компьютеры Raspberry Pi до сих пор не поддерживают «сон».)
А уж если устройство можно перевести в «спячку» с мизерным энергопотреблением, то power management явно позволяет вручную управлять остальными подсистемами!
Чтобы не быть голословным, я попытался нехитрыми манипуляциями избавиться от «лишнего» энергопотребления HummingBoard Pro.
Несколько лет назад активные пользователи англоязычного форума Raspberry (и я среди них), яростно обсуждали эффективные настройки энергосбережения «малинок». Конечно, нашим чемпионом был Raspberry Pi Zero, но миникомпьютер 3А+ тоже показывал хорошие результаты.
Первичная «методика» настраивания энергосбережения на «малинке» подразумевала отключение устройств типа порта ethernet (если он был) и целиком шины USB, выключение HDMI, тонкую настройку питания и частоты CPU, программную оптимизацию и даже перевод в «off» светодиодов-индикаторов!
$ echo none | sudo tee /sys/class/leds/led0/trigger
$ echo 1 | sudo tee /sys/class/leds/led0/brightness
Какие цифры можно считать средними для 3-й версии?
Например, отключение выхода HDMI дает нам экономию ~20 мА.
$ sudo tvservice --off
Даже принудительная настройка ethernet контроллера на Raspberry Pi 3B+ (версия 3A+ без контроллера) в режим fast ethernet экономит электроэнергию.
$ ethtool -s eth0 speed 100 duplex full # Fast Ethernet
Отключение питания USB также позволяет снизить потребление тока.
$ echo 0 | sudo tee /sys/devices/platform/soc/3f980000.usb/buspower >/dev/null
Как итог, если отключить wi-fi, мы получим 142 мА, что в общем-то неплохо для прожорливого процессора.
$ sudo ifconfig wlan0 down
Ниже я сделал попытку эксперимента с аппаратными средствами «колибри» по «методике Raspberry Pi».
И кстати, контролировать режимы энергосбережения на первом этапе очень удобно с помощью встроенного высокоточного датчика температуры: модуль на базе NXP/Freescale i.MX 6 обеспечивает показания внутренней температуры SoC, вывод в тысячных градусах Цельсия (как и на «малинках», где есть специальная утилита чтения датчика).
Читаем температуру процессора.
$ cat /sys/devices/virtual/thermal/thermal_zone0/temp
Разумеется, чем ниже температура, тем меньше потребляет процессор.
Ядро Linux поддерживает динамическое переключение напряжения и частоты (DVFS) для минимизации энергопотребления. Посмотрим, как это работает на «колибри» с прошивкой Debian Bullseye.
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
Не густо, всего два режима: performance, schedutil.
Правда, последний режим очень продвинутый, так что лучше и не надо.
Можно вручную выбрать режим.
$ echo performance | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
Посмотреть настройки частоты процессора.
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
Или выбрать из списка и определить частоту явно (на самом деле мы запишем частоту как максимальную, тем самым ограничивая работу процессора).
$ echo 396000 | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
С частотами разобрались, идем дальше. Ядро Linux может поддерживать до четырех состояний сна системы в зависимости от возможностей платформы, на которой оно работает. В простейшем случае «колибри» с процессором iMX6 легко перевести в один из двух режимов, например, бездействия с низким энергопотреблением: некоторые периферийные устройства продолжают работать, а другие отключены. Или даже выключить физические устройства. При этом оперативная память LDR3L остается в режиме самообновления.
Смотрим доступные варианты «сна».
$ cat /sys/power/state
Режим пониженного энергопотребления можно активировать с помощью следующей команды.
$ echo standby | sudo tee /sys/power/state
Или включить еще один один режим сна.
$ echo mem | sudo tee /sys/power/state
И в том, и в другом случае компьютер практически выключится (мой грубый амперметр usb не сможет измерить потребляемый ток, придется подключить более чувствительный мультиметр!).
Теперь для перевода системы в активное состояние можно использовать заранее запрограммированный gpio или часы RTC.
Немного об аппаратных часах. Если не настроить прерывания, то чтобы вывести устройство из сна придется отключать питание или нажать кнопку reset на плате. Поэтому самым простым способом кажется использование прерывания от аппаратного «будильника».
Часы с батарейным питанием, они показывают время, даже когда система выключена (для этого нужно подключить батарейку через специальный разъем).
Следующие команды позволяют управлять часами.
Показать время аппаратных часов.
$ sudo hwclock -r
Установить аппаратные часы на системное время.
$ sudo hwclock -w
Установить системное время из аппаратных часов.
$ sudo hwclock -s
Время срабатывания будильника задается в секундах.
Например, чтобы включить компьютер через 20 секунд после «сна».
$ echo +20 | sudo tee /sys/class/rtc/rtc0/wakealarm
(Конечно, разбудить компьютер, вывести его из спящего режима можно по другим прерываниям: сконфигурированть gpio или UART.)
Маленький скрипт спящего режима выглядит так.
#!/bin/bash
sudo date -s "2022-04-20 11:03:59"
sudo hwclock --systohc
echo +100 | sudo tee /sys/class/rtc/rtc0/wakealarm
echo mem | sudo tee /sys/power/state
Ух ты! Процессор тут же стал холодным, энергопотребление упало ниже низкого, в несколько раз ниже, чем у полностью выключенного компьютера Raspberry Pi 3А+.
В этом тесте «колибри» выглядит очень хорошо!
Но почему же «колибри» потребляет больше «малинки» при работе на холостом ходу? Ответ надо искать в дополнительных расширенных возможностях HummingBoard Pro.
Прежде всего речь идет о мощном графическом ядре Vivante GC2000
Его можно сразу же отключить и полюбоваться резким падением потребления тока — мой неточный usb амперметр сразу прыгнет вниз, до уровня Raspberry Pi 3А+ (0,18 А). Процессор также станет ощутимо холоднее даже без радиатора. Да, Vivante — мощное, прожорливое устройство.
$ echo »130000.gpu» | sudo tee \ /sys/bus/platform/devices/130000.gpu/driver/unbind
Затем мы можем отключить шину USB. Ведь если мы сравниваем с Raspberry Pi 3А+, то будем сражаться по-рыцарски: у «малинки» один порт usb и тем более не предусмотрен Qualcomm Atheros AR8035.
Отключаем. Так?
$ echo »1–0:1.0» | sudo tee »/sys/bus/usb/devices/1–0:1.0/driver/unbind»
Или так? =)
$ echo »2–0:1.0» | sudo tee »/sys/bus/usb/devices/2–0:1.0/driver/unbind»
Посмотрим, что будет если дать следующую команду:
$ echo »0000:00:00.0» | sudo tee »/sys/bus/pci/drivers/pcieport/unbind»
(Ничего особенного не произошло, что ожидаемо.)
Наконец, ради чистоты эксперимента сделаем следующее.
$ echo «sound-sgtl5000» | sudo tee \ /sys/bus/platform/devices/sound-sgtl5000/driver/unbind
$ echo «sound-spdif» | sudo tee \ /sys/bus/platform/devices/sound-spdif/driver/unbind
Модуль wi-fi также позволяет управлять режимами энергосбережения, это промышленный контроллер. Так что смело настроим беспроводное соединение.
$ sudo iwconfig wlan0 power on
(При этом скорость соединения по wi-fi резко снизится до уровня старорежимного телефоно-модемного, но wi-fi будет исправно функционировать!)
Смотрим результаты. Даже без каких-либо изысков, энергопотребление HummingBoard Pro стало чуть ниже «малинки», на уровне 0,12–0,14 А. И мы приблизились к замечательным показателям Raspberry Pi Zero 2 W, который с легкостью достигает на холостом ходу 120 мА (600 мВт!). Raspberry Pi Zero (без WiFi) будет потреблять в том же режиме 108 мА, но для него это отнюдь не предел!
Примечание. На борту HummingBoard Pro существует eMMC на восемь гигабайт. Это значит, что можно установить ОС на встроенную флеш и тем самым снизить энергопотребление — ведь sd-карта тоже потребляет ток. Однако из рыцарского этикета (у компьютеров RPi нет eMMC) я этого делать не буду.
Также очевидно что некоторыми изощренными методами можно перевести HummingBoard Pro в еще более экономный режим. Но так уж ли это необходимо? Вряд ли следует тюнинговать HummingBoard Pro до Raspberry Pi Zero без ощутимой потери функционала (например, отключив ethernet контроллер).
Ну и напоследок. Чтобы полюбоваться загрузкой u-boot в реальном времени, я спаял на основе arduino с nRF52840 небольшое устройство для подключения к пинам UART. Ардуино подключается к HummingBoard Pro «внахлест», то есть RX→TX, TX→RX, и прошивается следующей простой программой.
void setup() {
#define UARTE0_BASE_ADDR 0x40002000 // для nRF52840 UART
#define UART_BAUDRATE_REG_OFFSET 0x524
#define UART0_BAUDRATE_REGISTER (*(( unsigned int *)(UARTE0_BASE_ADDR + UART_BAUDRATE_REG_OFFSET)))
#define BAUD307200 0x04d01eac
Serial1.begin(115200, SERIAL_8N1);
//UART0_BAUDRATE_REGISTER = BAUD307200;
Serial.begin(115200);
}
void loop() {
if (Serial1.available()) { Serial.write(Serial1.read()); }
// От UART к компьютеру
if (Serial.available()) { Serial1.write(Serial.read()); }
}
Здесь важно настроить скорость, иначе на экран компьютера полезут малопонятные кракозябры.
Какие впечатления оставил у меня одноплатник HummingBoard Pro? Очень и очень положительные! Для своего времени это был явно шаг вперед, и даже если сравнивать с более новом компьютером Raspberry Pi 3А+, «колибри» не кажется таким уж отсталым. К безусловным плюсам можно отнести «дальнобойный» промышленный wi-fi с возможностью подключения внешней антенны (это был решающий фактор для меня, но придется разбираться, как разлочить 5 Ггц), часы RTC, полноценные спящие режимы и звуковой чип (аналоговый микрофон также можно подключить).
На этом все, и надеюсь, мое сообщение покажется интересным для людей, любящих старое компьютерное железо.