Данный сайт является зеркалом сайта www.count-zero.ru

LinkIt 7688 Smart Duo: одноплатный микрокомпюьтер на OpenWRT содержащий микроконтроллер ATmega32U4

разделы: Интернет вещей , дата: 22 декабря 2018г.

Я уже пару статей подряд вскользь упоминаю OpenWRT, и возможно кого-то заинтересовало, что это за система. OpenWRT - это набор прошивок для самых разных устройств, но в основном для роутеров. Базируется на BusyBox и ядре Linux. Где-то с версии 17.01 прошивки стали именоваться LEDE, т.к. произошло слияние проектов OpenWRT и LEDE.

К сожалению, чтобы в первый раз поставить на какое-либо фирменное устройство прошивку OpenWRT, скорее всего вам придётся изрядно "поплясать с бубном" (сужу по собственному опыту). В худшем случае вы получите "кирпич" вместо вашего роутера. Это не означает, что устройство после этого нельзя оживить, но не у всех хватит квалификации выпаять флешку в корпусе TSOP-48, что бы перепрошить ее и заново запаять. Поэтому, если вам нужна система с OpenWRT, я не советую перепрошивать роутеры, т.к. если вы умеете это делать, то мои советы будут вам ни к чему, а если нет, то они будут только во вред.

Замечу, что согласно предупреждению 4/32 устройства с размером флеш-памяти 4МБ и менее, и размером ОЗУ 32МБ или менее, считаются устройствами с ограниченной поддержкой. Оптимальный размер ОЗУ для OpenWRT/LEDE сейчас равняется 128МБ, а приемлемый размер 64МБ. Т.е. вы хотите использовать роутер для перепрошивки под OpenWRT то он должен быть не какой-нибудь, а довольно приличный.

На самом деле существуют специальные платы для разработки под OpenWRT, где не надо совершать никаких телодвижений с бубном, и об одной из них я хочу рассказать, а именно о LinkIt™ Smart 7688 Duo. В качестве альтернативы вы также можете рассмотреть платы: Arduino Yun и Omega 2 plus.

Платы LinkIt™ Smart 7688 и LinkIt™ Smart 7688 Duo были выпущены три года назад и являются совместным проектом тайваньской компании MediaTek и китайской SeeedStudio. Проект был нацелен на быстрорастущий рынок интернет-вещей и призван упростить жизнь тех людей, что делают свои проекты из разномастных роутеров под управлением OpenWRT. В данный момент проект находится в несколько заброшенном состоянии, но платы все еще продаются в SeeedStudio (летом они были доступны только по предзаказу), а сайте MediaTek все еще доступна документация по работе платами.

Пятого мая 2011 года, компания Mediatek купила(поглотила) Realtek. И многие чипы достались Mediatek "в наследство" от Realtek. Поэтому в логах часто будет встречаться оригинальное наименование. К примеру, ветка с прошивками OpenWRT для MT7688 называется ramips.

Основой платы LinkIt™ Smart 7688 является "роутерный" чип MT7688 с архитектурой MIPS24KEc, частотой 580MHz и объёмом оперативной памяти 128MB. В довесок, LinkIt™ Smart 7688 содержит разъём microUSB 2.0 и разъём для microSD карт. Из серьёзных минусов я бы назвал отсутствие аппаратной поддержки чисел с плавающей запятой (FPU).

Концепция платы LinkIt™ Smart 7688 Duo состоит в том, что она может являться связующей платформой для разработчиков разных направлений: 1) Для разработчиков OpenWRT которые самостоятельно собирают свои сборки OpenWRT и предпочитают программировать на языках C/C++; 2) для веб-разработчиков которые предпочитают писать свои веб-приложения с использованием Python или/и Node.js®; 3) Для Arduino разработчиков которые могут писать программы в комфортной для себя среде, опираясь при этом на мощь 580МНz компьютера.

Фирменная прошивка базируется на OpenWRT 15.05 Сhaos Сalmer. Она дополнена пакетами Python 2.7.9 и NodeJS 0.12.7. Всего прошивка "весит" где-то 20МБ. Технически, вы можете обновить прошивку до последней стоковой LEDE 18.06, но там не будет NodeJS, а Python придётся устанавливать через пакетный менеджер opkg.

Я пока предлагаю не трогать фирменную прошивку, а сосредоточиться на прикладных задачах. В данной статье я постарался рассказать о основах работы с платой Linkit Smart 7688, о сложностях и путях их преодоления.

Содержание:

  1. Характеристики LinkIt™ Smart 7688 Duo
  2. Вопрос цены. Сравнение LinkIt™ Smart 7688 Duo c аналогами
  3. Подключение и обновление прошивки LinkIt™ Smart 7688 Duo. Способ первый, стандартный, но долгий
  4. Подключение к LinkIt™ Smart 7688 Duo через последовательный порт
  5. Консоль восстановления Failsafe
  6. Баг при подключении по последовательному порту
  7. Первоначальная настройка LinkIt™ Smart 7688 Duo. Способ второй, быстрый
  8. Подключение Ethernet порта
  9. Перенос файловой системы на карту MicroSD
  10. Безопасность: создание непривилегированного пользователя и защита паролем входа через последовательный интерфейс

1) Характеристики LinkIt 7688 Smart Duo

Распиновка платы LinkIt™ Smart 7688 Duo:

Как видно, на плате почти все пины MT7688 обрезаны, оставлены только: UART, USB и Ethernet порты. Остальные пины отведены под ATmega32U4. Связь MT7688 с ATmega32U4 предполагается осуществлять через UART порты друг-друга. Для этого предполагается использовать библиотеки Firmata или Bridge.

ATmega32U4 работает на частоте 8MHz, логический уровень 3.3 Вольт.

    Основные характерности LinkIt™ Smart 7688 Duo:
  • 580 MHz MIPS CPU;
  • Single input single output(1T1R) Wi-Fi 802.11 b/g/n (2.4G);
  • Pin-out for GPIO, I2C, SPI, SPIS, UART, PWM and Ethernet Port;
  • 32MB Flash and 128MB DDR2 RAM;
  • USB host;
  • Micro SD slot;
  • Support for Arduino (ATmega32U4).

Как я уже говорил, к сожалению, процессор лишён блока операций с числами с плавающей запятой.

Таблица с детальными характеристиками LinkIt™ Smart 7688 Duo (взята с сайта SeeedStudio):

Specifications Category Feature Specification
MPU Chipset MT7688AN
Core MIPS24KEc
Clock speed 580MHz
Working voltage 3.3V
MCU Chipset ATmega32U4
Core Atmel AVR
Clock speed 8MHz
Working voltage 3.3V
PCB Size Dimensions 60.8 x 26 mm
Memory Flash 32MB
RAM 128MB DDR2
Power Source USB Power 5V (USB micro-B)
VCC 3.3V (Pin Breakout)
GPIO Pin Count 3 (MT7688AN)
24 (ATmega32U4)
Voltage 3.3v
PWM Pin Count 8 (ATmega32U4)
Voltage 3.3v
Max. Resolution 16 bits (customizable)
Maximum Frequency@Resolution 31.25kHz@8-bit, Timer 0 (4 sets)
2MHz@2-bit,122Hz@16-bit, Timer 1 & 3 (4 sets)
187.5kHz@8-bit, 46.875kHz@10-bit, Timer 4 (6 sets)
ADC Pin Count 12 (ATmega32U4)
Voltage 3.3v
External Interrupts Pin Count 8 (ATmega32U4)
SPI/SPIS Set count 1 (ATmega32U4)
Pin numbers S0, S1, S2, S3
Max. Speed 4 MHz
I2C Set count 1
Pin numbers D2, D3
Speed 400K
UART Lite Set count 1 (ATmega32U4)
1 (MT7688AN)
Pin numbers P8, P9 (MT7688AN)
D0, D1 (ATmega32U4)
Max. Speed 0.5 Mbps (MT7688AN)
0.5 Mbps (ATmega32U4)
USB Host Set count 1 (MT7688AN)
Pin numbers P6, P7
Connector type Micro-AB
Communication Wi-Fi 1T1R 802.11 b/g/n (2.4G)
Ethernet 1-port 10/100 FE PHY
Pin numbers P2, P3, P4, P5
User Storage SD Card Micro SD SDXC

Фотографии платы. Сравнение с ESP32 NodeMCU, вид сверху:

LinkIt™ Smart 7688 Duo, вид снизу:

Здесь сбоку имеется EJTAG разъём. Чтобы его активировать, нужно перепаивать перемычку рядом с логотипом "Open Hardware".

2) Вопрос цены. Сравнение LinkIt™ Smart 7688 Duo c аналогами

По правде говоря, плата досталась мне за полцены. Летом мне удалось выиграть купон на 10$ за прохождение опроса в честь годовщины(anniversary) SeeedStudo. Кроме этого, в августе у них была акция с доставкой в 5$ при заказах менее 100$. Т.о. плата LinkIt™ Smart 7688 Duo мне стоила всего 12.9$:

Я рассказываю это не для того чтобы похвастаться, а чтобы рассказать что на акциях там действительно можно чего-то перехватить, в отличии от того же али.

Если же искать альтернативы плате LinkIt™ Smart 7688 Duo, то первым делом на ум приходит Arduino Yun:

Arduino Yun появился несколько раньше LinkIt™ Smart 7688 Duo, и я не открою большого секрета сказав, что именно Arduino Yun послужил прообразом для LinkIt Smart 7688 Duo.

Также как в Linkit Duo, здесь имеется чип ATmega32U4, а вот характеристики процессорного модуля несколько устаревшие: процессор Atheros AR9331 с частотой 400MHz, 64 Мбайт ОЗУ, 16 Мбайт флеш-памяти. Имеется разъём для карт MicroSD. Возможно кому-то придётся по вкусу Ethernet разъём имеющийся на борту, или возможно кому-то придётся кстати форм-фактор типа "Arduino". На борту Arduino Yun имеется семь светодиодов для индикации различных аппаратных процессов: индикации питания, работы UART, USB, Wifi, а также отладочный светодиод на D13. Плата продаётся за 5990 руб в "Амперке".

На ebay можно встретить различные клоны Arduino Yun, например такого вида:

Здесь отсутствует разъём MicroSD и чип ATmega32U4. Плата позиционируется как процессорный модуль. Торгуется на уровне 1770 руб, включая доставку.

На али мое внимание привлекла такая плата:

Здесь нет никаких разъёмов кроме штыревого. Чип MT7688, память 64, флеш 16. Цена около 620р. Дёшево и сердито.

Плата Omega 2+ в каком-то роде может считаться конкурентом Linkit:

Здесь имеется разъём для MicroCD карт, чип MT7688, флеш 32Мбайта, ОЗУ 128 Мбайт. Имеется сайт с документацией продаётся за 1510 руб в ЧиД.

Далее в обзоре два процессорных модуля, которые предназначены для для впаивания в платы. Первый модуль - HLK7688A:

Здесь имеется: чип MT7688, память 128, флеш 32. Модуль торгуется на али примерно за 630 руб, включая доставку.

Еще один любопытный модуль - VoCore2, который как преподносится как самый маленький компьютер в мире:

Здесь используется совместимый чип MT7628AN, память на 128МБ, флешка NOR типа на 16МБ. Приобрести можно через краудфандинговую платформу Indiegogo за 100$.

3) Подключение и обновление прошивки LinkIt™ Smart 7688 Duo. Способ первый, стандартный, но долгий

LinkIt™ Smart 7688 Duo имеет два разъёма microUSB: PWR/MCU через которое подаётся питание на плату и которое служит интерфейсным USB портом для ATmega32U4, и USB HOST - это интерфейсный порт чипа MT7688. Для подключения питания на плату, нужно подсоединить кабель microUSB компьютера к разъёму PWR/MCU, как показано на фото:

После включения питания должен загореться зелёный светодиод. Последовательность мигания оранжевого светодиода (он носит название WiFi LED) показана на следующей картинке:

Через секунду после включения он ненадолго мигнёт, после чего погаснет на 4-5 секунд. После этого начинается загрузка Linux которая займёт около 30 секунд, в это время, оранжевый светодиод будет непрерывно гореть. При первом включении, Linkit загрузится в режим открытой точки доступа. При отсутствии подключений к ней, WiFi LED будет находится в погашенном состоянии. Подключать внешнюю антенну для работы с Linkit не обязательно. Плата оснащена своей pcb-антенной.

Внимание! При недостаточном качестве источника питания, Linkit может вести себя следующим образом: а) когда горит только только зелёный светодиод и больше ничего не происходит; б) когда Linkit постоянно перезагружается. Linkit нужно подключать к зарядному устройству, либо непосредственно к USB порту компьютера. Не следует подключать плату через удлинители или USB хабы.

При подключении LinkIt™ Smart 7688 Duo к компьютеру, в логе ядра Linux появятся следующие строки:

usb 3-1: new full-speed USB device number 3 using ohci-pci
usb 3-1: New USB device found, idVendor=0e8d, idProduct=ab01
usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 3-1: Product: LinkIt Smart 7688
usb 3-1: Manufacturer: MediaTek Labs
cdc_acm 3-1:1.0: ttyACM0: USB ACM device
input: MediaTek Labs LinkIt Smart 7688 as /devices/pci0000:00/0000:00:12.0/usb3/3-1/3-1:1.2/0003:0E8D:AB01.003E/input/input75
hid-generic 0003:0E8D:AB01.003E: input,hidraw4: USB HID v1.01 Mouse [MediaTek Labs LinkIt Smart 7688] on usb-0000:00:12.0-1/input2

Для Windows потребуется установить драйвер по этому руководству Install the LinkIt Smart 7688 Duo COM port driver

После перехода Linkit в режим точки доступа, она должна отобразиться с идентификатором начинающимся с "Linkit_Smart_7688":

$ nmcli device wifi list
*  SSID                      РЕЖИМ           КАНАЛ  СКОРОСТЬ  СИГНАЛ  СТОЛБЦЫ  ЗАЩИТА    
   LinkIt_Smart_7688_27A89B  Инфраструктура  9      54 МБ/с   100     ▂▄▆█               
   Alien                     Инфраструктура  11     54 МБ/с   100     ▂▄▆█     WPA2      
   Brute                     Инфраструктура  11     54 МБ/с   69      ▂▄▆_     WPA1 WPA2 
   WiFi-DOM.ru-1784          Инфраструктура  2      54 МБ/с   45      ▂▄__     WPA1 WPA2 
   Super S                   Инфраструктура  6      54 МБ/с   42      ▂▄__     WPA1 WPA2 

Подключаемся с нашей точке доступа:

$ nmcli device wifi connect LinkIt_Smart_7688_27A89B
Device 'wlan0' successfully activated with 'f554ff14-9856-491b-bcde-696b66eb8cbf'

После подключения к LinkIt™ Smart 7688 Duo, оранжевый светодиод начнёт мигать в следующем режиме: три коротких вспышки, после чего одна длинная пауза".

Посмотрим на параметры соединения:

$ sudo /sbin/ifconfig 
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.100.142  netmask 255.255.255.0  broadcast 192.168.100.255
        ether f0:7d:68:6d:53:4e  txqueuelen 1000  (Ethernet)
        RX packets 798  bytes 759741 (741.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 677  bytes 75729 (73.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Ищем доступные хосты:

$ nmap -sP 192.168.100.0/24

Starting Nmap 7.12 ( https://nmap.org ) at 2018-11-24 05:59 SAMT
Nmap scan report for mylinkit.lan (192.168.100.1)
Host is up (0.0037s latency).
Nmap scan report for darkstar.lan (192.168.100.142)
Host is up (0.00024s latency).
Nmap done: 256 IP addresses (2 hosts up) scanned in 3.11 seconds

Хост mylinkit - это вероятно то, что нам нужно. Проверяем:

$ ping -c 5 mylinkit
PING mylinkit.lan (192.168.100.1) 56(84) bytes of data.
64 bytes from mylinkit.lan (192.168.100.1): icmp_seq=1 ttl=64 time=2.39 ms
64 bytes from mylinkit.lan (192.168.100.1): icmp_seq=2 ttl=64 time=3.18 ms
64 bytes from mylinkit.lan (192.168.100.1): icmp_seq=3 ttl=64 time=3.49 ms
64 bytes from mylinkit.lan (192.168.100.1): icmp_seq=4 ttl=64 time=3.84 ms
64 bytes from mylinkit.lan (192.168.100.1): icmp_seq=5 ttl=64 time=3.85 ms

--- mylinkit.lan ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 2.391/3.354/3.851/0.544 ms

Теперь в браузере вводим "http://mylinkit" и попадаем на страницу аутентификации:

Здесь нас просят придумать пароль. После ввода пароля и прохождения аутентификации, попадаем на страницу главных настроек.

Текущая версия прошивки 0.9.2, в то время как на сайте MediaTek доступна версия 0.9.4:

После скачивания и распаковки архива, жмём жёлтую кнопку "UPGRADE FIRMWARE", и указываем файл с распакованной прошивкой. После чего щёлкаем по кнопке "UPGRADE & RESTART":

Прошивка загрузится довольно быстро после чего выдаст такое сообщение:

Здесь говорится, что в процессе прошивки оранжевый светодиод будет быстро мигать (без пауз) около трех минут. После этого Linkit перезагрузится и светодиод будет непрерывно гореть около 30 секунд.

После того как будет нажато OK, начнётся перепрошивка. Во время последующей перезагрузки соединение с точкой доступа будет сброшено. Переподключившись (в случае если у вас не автоматический реконект) к Linkit, видим, что текущая версия прошивки обновилась до 0.9.4:

После этого щёлкаем по вкладке "NETWORK", и переводим Linkit в режим клиента:

Указываем свою точку доступа и пароль к ней. После чего перезагружаем Linkit.

После переподключения, заходим на Linkit как на обычный локальный сервер. После аутентификации мы можем перейти к настройкам OpenWRT:

На плате linkit имеется три кнопки: MPU, WIFI и MCU. Если в процессе настройки что-то пошло не так, например вы неправильно указали пароль к точке доступа, то вы всегда сможете сбросить настройки путём удерживания кнопки "WIFI" около 5 секунд. После этого нажмите кнопку "MCU", и Linkit перезагрузится снова в режим точки доступа.

4) Подключение к LinkIt™ Smart 7688 Duo через последовательный порт

Также как и в стандартной сборке OpenWRT, с LinkIt™ Smart 7688 Duo можно работать через ssh. Но иногда бывает, что что-то идёт не так, и после перепрошивки или каких-то изменений, система перестаёт загружаться, из сети её соответственно тоже не видно. Первое за что следует браться в такой ситуации - это USB-UART конвертер с (обязательно!) 3.3 вольтовой логикой.

На сайте Seeedstudio имеется руководство по подключению USB-UART конвертера к Linkit:

Подключаем адаптер согласно этой инструкции, открываем терминал, выставляем скорость 57600 и окончание строки NL. После этого перезагружаем LinkIt™ Smart 7688 Duo, и в окне терминальной программы видим лог загрузки:

Из интересного, в логе имеется: 1) меню загрузчика U-Boot; 2) возможность попасть в консоль восстановления OpenWRT Failsafe.

Вводим Enter, и попадаем в консоль:

Но лучше, конечно, будет использовать не терминал Arduino IDE, а программу screen если речь о Linux или GYGWIN. Открываем порт:

$ screen /dev/ttyUSB0 57600

Опять нажимаем Enter и попадаем в консоль:

Как я упоминал, в начале загрузки, сначала появляется меню загрузчика U-Boot, который выглядит так:

U-Boot 1.1.3 (Dec  6 2016 - 11:20:23)

Board: Ralink APSoC

DRAM:  128 MB
relocate_code Pointer at: 87f68000
******************************
Software System Reset Occurred
******************************
flash manufacture id: c2, device id 20 19
find flash: MX25L25635E
============================================
Ralink UBoot Version: 4.3.0.0
--------------------------------------------
ASIC 7628_MP (Port5<->None)
DRAM component: 1024 Mbits DDR, width 16
DRAM bus: 16 bit
Total memory: 128 MBytes
Flash component: SPI Flash
Date:Dec  6 2016  Time:11:20:23
============================================

icache: sets:512, ways:4, linesz:32 ,total:65536
dcache: sets:256, ways:4, linesz:32 ,total:32768

 ##### The CPU freq = 580 MHZ ####
 estimate memory size =128 Mbytes
RESET MT7628 PHY!!!!!!

GPIOMODE --> 50054404

GPIOMODE2 --> 5540551

Please choose the operation:

   1: Load system code to SDRAM via TFTP.
   2: Load system code then write to Flash via TFTP.
   3: Boot system code via Flash (default).
   4: Entr boot command line interface.
   7: Load Boot Loader code then write to Flash via Serial.
   9: Load Boot Loader code then write to Flash via TFTP. 0

Меню предоставляет возможность загрузить прошивку через TFTP, для чего потребуется прикручивать к плате LAN порт. Также через загрузчик можно обновить сам загрузчик через TFTP или последовательный порт. U-Boot ждёт две секунды, после чего загружает ядро Linux.

5) Консоль восстановления Failsafe

Используя подключение по последовательному порту, при загрузке системы, имеется возможность попасть в консоль восстановления. Для этого нужно дождаться, пока в логе загрузки не появятся следующие строки:

Press the [f] key and hit [enter] to enter failsafe mode

После чего последовательно нажать "f" и "enter".

Суть работы в консоли восстановления заключает в "откате" на первоначальные установки, что осуществляется стиранием overlay раздела куда сохраняются все изменения.

Для примера, предположим, что LinkIt™ Smart 7688 Duo перестал загружаться. Вначале все идёт нормально, оранжевый светодиод один раз мигает, потом идёт пауза на 4-5 секунд, но затем светодиод включается и не выключается. Плата зависла.

Для восстановления, подключим USB-UART адаптер к Linkit с перезагрузим плату. После дождёмся пока не появится надпись: "Press the [f] key and hit [enter] to enter failsafe mode", и здесь нажмём клавиши: "f" и Enter.

Сброс может быть мягким или жёстким. Согласно документации, мягкий сброс выполняется командой:

umount /overlay && firstboot && reboot

Жёсткий сброс производится командой:

umount /overlay && jffs2reset && reboot

В моём случае не работает ни первый не второй вариант. Начнём с того, что структура томов выглядит так:

# mount
rootfs on / type rootfs (rw)
/dev/root on / type squashfs (ro,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,noatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,noatime)
tmpfs on /dev type tmpfs (rw,nosuid,noatime,size=512k,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,noatime,mode=600)
tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noatime)

Как видно, раздел overlay не подключён и следовательно команду: "umount /overlay" можно пропустить.

По команде jffs2reset попросту выводит сообщение без какого-либо видимого эффекта:

root@(none):/# jffs2reset
[ 1583.820000] jffs2reset: This will erase all settings and remove any installed packages. Are you sure? [N/y]
root@(none):/# 

Решение было найдено здесь: OpenWrt Failsafe Mode and Flash Recovery - VillageTelco.

root@(none):/# mtd -r erase rootfs_data
Unlocking rootfs_data ...
Erasing rootfs_data ...
Rebooting ...
reboot

Команда выполняется примерно секунд 40, после чего автоматически происходит перезагрузка. Система возвращается к первоначальной конфигурации OpenWRT.

Иногда бывает необходимость всего лишь поправить несколько файлов на overlay разделе, посмотреть логи и т.д. Тогда подключаемся через USB-UART преобразователь, перезагружаем Linkit, дожидаемся строки:

Press the [f] key and hit [enter] to enter failsafe mode

далее жмем "f" и "enter". Попадаем в консоль восстановления:

Флешка на 32МБ подключена к ядру Linux через MTD подсистему:

root@(none):/# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00030000 00010000 "u-boot"
mtd1: 00010000 00010000 "u-boot-env"
mtd2: 00010000 00010000 "factory"
mtd3: 01fb0000 00010000 "firmware"
mtd4: 001238e3 00010000 "kernel"
mtd5: 01e8c71d 00010000 "rootfs"
mtd6: 00aa0000 00010000 "rootfs_data"

Здесь в mtd0 записан загрузчик U-Boot, в mtd5 находится прошивка в сжатом Squashfs формате, в разделе mtd6 находится overlay-раздел в формате jffs2. Его можно примонтировать обычным образом:

# mount -t jffs2 /dev/mtdblock6 /mnt

После этого можно создавать и редактировать файлы на overlay разделе.

6) Баг при подключении по последовательному порту

Хочу обратить внимание на довольно неприятный баг, с которым можно столкнуться при частом использовании подключения через последовательный порт. Я еще не совсем разобрался с ним, но почти уверен, что он возникает только при подключении через последовательный интерфейс. При этом я на 100% уверен, что это не аппаратный баг.

Баг проявляется в виде создании лишних файлов в корневой директории, система зависает и отказывается загружаться, соответственно сеть не работает на устройство можно попасть только через консоль восстановления. Баг проявляется не только у меня, поиском в google нашлась тема с описанием подобной проблемы: Serial console can not be activated. Самый простой способ восстановления работоспособности LInkit - возврат к настройкам по умолчанию, с форматированием overlay раздела. Однако это ведёт к потери данных.

Из-за чего возникает баг? Я еще не знаю точно, но подозреваю из-за того, что через последовательный порт в рутовую консоль можно попасть одним нажатием клавиши "Enter". Т.е. достаточно чтобы последовательный порт "поймал" байт 0х0D, чтобы весь последующий поток ушёл на исполнение от рута. У меня так однажды текстовый файл ушел на выполнение.

В данном случае лечение на мой взгляд очевидно - это поставить пароль на вход через последовательный порт. В руководстве OpenWrt Project: Serial console password для этого рекомендуют в файле /etc/inittab, строку:

::askconsole:/bin/ash --login
заменить на:
::askconsole:/bin/login

Утилиты login в прошивке Linkit нет, для ее добавления придётся перекомпилировать BusyBox. Есть скрипт login.sh, но он все равно не заменяет login. Поэтому в любом случае, при указании login или login.sh - это приведёт к блокировке входа через последовательный порт. Что собственно и требовалось. У меня лично файловая система расположена на microSD карте, что позволяет иметь две конфигурации. Основная конфигурация располагается на карточке, и там вход через последовательный порт заблокирован. Если мне нужно попасть в систему через последовательный порт, например для того чтобы поменять пароль к WiFi, то я загружаюсь без карточки (её при необходимости можно вставить в слот и примонтировать в процессе работы).

Также не лишним будет добавить в систему непривилегированного пользователя, а для администрирования пользоваться командой sudo. После осуществления указанных мер предосторожности, обозначенный баг у меня не проявлялся.

По большому счету, для нормально сконфигурированной системе достаточно SSH доступа. Доступ по последовательному порту нужен только на первоначальном этапе конфигурации системы, когда сеть ещё не работает.

7) Первоначальная настройка LinkIt™ Smart 7688 Duo. Способ второй, быстрый

При смене прошивок приходится заново производить первичную конфигурацию системы. Есть способ сократить время на эту нудную процедуру. Для этого понадобится подключение по последовательному порту.

Допустим вы ставили прошивку LEDE 18.06 и теперь хотите откатиться обратно на фирменную прошивку. Для начала нам нужно скачать прошивку. Ссылка на последнюю актуальную прошивку находится в Downloads - LinkIt Smart 7688 Resources сайта Mediatek. Для firmware 0.9.4 ссылкой на прошивку будет https://labs.mediatek.com/en/download/hpcKCI7J.

Скачиваем прошивку на обычном компьютере, к примеру через wget:

wget https://labs.mediatek.com/en/download/hpcKCI7J

Прошивка сохранится под именем hpcKCI7J. Распаковываем прошивку:

$  unzip hpcKCI7J 
Archive:  hpcKCI7J
   creating: 0.9.4/
  inflating: 0.9.4/lks7688.img 

Копируем прошивку на Linkit:

$ scp  0.9.4/lks7688.img  root@linkit:/tmp

Переходим на сторону Linkit. Для перепрошивки нам понадобится утилита sysupgrade:

# sysupgrade -h
Usage: /sbin/sysupgrade [<upgrade-option>l;...] <image file or URL>
       /sbin/sysupgrade [-q] [-i] <backup-command> <file>

upgrade-option:
        -d    add a delay before rebooting
        -f   restore configuration from .tar.gz (file or url)
        -i           interactive mode
        -c           attempt to preserve all changed files in /etc/
        -n           do not save configuration over reflash
        -T | --test
                     Verify image and config .tar.gz but do not actually flash.
        -F | --force
                     Flash image even if image checks fail, this is dangerous!
        -q           less verbose
        -v           more verbose
        -h | --help  display this help

backup-command:
        -b | --create-backup 
                     create .tar.gz of files specified in sysupgrade.conf
                     then exit. Does not flash an image. If file is '-',
                     i.e. stdout, verbosity is set to 0 (i.e. quiet).
        -r | --restore-backup 
                     restore a .tar.gz created with sysupgrade -b
                     then exit. Does not flash an image. If file is '-',
                     the archive is read from stdin.
        -l | --list-backup
                     list the files that would be backed up when calling
                     sysupgrade -b. Does not create a backup file.

Перепрошиваем плату без сохранения конфигурации:

# sysupgrade -n lks7688.img

Система выдаст такой лог и нужно будет подождать минуту или полторы, после чего пойдёт лог загрузки:

killall: watchdog: no process killed
Sending TERM to remaining processes ... logd rpcd netifd odhcpd uhttpd ntpd ap_client dnsmasq ubusd 
Sending KILL to remaining processes ... 
Switching to ramdisk...
Performing system upgrade...
Unlocking firmware ...

Writing from <stdin> to firmware ...  [w]

После перезагрузки в ненастроенную систему, сначала нужно задать пароль рута:

# passwd

В конфиге беспроводной сети /etc/config/wireless:

config wifi-device 'radio0'
        option type 'ralink'
        option variant 'mt7628'
        option country 'TW'
        option hwmode '11g'
        option htmode 'HT40'
        option channel 'auto'
        option linkit_mode 'sta'
        option disabled '0'

config wifi-iface 'ap'
        option device 'radio0'
        option mode 'ap'
        option network 'lan'
        option ifname 'ra0'
        option encryption 'none'
        option ssid 'LinkIt_Smart_7688_27A89B'
        option seq '1'

config wifi-iface 'sta'
        option device 'radio0'
        option mode 'sta'
        option network 'wan'
        option ifname 'apcli0'
        option led 'mediatek:orange:wifi'
        option ssid 'Alien'
        option key 'пароль'
        option encryption 'psk'

надо будет поменять режим работы wifi на режим клиента, а также в разделе настройки клиента вписать свою точку доступа и пароль к ней для подключения.

На этом собственно все, далее можно перезагружаться, и входить на Linkit уже по ssh.

8) Подключение Ethernet порта

    Подключение Ethernet разъёма к Linkit может потребоваться в следующих случаях:
  • Когда при отсутствии WiFi соединения вам непременно нужно попасть в LUCI. Например, если вы прошили плату какой-либо последней сборкой OpenWRT где как водится всё поломано, и без интернет соединения вы даже нужные пакеты не установите.
  • Если вы прошили плату несовместимой прошивкой и плата превратилась в "кирпич". Перепрошить такую плату можно через TFTP сервер загрузчика U-Boot, для чего потребуется проводное соединение.
  • Если для осуществления ваших творческих планов непременно требуется проводное соединение. Хотя на мой взгляд в этом случае проще будет какой-либо одноплатник, навроде Orange Pi Zero, дешевле будет.

Вообще-то для подключения к Linkit по Ethernet продаётся специальная плата Arduino Breakout for LinkIt Smart 7688 Duo.

Подключать какую-либо железку к витой паре, не важно, микроконтроллер или микропроцессор следует через специальные Ethernet-фильтры (Ethernet magnetics). Выглядят они как черные коробочки. На фото даже показано как с помощью ножовки добыть себе LAN разъем из ненужной сетевой карты:

У меня такой удобной платы на распил не было, да мне и надо было подключиться всего на пять минут, поэтому я просто взял разъем rj45 и подпаял к нему проводки:

Проводки должны быть минимальной длины! К разъёму я подключал витую пару около 30см длиной. Обычный патч-корд на полтора метра отказывался работать.

Подключение может быть прямым или кроссированным. Если плату подключать непосредственно к компьютеру, что следует использовать кроссированное соединение. Если подключать к роутеру, то как правило следует использовать прямое подключение. Хотя многие роутеры могут определять тип кабеля, и подстраиваются под них.

    Для прямого подключения нужно соединить
  • RD+ Linkit c Recive+ коннектора RJ45;
  • RD- Linkit c Recive- коннектора RJ45;
  • TD+ Linkit c Transmit+ коннектора RJ45;
  • TD- Linkit c Transmit- коннектора RJ45;
    Для кроссированного подключения нужно соединить
  • TD+ Linkit c Recive+ коннектора RJ45;
  • TD- Linkit c Recive- коннектора RJ45;
  • RD+ Linkit c Transmit+ коннектора RJ45;
  • RD- Linkit c Transmit- коннектора RJ45;

Для подключения к LinkIt™ Smart 7688 Duo через Ethernet интерфейс, нужно убедиться, что ваш компьютер и Linkit находятся в одной подсети. По умолчанию, Linkit имеет адрес 192.168.100.1. Если мой компьютер имеет адрес вида 192.168.1.хх то Linkit должен иметь адрес вида 192.168.1.yy. Адрес указывается в конфиге /etc/config/network:

config interface 'loopback'
        option ifname 'lo'
        option proto 'static'
        option ipaddr '127.0.0.1'
        option netmask '255.0.0.0'

config globals 'globals'
        option ula_prefix 'fd05:f152:73e6::/48'

config interface 'lan'
        option ifname 'eth0'
        option force_link '1'
        option macaddr '9c:65:f9:27:9c:e3'
        option type 'bridge'
        option proto 'static'
        option netmask '255.255.255.0'
        option ip6assign '60'
        option ipaddr '192.168.1.77'

config switch
        option name 'switch0'
        option reset '1'
        option enable_vlan '0'

config interface 'wan'
        option proto 'dhcp'

После подключения LinkIt™ Smart 7688 Duo к роутеру или компьютеру, нужно протестировать соединение:

$ ping -D -i 0.2  192.168.1.77

Нужно добиться того, чтобы потерянных пакетов не было:

--- 192.168.1.77 ping statistics ---
126 packets transmitted, 126 received, 0% packet loss, time 24999ms
rtt min/avg/max/mdev = 0.248/0.283/0.342/0.022 ms

9) Перенос файловой системы на карту MicroSD

Неоспоримым преимуществом платы LinkIt™ Smart 7688 Duo является наличие разъема для карты памяти MicroSD. Это позволяет использовать карту MicroSD в качестве носителя файловой системы, вместо использования USB-Flash носителей, как это традиционно делается в роутерах на OpenWRT. Т.о. у нас остаётся свободным USB разъем для чего-то более интересного.

Предполагаем, что мы работаем с Linkit через ssh-соединение. Если мы посмотрим на структуру файловой системы:

root@linkit:~# df -h
Filesystem                Size      Used Available Use% Mounted on
rootfs                   10.6M      1.5M      9.2M  14% /
/dev/root                20.0M     20.0M         0 100% /rom
tmpfs                    61.7M    244.0K     61.4M   0% /tmp
/dev/mtdblock6           10.6M      1.5M      9.2M  14% /overlay
overlayfs:/overlay       10.6M      1.5M      9.2M  14% /
tmpfs                   512.0K         0    512.0K   0% /dev
root@linkit:~# mount
rootfs on / type rootfs (rw)
/dev/root on /rom type squashfs (ro,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,noatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,noatime)
tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noatime)
/dev/mtdblock6 on /overlay type jffs2 (rw,noatime)
overlayfs:/overlay on / type overlay (rw,noatime,lowerdir=/,upperdir=/overlay/upper,workdir=/overlay/work)
tmpfs on /dev type tmpfs (rw,nosuid,relatime,size=512k,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,mode=600)
debugfs on /sys/kernel/debug type debugfs (rw,noatime)

то видно, что SPI-флешка подключена через MTD подсистему. Она разделена на две части. Первый раздел объёмом в 20 Мбайт в отведён под прошивку, он имеет сжатую файловую систему SquashFS и доступен только для чтения. Второй раздел имеет объем 10 Мбайт, файловую систему jffs2 и он доступен для записи. Оба раздела, через OverlayFS склеены в единый "бутерброд". Это типичная организация файловой системы для встраиваемых систем.

С помощью подключения SD карты мы можем перенести второй раздел на MicroSD и тем самым увеличим свободное пространство с нескольких мегабайт до нескольких гигабайт. О том, как это осуществить на практике, имеется подробная инструкция на сайте mediatek: Mounting the root FS on an SD card. Но там имеется парочка неточностей. Итак.

Первым делом, устанавливаем необходимые модули и дополнительный софт:

# opkg update
# opkg install block-mount kmod-fs-ext4 kmod-usb-storage-extras e2fsprogs fdisk

Если карта MicroSD вставлена в слот, то она появится в системе. Если карты еще нет, то можно ее вставить на отключая питание LinkIt™ Smart 7688 Duo, как это делается на планшетах.

[ 7353.170000] msdc-1 -> cmd<13> card<0> power<2> <- msdc_ops_request() : L<2120> PID<kworker/u2:0><0x6>
[ 7353.180000] msdc-1 -> cmd<13> card<0> power<2> <- msdc_ops_request() : L<2120> PID<kworker/u2:0><0x6>
[ 7353.200000] msdc-1 -> cmd<13> card<0> power<2> <- msdc_ops_request() : L<2120> PID<kworker/u2:0><0x6>
[ 7353.220000] msdc-1 -> cmd<13> card<0> power<2> <- msdc_ops_request() : L<2120> PID<kworker/u2:0><0x6>
[ 7353.240000] mmc0: card 1234 removed
[ 7353.250000] ttyS2: 1 input overrun(s)
[ 7355.170000] mmc0: new high speed SDHC card at address 1234
[ 7355.180000] mmcblk mmc0:1234: no of_node; not parsing pinctrl DT
[ 7355.190000] mmcblk0: mmc0:1234 SA04G 3.68 GiB
[ 7355.200000]  mmcblk0: p1

Здесь я извлёк карту, и вставил ее обратно в разъём. Как видно, SD карта подключается через MMC-подсистему. Если включен демон mountd то карточка автоматически смонтируется, при условии, что ее разделы отформатированы в FatFS или Ext2/Ext3/Ext4. Нам этот демон будет пока мешать, поэтому выключим его пока, а смонтированные им разделы - размонтируем.

Запустим fdisk и разобьём карту по своему усмотрению. Я лично сделал так:

root@linkit:~# fdisk -l /dev/mmcblk0

Disk /dev/mmcblk0: 3.7 GiB, 3959422976 bytes, 7733248 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device         Boot  Start     End Sectors  Size Id Type
/dev/mmcblk0p1        2048  526335  524288  256M 82 Linux swap / Solaris
/dev/mmcblk0p2      526336 7733247 7206912  3.4G 83 Linux

Первый раздел я планирую использовать как раздел подкачки, а на втором будет смонтирована файловая система LinkIt™ Smart 7688 Duo.

Форматируем свои разделы:

root@linkit:~# mkswap /dev/mmcblk0p1
Setting up swapspace version 1, size = 268431360 bytes
root@linkit:~# mkfs.ext4 /dev/mmcblk0p2
mke2fs 1.42.12 (29-Aug-2014)
Creating filesystem with 900864 4k blocks and 225344 inodes
Filesystem UUID: e998c997-43f3-4961-9674-c36bb8da99fe
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done 

Теперь нам нужно сформировать конфиг fstab. В этом нам поможет программа block которую мы только что установили:

root@linkit:~# block detect
config 'global'
        option  anon_swap       '0'
        option  anon_mount      '0'
        option  auto_swap       '1'
        option  auto_mount      '1'
        option  delay_root      '5'
        option  check_fs        '0'

config 'mount'
        option  target  '/mnt/mmcblk0'
        option  uuid    'C563-3BFB'
        option  enabled '0'

config 'swap'
        option  device  '/dev/mmcblk0p1'
        option  enabled '0'

config 'mount'
        option  target  '/mnt/mmcblk0p2'
        option  uuid    'e998c997-43f3-4961-9674-c36bb8da99fe'
        option  enabled '0'

Здесь первый раздел нужно будет обозначить как SWAP, а второй должен монтироваться на "/overlay". Т.о. конфиг "/etc/config/fstab" примет следующий вид:

config 'global'
        option  anon_swap       '0'
        option  anon_mount      '0'
        option  auto_swap       '1'
        option  auto_mount      '1'
        option  delay_root      '5'
        option  check_fs        '0'

config 'swap'
        option  device  '/dev/mmcblk0p1'
        option  enabled '1'

config 'mount'
        option  target  '/overlay'
        option  uuid    'e998c997-43f3-4961-9674-c36bb8da99fe'
        option  enabled '1'

Здесь красным обозначены поля, которые потребовалось изменить.

Далее нужно скопировать содержимое раздела "/overlay" на нашу карту. Для этого монтируем карточку и переходим на ее:

# mount /dev/mmcblk0p2 /mnt
# cd /mnt

Переносим раздел:

# tar -C /overlay -cvf - . | tar -C /mnt -xf -

Проверяем:

# root@linkit:/mnt# ls -l
drwx------    2 root     root         16384 Dec  1 08:10 lost+found
drwxr-xr-x    9 root     root          4096 Dec  1 08:54 upper
drwxr-xr-x    3 root     root          4096 Dec  1 08:54 work
# df -h
Filesystem                Size      Used Available Use% Mounted on
rootfs                   10.6M      1.5M      9.2M  14% /
/dev/root                20.0M     20.0M         0 100% /rom
tmpfs                    61.7M    716.0K     61.0M   1% /tmp
/dev/mtdblock6           10.6M      1.5M      9.2M  14% /overlay
overlayfs:/overlay       10.6M      1.5M      9.2M  14% /
tmpfs                   512.0K         0    512.0K   0% /dev
/dev/mmcblk0p2            3.3G      9.8M      3.1G   0% /mnt

Размонтируем:

root@linkit:/mnt# cd
root@linkit:~# umount /mnt

После этого перезагружаем плату LinkIt:

# reboot

После перезагрузки, заново подключаемся по ssh, проверяем:

root@linkit:~# df -h
Filesystem                Size      Used Available Use% Mounted on
rootfs                    3.3G      9.8M      3.1G   0% /
/dev/root                20.0M     20.0M         0 100% /rom
tmpfs                    61.7M    244.0K     61.4M   0% /tmp
/dev/mmcblk0p2            3.3G      9.8M      3.1G   0% /overlay
overlayfs:/overlay        3.3G      9.8M      3.1G   0% /
tmpfs                   512.0K         0    512.0K   0% /dev

Теперь появилось достаточно места для своего софта и сайтов.

10) Безопасность: создание непривилегированного пользователя и защита паролем входа через последовательный интерфейс

Создание непривилегированного пользователя описано в документации OpenWRT на этой странице: Secure your router's access.

Допустим нам нужно создать пользователя flanker, который бы принадлежал бы к группе users. Для этого :

  1. Создаём домашний каталог пользователя:
    mkdir -p /home/flanker
  2. Устанавливаем пакет shadow-useradd:
    opkg update
    opkg install shadow-useradd
    useradd flanker
  3. В файле /etc/passwd строку с пользователем приводим к виду:
    flanker:x:1000:1000:users:/home/flanker:/bin/ash
  4. В файл /etc/group добавляем нашу группу
    users:x:1000:
  5. Задаём пароль пользователя командой:
    passwd flanker
  6. После этого в файле /etc/shadow должна появиться строка вида:
    flanker:$1$tj/JJ92k$8g2rKq39VCs9zHJe80Q0m1:17869:0:99999:7:::
    На этом этапе уже можно пробовать подключиться через ssh под логином нового пользователя.
  7. На мой взгляд не лишним будет установить пакеты "su" и "sudo".
    opkg update
    opkg install shadow-su
    opkg install sudo
  8. После установки "sudo", нужно будет её настроить. Для этого вызовем редактирование конфига sudo командой:
    visudo
    В простейшем случае нужно будет раскомментировать эти две строки:
    # Defaults targetpw  # Ask for the password of the target use 
    # ALL ALL=(ALL) ALL # WARNING: only use this together with 'Defaults targetpw'

Теперь когда мы хотим выполнить какую-нибудь команду из-под непривилегированного пользователя, нам нужно напечатать что-то вроде:

sudo sh -c "/etc/init.d/uhttpd stop"

Для установки пароля на вход по последовательному порту, нужно на файле /etc/inittab, строку:

::askconsole:/bin/ash --login
заменить на:
::askconsole:/bin/login.sh

На этом этап первоначальной настройки можно считать завершённым.