О том, как я заставлял работать Orange Pi

Материал из FadeDEAD.ORG
Перейти к: навигация, поиск
1

Orange Pi и умный дом

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

Преобразователь между UART TTL и RS485

Одним из основных звеньев по моим планам должна была стать Orange Pi PC, которой была уготована скромная роль “прослойки” между шиной (или даже шинами) RS485 и сетью Ethernet, впрочем прослойки достаточно разумной. Почему я решил городить RS485 во времена, когда провода — это уже не модно, тема отдельного рассуждения. Точнее, никакого рассуждения и небыло, просто я так захотел. Собственно из описанной потребности, моя Orange Pi должна была иметь в функционирующем состоянии хотя-бы один из своих трёх портов UART, к которому будет аккуратно прицеплен вот такой симпатичный конвертер UART TTL to RS485, добытый оптом на Aliexpress. Хорошая это штука, однако — Aliexpress.

Но не всё бывает так просто в этой жизни. Проблемы начались на стадии функционирования самой Orange Pi.

Мертвец или симулирует?

Вставив в Orange Pi только что записанную карту со свежим Armbian с mainline ядром, подсоединив USB-UART конвертер на скорости 115200 к отладочному порту UART, и подав стабильные 5 вольт на соответствующие пины, я был несколько озадачен, когда увидел в консоле это:

spl: mmc init failed with error: -123
SPL: failed to boot from all boot devices
### ERROR ### Please RESET the board ###

Сначала я подумал, что проблема в образе с Armbian, но записав штуки 3 разных образа на бедную карту памяти, и поняв, что проблема от этого не исчезает, я понял, что тут не все так просто. При запуске других образов результаты в консоль выдавались более развёрнутые, но суть была примерно такая-же, загрузка повисала на стадии обращения к mmcblk. Затем, исходя из некоторых советов[1], я попробовал поменять карту памяти — результат был такой-же. Я начал понимать, что что-то здесь не так, поскольку предыдущие 6 Orange Pi, которые я оживлял в рамках Кубка CTF 2017 были куда менее прихотливы к картам и образам, и запускались без проблем.

FEL и Windows 10

В общем поковыряв гугол на предмет информации, я наткнулся на упоминания о том, что в Orange Pi имеется собственная флеш-память, в которой содержится загрузчик, и в которую можно прошивать все что вздумается[2]. До меня на этом месте аж наконец-то дошло, зачем на плате припаян micro-USB, через который даже запитать плату нельзя. Прямой связью между моей проблемой и загрузчиком, правда, небыло, но поскльку проблема была очевидно где-то внутри платы, а не в моих действиях — я свято поверил, что должен прямо срочно здесь и сейчас прошить в плату какой-нибудь другой загрузчик, и что от этого сразу станет хорошо. Или по крайней мере, не станет хуже.

Но ведь у меня не Linux! И под рукой конечно-же нет никакой железки с Linux. Просто потому, что у меня их никогда нет, Ubuntu только в виртуальной машине. Хотя, зачем сразу Linux-то?! Беглый поиск драйверов под FEL для Windows 10 показал, что таковые сделать можно, правда несколько нетривиальным способом. А именно, вот так[3]:

Драйвер FEL в Windows 10.png

То есть, если кратко, то алгоритм перевода железки в FEL режим на Windows 10 таковой:

  1. Вытаскиваем из платы карту памяти
  2. Подключаем плату по micro-USB к компу с Windows 10
  3. Подаём на плату стабильные 5 вольт
  4. Руками выбираем для появившегося Unknown device драйвер WinUsb. Который, внезапно, уже в винде есть.
  5. PROFIT

Всё, железка готова к перепрошивке. Осталось воспользоваться сборкой утилиты sunxi-fel под Windows, выполнив предельно примитивную команду:

sunxi-fel u-boot-sunxi-with-spl-last.bin

Файл u-boot-sunxi-with-spl-last.bin можно взять прямо отсюда[2], ну или где-нибудь нагуглить. Собственно, после того, как команда выше чудесным образом выполнилась, Orange Pi оживлённо замигала светодиодами под Ethernet портом, и… ЗАГРУЗИЛАСЬ. Причем, прямо с того непотреба, который был на карте в данный момент. Впрочем, ровно также охотно она стала загружаться и с образа Armbian, упомянутого в начале. Я был почти счастлив. Правда, мои мучения на этом так просто не закончились. Ведь мне еще предстояло разобраться с UART, который по умолчанию в системе, судя по всему, не работал. Точнее, не работало ни одно устройство /dev/ttyS* кроме отладочного. Хотя эта проблема решалась куда проще.

Вкратце о включении UART

Чтобы не быть сильно многословным, просто напишу, как на Orange Pi по быстрому включить UART. Для своего случая — когда для описания конфигурации портов используется DeviceTree (а может использоваться script.bin, в случае если в вашем образе legacy ядро)[4]. Идём для начала в /boot/dtb, и декомпилируем текущую конфигурацию DeviceTree:

dtc -I dtb -O dts -o sun8i-h3-orangepi-pc.dts ./sun8i-h3-orangepi-pc.dtb

Этот пример валиден, если у вас Orange Pi PC на Allwinner H3[5], в противном случае вам тут надо вписать .dtb файл для своего устройства. На выходе получиться редактируемый текстовый файл sun8i-h3-orangepi-pc.dts, который сразу-же можно начинать редактировать. Для начала давайте посмотрим вот сюда:

                uart0 = "/soc/serial@01c28000";
                uart1 = "/soc/serial@01c28400";
                uart2 = "/soc/serial@01c28800";
                uart3 = "/soc/serial@01c28c00";

А затем, чтобы стало всё понятно, сразу посмотрим сюда:

                serial@01c28400 {
                        compatible = "snps,dw-apb-uart";
                        reg = <0x1c28400 0x400>;
                        interrupts = <0x0 0x1 0x4>;
                        reg-shift = <0x2>;
                        reg-io-width = <0x4>;
                        clocks = <0x6 0x3f>;
                        resets = <0x6 0x32>;
                        dmas = <0x1e 0x7 0x1e 0x7>;
                        dma-names = "rx", "tx";
                        status = "disabled";
                        pinctrl-names = "default";
                        pinctrl-0 = <0x23>;
                        linux,phandle = <0x67>;
                        phandle = <0x67>;
                };

Так вот. Чтобы включить uart1 на нашем устройстве, нужно status = "disabled"; поменять на status = "okay";. Ну, и скомпилировать исходный файл обратно, предварительно сделав бекап оригинального.

mv sun8i-h3-orangepi-pc.dtb sun8i-h3-orangepi-pc.dtb.bak
dtc -I dts -O dtb -o ./sun8i-h3-orangepi-pc.dtb ./sun8i-h3-orangepi-pc.dts

После перезагрузки попробуем инициализировать наш новый порт UART, и отправить в него что-нибудь. Например, слово privet.

stty -F /dev/ttyS1 115200
echo privet > /dev/ttyS1

Если перед этим вы подключите к портам UART1 какой-нибудь терминал на скорости 115200, то мы увидим что-то вроде этого

Пример работающего UART

На этом всё! Теперь вы знаете, что можно попробовать сделать для реанимации Orange Pi, и как после этого активировать на ней UART. Чуть позже я расскажу подробнее про свой будущий умный дом, и процесс его создания.

К созданию умного дома готовы!


Добавить свой комментарий
На сайте FadeDEAD.ORG приветствуются все комментарии. Если вы не хотите быть анонимным, зарегистрируйтесь или представьтесь. Это бесплатно.