- PVSM.RU - https://www.pvsm.ru -

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

Firefly-RK3288 Reload

Подбирая девелоперскую плату для опытов, выбор пал на достаточно навороченную модель от китайского производителя T-Chip. Реализуют продукцию они под маркой Firefly. Специализируются на платах с системами на чипе от RockChip. RK3288 — самое производительное 32-битное решение от этой китайской компании. SoC от RockChip и Allwinner выгодно отличаются от чипов Broadcom в RaspberryPi не только лучшими характеристиками, но и технологией производства — 28nm против 40nm. Но конечно и стоят в данном случае китайцы дороже. Ещё более крутую 64-битную систему RK3399 не выбрал, в том числе потому, что есть основания полагать, что она уже существенно горячее. В то время как RK3288 под нагрузкой не сильно греется, даже без использования каких-либо радиаторов.

Страница продукта [1]. Основные аппаратные параметры девайса: 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 [2]. Другая полезная информация — как установить время: используя dpkg-reconfigure tzdata [3]. Да, никогда не угадаешь что, в какой-либо оболочке Линукса, делается нетривиальным способом.

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

Плата имеет бутербродную структуру (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 [4].

Так как для работы утилиты заливки 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» [5], там используют «кубик», но это не принципиально.

А для подключения к I2C-периферии программным способом, используя файловую виртуализацию шин I2C, можно порекомендовать эту: «Interfacing with I2C Devices» [6].
В качестве периферийного устройства 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 [7]). Двенадцатый бит двухбайтового регистра кодирует знак. Если он равен 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 [8]. Но как в ней верно подмечено, сложно определить какой номер 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 явно предупреждают об этом, приводя в пример некоторые модели пострадавших ноутбуков.

Автор: habracom

Источник [9]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/umny-j-dom/282331

Ссылки в тексте:

[1] Страница продукта: http://en.t-firefly.com/product/rk3288

[2] Lxde wiki: https://wiki.lxde.org/en/How_to_take_screenshots

[3] используя dpkg-reconfigure tzdata: https://forum.lxde.org/viewtopic.php?t=34331

[4] Flash Image: http://en.t-firefly.com/index.php/doc/product/info/231.html

[5] «I2C on Cubieboard with Lubuntu»: http://homecircuits.eu/blog/i2c-on-cubieboard-with-lubuntu

[6] «Interfacing with I2C Devices»: https://elinux.org/Interfacing_with_I2C_Devices

[7] two's complement format: https://stackoverflow.com/questions/1049722/what-is-2s-complement/1049774

[8] Linux: кнопки, светодиоды и GPIO: https://habr.com/post/236251/

[9] Источник: https://habr.com/post/412763/?utm_campaign=412763