Использование платы Firefly-RK3288 Reload с SoC RockChip RK3288. Цифровой I2C термодатчик Microchip — MCP9808 +12
C++, Разработка под Linux, Разработка на Raspberry Pi, Интернет вещей, Умный дом
Рекомендация: подборка платных и бесплатных курсов создания сайтов - https://katalog-kursov.ru/
Firefly-RK3288 Reload
Подбирая девелоперскую плату для опытов, выбор пал на достаточно навороченную модель от китайского производителя T-Chip. Реализуют продукцию они под маркой Firefly. Специализируются на платах с системами на чипе от RockChip. RK3288 — самое производительное 32-битное решение от этой китайской компании. SoC от RockChip и Allwinner выгодно отличаются от чипов Broadcom в RaspberryPi не только лучшими характеристиками, но и технологией производства — 28nm против 40nm. Но конечно и стоят в данном случае китайцы дороже. Ещё более крутую 64-битную систему RK3399 не выбрал, в том числе потому, что есть основания полагать, что она уже существенно горячее. В то время как RK3288 под нагрузкой не сильно греется, даже без использования каких-либо радиаторов.
Страница продукта. Основные аппаратные параметры девайса: 4 ядра ARM Cortex-A17 1,8 ГГц (некоторые источники настаивают, что тут Cortex-A12 или A15, но это не особо важно), 2 ГБ DDR3 dual-channel, накопитель 16 ГБ eMMC, гигабитный Ethernet.
Покупал на Ebay, это оказалось чуть ли не единственным местом, где эти платы можно заказать в Россию. Интернет магазин самого китайского Firefly в Россию не высылает. Не высылает в Россию и Indiegogo. Что забавно, в списке стран для отправки, у этих странных людей якобы есть даже ныне не существующие государства :). Продавец с Ebay прислал плату в хорошей комплектации — плата, блок питания (нужен 12V 1,5A, прислали как и положено с запасом — 2A), платка с антенной, акриловые панели корпуса с крепежом. Адаптер правда под американскую розетку, но ведь все должны иметь походный переходник :).
Подобно более известным на российском рынке платам CubieBoard от CubieTech, Firefly даёт неплохую информационную поддержку. Предоставляются образы ОС, схема распиновки и прочее. Достойна похвалы прошивка Ubuntu 14 для Firefly. Работает стабильно, небольшое потребление памяти. Графический рабочий стол — LXDE. Прорисовка интерфейса не кажется идеально быстрой, но вполне прилична. Кстати, полезная ссылка о том как делать снимки экрана в LXDE:
Lxde wiki. Другая полезная информация — как установить время:
используя dpkg-reconfigure tzdata. Да, никогда не угадаешь что, в какой-либо оболочке Линукса, делается нетривиальным способом.
Плата имеет бутербродную структуру (sandwich style). Core board содержит SoC RockChip, RAM и накопитель Samsung, Realtek'овский Ethernet, а так же чип управления питанием и мониторинга от Active. Main board содержит всё остальное: контроллер HDMI выхода Lontium (всего два выхода), HDMI вход Toshiba, USB-SATA мост JMicron, чип Ampak для беспроводных интерфейсов. Соединяются две части через относительно стандартный слот MXM3.0 (мобильный модуль PCI Express). Плата имеет множество интерфейсов, а так же четыре основных блока пинов, всего 184 пина. Причём производитель не поскупился на мама-коннекторы, так наверняка безопаснее, учитывая что разведено даже несколько линий питания 12V.
Boot-mode и прошивка
Первое, что нужно делать с платами — это прошивать их. Для эпизодического взаимодействия с девелоперскими платами, IoT и всего такого, удобнее на компьютере иметь систему Linux. У меня это традиционно Linux Fedora 64bit, на то всемя 26й версии. Официальная инструкция по переводу платы в boot-режим и прошивке образа ОС:
Flash Image.
Так как
для работы утилиты заливки upgrade_tool от RockChip нужно установить зависимости. И не каждая версия дистрибутива Linux на хостовом ПК говорит какие именно.
Хочу поделиться своим алгоритмом действий для успешного перевода платы в boot и заливки образа ОС:
1. Включить плату.
2. Соединить плату с ПК (кабель micro USB - USB).
3. Далее нужно перевести плату в режим заливки прошивки:
- нажать и удерживать кнопку RECOVER
- кликнуть кнопку RESET
- через две секунды отпустить кнопку RECOVER
4. Затем - подготовить утилиту Linux Upgrade Tool (скачивается из раздела загрузок страницы продукта):
- [user@nb-linuxfedora data-arm]$ unzip Linux_Upgrade_Tool_v1.24.zip
- [user@nb-linuxfedora data-arm]$ cd Linux_Upgrade_Tool_v1.24/
- [user@nb-linuxfedora Linux_Upgrade_Tool_v1.24]$ sudo mv upgrade_tool /usr/local/bin/
- [user@nb-linuxfedora Linux_Upgrade_Tool_v1.24]$ sudo chown root:root /usr/local/bin/upgrade_tool
- [user@nb-linuxfedora Linux_Upgrade_Tool_v1.24]$ cd /usr/local/bin/
- [user@nb-linuxfedora bin]$
- необходимо удостоверится, что для файла upgrade_tool выставлен атрибут исполнения как программы
5. Использование Linux Upgrade Tool для заливки <update>.img в устройство (ссылки на скачивание образов находятся в том же разделе загрузок):
[user@nb-linuxfedora bin]# sudo upgrade_tool
- важный момент, утилита скорее всего сразу не запустится и, в более новой версии дистрибутива Fedora, даже не выдаёт ошибок. Но в Fedora 26 было ясно сказано каких библиотек не хватает. Итак, необходимо установить зависимости: libudev.so.1, libstdc++.so.6.
Консольные команды для их установки конечно зависят от дистрибутива Linux и используемого менеджера пакетов, но в Fedora это:
[user@linux]# dnf install libudev.so.1
installing:
libcap-2.25-5.fc26.i686.rpm
libgpg-error-1.25-2.fc26.i686.rpm
xz-libs-5.2.3-2.fc26.i686.rpm
systemd-libs-233-6.fc26.i686.rpm
libgcc-7.2.1-2.fc26.i686.rpm
libselinux-2.6-7.fc26.i686.rpm
lz4-libs-1.8.0-1.fc26.i686.rpm
libgcrypt-1.7.8-1.fc26.i686.rpm
libsepol-2.6-2.fc26.i686.rpm
pcre-8.41-1.fc26.i686.rpm
[user@linux]# dnf install libstdc++.so.6
installing:
libstdc++.i686 7.2.1-2.fc26
После чего наконец-то программа будет работать:
[user@nb-linuxfedora bin]# sudo upgrade_tool
вывод:
List of rockusb connected
DevNo=1 Vid=0x2207,Pid=0x320a,LocationID=302 Loader
Found 1 rockusb,Select input DevNo,Rescan press <R>,Quit press <Q>:1
Вводим "1" для подключения к первому присоединённому устройству. Далее используем команду uf.
Rockusb>uf Firefly-RK3288-Reload_DualBoot_201612101121.img
вывод:
Loading firmware...
Support Type:RK32 FW Ver:5.0.00 FW Time:2016-12-10 11:21:47
Loader ver:2.30 Loader Time:2016-10-13 10:04:54
(показывается прогресс...)
Upgrade firmware ok.
Rockusb>q
Использование
После успешной прошивки Firefly-RK3288 Reload отключаем USB-шнур. И можно подключить монитор, клавиатуру, мышь. И само собой установить компилятор g++. Ubuntu LXDE для Firefly имеет хороший, минимально-достаточный, набор ПО. Конечно же самое полезное в данной ситуации — терминал. Так же имеется простенький системный монитор, текстовый редактор Leafpad, экранная клавиатура, файловый менеджер, медиа проигрыватель, браузер Chromium и другое.
Пара скринов:
Терминал и Leafpad
Информация о версии
Конечно не могло обойтись без ложки дёгтя. Плата внутренне работает с разрешением изображения Full HD, и снимки экрана сохраняются в этом же разрешении. Но на HDMI-выход на монитор подаётся картинка в разрешении лишь HD ready. Поэтому изображение, конечно, получается недостаточно чётким. Но для экспериментов сгодится и такая картинка.
Пара фильмов в хорошем качестве — не проблема для RK3288, загрузка CPU где-то 50%.
Использование I2C-перифирии и GPIO-пинов
Пожалуй, одни из самых ценных возможностей таких плат — это подключение периферийных устройств по шине I2C, использования GPIO и прочих интерфейсов. Firefly RK3288 Reload имеет четыре шины I2C, даже пять, но нулевая шина используется для внутренних нужд платы, а четыре другие — с 1 по 4 разведены для использования пользователем.
В сети достаточно общей информации про использование интерфейса I2C. Для взаимодействия с I2C-устройствами через терминал рекомендую эту статью:
«I2C on Cubieboard with Lubuntu», там используют «кубик», но это не принципиально.
А для подключения к I2C-периферии программным способом, используя файловую виртуализацию шин I2C, можно порекомендовать эту:
«Interfacing with I2C Devices».
В качестве периферийного устройства I2C использовал датчик температуры Microchip — MCP9808. На сайте производителя легко найти хорошую спецификацию устройства. Это один из самых качественных и дорогих сенсоров на рынке, ощутимо быстрее и точнее, чем датчики серий LM от TI и от NXP.
Использовал этот датчик уже распаянный на мини плату CJMCU-9808. Также всё с Ebay — и сенсоры, и соединительные проводки Dupont — что бы обойтись без пайки. Подключение достаточно простое: VCC — к питанию 3.3V, GND — к земле, SCL и SDA собственно реализуют шину I2C (линии тактирования и данных соответственно), пины A0 A1 A2 задают часть 7-битного адреса I2C-устройства, ALERT можно в принципе не использовать, но тревожная линия всё-таки будет задействована далее. На фото датчик температуры подключен к шине I2C 1, все контакты адреса подтянуты к земле, что означает логический 0 в соответствующем бите адреса, если проводок адреса воткнуть в питание 3.3V, то этот бит будет логическая 1. Базовый адрес у микросхемы MCP9808 — b0011 и далее A2 A1 A0. Всего семь бит, в данном случае — b0011000, то есть в hex'е — 0x18.
Таким образом консольная утилита выдаст:
root@firefly:/home/firefly# i2cdetect -y -r 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- UU
10: -- -- -- -- -- -- -- -- 18 -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
Видно, что на I2C-шине номер 1 что-то есть с адресом 0x18.
Вызов:
root@firefly:/home/firefly# i2cget -y 1 0x18 0x05 w
выдаст, например: 0xbc01 (что означает температуру 27,75 C).
Параметры программы i2cget: 1 — номер шины; 0x18 — адрес, подключенного к шине устройства; 0x05 — адрес регистра (в данном случае температурного); w — указывает на то, что регистр хранит 2 байта.
Конечно более полноценно можно использовать MCP9808 из собственной программы на C++. Нужно учитывать, что содержимое температурного регистра — 0xbc01 — перевёрнуто, то есть его можно представить как 0x01bc. Первый байт 0x01 содержит три бита причины тревоги, один бит знака и четыре старших бита температуры. Второй байт 0xbc содержит младшие восемь бит температуры. Содержимое температурного регистра Microchip кодирует методом дополнительного кода (
two's complement format). Двенадцатый бит двухбайтового регистра кодирует знак. Если он равен 0, то температура положительная. Если одиннадцатый бит равен 1, то к подсчитываемой окружающей температуре нужно прибавить 2 в степени 7 градусов Цельсия — 2^7 (128 С), если — равен 0, то — ничего прибавлять не нужно. Аналогично, 1 в десятом бите прибавит 2^6 (64 C). И так далее, 1 в четвёртом бите прибавит 2^0 (1 C). 1 в третьем бите прибавит 2^-1 (0.5 C). 1 в последнем — нулевом бите прибавит 2^-4 (0.0625 C). Если же бит знака (12й) равен 1, то
в дом пришла беда температура отрицательная. И дешифровка регистра несколько усложняется. В соответствии с принципами two's complement format нужно сначала инвертировать биты. Затем нужно прибавить единицу в самый младший используемый бит, т.к. отрицательные значения кодируются не с 0, а с -1. При конфигурации термодатчика по умолчанию, используется максимальная точность — до 0.0625 C. В этом случае нужно прибавить единицу в последний бит, отвечающий за 0.0625 C. Т.е. можно просто прибавить 1 к значению температурного регистра. Если, например ради увеличения скорости, уменьшить точность измерения температуры, воспользовавшись регистром конфигурации. То при отрицательной температуре нужно будет прибавлять единицу к более старшему биту или прибавлять число, соответствующее этому биту. Затем необходимо перевести биты в значение температуры так же как и при положительном случае.
GPIO и линия ALARM
Можно воспользоваться линией ALARM сенсора. В том числе используя одну из GPIO линий Firefly. На фото конечно жесть и угар с архаичными светодиодом и сопротивлением, но тут важен сам принцип. Как пользоваться GPIO хорошо рассказано в другой статье на Хабре:
Linux: кнопки, светодиоды и GPIO. Но как в ней верно подмечено, сложно определить какой номер Gpio экспортировать для дальнейшего использования. Для того чтобы посмотреть какие линии Gpio заняты, а какие нет можно воспользоваться коммандой:
root@firefly:/home/firefly# cat /sys/kernel/debug/gpio > /home/firefly/_temp/temp
Команда
firefly@firefly:~$ dmesg
так же покажет информацию про Gpio.
Исследование показало, что можно экспортировать, например, контакт GPIO с номером 262. Который обозначен на плате и в спецификации как GPIO8 A6. Т.к. в этой плате, как и обычно, блоки GPIO содержат по 32 элемента. То можно предположить, что, возможно, волшебная формула такая: 32 * номер блока GPIO + число из постфикса. Так, как раз можем получить 32 * 8 + 6 = 262. Теперь можем при старте программы подавать на эту Gpio 262 линию питание 3.3V, а при выходе из неё — прекращать это делать.
В спецификации к MCP9808 указывается, что линия ALARM на нём — это open drain, т.е. открытый сток. Это означает, что когда тревога случается, эта линия замкнута на землю, а иначе — не замкнута. Так же подчёркивается необходимость использования резистора. На практике проверено, что это действительно необходимо, иначе, при прохождении тока, внутренности сенсора будут разогреваться до высоких температур. На фото показана следующая схема: GPIO последовательно подключен к LED, сопротивлению, open drain (ALARM) сенсора. Остаётся воспользоваться регистром конфигурации MCP9808 для того, чтобы задать допустимые температурные пределы. При выходе за которые будет случаться тревога. Можно задать два уровня слишком высокой температуры и один уровень слишком низкой. В целом для работы с этим цифровым датчиком конечно нужно внимательно читать спецификацию, переходить в режим конфигурирования, возвращаться в рабочий режим и прочее. Таким образом при выходе температуры за установленные рамки, ток будет проходить через контакт ALARM и зажигать светодиод.
В заключение
Хотелось бы упомянуть полезный приём управления свечением светодиодов, встроенных в платы для разработки. В руководствах для Cubieboard 6 показывается как включить светодиод LED1:
$echo default-on > /sys/class/leds/led1-GPIOB9/trigger
И как выключить LED1:
$echo none > /sys/class/leds/led1-GPIOB9/trigger
На базе этого было выяснено, как управлять светодиодами в Firefly 3288 Reload.
Включение жёлтого пользовательского LED (на самом деле синего LED):
root@firefly:/home/firefly# echo default-on > /sys/class/leds/firefly:yellow:user/trigger
Отключение этого LED:
root@firefly:/home/firefly# echo none > /sys/class/leds/firefly:yellow:user/trigger
Предосторожности
Разрабатывая для девелоперских плат важно проявлять осторожность. Кодинг, конечно, происходит на ПК, при большом желании и кросскомпиляция тоже. Затем исходники компилируются на конкретном таргете или на плату переносится уже готовый исполняемый файл. И если специализированные платы во многом и делаются для использования всевозможных интерфейсов. Да и стоят они как правило не очень дорого. То на самих дорогостоящих ПК пытаться использовать шины I2C, линии GPIO и тому подобное не рекомендуется. Это может привести к неприятным поломкам компьютера. По крайней мере консольные утилиты типа i2cget явно предупреждают об этом, приводя в пример некоторые модели пострадавших ноутбуков.
К сожалению, не доступен сервер mySQL