Перейти к основному содержимому

Компиляция ядра NapiLinux - быстрый метод

· 2 мин. чтения
dmn
maintainer

Как скомпилировать только ядро NapiLinux

Это "грязный" быстрый метод, который позволяет не компилировать всю систему, а быстро включить какие-то опции ядра и проверить новое ядро в системе.

Правильный способ компиляции NapiLinux — через пакет Yocto.

1. Сделать клон ядра с нужной ветки (branch)

Бранч — это версия репозитория ядра. Для разных платформ она разная, и нужно выбрать ту, которая вас интересует:

  • rk-6.1
  • orange-pi-6.6
  • rk35xx

и т. п. (выбирайте на сайте GitLab)

git clone https://gitlab.nnz-ipc.net/pub/napilinux/kernel.git --branch=rk-6.1 --depth=1
cd kernel/

2. Настроить переменные для архитектуры (ARM64)

export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-

3. Подготовить конфиг

  • Конфиги лежат в папке /arch/arm64/configs
  • В каждой ветке нужно выбрать свой конфиг:

Для Napi:

make napi_defconfig

Для CM4:

make opi_cm4_defconfig

4. Настройка конфигурации

После этого появится файл .config, в котором вы можете изменить опции ядра под себя.

5. Запускаем компиляцию ядра

make -j10

6. Результаты сборки

  • Имидж ядраarch/arm64/boot/Image
  • Главная DTB (дерево устройств) — arch/arm64/boot/<файл>.dtb
  • Оверлеиarch/arm64/boot/dts/rockchip/

7. Замена ядра в системе

Теперь можно заменить файлы Image и .dtb в /boot, затем перезагрузить систему.

8. Важно про overlay root!

NapiLinux использует root (/) как виртуальную партицию overlay, поэтому просто переписать ядро и другие файлы из системы не получится (на деле вы запишете их в overlay, и u-boot их не увидит).

Что делать?

  • Если работаете на SD-карте — выньте SD, примонтируйте обе физические партиции и запишите новые файлы в их /boot

  • Если работаете с NAND/eMMC — загрузитесь с SD, примонтируйте обе партиции и запишите туда файлы вручную

Просмотр структуры партиций

Посмотреть структуру партиций можно командами:

lsblk
lsblk -f

#napilinux #napikernel

Просмотр опций компиляции ядра Linux

· 1 мин. чтения
dmn
maintainer

Как посмотреть с какими опциями скомпилировано ядро Linux ?

zcat /proc/config.gz

Так же можно поставить фильтр - например, посмотрим все что касается последовательных портов

zcat /proc/config.gz | grep -E 'CONFIG_SERIAL_8250_NR_UARTS|CONFIG_SERIAL_8250|CONFIG_SERIAL_'

#linuxkernel #kernel #napikernel #uart

Перенос blue-led на GPIO2B4 в Armbian

· 1 мин. чтения
dmn
maintainer

Перевод blue-led на GPIO2B4

Перевод blue-led на GPIO2B4 (Аrmbian). (В предыдущем примере GPIO3B3 попало на SPI1-CLK)

Файл конфигурации


root@rockpi-s:~# cat blue-led-gpio2b4-1.dts

/dts-v1/;
/plugin/;

/ {
fragment@0 {
/* у вас узел именно под /leds */
target-path = "/leds/blue-led";
__overlay__ {
gpios = <&gpio2 12 0>; /* GPIO2_B4, ACTIVE_HIGH */
linux,default-trigger = "heartbeat";
default-state = "on";
status = "okay";
};
};
};

#napi #dts

Восстановление повреждённых series в InfluxDB

· 2 мин. чтения
dmn
maintainer

Как "починить" сломанные series в InfluxDB

Неожиданно при отладке датчиков influxdb перестал запускаться с такой ошибкой.

Ошибка запуска

root@napi-playfulokapi:~# /usr/lib/influxdb/scripts/influxd-systemd-start.sh
Command "print-config" is deprecated, use the influx-cli command server-config to display the configuration values from the running server
2025-09-16T08:54:29.621708Z info Welcome to InfluxDB {"log_id": "0z0RZky0000", "version": "v2.7.1", "commit": "407fa622e9", "build_date": "2023-04-28T13:24:42Z", "log_level": "info"}
2025-09-16T08:54:29.677535Z info Resources opened {"log_id": "0z0RZky0000", "service": "bolt", "path": "/root/.influxdbv2/influxd.bolt"}
2025-09-16T08:54:29.680849Z info Resources opened {"log_id": "0z0RZky0000", "service": "sqlite", "path": "/root/.influxdbv2/influxd.sqlite"}
2025-09-16T08:54:29.754889Z info Checking InfluxDB metadata for prior version. {"log_id": "0z0RZky0000", "bolt_path": "/root/.influxdbv2/influxd.bolt"}
2025-09-16T08:54:29.756722Z info Using data dir {"log_id": "0z0RZky0000", "service": "storage-engine", "service": "store", "path": "/root/.influxdbv2/engine/data"}
2025-09-16T08:54:29.773043Z info Compaction settings {"log_id": "0z0RZky0000", "service": "storage-engine", "service": "store", "max_concurrent_compactions": 2, "throughput_bytes_per_second": 50331648, "throughput_bytes_per_second_burst": 50331648}
2025-09-16T08:54:29.774155Z info Open store (start) {"log_id": "0z0RZky0000", "service": "storage-engine", "service": "store", "op_name": "tsdb_open", "op_event": "start"}
2025-09-16T08:54:29.780689Z error Unable to open series file {"log_id": "0z0RZky0000", "service": "storage-engine", "path": "/root/.influxdbv2/engine/data/50d1dfc5f00c762d/_series", "partition": 0, "error": "invalid series segment"}
2025-09-16T08:54:29.781180Z info Open store (end) {"log_id": "0z0RZky0000", "service": "storage-engine", "service": "store", "op_name": "tsdb_open", "op_event": "end", "op_elapsed": "7.046ms"}
2025-09-16T08:54:29.781345Z error Failed to open engine {"log_id": "0z0RZky0000", "error": "invalid series segment"}
Error: invalid series segment

Как видно в логе - у нас сломался series. Очистка базы мне не помогла, поэтому чистил вручную.

Проверить series

root@napi-playfulokapi:~# influxd inspect   verify-seriesfile
2025-09-16T09:00:55.486187Z error Error opening segment {"log_id": "0z0RwJBW000", "path": "/root/.influxdbv2/engine/data/50d1dfc5f00c762d/_series", "partition": "01", "segment": "0000", "error": "invalid series segment"}
2025-09-16T09:00:55.497022Z error Error opening segment {"log_id": "0z0RwJBW000", "path": "/root/.influxdbv2/engine/data/50d1dfc5f00c762d/_series", "partition": "00", "segment": "0000", "error": "invalid series segment"}
2025-09-16T09:00:55.507980Z error Error opening segment {"log_id": "0z0RwJBW000", "path": "/root/.influxdbv2/engine/data/50d1dfc5f00c762d/_series", "partition": "02", "segment": "0000", "error": "invalid series segment"}

Видим поломанный series. Удалим его и перестроим

Удаление повреждённых series

mv /root/.influxdbv2/engine/data/50d1dfc5f00c762d/_series/ /root/.influxdbv2/engine/data/50d1dfc5f00c762d/_series.bad/

Перестроим series

influxd inspect build-tsi

Результат

После этого "шаманства" у меня influx запустился корректно.

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

#influxdb

Перенос heartbeat диода на пользовательский GPIO через overlay

· 2 мин. чтения
dmn
maintainer

Как перенести "софтовым" методом heartbit (диод активности) с встроенного GPIO на свободный  

По умолчанию диод на GPIO находится на  GPIO0A5, у нас в NAPI его нет на "гребёнке",  подтому мы его перекинем на GPIO3B3, который есть на "гребёнке" и ничем не занят.

Научимся делать user-overlay к ядру 

Добавляем оверлей в Armbian

Сделать файл blue-led-gpio3b3-2.dts и добавить его как оверлей 

armbian-add-overlay blue-led-gpio3b3-2.dts

Команда сама скомпилирует dtbo, перенесем его в нужную папку и добавит запись в файл armbianEnv.txt.

Останется только перегрузится и убедиться, что диод "прикрепился" к нашему пину (визуально он станет сразу помигивать). Как проверить на каком GPIO оказался диод - в конце поста.

Файл dts для Armbian

/dts-v1/;
/plugin/;

/ {
fragment@0 {
     /* у вас узел именно под /leds */
     target-path = "/leds/blue-led";
     __overlay__ {
         gpios = <&gpio3 11 0>;      /* GPIO3_B3, ACTIVE_HIGH */
         linux,default-trigger = "heartbeat";
         default-state = "on";
         status = "okay";

         /* убрать pinctrl у конкретного LED, чтобы не валилось на -22 */
         /delete-property/ pinctrl-names;
         /delete-property/ pinctrl-0;
     };
};
};

Добавляем оверлей NapiLinux

Необходимо скомпилировать из dts файла, dtbo файл через утилиту dtc на любом Linux-хосте.

dtc -@ -I dts -O dtb -o blue-led-gpio3b3.dtbo blue-led-gpio3b3.dts

Делаем папку 

mkdir /boot/overlay-user Получившийся файл dtbo (blue-led-gpio3b3.dtbo) закинуть  в  /boot/overlay-user

Добавить строчку в файл /boot/uEnv.txt

user_overlays=blue-led-gpio3b3 Файл dts для NapiLinux

/dts-v1/;
/plugin/;

/ {
fragment@0 {
     /* у вас узел именно под /leds */
     /* target-path = "/leds/blue-led"; */
     target-path = "/gpio-leds/blue-led";
     __overlay__ {
         gpios = <&gpio3 11 0>;      /* GPIO3_B3, ACTIVE_HIGH */
         linux,default-trigger = "heartbeat";
         default-state = "on";
         status = "okay";

     };
};
};

Проверка на каком gpio blue-led 

hexdump -v -e '1/4 "0x%08X "' -e '"\n"' /proc/device-tree/gpio-leds/blue-led/gpios
Должно выдать: <phandle gpio3, 0x0000000B, 0x00000000>

#gpio #napi #dts

Диагностика SD-NAND карт в Linux - получение регистров

· 2 мин. чтения
dmn
maintainer

Пришлось глубоко копнуть в часть SD-NAND, так как некоторые карты Zetta не инициализировались в ядрах 6.х Linux.

Полезные факты и приемы

Получаем данные регистров SD (SD-NAND) карт

Карта 1.

root@napi-rk3308b-s:~# cat /sys/bus/mmc/devices/mmc0\:1388/cid
ba2345534134474206071c06fe016945
root@napi-rk3308b-s:~# cat /sys/bus/mmc/devices/mmc0\:1388/csd
400e00325b5900001cdf7f800a4000d7
root@napi-rk3308b-s:~# cat /sys/bus/mmc/devices/mmc0\:1388/ocr
0x00300000
root@napi-rk3308b-s:~# cat /sys/bus/mmc/devices/mmc0\:1388/rca
0x1388
root@napi-rk3308b-s:~# cat /sys/bus/mmc/devices/mmc0\:1388/scr
0235000e00000000
root@napi-rk3308b-s:~#

Карта 2

root@napi-nightstarfish:~# cat /sys/bus/mmc/devices/mmc0\:1388/cid
e700115a6574746101b135ee4a719523
root@napi-nightstarfish:~# cat /sys/bus/mmc/devices/mmc0\:1388/csd
400e00325b5900001d177f800a40008d
root@napi-nightstarfish:~# cat /sys/bus/mmc/devices/mmc0\:1388/ocr
0x00300000
root@napi-nightstarfish:~# cat /sys/bus/mmc/devices/mmc0\:1388/rca
0x1388
root@napi-nightstarfish:~# cat /sys/bus/mmc/devices/mmc0\:1388/scr
0205848f33333039
root@napi-nightstarfish:~#

В uboot

=> mmc info
Device: mmc@ff500000
Manufacturer ID: 3
OEM: 5344
Name: SA04G
Bus Speed: 50000000
Mode : SD High Speed (50MHz)

Расшифровка SCR (чатгпт)

1) SCR contents (from Linux):

SCR = 02 05 84 8F 33 33 30 39

Decoded:

SCR Structure = 0 (v1.0)

SD Spec = 2.0 + Spec3 → SD 3.0 (UHS-I)

Bus widths = 1-bit and 4-bit supported

Security = CPRM supported

Byte 3 = 0x8F → according to the SD spec, bits indicate:

bit0 = CMD20 supported

bit1 = CMD23 supported

bit2 = CMD48 supported

bit3 = CMD49 supported

Расшифровка CID (чатгпт)

CID #1

ba2345534134474206071c06fe016945

MID: 0xBA

OID: 0x23 0x45 → «#E» (непечатный/нестандартный OID, трактую как hex)

PNM: SA4GB

PRV: 0.6

PSN: 119277310 (0x071C06FE)

MDT: 2022-09 (разбор по формуле: ((cid[13]&0x0F)<<8)|cid[14]) → год=2000+((mdt>>4)&0xFF), месяц=mdt&0xF)
CID #2

e700115a6574746101b135ee4a719523

MID: 0xE7 (похоже на Zetta)

OID: 0x00 0x11 → непечатный (оставляем в hex)

PNM: Zetta

PRV: 0.1

PSN: 2973101642 (0xB135EE4A)

MDT: 2025-05

Что по факту отличается

Производитель/бренд:

— #1: MID=0xBA, имя продукта SA4GB (выглядит как «4GB» линейка). — #2: MID=0xE7, имя продукта Zetta (бренд Zetta виден прямо в PNM).

Версия продукта (PRV):

— #1: 0.6 (более поздняя ревизия конкретной линейки), — #2: 0.1 (самая ранняя ревизия).

Серийный номер (PSN): разные (ожидаемо), у #2 — существенно большее значение.

Дата производства (MDT): — #1: 2022-09, — #2: 2025-05 (свежее).

OID: у обеих — непечатные/нестандартные коды (это нормально: поле OEM/Application ID не обязано быть ASCII).

Место в ядре где идёт чтение регистров карты

https://github.com/torvalds/linux/blob/07d9df80082b8d1f37e05658371b087cb6738770/drivers/mmc/core/sd.c#L1279

#sdnand #kernel #linuxkernel #sys #uboot

Установка Zigbee2mqtt на NAPI-C (P)

· 1 мин. чтения
dmn
maintainer

Устанавливаем на NAPI-C (P) Zigbee2mqtt

  1. Устанавливаем Аrmbian

  2. Ставим пакеты

apt-get install -y curl curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - apt-get install -y nodejs git make g++ gcc libsystemd-dev tmux apt install -y mosquitto mosquitto-clients corepack enable
  1. Создадим каталог
mkdir /opt/zigbee2mqtt
  1. На случай если ставили не от рута нужно дать права на каталог
sudo chown -R ${USER}: /opt/zigbee2mqtt
  1. Скачиваем гит в каталог
git clone --depth 1 https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt
  1. Переходим в каталог:
cd /opt/zigbee2mqtt
  1. Запустим tmux и продолжим сборку в нем:
tmux
  1. Собираем приложение

Запустим сборку в один поток

pnpm install --frozen-lockfile --child-concurrency=1 6.1
  1. После сборки выполняем запуск
cd /opt/zigbee2mqtt
pnpm start
  1. Делаем сервис

Создаем файл

nano /etc/systemd/system/zigbee2mqtt.service

С таким содержимым

[Unit]
Description=zigbee2mqtt
After=network.target

[Service]
Environment=NODE_ENV=production
Type=simple
ExecStart=/usr/bin/pnpm start
WorkingDirectory=/opt/zigbee2mqtt
StandardOutput=inherit
StandardError=inherit
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
  1. Выполняем инициализацию и запуск сервиса
systemctl daemon-reload
systemctl enable zigbee2mqtt.service
systemctl start zigbee2mqtt.service
systemctl status zigbee2mqtt.service
journalctl -u zigbee2mqtt.service -f

#napi #zigbee $zigbee2mqtt

Чтение и программирование EEPROM преобразователя FT232

· 2 мин. чтения
dmn
maintainer

Читаем внутреннюю прошивку преобразователя rtu-usb ft232 под Linux (armbian na Napi-C)

Ставим софт

sudo apt install libftdi1-2 libftdi1-dev ftdi-eeprom

Читаем

touch c.txt #создаем пустой файл

#vendor/product смотрим в lsusb
echo 'vendor_id=0x0403
product_id=0x6001' > c.txt
ftdi_eeprom --read-eeprom c.txt  --verbose

Получаем результат

FTDI eeprom generator v0.17
(c) Intra2net AG and the libftdi developers <opensource@intra2net.com>
Unable to find FTDI device with description: i:0403:6001
Error code: -3 (device not found)
root@rockpi-s:~# ftdi_eeprom --read-eeprom c.txt --verbose

FTDI eeprom generator v0.17
(c) Intra2net AG and the libftdi developers <opensource@intra2net.com>
Unable to find FTDI devices under given vendor/product id: 0x0/0x0
Error code: -3 (device not found)
Retrying with default FTDI pid=0x6001.
FTDI read eeprom: 0
EEPROM size: 128
VID: 0x0403
PID: 0x6001
Release: 0x0000
Bus Powered: 90 mA USB Remote Wake Up
Manufacturer: FTDI
Product: FT232R USB UART
Serial: A10M5ZU3
Checksum : 17cb
Internal EEPROM
Oscillator: Internal
Enable Remote Wake Up
PNP: 1
Channel A has Mode UART VCP
C0 Function: TXLED
C1 Function: RXLED
C2 Function: TXDEN
C3 Function: PWREN
C4 Function: SLEEP
Warning: Not writing eeprom, you must supply a valid filename
FTDI close: 0

Этой же программой можно писать параметры в еепром ft232, создав конфигурационный файлик.

🙋‍♀️Зачем это надо ?

  • Проверить жив ли ft232
  • Проверить назначение линий CBUS (C0-C4), которые могут быть переопределены.

👍 Полезные факты

  • lsusb -v — должно быть состояние bConfigurationValue = 1

  • PWREN # после того как модуль инициализирован драйвером должен быть в НУЛЕ (0)

  • SLEEP #у FTDI — это сигнал, который показывает, что чип перешёл в режим сна (USB suspend).

Когда USB-шина в нормальном рабочем состоянии → SLEEP# = 1 (логическая единица).

Когда хост перевёл устройство в режим suspend (спящий режим по USB, обычно при бездействии или энергосбережении) → SLEEP# = 0.

😂 Несколько подсказок от чатГПТ (я не проверял)

  1. Сохранить сырой еепром
sudo ftdi_eeprom --read-eeprom текущий.conf --device ft232 --small-eeprom --eeprom-filename дамп.bin
  1. Файл, если нужно прошить свои кастом параметры (ftdi.conf)
vendor_id=0x0403
product_id=0x6001
manufacturer="MyCompany"
product="My FT232R"
serial="FT123456"

# CBUS configuration:
cbus0=1 # Можно оставить как есть или назначить PWREN
cbus1=1 # PWREN, к примеру
cbus2=0 # TXDEN
cbus3=2 # RXLED (имитация RXDEN через LED#)
cbus4=4 # TXRXLED

Как писать

sudo ftdi_eeprom --flash-eeprom ftdi.conf

#sys #ft232 #linux

Конфигурация uEnv.txt для Сборщик компакт 0.3

· 1 мин. чтения
dmn
maintainer

uEnv.txt для Сборщик компакт 0.3 (с блоком питания 1,2А)

verbosity=7
fdtfile=rk3308-napi-c.dtb
console=ttyS0,115200n8
overlays=rk3308-uart1 rk3308-uart3-m0 rk3308-i2c1-ds1338 rk3308-i2c3-m0 rk3308-usb20-host
kernelimg=Image
extraargs=

🔥Важно: RS485 у этой модели находится на /dev/ttyS3

#fcc #fcc03 #fcc3308

Конфигурация UART на модуле CM4 в Токосборщике

· 1 мин. чтения
dmn
maintainer

В Токосборщике на модуле CM4 UART-ы расположились следующим образом:

✔️UART3 - внешний датчик Modbus ✔️UART9 - модуль расширений (Zigbee) ✔️UART7 - встроенный датчик тока

Для корректной работе Debian, необходимо подключить оверлеи с uart7,9 в файле /boot/orangepiEnv.txt

root@orangepicm4:~# cat /boot/orangepiEnv.txt 
verbosity=1
bootlogo=false
extraargs=cma=128M
overlay_prefix=rk356x
overlays=uart7-m2 uart9-m2
rootdev=UUID=a0f8ca89-7eb7-4a1e-947a-2341637b4782
rootfstype=ext4
console=serial

#fcucm4 #orangecm4 #fcu