OpenWrt для Napi - архитектура и сборка
Статья для тех, кто хочет собрать OpenWrt под платы NapiLab Napi самостоятельно и понимать, что именно происходит на каждом шаге — от патча U-Boot до первого входа по SSH.
Зачем вообще собирать OpenWrt для Napi?
NapiLab Napi — промышленный одноплатный компьютер (SBC) и системный модуль (SOM) на базе Rockchip RK3308. Платформа ориентирована на промышленный IoT: сбор данных с датчиков, шлюзы Modbus TCP/RTU, MQTT-брокеры, удалённый мониторинг.
Ванильный OpenWrt доступен для "родственной" платы RockPi-S, но не знает особенностей Napi: нет device tree дополнительных портов, нет правильной конфигурации U-Boot, нет пакетов для промышленного применения. Наш репозиторий — это набор патчей, DTS, uci-defaults и пакетов, которые превращают чистый снапшот OpenWrt в готовый промышленный одноплатник.
Если хотите сразу попробовать без сборки — готовые образы доступны на странице загрузок napiworld.ru.
Что даёт кастомная сборка
- Стабильный MAC-адрес — генерируется из OTP-данных чипа, не меняется после перезагрузки
- Правильный Device Tree — UART1 и UART2 в нужных режимах, Bluetooth отключён
- Готовый стек Modbus TCP —
mbusd+ веб-интерфейсluci-app-mbusdиз коробки - MQTT-брокер —
mosquittoуже установлен и настроен - Поддержка LTE-модемов — Quectel EP06 работает без дополнительных танцев
- Первый старт без консоли — все настройки применяются через
uci-defaultsавтоматичес ки
Поддерживаемое железо
Все платы используют один и тот же SoC — Rockchip RK3308, поэтому собирается одна прошивка для всей линейки:
| Плата | Хранилище | Тип |
|---|---|---|
| NapiLab Napi-C | 4 ГБ NAND — 32 ГБ eMMC | Промышленный SBC |
| NapiLab Napi-P | 4 ГБ NAND — 32 ГБ eMMC | Промышленный SBC |
| NapiLab Napi-Slot | 4 ГБ NAND — 32 ГБ eMMC | SOM |
| Radxa ROCK Pi S | — | Референсная плата, тот же RK3308 |
Характеристики RK3308
| Компонент | Детали |
|---|---|
| CPU | Quad-core ARM Cortex-A35, 1.3 ГГц |
| RAM | 256 МБ / 512 МБ DDR3 |
| Ethernet | 100 Мбит/с (GMAC + PHY RTL8201F) |
| USB | 2× USB 2.0 Host |
| UART | 3× UART (ttyS0 — консоль, ttyS1, ttyS2) |
| Wi-Fi | RTL8723DS (802.11b/g/n) |
Структура репозитория: что куда кладётся
./
├── files/
│ └── etc/
│ └── uci-defaults/ # Скрипты первого старта
│ ├── 91-bash
│ ├── 92-timezone
│ ├── 93-console-password
│ ├── 94-macaddr
│ ├── 95-network
│ ├── 96-hostname
│ ├── 97-luci-theme
│ └── 99-dhcp
│
├── package/
│ ├── boot/
│ │ └── uboot-rockchip/
│ │ ├── Makefile
│ │ └── patches/
│ │ └── 108-board-rockchip-add-napilab-napic.patch # Патч U-Boot
│ └── luci-app-mbusd/ # Веб-интерфейс для mbusd
│ ├── Makefile
│ ├── htdocs/luci-static/resources/view/
│ │ └── mbusd.js
│ └── root/
│ ├── etc/uci-defaults/luci-app-mbusd
│ └── usr/share/
│ ├── luci/menu.d/luci-app-mbusd.json
│ └── rpcd/acl.d/luci-app-mbusd.json
│
└── target/linux/rockchip/
├── files/arch/arm64/boot/dts/rockchip/
│ └── rk3308-napi-c.dts # Кастомный Device Tree
└── image/
└── armv8.mk # Описание целевого образа
Разберём каждую часть подробно.
U-Boot: почему нужен патч и что он делает
OpenWrt собирает U-Boot из исходников вместе с прошивкой. Для RK3308 есть готовая конфигурация для Radxa ROCK Pi S — мы взяли её за основу, так как схемотехника близка к Napi.
Патч 0001-napic-rk3308-defconfig.patch
Патч добавляет новый вариант napic-rk3308 в систему сборки U-Boot:
+++ b/configs/napic-rk3308_defconfig
@@ -0,0 +1,42 @@
+CONFIG_ARM=y
+CONFIG_ARCH_ROCKCHIP=y
+CONFIG_SYS_TEXT_BASE=0x00600000
+CONFIG_ROCKCHIP_RK3308=y
+CONFIG_TARGET_EVB_RK3308=y
+CONFIG_DEFAULT_DEVICE_TREE="rk3308-napi-c"
+CONFIG_DISTRO_DEFAULTS=y
+CONFIG_SYS_MALLOC_F_LEN=0x4000
+CONFIG_BAUDRATE=1500000
+CONFIG_BOOTDELAY=0
...
Ключевые настройки:
CONFIG_DEFAULT_DEVICE_TREE="rk3308-napi-c"— указываем U-Boot использовать наш DTSCONFIG_BAUDRATE=1500000— нестандартная скорость консоли (1.5 Мбод), типичная для RockchipCONFIG_BOOTDELAY=0— не ждём прерывания при старте (промышленное применение)
Как собрать только U-Boot
make package/boot/uboot-rockchip/compile VARIANT=napic-rk3308 -j$(nproc)
Флаг VARIANT=napic-rk3308 говорит системе сборки использовать именно наш defconfig.
Device Tree (DTS): описываем железо ядру
Device Tree — это описание аппаратной конфигурации платы в текстовом формате. Ядро Linux не знает про периферию «само по себе», ему нужно явно сказать: «вот тут UART, вот тут Ethernet, вот GPIO».
Файл rk3308-napi-c.dts
Берём за основу rk3308-rock-pi-s.dts (Radxa ROCK Pi S — ближайший аналог по схемотехнике) и переопределяем то, что отличается у Napi.
/dts-v1/;
#include "rk3308.dtsi"
#include "rk3308-rock-pi-s.dtsi"
/ {
model = "NapiLab Napi-C";
compatible = "napilab,napi-c", "rockchip,rk3308";
};
/* UART1 → RS-485 через mbusd */
&uart1 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&uart1_xfer>;
};
/* UART2 — доступен как /dev/ttyS2 */
&uart2 {
status = "okay";
};
/* Bluetooth отключаем — не нужен в промышленном применении */
&bluetooth {
status = "disabled";
};
Что важно в этом DTS:
uart1 — маппится на /dev/ttyS1. Это главный последовательный порт, к которому подключаются RS-485 устройства Modbus. mbusd будет слушать именно его.
uart2 — маппится на /dev/ttyS2, доступен для дополнительных устройств.
bluetooth disabled — RTL8723DS предоставляет и Wi-Fi, и Bluetooth через один чип. Bluetooth нам не нужен и только занимает UART, поэтому отключаем на уровне DTS — никаких лишних сервисов, никаких потерь производительности.
Где лежит DTS в дереве OpenWrt
target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3308-napi-c.dts
OpenWrt копирует файлы из target/linux/<arch>/files/ поверх исходников ядра перед компиляцией. Это стандартный механизм добавления новых DTS без форка ядра.