Использование платы Firefly-RK3288 Reload с SoC RockChip RK3288. Цифровой I2C термодатчик Microchip — MCP9808 +12


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 и другое.

Пара скринов:

image
Терминал и Leafpad
image
Информация о версии
Конечно не могло обойтись без ложки дёгтя. Плата внутренне работает с разрешением изображения Full HD, и снимки экрана сохраняются в этом же разрешении. Но на HDMI-выход на монитор подаётся картинка в разрешении лишь HD ready. Поэтому изображение, конечно, получается недостаточно чётким. Но для экспериментов сгодится и такая картинка.

image
Пара фильмов в хорошем качестве — не проблема для 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.

image

Использовал этот датчик уже распаянный на мини плату 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


image image

Можно воспользоваться линией 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