Серія “STM32 з нуля без HAL” • Місяць 3 • Тижні 3-4
Про що ця стаття
Привіт! Ми продовжуємо серію про STM32 без HAL і embedded Linux. В минулих статтях ми розібрали Buildroot, DTS, підключили STM32 до Luckfox через UART — і тепер Linux керує STM32 через Python. Настав час додати до системи очі — камеру.
Але тут нас чекає сюрприз. Перше що робить кожен хто хоче стрімити відео з Linux — шукає GStreamer. І саме тут Luckfox показує характер.

В цій статті ми:
- З’ясуємо чому GStreamer на Luckfox порожній — і що Rockchip використовує замість нього
- Підключимо камеру MIS5001 і пройдемо всю діагностику від dmesg до живого стріму
- Запустимо RTSP через rkipc — IP camera daemon від Rockchip
- Зменшимо затримку стріму з 10 секунд до 1
- Порівняємо з нашим першим досвідом — тоді прошивка не знала про камеру
Частина 1. Очікування vs реальність
Що ми очікували
В попередній статті про Luckfox (dou.ua/forums/topic/58244/) ми вже запускали RTSP стрім. Але тоді прошивка з коробки не знала про камеру MIS5001 — довелося перепрошивати. Тепер у нас правильна прошивка, камера є. Здається — підключай і стрімь.
Перше що спадає на думку — GStreamer. Класичний pipeline для IP камери:
|
1 |
gst-launch-1.0 v4l2src ! jpegenc ! tcpserversink port=8080 |
Перевіряємо:
|
1 2 3 4 |
gst-launch-1.0 --version # no gstreamer gst-inspect-1.0 2>/dev/null | wc -l # 0 |
⚠ GStreamer на Luckfox порожній. Не ‘мало плагінів’ — взагалі нічого. Це не баг і не помилка конфігурації. Це архітектурне рішення Rockchip.
Чому GStreamer відсутній
Rockchip для своїх SoC (RV1106, RV1103, RK3588 та інших) використовує власний медіа стек — Rockchip MPP (Media Process Platform). Це низькорівневий API для апаратного кодування і декодування відео через вбудований VPU.
Архітектура виглядає так:
Камера (MIPI CSI) → ISP (Image Signal Processor) → VPU (кодування H.264/H.265/JPEG) → мережа
GStreamer з плагіном gstreamer1-rockchip теоретично можна зібрати через Buildroot — але це окремий квест. Офіційний образ Luckfox не включає його. Натомість є:
- Rockchip MPP — С бібліотека для прямої роботи з VPU
- rk_mpi_* утиліти — тестові програми для кожного компонента
- rkipc — повноцінний IP camera daemon від Rockchip
- sample_demo_vi_venc — зразок pipeline VI→ISP→VENC
◆ Аналогія зі STM32: замість GStreamer (стандартний інтерфейс) Rockchip дає свій HAL для медіа. Як ми писали hal_uart.c замість використання готової бібліотеки — тут теж треба знати специфічний API.
Частина 2. Камера: підключення і діагностика
Камера MIS5001
MIS5001 — 5MP MIPI CSI камера з сенсором mis5001. Підключається до роз’єму CSI на Luckfox Pico Pro. Офіційно підтримується, але тільки в нових прошивках — в старих її немає в списку сенсорів.
Підключаємо камеру і дивимося dmesg:
|
1 |
dmesg | grep -iE 'mis5001|sensor|csi' | tail -10 |
Без камери (стара ситуація):
sc3336 4-0030: Unexpected sensor id(000000), ret(-5)
mis5001 4-0031: Failed to get pwdn-gpios
Після підключення камери:
rockchip-csi2-dphy csi2-dphy0: dphy0 matches m00_b_mis5001 4-0031:bus type 5
rockchip-mipi-csi2 mipi0-csi2: stream ON
rockchip-csi2-dphy0: dphy0, data_rate_mbps 891
◆ ‘stream ON’ в dmesg — CSI шина активна. Сенсор відповідає. Дані йдуть від камери до ISP. Це ще не означає що відео готове — ISP треба налаштувати, але фізичний рівень працює.
IQ файли — калібрування ISP
ISP (Image Signal Processor) на RV1106 — це апаратний блок який перетворює сирий Bayer патерн з сенсора в RGB зображення. Він робить корекцію кольору, заглушення шуму, AWB (авто баланс білого), AE (авто експозиція).
Для кожного сенсора потрібен свій файл калібрування — IQ (Image Quality) файл. Без нього ISP не знає характеристики сенсора і зображення буде сірим або взагалі не з’явиться, до речі сірий муар проявляється на початку підключення, а потім відео стабілізується.
Перевіряємо наявність IQ файлів:
|
1 2 3 4 |
ls /etc/iqfiles/ # mis5001_CMK-OT2115-PC1_30IRC-F16.json <- наш файл є! # sc3336_CMK-OT2119-PC1_30IRC-F16.json # sc4336_OT01_40IRC_F16.json |
⚠ Якщо IQ файла для вашого сенсора нема — перепрошивайте новішим образом. Без IQ файла rkipc запуститься але зображення не буде. Це перша причина ‘камера є але відео немає’.
Перший тест: rk_mpi_vi_test
Перед запуском повноцінного стріму перевіримо чи взагалі ISP отримує кадри:
|
1 2 3 4 |
# Зупиняємо rkipc якщо запущений RkLunch-stop.sh # Тест захоплення кадрів rk_mpi_vi_test -w 1920 -h 1080 -c 1 -d 0 -m 0 -l 10 -o 1 |
⚠ Перед кожним тестом запускайте RkLunch-stop.sh! Процес rkipc тримає камеру і блокує інші програми. Якщо не зупинити — отримаєте ‘Address already in use’ або Segmentation fault.
Успішний вивід містить:
|
1 2 3 4 5 |
sensor name = m00_b_mis5001 4-0031 sensor raw width : 2592 sensor raw height: 1944 ispStreamOn done create file(/data/test_0_0_1.bin) succeed |
У моєму випадку були такі рядки:
|
1 2 3 |
cmpi 19:32:57-231 {getFrameRuntime :1347} -------------------------------vviBuf->buf_size: 3133440 cmpi 19:32:57-607 {getFrameRuntime :1364} write fail, ret = 330240, pixSize = 3110400 cmpi 19:32:57-631 {getFrameRuntime :1364} write fail, ret = 0, pixSize = 3110400 |
Бо /data замалий. Тож, якщо бачите ‘write fail’ — проблема з місцем на /data:
|
1 2 |
df -h /data <span class="token token">ls</span> -la /data/test_0_0_1.bin |
◆ Файл test_0_0_1.bin — це сирий YUV буфер з ISP. Його можна переглянути на ПК через ffmpeg: ffplay -f rawvideo -pixel_format nv12 -video_size 1920×1080 test_0_0_1.bin
Частина 3. rkipc — IP camera daemon
Що таке rkipc
rkipc — це повноцінний IP camera daemon від Rockchip. Він реалізує весь pipeline від сенсора до мережевого стріму:
mis5001 → ISP (rkaiq) → MPP (H.264 encoding) → RTSP server (порт 554)
По суті rkipc — це те що в IP камерах робить прошивка. Rockchip відкрив цей код для розробників Luckfox.
Перевіряємо чи запущений:
|
1 2 |
ps | grep rkipc # 877 root rkipc -a /oem/usr/share/iqfiles |
Проблема: неправильний конфіг
При першому запуску rkipc шукає конфіг /userdata/rkipc.ini. Якщо його нема — генерує дефолтний, який не підходить для mis5001. Симптом:
RK_MPI_VENC_GetStream timeout a004800e
Це означає що відеоенкодер не отримує кадри від ISP — неправильні параметри в ini файлі.
Знаходимо правильний конфіг для нашої камери:
|
1 2 3 4 |
find /oem /userdata /etc -name '*.ini' 2>/dev/null # /oem/usr/share/rkipc-mis5001-500w.ini <- наш файл! # /oem/usr/share/rkipc-300w.ini # /oem/usr/share/rkipc-400w.ini |
⚠ /userdata на Luckfox — тільки 2.2MB. Якщо він повний (100%) — cp не спрацює. Перевіряйте: df -h /userdata. Якщо повний — видаліть старий rkipc.ini і копіюйте знову.
Копіюємо правильний конфіг:
|
1 2 3 |
kill $(ps | grep rkipc | grep -v grep | awk '{print $1}') rm /userdata/rkipc.ini # видаляємо якщо є cp /oem/usr/share/rkipc-mis5001-500w.ini /userdata/rkipc.ini |
Запуск і перевірка
Запускаємо rkipc з правильним конфігом:
|
1 2 3 4 |
RkLunch-stop.sh 2>/dev/null; sleep 1 rkipc -c /userdata/rkipc.ini -a /oem/usr/share/iqfiles/ > /tmp/rkipc.log 2>&1 & sleep 8 ps | grep rkipc # перевіряємо що живий |
Перевіряємо лог:
|
1 |
cat /tmp/rkipc.log | grep -iE 'rtsp|port|listen|venc|timeout' | head -20 |
Успішний вивід:
|
1 2 3 4 5 |
sensor name = m00_b_mis5001 4-0031 ispStreamOn done [INFO] rtsp server demo starting on port 554 [DEBUG] add session path: /live/0 [DEBUG] add session path: /live/1 |
Якщо бачите ‘rtsp server starting on port 554’ і немає ‘VENC_GetStream timeout’ — все працює!
◆ Перевірка портів через /proc/net/tcp: 0x022A = 554 в hex. Якщо в списку є рядок з ‘00000000:022A’ — RTSP слухає на всіх інтерфейсах. На Luckfox команда ss відсутня, netstat теж показує не все — /proc/net/tcp надійніший.
Частина 4. RTSP стрім: підключення і затримка
VLC не працює — це нормально
Перша спроба підключитися через VLC: rtsp://192.168.1.125:554/live/0
VLC видає помилку з’єднання. Це відома проблема — VLC 3.x не завжди сумісний з RTSP сервером від Rockchip. Не витрачайте час на налаштування VLC.
|
1 2 3 4 5 |
# Використовуйте ffplay (пакет ffmpeg): ffplay rtsp://192.168.1.125/live/0 # Або mpv: mpv rtsp://192.168.1.125/live/0 |
Проблема затримки
Перший запуск ffplay дає ~10 секунд затримки. Це буферизація — ffplay за замовчуванням накопичує великий буфер для стабільного відтворення.
Для низької затримки (~ 1 секунда):
|
1 |
ffplay -fflags nobuffer -flags low_delay -framedrop rtsp://192.168.1.125/live/0 |
Розшифровка параметрів:
- -fflags nobuffer — не буферизувати вхідний потік
- -flags low_delay — режим мінімальної затримки для декодера
- -framedrop — дозволяє пропускати кадри якщо не встигає
◆ Затримка 1-2 секунди — це нормально для RTSP через TCP/IP. Для нульової затримки потрібен інший протокол (наприклад WebRTC) або UDP транспорт: ffplay -rtsp_transport udp rtsp://192.168.1.125/live/0
Два потоки: /live/0 і /live/1
rkipc піднімає два RTSP потоки:
- /live/0 — основний потік, висока роздільна здатність (1920×1080 або вища)
- /live/1 — субпотік, менша роздільна здатність для мобільних клієнтів
Параметри обох потоків задаються в rkipc.ini. У нас rkipc-mis5001-500w.ini (500w = 5 мегапікселів):
cat /userdata/rkipc.ini | grep -E ‘width|height|bitrate’ | head -10
Частина 5. Архітектура: що під капотом
Повний pipeline
Тепер коли стрім працює — розберемо що відбувається всередині:
mis5001 (MIPI CSI) → rkcif (CIF driver) → /dev/video0
↓
rkaiq (ISP tuning, AWB, AE) — читає mis5001_CMK-OT2115-PC1_30IRC-F16.json
↓
|rkisp (ISP hardware) → /dev/video11 (mainpath) /dev/video12 (selfpath)
↓
rkmpp (MPP encoder) → H.264 bitstream
↓
rtsp_demo → TCP port 554 → /live/0, /live/1
Кожен блок — окремий компонент:
- rkcif — CIF (Camera Interface) driver, забирає дані з MIPI шини
- rkaiq — Rockchip AIQ (AI quality), алгоритми обробки зображення. Читає JSON конфіг
- rkisp — ISP hardware, апаратна обробка RAW → YUV
- rkmpp — Media Process Platform, апаратне кодування через VPU
- rtsp_demo — RTSP сервер, вбудований в rkipc
◆ Порівняння з STM32: pipeline камери нагадує наш bare-metal підхід. Замість того щоб дати Universal HAL (як GStreamer намагається бути), Rockchip дає прямий доступ до апаратних блоків. Більше контролю, менше абстракцій.
Де сидить відео: /dev/video*
На платі 20+ відео пристроїв. Не лякайтесь:
|
1 2 |
ls /dev/video* /dev/media* # /dev/video0-video20, /dev/media0, /dev/media1 |
- /dev/video0-3 — сирий вивід з CIF (RAW Bayer дані від сенсора)
- /dev/video11 — ISP mainpath (основний вивід після обробки, YUV)
- /dev/video12 — ISP selfpath (другий вивід, менша роздільна здатність)
- /dev/video13 — ISP bypasspath
- /dev/video17-18 — ISP rawrd (зворотній шлях для RAW capture)
rkipc читає з /dev/video12 (selfpath) через rkaiq і MPP, кодує в H.264, відправляє в RTSP.
Автозапуск: RkLunch.sh
При старті системи rkipc запускається автоматично через RkLunch.sh. Цей скрипт не в стандартному /etc/init.d/ — він запускається з іншого місця (специфіка образу Luckfox).
Для зупинки перед тестами:
|
1 |
RkLunch-stop.sh |
⚠ Ніколи не запускайте два процеси які використовують камеру одночасно. rk_mpi_vi_test, sample_demo_vi_venc, rkipc — всі вони монопольно захоплюють ISP. Завжди зупиняйте попередній перед запуском нового.
Частина 6. Порівняння: тоді і зараз
Перший досвід (стаття про Luckfox, березень 2026)
В першій статті про Luckfox (dou.ua/forums/topic/58244/) ми вже запускали RTSP стрім. Але шлях був інший:
- Прошивка з коробки не знала про MIS5001 — sensor id = 0x000000
- Довелося перепрошивати через upgrade_tool і Maskrom режим
- rkipc запустився з дефолтним конфігом і стрім якось заробив
- VLC не працював вже тоді — рятував ffplay
- Наступного дня стрім ‘зник’ — rkipc потребує ~15 сек для підняття RTSP
◆ Цікавий патерн: тоді все ‘просто запрацювало’ після перепрошивки. Тепер ми знаємо чому: правильна прошивка включає rkipc-mis5001-500w.ini в /userdata при першому запуску. Але якщо /userdata переповнений — ini не скопіюється і буде проблема.
Зараз ми розуміємо кожен крок:
- dmesg показує стан сенсора — знаємо що шукати
- IQ файли — розуміємо навіщо вони і де шукати
- rkipc.ini — знаємо який файл правильний для якого сенсора
- /proc/net/tcp замість netstat — знаємо як перевірити порти на uclibc
- MTD розділи — розуміємо що /userdata це flash 2.2MB а не tmpfs
- -fflags nobuffer — знаємо як зменшити затримку
Це і є різниця між ‘запрацювало’ і ‘розумію чому запрацювало’. За місяць роботи з Luckfox накопичився контекст який перетворює магію в інженерію.
Алгоритм діагностики: коли стрім не йде
Якщо rtsp://192.168.1.125/live/0 не підключається — перевіряйте по черзі:
- Камера детектується? dmesg | grep -iE ‘mis5001|csi’ — шукайте ‘stream ON’
- IQ файл є? ls /etc/iqfiles/ — має бути файл для вашого сенсора
- rkipc запущений? ps | grep rkipc
- Порт 554 відкритий? cat /proc/net/tcp | grep ‘022A’ — шукайте рядок з 0A (listening)
- Лог чистий? cat /tmp/rkipc.log | grep timeout — не має бути VENC_GetStream timeout
- Правильний ini? Порівняйте /userdata/rkipc.ini з /oem/usr/share/rkipc-mis5001-500w.ini
- /userdata не повний? df -h /userdata — якщо 100% — відразу проблема
⚠ VLC помилка з’єднання — це не діагностика. VLC не завжди сумісний з Rockchip RTSP. Завжди перевіряйте через ffplay rtsp://IP/live/0 перш ніж робити висновки.
Підсумок
За ці два тижні ми:
- З’ясували що GStreamer на Luckfox відсутній — і це не проблема
- Підключили камеру MIS5001, навчились читати dmesg для діагностики
- Розібрали IQ файли і їх роль в роботі ISP
- Запустили rkipc з правильним конфігом і отримали RTSP стрім
- Зменшили затримку з 10 секунд до 1 через ffplay параметри
- Зрозуміли архітектуру pipeline: CSI → ISP → MPP → RTSP
Далі — NPU і face detection. Камера знімає, rkipc дає RTSP. Наступний крок: навчити систему розпізнавати обличчя і через UART давати команду STM32 вмикати реле. Повний ланцюжок від камери до фізичної дії.
А якщо хочете побачити звідки ростуть ноги — ось попередні статті серії:
- IoT PowerHub — Pi Pico + SIM800L + реле: dou.ua/forums/topic/56126/
- Luckfox від ATmega8 до відеостріму: dou.ua/forums/topic/58244/
- STM32 з нуля без HAL: серія статей на DOU
Довідники
- rkipc_camera_guide.md — референс по камері, IQ файлах і конфігах rkipc
- rockchip_mpp_cheatsheet.md — команди для роботи з Rockchip MPP стеком
Репозиторій: github.com/pipicosim800-maker/stm32F103