Решения различных вопросов, возникающих при работе с аппаратной платформой LuckFox (серия плат для разработки на основе процессоров Rockchip RV1103 и RV1106).
# Откуда загружаться (target boot medium) exportRK_BOOT_MEDIUM=sd_card
# Конфигурация раздела в окружении # Формат RK_PARTITION_CMD_IN_ENV: # < partdef>[,< partdef>] # < partdef> := < size>[@< offset>](part-name) # Примечание: если смещение первого раздела не 0x0, то это должно быть добавлено. # Иначе добавлять не нужно. exportRK_PARTITION_CMD_IN_ENV="32K(env),512K@32K(idblock),256K(uboot),32M(boot),512M(oem),256M(userdata),6G(rootfs)"
RK_BOOTARGS_CMA_SIZE: выделение памяти для камеры; если камера не используется, измените это значение на 1M.
RK_KERNEL_DTS: указывает файл дерева устройств (device tree file, DTS).
RK_BOOT_MEDIUM: указывает носитель загрузки (target boot medium), который может быть emmc (карта SD), sd_card (карта SD), spi_nor (SPI NOR Flash) или spi_nand (SPI NAND Flash).
RK_PARTITION_CMD_IN_ENV: эта информация используется для конфигурирования таблицы разделов. Если вам нужно сопоставить дисковое пространство с SD-картой, то вы можете изменить раздел rootfs.
LF_TARGET_ROOTFS: указывается корневая файловая система target (Root File System).
LF_SUBMODULES_BY: указывается источник субмодулей.
Из описания в предыдущем разделе можно увидеть, что образ Ubuntu поддерживает загрузку только с SD-карточки (SD card boot), в то время как образ Buildroot поддерживает как загрузку с TF-карты (TransFlash), так и загрузку из микросхемы памяти (SPI NAND FLASH boot).
1. Если вам нужно компилировать образ для системы Ubuntu и использовать gitee, то измените соответствующий mk-файл, задающий тип платы, чтобы отредактировать LF_SUBMODULES_BY для gitee, примерно так:
LF_SUBMODULES_BY=gitee
2. Если вы хотите компилировать образ Buildroot для загрузки TF card boot, то измените соответствующий файл BoardConfig-EMMC-Ubuntu-xxx.mk, чтобы поменять LF_TARGET_ROOTFS на buildroot, примерно так:
exportLF_TARGET_ROOTFS=buildroot
3. Установите cross-compilation toolchain:
$ cd {SDK_PATH}/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/
$ source env_install_toolchain.sh
Примечание: когда компилируется Ubuntu, используйте sudo, чтобы избежать файловых ошибок системы. Следующие инструкции не делают различий между этими двумя вариантами компиляции, но вы действуйте в соответствии с вашей ситуацией.
[Компиляция по частям]
Отдельная компиляция загрузчика U-Boot:
$ ./build.sh clean uboot
$ ./build.sh uboot
Сгенерированные файлы образа: output/image/MiniLoaderAll.bin и output/image/uboot.img
Промышленные устройства, IoT, дроны, где важны размер и скорость
Разработка, прототипирование, когда нужен привычный Linux-инструментарий
Управление пакетами
Нет менеджера пакетов. Софт добавляется на этапе сборки.
Есть apt — можно ставить/удалять что угодно.
Init система
Обычно простой init или busybox init
systemd
Требования к правам
Обычные права пользователя (./build.sh)
Требуются права root (sudo ./build.sh)
[Подробное объяснение]
1. Compile busybox/buildroot
Это стандартный способ для embedded-устройств. Buildroot — это инструмент для сборки, который:
Берет ядро Linux (kernel).
Компилирует минимальный набор системных библиотек (например, uClibc или glibc).
Использует Busybox — "швейцарский нож", который заменяет собой сотни стандартных UNIX-утилит (ls, cp, mv, vi, ifconfig и т.д.) одним бинарным файлом, экономя огромное количество места.
Собирает всё это в компактный образ rootfs (корневой файловой системы).
Результат: Вы получаете минимальную, быструю и экономичную систему, идеально подходящую для финального продукта. Но установить новые программы "на лету" не получится — для этого нужно пересобирать весь образ.
Когда использовать: для готовых устройств, где важны размер, скорость загрузки и безопасность.
2. Compile ubuntu
Это способ для тех, кому нужна полноценная и привычная среда. Здесь скрипты не собирают систему с нуля, а кастомизируют и адаптируют готовые образы Ubuntu (чаще всего Ubuntu Base или Core) под архитектуру Luckfox Pico. В результате вы получаете почти ту же Ubuntu, что и на ПК, но собранную для ARM-процессора. В ней есть менеджер пакетов apt, вы можете легко установить python3, gcc, vim или любой другой пакет из репозиториев Ubuntu.
Почему нужен sudo? Процесс адаптации образа часто involves mounting образы файловых систем и выполнение операций, требующих прав суперпользователя (например, chroot для установки пакетов или настройки).
Когда использовать: Для разработки и отладки, когда вам нужен доступ к большому количеству инструментов и библиотек без необходимости их самостоятельной кросс-компиляции.
[Итог: Какой вариант выбрать?]
Если вы разработчик и хотите быстро протестировать код, использовать привычные инструменты (apt, systemd)? Тогда выбирайте Ubuntu. Если же вы создаете устройство для продажи или развертывания, где критически важен минимальный размер образа и максимальная скорость? Выбирайте Buildroot/Busybox.
На практике часто начинают с Ubuntu для удобства прототипирования, а для финальной версии продукта переходят на Buildroot, чтобы оптимизировать образ.
Gitee Source (или Gitee источник) — это серверы-зеркала (репозитории) на платформе Gitee.com, которые хранят копии исходного кода и пакетов с других открытых платформ (в первую очередь — GitHub). Их основная цель — ускорение доступа к этим ресурсам для разработчиков внутри Китая.
Если говорить проще, Gitee Source — это "зеркало" или "кэш" для исходного кода.
Детальное объяснение:
Для чего это нужно?
Обход ограничений: прямой доступ к международным платформам, like GitHub, из Китая может быть медленным, нестабильным или вовсе ограниченным (из-за Великого файервола).
Высокая скорость: Gitee-зеркала расположены на территории Китая, поэтому местные разработчики и системы CI/CD (как в вашем случае со сборкой Luckfox Pico) могут скачивать код и пакеты с огромной скоростью.
Национальная безопасность: создание локальных копий критически важного opensource-кода является элементом технологического суверенитета.
Как это работает?
Платформа Gitee автоматически или вручную периодически синхронизируется (копирует) популярные репозитории с GitHub и других платформ.
Когда вы в процессе сборки (как примере с ./build.sh) указываете использовать gitee source, система не идет на GitHub за исходным кодом ядра Linux, тулчейна (toolchain) или библиотек, а скачивает их с быстрого локального зеркала на Gitee.
Где вы с этим сталкиваетесь?
Именно в сценариях, подобных вашему — при сборке прошивок для embedded-устройств (Luckfox Pico, Raspberry Pi, Orange Pi и т.д.) с помощью скриптов вроде build.sh. Внутри таких скриптов часто есть выбор source (источника для загрузки). Обычно это выглядит так:
• github (оригинальный, медленный для Китая) • gitee (зеркало, быстрое для Китая) • Иногда gitlab или другие.
Пример из практики: допустим, скрипту сборки нужен исходный код ядра Linux (linux.git). Вместо того чтобы клонировать его с https://github.com/torvalds/linux, что будет медленно, он клонирует его с https://gitee.com/mirrors/linux.git, что происходит почти мгновенно.
Итог:
Gitee Source — это техническое решение для ускорения и стабилизации разработки внутри Китая путем создания локальных копий международных opensource-репозиториев. Когда вы в процессе сборки видите упоминание gitee, это означает, что инструменты будут качать код не с медленного GitHub, а с его быстрого китайского зеркала.
В вашем случае, при выполнении ./build.sh lunch, вам, скорее всего, предложат выбрать платформу (например, luckfox_pico) и, возможно, источник для загрузки (github или gitee). Выбор gitee значительно ускорит процесс, если вы находитесь в Китае или используете китайское железо/провайдера.
В контексте одноплатных компьютеров LuckFox (и других подобных плат на процессорах Rockchip), термин `media` имеет очень конкретное и важное значение.
`Media` здесь — это сокращение от "Multimedia" и относится к подсистеме обработки мультимедиа внутри процессора (SoC). Это целый набор аппаратных блоков (IP-ядер) и программного обеспечения, отвечающих за работу с видео и изображениями.
Если говорить просто, `media` в LuckFox — это всё, что позволяет плате "видеть" и "показывать".
[Что входит в подсистему Media?]
Эта подсистема включает в себя два основных направления:
1. Видеозахват (Video Input - VI). Это аппаратные блоки и драйверы, отвечающие за приём видео от камер.
ISP (Image Signal Processor): "Мозги" обработки изображения. Он преобразует сырые данные (raw data) с матрицы камеры в привычное нам изображение, выполняя:
• Дебейеризацию (Demosaic) — преобразование сырых данных с Bayer-фильтра в цветное изображение. • Коррекцию белого (AWB) • Автоэкспозицию (AE) • Подавление шумов (3DNR) • Резкость (Sharpness) • Коррекцию линз (LSC)
MIPI CSI (Camera Serial Interface): hardware-интерфейс, к которому физически подключаются современные камерные модули (например, ваши камеры LuckFox).
VIPP (Video Input Post Processor): блок для дальнейшей обработки уже сформированного изображения (масштабирование, обрезка).
2. Видеовывод и Кодирование/Декодирование (Video Output & Codec). Это аппаратные блоки, отвечающие за сжатие, распаковку и вывод видео.
VPU (Video Processing Unit): hardware-энкодер и декодер. Именно он позволяет кодировать (сжимать) видео с камеры в форматы **H.264** или **H.265 (HEVC)** с очень малым потреблением энергии процессора. Это критически важно для видеорегистраторов, камер наблюдения.
VOP (Video Output Processor): блок, управляющий выводом изображения на дисплей (например, по HDMI или через LVDS-интерфейс).
[Где вы встречаетесь с термином "media" в LuckFox?]
1. В Device Tree (`*.dts`): конфигурация всей подсистемы `media` (какие камеры подключены, их разрешение, режимы работы ISP) прописывается в файле дерева устройств.
2. В ядре Linux (`kernel/`): драйверы, находящиеся в разделах типа `drivers/media/platform/rockchip/isp/`, `.../mipi-csi/`, `.../rkcif/`.
3. В пользовательском пространстве:
• Утилита `rkisp_demo`: позволяет тестировать и настраивать работу ISP (задавать параметры цветокоррекции, резкости и т.д.). • Утилита `v4l2-ctl`: стандартная Linux-утилита для работы с видеоустройствами (Video4Linux2). Через неё можно посмотреть список доступных камер (`v4l2-ctl --list-devices`), получить формат изображения с камеры и т.д. • Утилита `rkmpp`: набор утилит для работы с hardware-кодеком (VPU) — кодирование, декодирование видео.
Пример рабочего потока (pipeline) `media`:
Камера (Sensor)
-> MIPI CSI-2 Interface -> CIF (Capture Input Frame) -> ISP (Image Signal Processor) -> RGA (для rotation/scaling) -> VPU (для кодирования в H.264) -> Файл или сеть (RTSP-поток).
Итог:
В контексте LuckFox термин `media` — это не абстрактное "медиа", а конкретное название мощной аппаратно-программной подсистемы, которая отвечает за:
* Захват видео с камеры * Обработку изображения (улучшение качества) * Кодирование и декодирование видео * Вывод видео на дисплей
Именно эта подсистема является ключевым преимуществом процессоров Rockchip и делает платы LuckFox такими популярными для проектов компьютерного зрения, видеонаблюдения и потокового вещания.
Buildroot — это не дистрибутив Linux (как Ubuntu или Debian), а система автоматизации сборки. Её главная задача — собрать всё необходимое для работы встроенной системы (embedded Linux) из исходного кода с помощью инструмента make.
Представьте себе конструктор или конвейер, который по вашему заказу:
• Скачивает исходные коды нужной версии ядра Linux, библиотек и программ. • Настраивает и компилирует их друг за другом, учитывая все зависимости. • На выходе выдает готовые образы: ядро (kernel.img), Device Tree (dtb) и, самое главное, корневую файловую систему (rootfs) — то есть набор всех библиотек, системных утилит и ваших программ, упакованный в один файл.
Главная философия Buildroot — создавать минималистичные и эффективные системы без лишнего софта, что идеально для устройств с ограниченными ресурсами, наподобие плат разработчика Luckfox Pico Mini.
Buildroot предоставляется производителем (Luckfox) в составе Software Development Kit (SDK), и внутри этого SDK Buildroot является основным движком для сборки всей операционной системы.
Когда вы скачиваете официальный SDK для Luckfox Pico, его структура обычно включает:
buildroot/ — Сама система Buildroot с конфигурациями и настройками от Luckfox. linux/ — Исходный код ядра Linux, патченного для поддержки чипа RV1103. uboot/ — Исходный код загрузчика U-Boot. output/ — Директория, куда помещаются готовые образы после сборки.
Процесс разработки выглядит так:
1. Вы входите в директорию SDK.
2. Запускаете команду ./build.sh (это скрипт-обертка от Luckfox). Он скрипт запускает Buildroot, который, в свою очередь:
- Компилирует кросс-компилятор (gcc) для архитектуры ARM. - Конфигурирует и компилирует ядро Linux. - Компилирует загрузчик U-Boot. - Собирает корневую файловую систему: берет базовый набор утилит (BusyBox), добавляет именно те библиотеки и программы, которые указаны в конфигурации (например, поддержку Wi-Fi, инструменты для работы с GPIO, примеры кода для работы с камерой и NPU).
3. В результате в папке output/ вы получаете файлы rootfs.img, kernel.img и другие, которые можно прошить на вашу плату с помощью инструмента RKDevTool.
Buildroot для Luckfox Pico Mini используется по следующим соображениям:
• Легковесность: итоговая система получается очень маленькой. Образ rootfs.img может весить всего несколько десятков мегабайт, что идеально для встроенных устройств. • Простота и скорость: процесс сборки полностью автоматизирован одной командой. Не нужно вручную собирать каждую библиотеку. • Полный контроль: вы можете тонко настроить систему через конфигурационное меню (make menuconfig), чтобы включить или выключить тысячи опций, добавить конкретные библиотеки или свои приложения. Это избавляет систему от любого "мусора". • Повторяемость: процесс сборки детерминирован. Вы можете быть уверены, что соберете абсолютно идентичную систему на другой машине, что критически важно для разработки и промышленного применения.
[Альтернативы Buildroot]
Часто Buildroot сравнивают с Yocto Project. Оба решают одну задачу, но по-разному:
Buildroot: Проще в освоении, быстрее собирает систему, идеален для относительно простых устройств и быстрого прототипирования (как в случае с Luckfox Pico).
Yocto: Более мощный, гибкий и сложный инструмент, предназначенный для создания промышленных дистрибутивов с поддержкой множества пакетов и архитектур. Его кривая обучения значительно круче.
Итог:
Buildroot в контексте Luckfox Pico Mini — это "сердце" процесса сборки прошивки. Это инструмент, который превращает исходные коды ядра Linux, загрузчика U-Boot и сотен отдельных программ в единый, готовый к прошивке, минималистичный и оптимизированный образ операционной системы, который превращает голое "железо" Luckfox Pico в работающий мини-компьютер с Linux, способный выполнять ваши задачи.
Без Buildroot вам пришлось бы вручную компилировать и компоновать все части ОС, что является невероятно сложной и трудоемкой задачей. Buildroot автоматизирует этот процесс до одной команды.
Определить модель платы LuckFox Pico можно несколькими способами, от самого простого (визуальный осмотр) до более сложных (программных).
[Способ 1: визуальный осмотр (cамый быстрый и простой)]
Это первый и часто самый эффективный шаг. Посмотрите на вашу плату и найдите ключевые отличия. Ниже перечислены ключевые признаки для идентификации.
1. Размер и форма платы:
LuckFox Pico: самая маленькая плата (примерно 20x20 мм), квадратной формы. Выглядит как "голый" модуль без портов. LuckFox Pico Plus: чуть больше (примерно 30x30 мм), тоже квадратной формы. Часто на модуле есть металлическая крышка-радиатор. LuckFox Pico Mini: имеет вытянутую прямоугольную форму (примерно 56x26 мм). Все компоненты распаяны прямо на плате, модульной конструкции нет. На нижней стороне платы (противоположной кнопке BOOT) шелкографией нанесена надпись "Luckfox Pico Mini". LuckFox Pico Pro: cамая большая плата (примерно 56x56 мм), имеет прямоугольную форму с множеством разъемов.
2. Наличие и тип интерфейсов:
Ethernet (Сетевой порт RJ45): есть только у LuckFox Pico Mini A и LuckFox Pico Mini B. У модели "A" один порт, у модели "B" два порта. USB Type-C (для питания и данных): есть у всех моделей Mini, Plus и Pro. У базового Pico его нет (присутствуют только контакты для пайки). Разъем для камеры (MIPI CSI): есть у Mini B, Plus и Pro. У Mini A и базового Pico его нет. Разъем для дисплея (MIPI DSI): есть только у LuckFox Pico Pro.
3. Количество и расположение контактов GPIO:
LuckFox Pico: 24 контакта (2 ряда по 12 с каждой стороны). LuckFox Pico Mini: 22 контакта (2 ряда по 11 вдоль длинной стороны). LuckFox Pico Plus: 38 контактов. LuckFox Pico Pro: 48 контактов.
LuckFox Pico:
LuckFox Pico Mini A/B:
B-версия LuckFox Pico Mini отличается от A-версии только наличием распаянной на плате Flash памяти на 128 Мб. На Flash можно поставить операционную систему, но объема 128 Мб довольно мало (хотя в варианте сборки Buildroot для многих задач может хватить). Если использовать загрузку с карты SD, где памяти может быть намного больше, то Flash на плате можно использовать в качестве резервного хранилища важных данных, например, логов.
LuckFox Pico Plus:
LuckFox Pico Pro/Max:
LuckFox Pico Ultra/Ultra W:
[Способ 2: определение через Linux (если плата уже прошита)]
Если плата запускается, и у вас есть доступ к её командной строке (через UART, SSH или ADB [4]), то вы можете использовать несколько команд.
1. Посмотреть модель в `proc/device-tree/` (самый точный способ). Проприетарные параметры платы хранятся в Device Tree. Выполните команду:
# cat /proc/device-tree/model
Результат будет прямо указывать на модель, например:
`luckfox,pico` → LuckFox Pico `luckfox,pico-mini` → LuckFox Pico Mini `luckfox,pico-plus` → LuckFox Pico Plus `luckfox,pico-pro` → LuckFox Pico Pro
2. Посмотреть информацию о процессоре. Следующая команда покажет не модель платы, а модель чипа, это тоже может быть полезно.
[root@luckfox ]# cat /proc/cpuinfo
processor : 0
model name : ARMv7 Processor rev 5 (v7l)
BogoMIPS : 26.08
Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xc07
CPU revision : 5
Hardware : Rockchip (Device Tree)
Revision : 0000
Serial : 359238bf91d2b5a8
3. Проверить наличие определенных устройств (косвенный метод). Проверить сетевые интерфейсы позволяет команда `ifconfig -a` или `ip addr`:
Если видите `eth0` и `eth1`, то скорее всего это Pico Mini B. Если видите только `eth0`, то скорее всего это Pico Mini A. Если Ethernet-интерфейсов нет вообще, то это базовая Pico (без Ethernet).
Проверить наличие аудиоустройства: команда `ls /dev/snd/`.
[root@luckfox ]# ls /dev/snd/ by-pathcontrolC0 pcmC0D0c pcmC0D0p
Наличие звуковых устройств характерно для моделей Plus и Pro.
[Способ 3: по надписям на упаковке или плате]
Производитель часто наносит шелкографию с названием модели на саму плату. Ищите надписи типа "Pico", "Pico Mini", "Pico Plus" или "Pico Pro".
Коробка или антистатический пакет, в котором пришла плата, почти всегда имеют наклейку с точным указанием модели (например, "LuckFox Pico Mini B").
Таким образом, каждая из этих команд представлена не отдельной программой, а всего лишь "ссылкой" на главный исполняемый файл `busybox`. Например, когда вы вызываете команду `ls`, на самом деле система запускает `busybox ls`, и BusyBox "понимает", что нужно выполнить функцию `ls`.
Почему BusyBox КРИТИЧЕСКИ важен для LuckFox Pico Mini? Именно здесь преимущества BusyBox раскрываются в полной мере:
1. Экономия места файловой системы (что крайне важно!):
- LuckFox Pico Mini имеет ограниченный объем флеш-памяти (обычно 4GB или 16GB eMMC), часть которой занята ядром Linux и вашими приложениями. - Если бы все утилиты (`ls`, `cp`, `ping` и т.д.) были полноценными отдельными бинарными файлами (как в Ubuntu), они заняли бы десятки мегабайт. - BusyBox упаковывает все эти функции в один исполняемый файл размером всего 1-2 мегабайта. Это огромная экономия драгоценного пространства.
2. Экономия оперативной памяти: запущенные программы занимают оперативную память (RAM). Так как BusyBox — это одна программа, а не множество, она использует меньше RAM при выполнении различных задач.
3. Упрощение сборки и управления: разработчикам встраиваемых устройств проще управлять одним пакетом (BusyBox), который предоставляет весь базовый функционал, вместо того чтобы отслеживать сотни отдельных мелких утилит. При сборке прошивки с помощью Buildroot (см. Q002) просто выбирается конфигурация BusyBox с нужным набором функций.
4. Скорость и эффективность: BusyBox оптимизирован для работы на системах с ограниченными ресурсами, таких как LuckFox Pico Mini. Его код написан с упором на минимализм и скорость.
Итак, когда вы подключаетесь к своей плате через UART, SSH или ADB и попадаете в командную строку встраиваемой системы, практически с каждым вашим действием происходит взаимодействие с BusyBox.
Проверка, что вы используете BusyBox: введите любую команду с ключом --help, и вы увидите сигнатуру BusyBox. Например:
.[root@luckfox ]# ls --help
BusyBox v1.36.1 (2025-09-16 13:42:36 MSK) multi-call binary. Usage: ls [-1AaCxdLHRFplinshrSXvctu] [-w WIDTH] [FILE]... List directory contents
-1 One column output
-a Include names starting with .
-A Like -a, but exclude . and ..
-x List by lines
-d List directory names, not contents
-L Follow symlinks
-H Follow symlinks on command line ...
Первая строка четко указывает, что это BusyBox.
Можно посмотреть, какие функции встроены в BusyBox. Для этого выполните команду `busybox` без аргументов, и она выведет большой список всех поддерживаемых applets (маленьких приложений-функций).
Таким образом, BusyBox в контексте LuckFox — это фундаментальный строительный блок встраиваемой операционной системы. Это минималистичная, невероятно эффективная и универсальная замена всем стандартным UNIX-инструментам, которая позволяет уместить мощную и функциональную командную среду Linux в несколько мегабайт, что идеально соответствует ограниченным ресурсам платы. Без BusyBox встроенные Linux-системы like LuckFox Pico Mini были бы гораздо больше, дороже и менее эффективны.
На самой плате поддерживаются busybox, buildroot и Ubuntu 22.04. На машине разработчика для кросс-компиляции может использоваться Ubuntu 24.04 или Docker.
Запустите SocToolKit с правами администратора, и затем установите TF-карту. Если она все еще не распознается, закройте ПО антивируса. Попробуйте также загрузить новую версию SocToolKit.
Облачный диск не предоставляет образ системы buildroot, подходящий для загрузки с карты SD. Вам нужно самостоятельно скомпилировать его в соответствии с секцией SDK. Поскольку емкость SD-карт может быть разной, вам необходимо вручную подстроить емкость раздела.
При установке TF-карты в плату Luckfox Pico и подключении к компьютеру SocToolKit показывает режим Maskrom, и программа не может быть прошита.
Причина в том, что Luckfox Pico поддерживает только лишь загрузку с TF-карты (TF card boot). Используйте картридер для записи карты, после чего установите карту в слот платы для запуска системы.
Попытка подключения не удается с сообщением, что подключенная сторона не ответила должным образом через определенный промежуток времени, или из-за того, что подключенный узел не ответил.
Для решения проблемы сконфигурируйте виртуальный сетевой интерфейс RNDIS.
Проверьте совместимость уровней логики последовательного интерфейса, и не перепутаны ли прием с передачей (сигналы RX и TX). Luckfox-Pico работает с сигналами уровня логики 3.3V, и требует соответствующей установки уровней на модуле переходника USB - TTL UART.
Для Luckfox-Pico-Pro/Max фактический размер памяти меньше 128MB и 256MB. Если камера не используется, то вы можете освободить память модификацией переменной RK_BOOTARGS_CMA_SIZE, изменив значение 66M на 1M.
Если взять в качестве примера Luckfox-Pico-Pro, то модификация выглядит следующим образом:
После подключения Luckfox-Pico-Plus/Pro/Max через последовательный порт устройство все время посылает сообщение "udhcpc: sending discover".
Если сетевой кабель не подключен, то в лог будет выводиться сообщение "udhcpc: sending discover". Подключите сетевой кабель, или используйте команду kill для остановки процесса udhcpc.
# ps | grep udhcpc
248 root 1196 S udhcpc -i eth0
311 root 1192 S grep udhcpc
# kill 248
udhcpc: received SIGTERM
Причина в том, что factory image предназначен главным образом для тестирования функционала GPIO. Вам необходимо самостоятельно прошить образ из онлайн-репозитория.
Вы должны использовать инструментарий кросс-компиляции из SDK. После кросс-компиляции на хосте Ubuntu или виртуальной машине выгрузите результат компиляции на плату.
При загрузке виртуальной машины VirtualBox появляется ошибка "VT-x is disabled in the BIOS for both all CPU modes (VERR_VMX_MSR_ALL_VMX_DI)".
Причина ошибки в том, что не разрешена технология виртуализации CPU на материнской плате хоста. Выполните следующие шаги, основываясь на модели вашей материнской платы для доступа к BIOS компьютера:
1. Например, материнские платы ASUS для входа в BIOS используют клавишу F2 во время запуска. 2. Выберите Advanced settings. 3. Найдите раздел CPU Configuration и установите разрешенной опцию Intel Virtualization Technology. 4. В завершение нажмите F10 для сохранения изменений и перезапуска компьютера.
Программа VLC по умолчанию использует видеобуфер размером в 1 секунду (1000ms = 1s). Можно умеренно сократить время буферизации для улучшения real-time производительности, но слишком низкая задержка может привести к потере пакетов и заиканию. Не рекомендуется устанавливать размер буфера меньше 300ms.
$ sudo cp -r luckfox-pico/ ~/Luckfox-test/
$ cd ~/Luckfox-test/luckfox-pico/
$ ./build.sh lunch
ls: cannot access 'BoardConfig*.mk': No such file or directory
You're building on Linux
Lunch menu... pick a combo:
... показываются варианты для выбора платы ...
Which would you like? [0]: 2
ln: failed to create symbolic link '/home/luckfox/Luckfox-test/luckfox-pico/.BoardConfig.mk':
Permission denied [build.sh:error] Running build_select_board failed!
[build.sh:error] exit code 1 from line 191: [build.sh:info] ln -rfs $TARGET_PRODUCT_DIR/$RK_BUILD_TARGET_BOARD $BOARD_CONFIG
Возможная причина ошибки в том, что используется команда sudo в процессе копирования, поэтому могут быть измерены права доступа к файлам в SDK. Удалите и заново выполните копирование с правами обычного пользователя.
При компиляции происходит ошибка загрузки модуля драйвера Linux, SDK не компилируется после clean.
Случай 1:
Решение: используйте ./build.sh для полной перекомпиляции.
Случай 2:
Решение: выполните команду:
$ make ARCH=arm CROSS_COMPILE=/home/luckfox/Luckfox-Pico/luckfox-pico/tools/linux/toolchain/\
arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-
На платах LuckFox, включая Pico Mini, нет единой универсальной команды, которая бы просто вывела "список разрешенных периферийных устройств". Вместо этого используется комбинация команд для анализа Device Tree (дерева устройств) и состояния ядра Linux.
Вот как это правильно сделать:
1. Основной способ: анализ Device Tree
Device Tree (DT) — это структура данных, которая описывает аппаратное обеспечение платы ядру Linux. Именно в ней "разрешаются" или "запрещаются" периферийные устройства.
Самая важная команда:
# cat /sys/firmware/devicetree/base/compatible
Эта команда покажет модель вашей платы, которую ядро использует для загрузки правильной конфигурации. Для LuckFox Pico Mini вы увидите что-то вроде:
Это покажет список всех узлов высокого уровня (например, `gpio@fdd60000`, `serial@ff9c0000`). Это не названия периферии в привычном виде, а технические имена.
b) Поиск по ключевым словам (самый практичный метод). Используйте `grep` для поиска упоминаний конкретных интерфейсов в смонтированном дереве устройств.
Для UART (последовательный порт):
# find /proc/device-tree/ -name "*uart*" | head -5
Для I2C:
# find /proc/device-tree/ -name "*i2c*" | head -5
Для SPI:
# find /proc/device-tree/ -name "*spi*" | head -5
Для PWM:
# find /proc/device-tree/ -name "*pwm*" | head -5
Если команда возвращает пути к файлам (например, `/proc/device-tree/pwm@fdd70000`), значит, этот контроллер активирован в Device Tree.
2. Проверка, загрузились ли драйверы устройств. Даже если устройство разрешено в DT, стоит проверить, увидело ли его ядро и загрузило ли драйвер.
a) Просмотр списка зарегистрированных устройств:
# ls /sys/devices/platform/
Здесь вы увидите список платформенных устройств, которые были обнаружены ядром.
b) Проверка конкретных интерфейсов.
I2C: посмотреть, какие I2C адаптеры (шины) доступны в системе.
# i2cdetect -l
SPI: проверить, есть ли устройства SPI.
# ls /dev/spidev*
PWM: посмотреть, экспортированы ли каналы PWM.
# ls /sys/class/pwm/
GPIO: управление GPIO происходит через sysfs.
# ls /sys/class/gpio/
UART: последовательные порты.
# ls /dev/ttyS*
3. Прямой просмотр исходного файла Device Tree (если есть доступ). Самый полный, но и самый сложный способ — посмотреть исходный файл *.dts. Его обычно нет на самой плате, но он есть в SDK на вашем компьютере.
Строка `status = "okay";` означает, что устройство разрешено. Если стоит `status = "disabled";` — устройство отключено.
Краткий итог для быстрой проверки на плате LuckFox Pico Mini:
1. UART: `ls /dev/ttyS*` (должен быть `ttyS0` и другие). 2. I2C: `i2cdetect -l` (должна быть как минимум одна шина, например `i2c0`). 3. SPI: `ls /dev/spidev*` (часто по умолчанию отключен для экономии энергии). 4. PWM: `ls /sys/class/pwm/` (должны быть видны `pwmchip0`, `pwmchip4` и т.д.).
Вывод: не существует команды наподобие `list-peripherals`. Чтобы узнать список разрешенных устройств, нужно анализировать дерево устройств через `/proc/device-tree/` и проверять состояние драйверов в `/sys/` и `/dev/`.
Предположим, что на плате LuckFox Pico Mini есть директория /oem/spitest, и в ней вы тестируете программу в исполняемом файл spi, который для обновления нужно каждый раз перезаписывать. Тогда скрипт компиляции может выглядеть примерно так:
#!/bin/bash
# Удалим предыдущий результат компиляции:
rmspi # Компиляция spi.c в исполняемый файл spi:
arm-rockchip830-linux-uclibcgnueabihf-gccspi.c-ospi # Удалить файл spi на целевом устройстве LuckFox Pico Mini:
adbshell"rm /oem/spitest/spi" # Записать в то же место обновленную версию файла:
adbpush./spi/oem/spitest
В этом примере команда adb shell "rm /oem/spitest/spi" удалит исполняемый файл на плате LuckFox Pico Mini, а команда adb push ./spi /oem/spitest запишет его обновленную версию.
Можно посмотреть и отфильтровать лог компиляции, но ИМХО самый простой и надежный способ - внести в файл *.dts намеренную ошибку. Можно временно переименовать измененный вами файл, либо вставить в него что-то недопустимое, например:
При попытке перепрошить образ утилита upgrade_tool выдает сообщение, что не подключено устройство rockusb:
$ upgrade_tool uf output/image/update.imgNo found any rockusb device,please plug device in!
Проблема в том, что платка LuckFox Pico не введена в режим программирования. Для входа в режим программирования отключите кабель USB (тем самым обесточите плату), нажмите и удерживайте кнопку BOOT, и снова подключите кабель USB. После этого отпустите кнопку BOOT. Устройство готово к прошивке утилитой upgrade_tool.
$ upgrade_tool uf output/image/update.img
Loading firmware...
Support Type:1106 FW Ver:0.0.00 FW Time:2025-09-23 15:00:24
Loader ver:1.01 Loader Time:2025-09-23 14:56:47
Start to upgrade firmware...
Download Boot Start
Download Boot Success
Wait For Maskrom Start
Wait For Maskrom Success
Test Device Start
Test Device Success
Check Chip Start
Check Chip Success
Get FlashInfo Start
Get FlashInfo Success
Prepare IDB Start
Prepare IDB Success
Download IDB Start
Download IDB Success
Download Firmware Start
Download Image... (100%)
Download Firmware Success
Upgrade firmware ok.
Подключение по Ethernet — это очень удобный способ работы с LuckFox Pico Mini, так как он обеспечивает стабильное и быстрое соединение.
Вот пошаговая инструкция, как это сделать.
[Предварительные требования]
Сетевая инфраструктура: Ваш компьютер и плата LuckFox Pico Mini должны быть подключены к одной локальной сети (к одному маршрутизатору/свитчу). USB-C кабель (только для начальной настройки): Вам понадобится его для первоначальной настройки сети на плате. ADB и драйвера: На вашем компьютере должен быть установлен Android Debug Bridge (ADB). Обычно он идет в составе Android SDK Platform-Tools. Скачайте с официального сайта: https://developer.android.com/tools/releases/platform-tools Распакуйте архив и желательно добавьте путь к папке в переменную окружения PATH вашей системы.
[Пошаговая инструкция]
Шаг 1: Первоначальная настройка платы через USB
Подключите плату LuckFox Pico Mini к компьютеру с помощью кабеля USB-C (подключите его к порту OTG на плате). Определите COM-порт (Windows) или устройство (Linux/macOS), к которому подключилась плата. Используйте терминальную программу (например, PuTTY на Windows, screen или minicom на Linux/macOS) для подключения к последовательному порту платы. Скорость соединения (Baud Rate): 1500000 Войдите в систему. Логин по умолчанию: root, пароль обычно не требуется.
Шаг 2: Настройка сети на плате LuckFox Pico Mini
Теперь нужно настроить плату на получение IP-адреса по DHCP от вашего роутера или задать статический IP-адрес.
Способ А: Настройка DHCP (рекомендуется для большинства случаев)
Отредактируйте файл конфигурации сети. Часто для этого используется файл /etc/network/interfaces или команда udhcpc. Для LuckFox часто используется следующий метод:
# Проверьте имя сетевого интерфейса. Обычно это eth0 или end0.
ifconfig -a
# Запустите DHCP-клиент для получения IP-адреса автоматически. # Если интерфейс eth0:
udhcpc -i eth0
# Или можно настроить автоматический запуск при загрузке, отредактировав файл:
vi /etc/init.d/S99luckfox # Добавьте в него строку (перед exit 0):
udhcpc -i eth0 &
Способ Б: Настройка статического IP-адреса
Если вы хотите задать фиксированный IP-адрес, отредактируйте файл конфигурации.
# Пример редактирования файла /etc/network/interfaces vi /etc/network/interfaces # Добавьте или измените строки для интерфейса eth0:
auto eth0
iface eth0 inet static
address 192.168.1.100# Желаемый IP-адрес
netmask 255.255.255.0# Маска подсети
gateway 192.168.1.1# IP-адрес вашего роутера
dns-nameservers 8.8.8.8
# После сохранения файла перезапустите сетевой сервис или плату.
/etc/init.d/S40network restart # или
reboot
Шаг 3: Определение IP-адреса платы
После настройки сети вам нужно узнать, какой IP-адрес получила плата.
На плате выполните команду:
ifconfig eth0
Найдите строку inet addr:. Например, inet addr:192.168.1.50. Это IP-адрес вашей платы. Запишите этот адрес, он понадобится на следующем шаге.
Шаг 4: Подключение ADB по TCP/IP
Подключитесь к плате по USB и убедитесь, что ADB видит устройство через USB. На компьютере выполните в командной строке (или PowerShell/Terminal):
adb devices
Должен появиться список устройств. Если ваша плата подключена по USB, она там будет (возможно, с статусом unauthorized — нужно подтвердить разрешение на отладку на плате, если есть экран).
Переведите ADB в режим TCP/IP на указанный порт (по умолчанию 5555):
Выполните команду, где — это адрес, который вы узнали на Шаге 3.
adb tcpip 5555
В ответ вы должны увидеть сообщение: restarting in TCP mode port: 5555. Отключите USB-кабель от платы. Теперь связь будет осуществляться только по сети.
Подключитесь к плате по сети с помощью ADB:
adb connect:5555
Например: adb connect 192.168.1.50:5555 В случае успеха вы увидите: connected to 192.168.1.50:5555.
Проверьте соединение:
adb devices
Теперь в списке должно отображаться ваше устройство по сетевому адресу, например: 192.168.1.50:5555 device
Готово! Теперь вы можете использовать все стандартные команды ADB (adb shell, adb push, adb pull и т.д.), и они будут выполняться по Ethernet.
[Важные замечания и советы]
Автозапуск ADBD по сети: Чтобы не выполнять adb tcpip 5555 после каждой перезагрузки, вы можете настроить демон ADB (adbd) на плате на автоматический запуск в TCP-режиме. Для этого нужно от редактировать файл /init.usb.rc или аналогичный в прошивке и изменить строку запуска adbd на: start adbd --tcpip=5555 (внесение таких изменений может потребовать пересборки прошивки). Безопасность: Помните, что открытие порта 5555 для ADB делает ваше устройство доступным для подключения из локальной сети. Не делайте это в публичных или недоверенных сетях. Файерволл: Убедитесь, что на вашем компьютере брандмауэр не блокирует исходящие соединения на порт 5555. Если соединение не удается: Проверьте, можете ли вы "пропинговать" плату с компьютера: ping . Если пинг не проходит, проблема в сетевом подключении, а не в ADB.
Теперь вы можете удобно работать с вашей LuckFox Pico Mini по быстрому и надежному Ethernet-соединению.
Указываете серийный номер или IP-адрес устройства:
# Для устройства с IP-адресом
adb -s 192.168.1.50:5555 shell # Для USB-устройства по серийному номеру
adb -s ABCDEF012345 shell # Для эмулятора
adb -s emulator-5554 shell
Способ Б: Использование параметра -d (device) / -e (emulator)
Если у вас подключено только одно физическое устройство и один эмулятор:
# Для единственного физического устройства
adb -d shell # Для единственного эмулятора
adb -e shell
Способ В: Установка переменной окружения ANDROID_SERIAL
Можно задать устройство по умолчанию на время сессии:
# Windows (CMD) set ANDROID_SERIAL=192.168.1.50:5555
adb shell
# Windows (PowerShell)
$env:ANDROID_SERIAL="192.168.1.50:5555"
adb shell
# Проверяем устройства
adb devices # List of devices attached # 192.168.1.50:5555 device # LuckFox Pico Mini # emulator-5554 device # Android Emulator # ABCDEF012345 device # Телефон по USB # Подключаемся к LuckFox Pico Mini по сети
adb -s 192.168.1.50:5555 shell # Или если это единственное сетевое устройство
adb -d shell # Выполняем команды на конкретном устройстве
adb -s 192.168.1.50:5555 shell ls -la
adb -s 192.168.1.50:5555 shell cat /proc/version
# Алиас для быстрого подключения к LuckFox alias adb-luckfox='adb -s 192.168.1.50:5555' alias luckfox-shell='adb -s 192.168.1.50:5555 shell'
# Использование:
adb-luckfox shell
luckfox-shell
[Для Windows - создание пакетных файлов]
Создайте файл luckfox-shell.bat:
@echo off
adb -s 192.168.1.50:5555 shell
[Важные моменты]
Порт обязателен: для сетевых устройств всегда указывайте порт (:5555). Регистр важен: серийные номера обычно чувствительны к регистру. Авторизация: убедитесь, что устройство авторизовано для отладки. Стабильность соединения: для сетевых устройств проверяйте, что соединение активно.
Теперь вы можете легко работать с конкретным устройством, даже когда подключено несколько устройств одновременно!
В этом примере будем управлять ножкой 34 платы LuckFox Pico Mini, которая подключена к светодиоду пользователя:
1. Экспорт вывода GPIO 34 в файловую систему sysfs:
# echo 34 > /sys/class/gpio/export
2. Настройка GPIO 34 на выход:
# echo out > /sys/class/gpio/gpio34/direction
3. Установим лог. 1 на выходе порта GPIO 34:
# echo 1 > /sys/class/gpio/gpio34/value
После этой команды пользовательский светодиод загорится.
4. Установим лог. 1 на выходе порта GPIO 34:
# echo 0 > /sys/class/gpio/gpio34/value
После этой команды пользовательский светодиод погаснет.
5. Если вывод GPIO 34 больше не нужен, то отмените его экспорт:
# echo 34 > /sys/class/gpio/unexport
Обратите внимание, что после отмены экспорта настройка вывода сохранится, т. е. вывод 34 останется выходом, просто вывод 34 больше не будет представлен в файловой системе sysfs.
В menuconfig (как в Buildroot, так и в конфигурации ядра Linux) символы < >, < *> и < M> имеют специальное значение:
[1. Значения символов в menuconfig]
< > (пусто) - пакет/модуль не выбран для сборки < *> (звездочка) - пакет/модуль будет встроен в основную систему (statically linked) < M> (буква M) - пакет/модуль будет собран как отдельный загружаемый модуль (loadable module)
[2. Разница между < *> и < M>]
< *> - Статическая сборка:
Пакет/модуль включается непосредственно в:
- Ядро Linux (для драйверов) - Root filesystem (для приложений) - Не может быть выгружен во время работы - Занимает память постоянно
< M> - Сборка как модуль:
Пакет/модуль собирается отдельно:
- Создается файл .ko (для ядра) или отдельный бинарник - Может быть загружен/выгружен во время работы (insmod/rmmod) - Экономит память, если модуль не используется постоянно
[3. Примеры в контексте LuckFox Pico]
Для драйверов ядра:
Device Drivers --> Character devices --> [*] Serial drivers ← Встроено в ядро < M> USB Serial Converter support ← Собрано как модуль
Для пакетов Buildroot:
Target packages --> Hardware handling --> [*] i2c-tools ← Встроено в rootfs < M> spidev-test ← Собрано как отдельный пакет
[4. Практическое применение для LuckFox Pico]
Когда использовать < *>:
# Критически важные драйверы [*] GPIO support [*] I2C support [*] SPI support
# Базовые утилиты [*] busybox [*] base-files
Когда использовать < M>:
# Специфичные или редко используемые драйверы < M> USB WiFi drivers < M> Bluetooth support < M> Video4Linux drivers
# Дополнительные утилиты < M> iperf3 < M> tcpdump
[5. Работа с модулями после сборки]
Если вы собрали что-то как < M>:
Загрузка модуля:
# На устройстве LuckFox Pico insmod /lib/modules/5.10.110/extra/wifi_driver.ko
RKNN в контексте LuckFox Pico Mini — это ключевая технология для работы с искусственным интеллектом на этом устройстве.
[Что такое RKNN?]
RKNN (Rockchip Neural Network) — это программный стек и формат моделей ИИ, разработанный компанией Rockchip для своих процессоров. Это аналог Google Coral (.tflite) или NVIDIA TensorRT, но для чипов Rockchip.
Архитектура RKNN:
┌─────────────────┐ │ AI-модель │ # TensorFlow, PyTorch, ONNX │ (исходная) │ └─────────────────┘ ↓ ┌─────────────────┐ │ RKNN Toolkit │ # Конвертация и оптимизация │ (на ПК) │ └─────────────────┘ ↓ ┌─────────────────┐ │ RKNN-модель │ # .rknn файл │ (.rknn) │ └─────────────────┘ ↓ ┌─────────────────┐ │ LuckFox Pico │ # Выполнение на NPU │ с RKNN API │ └─────────────────┘
Компоненты RKNN экосистемы:
1. RKNN Toolkit (на ПК)
- Конвертирует модели в формат .rknn - Оптимизация для NPU Rockchip - Квантизация (снижение точности для ускорения) - Отладка и профилирование
2. RKNN Runtime (на LuckFox Pico)
- Библиотека для выполнения моделей - API для C, C++, Python - Управление памятью и ресурсами NPU
3. RKNN Model (.rknn файл)
- Оптимизированный формат модели - Содержит веса и граф вычислений - Готов к выполнению на NPU
[Практическое использование на LuckFox Pico Mini]
Типичный workflow (на языке Python):
fromrknnlite.apiimport RKNNLite
# Загрузка модели:
rknn = RKNNLite()
ret = rknn.load_rknn('model.rknn')
ret = rknn.init_runtime()
# Выполнение inference:
inputs = [...] # входные данные
outputs = rknn.inference(inputs=[inputs])
1. Высокая производительность - Использование **NPU** (Neural Processing Unit) - До 0.5 TOPS на некоторых моделях Rockchip - Энергоэффективное выполнение
2. Низкая задержка
- Оптимизировано для embedded-устройств - Минимальное использование CPU
- Поддержка не всех операторов нейросетей - Квантизация может снижать точность - Память ограничена размерами NPU - Тепловыделение при интенсивной работе
Типичный процесс разработки:
1. Обучение модели на ПК (TensorFlow/PyTorch) 2. Конвертация в RKNN через RKNN Toolkit 3. Развертывание на LuckFox Pico 4. Интеграция в приложение через RKNN API
Полезные команды:
# Проверка поддержки NPU cat /proc/device-tree/model
# Загрузка драйверов RKNN modprobe rknpu
# Примеры из репозитория LuckFox git clone https://github.com/LuckfoxTech/luckfox-pico
В итоге: RKNN — это мост между стандартными фреймворками машинного обучения и аппаратным ускорением на чипах Rockchip, что делает LuckFox Pico Mini мощным устройством для embedded AI приложений.
См. также:
RKNN Model Inference Test site:wiki.luckfox.com. Guide to Using RKNN Instances site:wiki.luckfox.com. Q041. Что такое RKMPI?
RKMPI в контексте LuckFox Pico Mini — это мультимедийный программный интерфейс (Media Process Interface) от Rockchip для работы с аппаратными блоками медиасистемы.
[Что такое RKMPI?]
RKMPI (Rockchip Media Process Interface) — это программный SDK, предоставляющий API для доступа к аппаратным мультимедийным возможностям процессоров Rockchip, включая:
- Видео кодирование/декодирование (VPU - Video Processing Unit) - Обработка изображений (ISP - Image Signal Processor) - Аудио обработка - Вывод на экран - Работа с памятью
Захват с камеры → ISP → RGA (масштабирование) → AI обработка: VI → ISP → RGA → RKNN (AI inference)
[Преимущества RKMPI]
1. Аппаратное ускорение:
- Низкое энергопотребление - Высокая производительность - Минимальная загрузка CPU
2. Низкая задержка
- Обработка в реальном времени - Прямая передача между блоками (zero-copy)
3. Полный контроль
- Тонкая настройка параметров - Доступ к RAW данным
Ограничения:
- Сложность программирования - Документация преимущественно на китайском - Требует глубокого понимания media pipeline
[Полезные утилиты]
Тест кодирования:
# rkmpp_venc_test
Тест декодирования:
# rkmpp_vdec_test
Информация о системе:
# cat /proc/rk_camship
Проверка аппаратных блоков:
# ls /dev/ | grep -E "vpu|rga|isp"
[Сравнение с другими технологиями]
Технология
Назначение
Уровень
RKMPI
Мультимедиа (видео/аудио)
Низкоуровневый
RKNN
Нейронные сети (AI)
Высокоуровневый
GStreamer
Мультимедиа пайплайны
Прикладной
OpenCV
Компьютерное зрение
Библиотека
В итоге: RKMPI — это фундаментальный инструмент для создания высокопроизводительных мультимедийных приложений на LuckFox Pico Mini, обеспечивающий прямой доступ к аппаратным возможностям чипа Rockchip.
См. также:
Q040. Что такое RKNN? RKMPI Instance User Guide site:wiki.luckfox.com.
- Робототехника (навигация, SLAM) - Медицина (анализ снимков) - Безопасность (распознавание лиц, детектирование движения) - Автомобильная промышленность (ADAS) - Дополненная реальность - Промышленный контроль качества
В итоге: OpenCV — это "швейцарский нож" для разработчиков в области компьютерного зрения, предоставляющий готовые, оптимизированные алгоритмы для самых разнообразных задач обработки изображений и видео.
Чтобы отключить устройство, используйте adb disconnect:
$ adb disconnect 192.168.1.100:5555
disconnected 192.168.1.100:5555
$ adb devices
List of devices attached
359238bf91d2b5a8 device
Чтобы снова подключить устройство, используйте команду adb connect:
$ adb connect 192.168.1.100:5555
connected to 192.168.1.100:5555
$ adb devices
List of devices attached
359238bf91d2b5a8 device
192.168.1.100:5555 device
Отключение всех сетевых устройств, используется adb disconnect без параметров (отключатся только сетевые устройства, USB-устройство останется подключенным):
$ adb disconnect
disconnected everything
$ adb devices
List of devices attached
359238bf91d2b5a8 device
Такая необходимость может возникнуть, если по какой-то причине подключиться через USB/ADB или Ethernet/SSH не представляется возможным. Например, вы собираетесь пересобрать Buildroot в конфигурации, когда порт USB будет использоваться как хост USB.
[Что понадобится]
1. Переходничок USB - TTL UART с уровнями логики 3.3V (на чипе CP2102, CH340, FT232 и т. п.). 2. Программа терминала на компьютере хоста - putty или minicom, или что-то подобное. 3. Плата LuckFox Pico.
[Как определить сигналы RX и TX]
1. Просмотрите список портов tty командой:
[root@luckfox ]# ls -1 /dev | grep tty
Выведется примерно вот такой список:
tty
tty0
tty1
tty10
tty11
..
tty8
tty9
ttyFIQ0
Ищите в этом списке устройства ttyS*, ttyAMA*, ttyFIQ*. Обычно для подключения к консоли используют ttyS0 и ttyFIQ0.
Также можно просмотреть список загрузочных сообщений командой:
В этом примере видно, что для консоли используется ttyFIQ0.
2. Запустите в терминале команду:
[root@luckfox ]# echo "hello" > /dev/ttyFIQ0
И с помощью осциллографа смотрите, на каком выводе появится сигнал передачи UART. На моей платке LuckFox Pico Mini B это оказался контакт 4 (порт 42, GPIO1_B2_d, UART2_TX_M1).
Это и будет сигнал TX. По длительности минимального бита видно, что это скорость 115200 бод. Соответственно сигнал RX будет на контакте 5 (порт 43, GPIO1_B3_u, UART2_RX_M1).
3. С помощью программы luckfox-config можно ознакомиться с текущей настройкой выводов:
Настройте подключение к порту адаптера USB - TTL UART с помощью программы терминала на скорости 115200, 8 бит данных, 1 стоп-бит, без контроля четности. Можно использовать различные программы терминала.
Windows:
Putty Tera Term SecureCRT
Linux/macOS:
Minicom Screen Picocom Putty
Пример подключения с помощью minicom (логин root, пароль luckfox):
$ minicom -D /dev/ttyUSB1
Welcome to minicom 2.9
OPTIONS: I18n
Port /dev/ttyUSB1, 09:40:33
Press CTRL-A Z for help on special keys
Welcome to luckfox pico
luckfox login: root
Password:
[root@luckfox root]#
~/luckfox-pico$ upgrade_tool ul output/image/update.img
Loading loader...
Support Type:RK1106 Loader ver:1.01 Loader Time:2025-09-30 13:58:34
Start to upgrade loader...
Download Boot Start
Download Boot Success
Wait For Maskrom Start
Wait For Maskrom Success
Test Device Start
Test Device Success
Check Chip Start
Check Chip Success
Get FlashInfo Start
Get FlashInfo Success
Prepare IDB Start
Prepare IDB Success
Download IDB Start
Download IDB Success
Upgrade loader ok.
Проблема в том, что upgrade_tool загрузил только загрузчик (loader), но не саму прошивку.
Что произошло:
Загрузчик успешно загружен в RAM. Утилита перевела устройство в режим Maskrom. Утилита проверила чип и информацию о flash-памяти. Но не записала основную прошивку.
Проблема в том, что была ошибочно указана опция ul (upgrade loader) вместо uf (upgrade firmware).
Решения:
1. Используйте параметр uf для полной прошивки:
$ upgrade_tool uf output/image/update.img
2. Или используйте для принудительной записи:
$ upgrade_tool uf output/image/update.img
3. Проверьте режим устройства:
$ upgrade_tool pl
Убедитесь, что устройство в режиме Loader или Maskrom.
4. Альтернативные команды: используйте RKDevTool (графическая утилита) или rkdeveloptool.
- Переведите устройство в режим Maskrom (зажать кнопку Boot и нажать Reset или выдернуть и снова вставить кабель). - Выполните: upgrade_tool uf output/image/update.img. - Дождитесь полного завершения процесса.
Ключевое отличие: ul загружает только loader, uf прошивает всю систему.
После этого можно прошить память SPI FLASH командой:
$ upgrade_tool uf output/image/update.img
[Конфигурирование пакетов и ядра Buildroot]
Сборка пакетов и приложений конфигурируется командой:
$ ./build.sh buildrootconfig
Сборка ядра конфигурируется командой:
$ ./build.sh kernelconfig
Подсказка по командам:
$ ./build.sh --help
Usage: build.sh [OPTIONS]
Available options:
lunch -Select Board Configure
env -build env
meta -build meta (optional)
uboot -build uboot
kernel -build kernel
rootfs -build rootfs
driver -build kernel's drivers
sysdrv -build uboot, kernel, rootfs
media -build rockchip media libraries
app -build app
recovery -build recovery
tool -build tool
updateimg -build update image
unpackimg -unpack update image
factory -build factory image
all -build uboot, kernel, rootfs, recovery image
allsave -build all & firmware & save
clean -clean all
clean uboot -clean uboot
clean kernel -clean kernel
clean driver -clean driver
clean rootfs -clean rootfs
clean sysdrv -clean uboot/kernel/rootfs
clean media -clean rockchip media libraries
clean app -clean app
clean recovery -clean recovery
firmware -pack all the image we need to boot up system
ota -pack update_ota.tar
save -save images, patches, commands used to debug
check -check the environment of building
info -see the current board building information
buildrootconfig -config b # EMMCuildroot and save defconfig
kernelconfig -config kernel and save defconfig
Default option is 'allsave'.
По умолчанию интерфейс USB платки LuckFox Pico в сборке Buildroot работает в режиме устройства USB. Это сделано, в частности, чтобы при подключении через USB к компьютеру можно было подключиться к LuckFox Pico командой adb shell.
$ adb devices
* daemon not running; starting now at tcp:5037
* daemon started successfully
List of devices attached
359238bf91d2b5a8 device
Переконфигурировать USB на работу в режиме хоста можно с помощью команды luckfox-config в терминале Buildroot и последующей перезагрузкой.
Примечание: если вы запустите Buildroot, когда USB работает в режиме хоста, нельзя будет подключаться через adb к плате. Восстановить работу adb можно через подключение Ethernet, если оно у вас настроено, см. Q036. Также можно получить доступ к консоли терминала через UART, см. Q044.
Итак, как переконфигурировать сборку Buildroot, чтобы интерфейс USB работал в режиме хоста. Подключитесь к терминалу Buildroot, и введите команду:
[root@luckfox root]# luckfox-config
Откроется меню конфигурации, войдите в раздел Advanced Options -> USB.
Выберите вариант 2 host, нажмите пробел, это соответствует нажатию кнопки OK для подтверждения выбора. Появится окно о необходимости перезагрузки для того, чтобы изменения вступили в силу.
Нажмите еще раз пробел (OK), и несколько раз Esc для выхода из меню конфигурации. Выполните команду перезагрузки:
[root@luckfox root]# reboot
Чтоб можно было подключать устройства USB, необходимо подать питание +5V на контакт 1 (VBUS) платки LuckFox Pico:
Теперь платка LuckFox Pico будет обнаруживать подключаемые к ней устройства. Вам понадобится USB-хаб с коннектором USB Type-C, например T-809A, T-809B, или любой другой:
При подключении хаба T-809A в консоли Buildroot появится сообщение:
[root@luckfox root]# [ 187.785069] usb 1-1: new high-speed USB device
number 2 using xhci-hcd
[ 187.990667] hub 1-1:1.0: USB hub found
[ 187.991568] hub 1-1:1.0: 4 ports detected
v4l_id - это вспомогательная утилита в Linux-системах, которая играет важную роль в автоматическом определении и настройке видеоустройств, которая:
- Принадлежит пакету udev (система управления устройствами). - Специализируется на идентификации Video4Linux (V4L/V4L2) устройств. - Вызывается автоматически демоном udevd при обнаружении нового видеоустройства.
[Основные функции v4l_id]
1. Сбор информации о видеоустройстве:
- Определяет возможности устройства (форматы, разрешения) - Читает технические характеристики через V4L2 API - Получает идентификаторы устройства (модель, производитель)
Это позволяет обращаться к устройствам по постоянным именам, а не по меняющимся /dev/video0, /dev/video1 и т.д.
Почему v4l_id отсутствует в вашей Buildroot?
В конфигурации Buildroot для LuckFox Pico Mini B часто включают только минимальный набор компонентов для экономии места. Утилита v4l_id может быть исключена как "необязательная".
Как добавить v4l_id в Buildroot?
Способ 1: Через menuconfig или buildrootconfig.
$ cd ~/luckfox-pico/sysdrv/source/buildroot/buildroot-2023.02.6
$ make menuconfig
Или:
$ cd ~/luckfox-pico
$ ./build.sh buildrootconfig
Перейдите в разделы:
Target packages → Hardware handling → udev → [*] Enable udev support → [*] Install udev rules for V4L devices
Способ 2: Проверка существующих пакетов
Некоторые пакеты автоматически включают v4l_id:
$ make menuconfig
И проверьте:
Target packages → Multimedia → [*] v4l2-utils
Что происходит без v4l_id?
- Устройства создаются: /dev/video0, /dev/video1 и т. д. - Работоспособность: jсновные функции видео работают нормально - Недостатки: - Нет удобных симлинков в `/dev/v4l/by-*` - В логах появляются ошибки `failed to execute '/lib/udev/v4l_id'` - Автоматическая классификация устройств не работает
Проверка наличия v4l_id, установлена ли утилита:
# which v4l_id
# ls -la /lib/udev/v4l_id
Проверить наличие симлинков (которые создает v4l_id):
# ls -la /dev/v4l/by-id/
# ls -la /dev/v4l/by-path/
Практическое значение для LuckFox Pico. На платах типа LuckFox Pico, где часто подключаются USB-камеры и устройства видеозахвата, наличие v4l_id полезно для:
1. Стабильности имен - если у вас несколько камер, их порядок в /dev/video* может меняться при перезагрузке. 2. Автоматизации - скрипты могут надежно обращаться к устройствам по постоянным именам. 3. Отладки - проще идентифицировать конкретное устройство в системе.
v4l_id - это не критически важный компонент, но очень полезная утилита для правильной организации видеоустройств в системе. Ее отсутствие не мешает базовой работе с камерами, но создает неудобства и сообщения об ошибках в логах.
eudev - это реализация системы udev (userspace device manager), специально разработанная для встраиваемых систем и дистрибутивов вроде Buildroot. Утилита eudev (Embedded udev) заменяет оригинальную утилиту systemd-udev от Red Hat, которая:
- Работает независимо от systemd - Оптимизирована для встраиваемых систем с ограниченными ресурсами - Обеспечивает динамическое управление устройствами в `/dev`
[Основные функции eudev в Buildroot]
1. Динамическое создание узлов устройств в /dev. Без eudev пришлось бы создавать все устройства статически (через `mknod`), что неэффективно для систем с подключаемыми устройствами.
2. Автоматическая загрузка драйверов. При подключении устройства eudev определяет, какой драйвер нужен, и загружает его.
3. Создание симлинков и персистентных имен. Пример того, что создает eudev:
4. Запуск скриптов при обнаружении устройств. Eudev выполняет правила из `/etc/udev/rules.d/` при подключении/отключении устройств.
[Конфигурация eudev в Buildroot для LuckFox Pico]
Включение eudev:
$ make menuconfig
System configuration → /dev management (Dynamic using eudev) → [*] eudev (Dynamic using eudev)
Дополнительные опции:
Target packages → Hardware handling → [*] eudev → [*] Enable udev support → [*] Install udev rules for V4L devices # включает v4l_id → [*] Install udev rules for devpts
Почему eudev важен для LuckFox Pico?
Для USB-устройств (камеры, флешки, последовательные порты):
- Автоматическое создание /dev/video0, /dev/sda1, /dev/ttyUSB0 - Стабильные имена через симлинки в /dev/disk/by-id/, /de/serial/by-id/
Для встроенных периферийных устройств:
- GPIO, I2C, SPI устройства - Аудиоустройства - Сетевые интерфейсы
Что происходит без eudev? Без eudev в Buildroot обычно используются:
1. Статический /dev - все устройства создаются при компиляции 2. mdev - более легковесная альтернатива (устаревшая) 3. devtmpfs - базовая функциональность без сложных правил
[Практический пример с USB-камерой]
С eudev при подключении камеры автоматически:
[ 561.687738] uvcvideo: Found UVC 1.00 device AV TO USB2.0
- Устройство появится в /dev/videoX (если драйвер загружен) - Но не будет симлинков и дополнительной метаинформации - Могут отсутствовать автоматические действия при подключении
Структура каталогов eudev
/etc/udev/rules.d/ # Пользовательские правила /lib/udev/rules.d/ # Системные правила /lib/udev/ # Вспомогательные утилиты ├── v4l_id # Для видеоустройств ├── ata_id # Для ATA устройств └── scsi_id # Для SCSI устройств
[root@luckfox root]# udevadm test /sys/class/video4linux/video0
Выводы. eudev в контексте LuckFox Pico с Buildroot - это система, которая:
- ✅ Обеспечивает автоматическое управление устройствами - ✅ Создает персистентные имена для USB-устройств - ✅ Загружает драйверы при подключении оборудования - ✅ Выполняет пользовательские скрипты через правила udev
Для плат разработки с частым подключением различных USB-устройств (камер, флешек, последовательных адаптеров) eudev практически необходим для удобной работы.
Почему настройка eth0 не применяется автоматически?
Проблема связана с порядком инициализации служб в Buildroot. Сеть поднимается до того, как все необходимые компоненты системы готовы.
[Причина проблемы]
В Buildroot существует несколько систем инициализации, и порядок запуска служб может отличаться:
1. Скрипт S40network запускается слишком рано (до полной инициализации драйверов). 2. Драйвер Ethernet может загружаться позже, чем пытается подняться сеть. 3. udev/eudev может не успеть проинициализировать сетевые интерфейсы.
Почему ручной перезапуск работает?
Команда `/etc/init.d/S40network restart` работает, потому что к моменту ее выполнения:
- Драйверы Ethernet уже загружены - Система полностью проинициализирована - Все аппаратные ресурсы готовы
Проблема именно в временном соотношении между загрузкой драйверов и запуском сетевого сервиса при старте системы.
Если вы не используете скрипт rc.local, то просто добавьте строчку /etc/init.d/S40network restart в конец файла /etc/init.d/rcS. Мне как раз помог именно этот простой метод.
Если вы хотите использовать скрипт /etc/rc.local, и его запуск настроен в /etc/init.d/rcS, то добавьте в /etc/rc.local:
echo"Sleeping for network initialization..."
sleep5
/etc/init.d/S40networkrestart
Сделайте файл /etc/rc.local исполняемым:
# chmod +x /etc/rc.local
Перезагрузите систему:
# sync
# reboot
[Решение 2: Проверка и изменение порядка запуска]
Посмотрите порядок служб в /etc/init.d/:
# ls -la /etc/init.d/S*
Сетевой сервис должен запускаться после основных системных сервисов. Попробуйте переименовать S40network в более поздний номер:
Чтобы понять, в чем именно проблема, выполните диагностику.
1. Убедитесь, что драйвер Ethernet загружается. Проверить загруженные модули:
# lsmod | grep eth
Или:
# dmesg | grep eth
2. Проверить логи загрузки:
# dmesg | grep -i eth
# dmesg | grep -i network
3. Проверить статус интерфейса:
# ip link show eth0
4. Проверить, когда поднимается интерфейс:
# ip addr show eth0
5. Проверить наличие драйвера:
# lsmod | grep gmac # для LuckFox обычно gmac или подобный
[Рекомендуемое решение]
Мне помог вариант из Решения 1: просто добавил команду /etc/init.d/S40network restart в конец файла /etc/init.d/rcS. Скорее всего это поможет. Как вариант, попробуйте также Решение 2 и Решение 3.
Этот файл нормально создается и участвует в распознавании DNS-имен, но после перезагрузки оказывается пустым. Почему?
Проблема с сохранением /etc/resolv.conf после перезагрузки связана с тем, как Buildroot управляет этим файлом. Вот основные причины и решения:
Причина 1. Файл /etc/resolv.conf на самом деле это символическая ссылка на временный файл:
Проверить, является ли resolv.conf симлинком:
[root@luckfox root]# ls -la /etc/resolv.conf
lrwxrwxrwx 1 1000 1000 18 Oct 16 2023 /etc/resolv.conf -> ../tmp/resolv.conf
[root@luckfox root]# ls -la /tmp/resolv.conf
-rw-r--r-- 1 root root 0 Jan 1 00:00 /tmp/resolv.conf
Причина 2. tmpfs очищается при перезагрузке. Файл в /tmp/ создается заново при каждой загрузке. Таким образом, Причина 1 и Причина 2 могут быть взаимосвязаны, и дополнить друг друга, что как раз был мой случай.
Причина 3. Сетевые скрипты перезаписывают файл. Сетевые демоны (наподобие connman, dhcpcd, network manager) могут перезаписывать resolv.conf.
Скорее для Linux Buildroot на плате LuckFox Pico скорее всего причина проблемы это комбинация Причины 1 и Причины 2. Решить проблему можно, если заменить символическую ссылку реальным файлом. Как это сделать, по шагам:
Перечисленные здесь команды использовались для взаимодействия хоста разработчика на Ubuntu 24.04.3 LTS через сеть Ethernet с Linux Buildroot на платке LuckFox Pico Mini B. На Ubuntu IP-адрес 192.168.1.1, на Buildroot 192.168.1.100.
Запуск подключения к устройству LuckFox Pico Mini B:
$ adb connect 192.168.1.100:5555
connected to 192.168.1.100:5555
Передача файла скрипта videotest.sh из локального каталога хоста в домашний каталог пользователя root на платке LuckFox (почему-то домашнему каталогу root соответствует папка /oem):
Но запуск потока на 192.168.1.1:5000 приводит к ошибке, несмотря на то, что связь с хостом 192.168.1.1 есть (ping проходит), на принимающей стороне запущена команда ffplay udp://192.168.1.100:5000.
[root@luckfox root]# v4l2-ctl -d /dev/video0 --stream-mmap --stream-count=10 \
--stream-to=192.168.1.1:5000
could not open 192.168.1.1:5000 for writing
Почему --stream-to=192.168.1.1:5000 приводит к ошибке?
Дело в том, что v4l2-ctl --stream-to не поддерживает сетевые адреса с портами напрямую. Эта опция ожидает только путь к файлу или хост без указания порта. Таким образом, v4l2-ctl --stream-to интерпретирует 192.168.1.1:5000 как имя файла, а не сетевой адрес.
Для оптимального использования узнайте точные параметры вашего видео. На стороне вывода:
[root@luckfox root]# v4l2-ctl -d /dev/video0 --get-fmt-video
Format Video Capture:
Width/Height : 640/480
Pixel Format : 'MJPG' (Motion-JPEG)
Field : None
Bytes per Line : 0
Size Image : 614400
Colorspace : sRGB
Transfer Function : Rec. 709
YCbCr/HSV Encoding: ITU-R 601
Quantization : Default (maps to Full Range)
Flags :
Недостаток использования sshpass очевиден, что её область применения пожалуй только в скриптах, потому что пароль в командной строке все равно присутствует, да еще и в открытом виде. Поэтому лучше настроить беспарольный доступ лучше с помощью обмена ключами шифрования SSH.
[Настройка доступа по ключу SSH]
1. На локальной машине выполните генерацию публичного и приватного ключей:
$ ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/имя_пользователя/.ssh/id_rsa): 251007luckfox
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in 251007luckfox
Your public key has been saved in 251007luckfox.pub
The key fingerprint is:
SHA256:eUJ6GQ+W2BComCfkuoF7aysNhFkYBf6SG8fJGtOeW0U имя_пользователя@TAG-5779
The key's randomart image is:
+---[RSA 4096]----+
|o=. .o. |
|o.. . + . |
|+* . .EB |
|*oO . .+ * |
|+O B ..S o |
|= X . .. o |
| O o . |
|+ + o |
| +o+ |
+----[SHA256]-----+
Здесь имя_пользователя это логин локального пользователя, 251007luckfox имя файла для генерируемого ключа. После этой команды в локальном каталоге пользователя ~ будут сгенерированы два файла:
2. Добавьте текст сгенерированного публичного ключа в файл /root/.ssh/authorized_keys на сервере SSH. Дальнейшие действия происходят на сервере SSH платки LuckFox под пользователем root:
Вставьте текст из файла 251007luckfox.pub и сохраните файл /root/.ssh/authorized_keys. Это можно сделать с помощью текстового редактора nano или vi. Проверьте, что публичный ключ сохранился:
3. Исправьте конфигурацию сервера SSH, чтобы там правильно был указан путь до файла authorized_keys:
# nano /etc/ssh/sshd_config
Проверьте строчку AuthorizedKeysFile, исправьте её, если она неправильная:
AuthorizedKeysFile/root/.ssh/authorized_keys
4. Проверьте права доступа и владельца на каталоги /root, /root/.ssh и файл /root/.ssh/authorized_keys с помощью команды ls -la:
# ls -la /root
# ls -la /root/.ssh
# ls -la /root/.ssh/authorized_keys
Везде владелец должен быть root:root, права доступа на каталогах /root и /root/.ssh должны быть drwx------, а на файл authorized_keys должны быть права доступа -rw-------.
Следующая команда запускает сервер SSH в режиме вывода лога отладки в консоль (опция -d), с использованием конфигурационного файла /etc/ssh/sshd_config (опция -f):
# /usr/sbin/sshd -d -f /etc/ssh/sshd_config
В частности, это помогло мне обнаружить проблему прав доступа к каталогу /root со стороны сервера sshd. Он упорно запрашивал пароль пользователя, несмотря на настроенный доступ по ключу (см. Q055).
См. также:
Q032. Как разрешить Ethernet на плате LuckFox Pico Mini Q033. Настроить IP интерфейса Ethernet на плате LuckFox Pico Mini Q035. Как подключиться по SSH?
Наблюдается проблема: несмотря на то, что правильно настроен доступ по паре ключей SSH (см. Q054), сервер все равно запрашивает пароль при попытке подключения.
Запуск сервера SSH в режиме отладки (опция -d) позволил понять, в чем проблема:
# ps | grep ssh
1349 root sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups
1380 root grep ssh
# kill 1349
# /usr/sbin/sshd -d -f /etc/ssh/sshd_config
debug1: sshd version OpenSSH_9.3, OpenSSL 1.1.1v 1 Aug 2023
debug1: private host key #0: ssh-rsa SHA256:TUf2NU/xAfSS8UXJjyrxTkdLbIlYxBe2ZnxgXe9
debug1: private host key #1: ecdsa-sha2-nistp256 SHA256:9wWC2XW74wk5uc4OrrFVyaZAX1+
debug1: private host key #2: ssh-ed25519 SHA256:5b8Z6u5uCWhu0AhfsQTkrRwiyTtBidfSUcm
debug1: rexec_argv[0]='/usr/sbin/sshd'
debug1: rexec_argv[1]='-d'
debug1: rexec_argv[2]='-f'
debug1: rexec_argv[3]='/etc/ssh/sshd_config'
debug1: Set /proc/self/oom_score_adj from 0 to -1000
socket: Address family not supported by protocol
debug1: Bind to port 22 on 0.0.0.0.
Server listening on 0.0.0.0 port 22.
...
Попытка подключения клиента SSH:
...
debug1: rekey in after 134217728 blocks [preauth]
debug1: KEX done [preauth]
debug1: userauth-request for user root service ssh-connection method none [preauth]
debug1: attempt 0 failures 0 [preauth]
debug1: userauth-request for user root service ssh-connection method publickey [preauth]
debug1: attempt 1 failures 0 [preauth]
debug1: userauth_pubkey: publickey test pkalg ssh-ed25519 pkblob ED25519 SHA256:o2n
9di8eVNIKkVNRHUrWpD8yWsnnYhFietm7q2tgOxE [preauth]
debug1: temporarily_use_uid: 0/0 (e=0/0)
debug1: trying public key file /root/.ssh/authorized_keys
debug1: fd 4 clearing O_NONBLOCK
Authentication refused: bad ownership or modes for directory /root
debug1: restore_uid: 0/0
...
Из лога видно, что отказано в попытке доступа к файлу /root/.ssh/authorized_keys (bad ownership or modes for directory /root).
Проблему решила настройка владельца и прав доступа на каталог /root:
# chown -R root:root /root
# chmod 700 /root
Проверьте также права доступа (командой ls -la) на каталог /root/.ssh/ и файл authorized_keys:
Здесь localfile это файл, localdir директория на машине, откуда происходит копирование, remoteuser это пользователь на удаленном сервере SSH, IP это адрес сервера SSH (который может быть представлен DNS-именем), /путь/на/сервере это путь в файловой системе сервера SSH.
Пример копирования файла hello.txt на SSH-сервер платки LuckFox, которая подключена через Ethernet. IP-адрес сервера SSH 192.168.1.100:
Здесь каталог /oem это каталог на Linux Buildroot платки LuckFox, соответствующий домашнему каталогу пользователя root. Проверка, что файл успешно скопировался:
$ ssh root@192.168.1.100 "cat /oem/hello.txt"
hi!
Важное замечание: /путь/на/сервере должен быть абсолютным, т. е. нельзя использовать относительные пути и пути, содержащие ~. Иначе это может привести к путанице.
[2. SFTP (SSH File Transfer Protocol)]
С помощью sftp можно организовать интерактивную работу с файловой системой SSH-сервера. Общий синтаксис показан ниже.
Подключение к серверу:
sftp remoteuser@IP
Команды в SFTP:
put локальный_файл # Загрузить файл get удаленный_файл # Скачать файл ls # Просмотр файлов cd папка # Смена директории
[3. Rsync через SSH]
Утилиту rsync часто используют для синхронизации файлов и директорий на сетевых хостах. Например, для зеркалирования каталогов web-сервера на другой web-сервер. При этом копируются только измененные или новые файлы [5]. Ниже показан общий синтаксис использования утилиты rsync.
- Используйте SSH-ключи для автоматизации. - Rsync предпочтительнее для больших файлов/директорий. - Для частого использования настройте конфигурационный файл для ssh.
# Принудительное завершение, если процессы не отвечают
sleep2 REMAINING=$(pgrep"$1") if[-n"$REMAINING"];then echo"Принудительно завершаем: $REMAINING" kill-9$REMAINING2>/dev/null fi
Остановить процесс, если он использует много памяти:
ifpsaux|grepfirefox|grep-vgrep|awk'{if ($4 > 50) print $2}'|xargskill;then echo"Процессы Firefox с >50% памяти остановлены" fi
Рекомендации:
- Используйте pkill для простых случаев. - Используйте pgrep + kill когда нужен больший контроль. - Сначала пробуйте SIGTERM, и только потом SIGKILL. - Будьте осторожны с sudo и системными процессами.
# Сохраняем RAW данные RAW_FILE="${OUTPUT%.*}.raw"
v4l2-ctl-d$DEVICE--stream-mmap--stream-to="$RAW_FILE"--stream-count=1
# Конвертируем в BMP используя ffmpeg ifcommand-vffmpeg&>/dev/null;then case$PIXELFORMATin YUYV|YUYV422) ffmpeg-frawvideo-pixel_formatyuyv422-video_size${WIDTH}x${HEIGHT}\ -i"$RAW_FILE""$OUTPUT"-y ;; MJPG) ffmpeg-fmjpeg-i"$RAW_FILE""$OUTPUT"-y ;; RGB24) ffmpeg-frawvideo-pixel_formatrgb24-video_size${WIDTH}x${HEIGHT}\ -i"$RAW_FILE""$OUTPUT"-y ;; *) echo"Формат $PIXELFORMAT не поддерживается для автоматической конвертации" echo"RAW данные сохранены в: $RAW_FILE" exit1 ;; esac
# Удаляем временный RAW файл rm"$RAW_FILE" echo"Кадр сохранен как: $OUTPUT" else echo"ffmpeg не найден. RAW данные сохранены в: $RAW_FILE" echo"Установите ffmpeg для конвертации в BMP: sudo apt install ffmpeg" fi
# Конвертируем в BMP ifcommand-vffmpeg&>/dev/null;then echo"Конвертация в BMP..." ffmpeg-frawvideo-pixel_formatyuyv422-video_size${width}x${height}\ -i"$temp_raw""$output"-y-loglevelquiet rm"$temp_raw" echo"✅ Кадр сохранен: $output" else mv"$temp_raw""${output%.*}.raw" echo"⚠️ ffmpeg не найден. RAW данные сохранены: ${output%.*}.raw" fi }
$ ./capture_bmp.sh # Использовать значения по умолчанию
$ ./capture_bmp.sh 0 frame1.bmp # Указать устройство и имя файла
Примечания:
- v4l2-ctl сам по себе не умеет сохранять прямо в BMP, только RAW данные - ffmpeg требуется для конвертации RAW в BMP - Формат YUYV наиболее распространен для веб-камер - Для MJPEG камер используйте `pixelformat=MJPG`
Самый простой способ - использовать "3. Полный скрипт для сохранения BMP", который автоматически выполнит все необходимые шаги.
На принимающей стороне видеопоток можно просмотреть командой:
ffplay -f mjpeg udp://192.168.1.100:5000
Проблема в том, что наблюдается большая задержка между событиями реального времени перед камерой и их появлением на принимающей стороне. Задержка может быть случайная, визуально от 0.2 до 3 секунд. При этом видно, что проигрывание картинки ffplay как раз происходит с этой задержкой.
Причина проблемы заключалась в буферах UDP на стороне приема. Минимизировать эту задержку и сделать её постоянной можно с помощью следующей команды на стороне приема: