Пошаговая инструкция по сборке кастомной прошивки OpenWrt для плат NapiLab Napi-C/P/Slot на базе Rockchip RK3308 и компьютеров на основе Napi-C (FCC3308, FCM3308). Включает все необходимые патчи, DTS, uci-defaults скрипты и конфигурацию. Особенно интересно для устройств с двумя Ethernet (FCM3308).
1. Подготовка хост-м ашины (Ubuntu/Debian)
sudo apt install build-essential clang flex bison g++ gawk gcc-multilib \
gettext git libncurses-dev libssl-dev python3-distutils python3-setuptools \
python3-pyelftools swig rsync unzip zlib1g-dev help2man
2. Клонирование OpenWrt
git clone https://github.com/openwrt/openwrt.git ~/openwrt
cd ~/openwrt
./scripts/feeds update -a
./scripts/feeds install -a
3. Кастомизации
Все изменения вносятся в чистое дерево OpenWrt. Ниже - полный список файлов и модификаций.
3.1. Патч U-Boot defconfig
Файл: package/boot/uboot-rockchip/patches/108-board-rockchip-add-napilab-napic.patch
Этот патч добавляет defconfig для NapiLab Napi-C в систему сборки U-Boot. Копируется из репозитория napi-openwrt-build.
3.2. Блок U-Boot в Makefile
В файле package/boot/uboot-rockchip/Makefile нужно добавить определение устройства napic и включить его в список целей сборки.
Добавить блок определения после U-Boot/rock-pi-s-rk3308 (перед строкой # RK3328 boards):
define U-Boot/napic-rk3308
$(U-Boot/rk3308/Default)
DEPENDS+=+PACKAGE_u-boot-$(1):trusted-firmware-a-rk3308-tpl-rock-pi-s
TPL:=rk3308_ddr_589MHz_uart0_m0_v2.10.bin
NAME:=NapiLab Napi-C
BUILD_DEVICES:= \
napilab_napic
endef
Команда для вставки:
sed -i '/^# RK3328 boards/i\
define U-Boot/napic-rk3308\
$(U-Boot/rk3308/Default)\
DEPENDS+=+PACKAGE_u-boot-$(1):trusted-firmware-a-rk3308-tpl-rock-pi-s\
TPL:=rk3308_ddr_589MHz_uart0_m0_v2.10.bin\
NAME:=NapiLab Napi-C\
BUILD_DEVICES:= \\\
napilab_napic\
endef' package/boot/uboot-rockchip/Makefile
Ограничить UBOOT_TARGETS только платами RK3308 (иначе сборка падает на отсутствующих ATF для rk3399 и др.):
Найти блок UBOOT_TARGETS := \ и заменить весь список на:
UBOOT_TARGETS := \
rock-pi-s-rk3308 \
napic-rk3308
3.3. Профиль устройства в armv8.mk
В файл target/linux/rockchip/image/armv8.mk добавить в конец:
define Device/napilab_napic
$(Device/rk3308)
DEVICE_VENDOR := NapiLab
DEVICE_MODEL := Napi-C
DEVICE_DTS := rk3308-napi-c
SUPPORTED_DEVICES := napilab,napic radxa,rockpis
BOOT_SCRIPT := rock-pi-s
UBOOT_DEVICE_NAME := napic-rk3308
DEVICE_PACKAGES := \
kmod-rtw88-8723ds \
kmod-usb-net-cdc-ncm \
kmod-usb-net-rndis \
wpad-basic-mbedtls \
kmod-fs-ext4 \
kmod-fs-msdos \
kmod-fs-vfat \
kmod-fs-exfat \
kmod-fs-ntfs3 \
kmod-usb-storage \
kmod-usb-serial-option \
kmod-usb-net-qmi-wwan \
uqmi \
minicom \
htop \
nano \
lsblk \
usbutils \
tcpdump \
ethtool \
mosquitto \
mosquitto-client \
screen \
xz-utils \
mbpoll \
openssh-sftp-server \
bash \
luci-ssl \
luci-theme-openwrt-2020 \
luci-proto-qmi \
luci-app-mbusd
endef
TARGET_DEVICES += napilab_napic
3.4. Device Tree (DTS)
Файл: target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3308-napi-c.dts
Основан на Rock Pi S, ключевые отличия:
uart1, uart2, uart4 включены (RS-485, дополнительные последовательные порты)
- Bluetooth не используется (занимает UART)
- USB OTG контроллер (
usb20_otg) переключён в режим host - без этого USB-устройства на OTG-порте не видны:
&usb20_otg {
dr_mode = "host";
status = "okay";
};
Важно: без dr_mode = "host" модуль dwc2 инициализируется в режиме gadget и USB-устройства (например, USB-Ethernet адаптеры) не определяются.
3.5. Пакеты
Скопировать в package/:
package/luci-app-mbusd/ - LuCI веб-интерфейс для Modbus-шлюза mbusd
package/luci-app-mbpoll/ - LuCI веб-интерфейс для Modbus-поллера
package/mbscan/ - утилита сканирования Modbus RTU шины (содержит Makefile + src/mbscan.c)
3.6. Файлы прошивки (files/)
Все файлы в директории files/ копируются в корневую ФС образа при сборке.
files/etc/shadow
Пароль root по умолчанию (хеш генерируется через openssl passwd -6):
HASH=$(openssl passwd -6)
echo "root:${HASH}:19000:0:99999:7:::" > files/etc/shadow
chmod 640 files/etc/shadow
files/etc/banner
Кастомный баннер при логине.
files/etc/profile.d/10-sysinfo.sh
Скрипт вывода информации об интерф ейсах при логине:
#!/bin/sh
echo ""
for iface in /sys/class/net/eth*; do
name=$(basename "$iface")
ip=$(ip -4 addr show "$name" 2>/dev/null | awk '/inet /{print $2}')
state=$(cat "$iface/operstate" 2>/dev/null)
[ -z "$ip" ] && ip="no address"
echo " $name: $ip ($state)"
done
echo ""
files/etc/uci-defaults/