Работа с CSI камерой
Для поддержки камер используется ядро от Rockchip (ветка develop-6.1), так как в mainline-ядре отсутствуют необходимые media-драйверы (CIF, ISP, rkisp, rkcif), требуемые для работы с MIPI CSI-2 камерами на SoC RK3566. Подробнее о сборке образа для работы с камерой с помощью Buildroot - здесь.
На сборке плат ELTAY RM66 + ELTAY BB CM4 доступны два разъёма CSI: CAM1 и CAM2. В обоих случаях сенсор подключается по интерфейсу MIPI CSI-2 и появляется в медиаграфе V4L2, однако способы использования камеры и получаемые данные отличаются.
CAM1
Камера, подключенная к CAM1, ориентирована на работу через ISP.
В типовом сценарии достаточно захвата видеопотока через соответствующий /dev/video*-узел — ISP выполняет всю необходимую обработку (demosaic, автоэкспозиция, баланс белого и т.д.), и на выходе получается готовое изображение в стандартных форматах (NV12, YUYV и т.п.). Этот режим удобен, когда:
- требуется сразу получить "картинку", пригодную для просмотра;
- важно минимизировать пользовательскую обработку;
- камера используется для отладки, визуального контроля или демонстрации.
CAM2
Камера, подключенная к CAM2, может использоваться в двух разных режимах, в зависимости от задачи.
-
Захват сырых данных (через CIF, без ISP). В этом режиме данные с сенсора поступают напрямую в память в виде RAW/Bayer-кадров. Режим подходит, когда:
- необходимы сырые данные с сенсора без аппаратной обработки;
- планируется собственная или внешняя обработка изображения;
- важен полный контроль над пайплайном обработки данных.
-
Захват через ISP (с использованием rkaiq). В этом режиме поток данных проходит через ISP, что позволяет получить обработанное изображение, аналогичное выходу CAM1. Для корректной работы требуется запуск сервера AIQ/3A (rkaiq). Режим имеет смысл использовать, когда:
- нужно визуально оценить изображение с камеры CAM2;
- требуется аппаратная обработка ISP без написания собственного конвейера;
- камера используется автономно, как основная.
Работа камеры была протестирована с модулем ov5647.
Камера подключена к разъему CAM1
Предварительно необходимо убедиться, что в загрузочном файле операционной системы подключен overlay-файл для камеры 1 (/boot/overlays/rk356x-ov5647-c1.dtbo). Для этого нужно открыть файл /boot/extlinux/extlinux.conf, внутри в параметре FDTOVERLAYS должен быть указан путь до нужного файла:
FDTOVERLAYS /boot/overlays/rk356x-ov5647-c1.dtbo
Если это не так, файл необходимо отредактировать, сохранить и перезагрузить устройство. После перезагрузки изменения будут применены.
Первые кадры после запуска стрима могут быть нестабильными, поэтому рекомендуется отбросить несколько кадров (--stream-skip), а затем сохранить кадр/последовательность. Пример команды:
v4l2-ctl -d /dev/video0 --set-fmt-video=width=640,height=480,pixelformat=NV12 --stream-mmap=4 --stream-skip=10 --stream-count=1 --stream-to=/tmp/cam1_640x480_nv12.raw --stream-poll
Полученные сырые кадры можно конвертировать в PNG через встроенный пакет ffmpeg, например:
ffmpeg -f rawvideo -pixel_format nv12 -video_size 640x480 -i /tmp/cam1_640x480_nv12.raw -frames:v 1 /tmp/cam1.png
Для получения кадров нужной яркости и четкости может потребоваться ручная настройка параметров камеры, например:
v4l2-ctl -d /dev/video0 --set-ctrl=auto_exposure=1,gain_automatic=1,white_balance_automatic=1
Камера подключена к разъему CAM2
Предварительно необходимо убедиться, что в загрузочном файле операционной системы подключен overlay-файл для камеры 2 (/boot/overlays/rk356x-ov5647-c2.dtbo). Для этого нужно открыть файл /boot/extlinux/extlinux.conf, внутри в параметре FDTOVERLAYS должен быть указан путь до нужного файла:
FDTOVERLAYS /boot/overlays/rk356x-ov5647-c2.dtbo
Если это не так, файл нужно отредактировать, сохранить и перезагрузить устройство. После перезагрузки изменения будут применены.
При необходимости определить номера устройств используется команда:
v4l2-ctl --list-devices
Для захвата можно использовать:
- CIF (RAW): первый video node из секции
rkcif, как правило/dev/video0. - ISP (mainpath): первый video node из секции
rkisp_mainpath (platform:rkisp-vir1), как правило/dev/video8.
Захват сырых кадров через CIF
RAW-кадры можно получить через узел CIF (V4L2 video node) без участия ISP. Пример команды для получения данных и проверки размера полученного файла:
v4l2-ctl -d /dev/video0 --set-fmt-video=width=640,height=480,pixelformat=RG10 --stream-mmap=4 --stream-count=10 --stream-to=/tmp/cif_raw_640x480_rg10.raw
ls -lah /tmp/cif_raw_640x480_rg10.raw
Захват кадров через ISP
При подключении камеры к разъему CAM2 захват через ISP требует предварительной инициализации ISP-параметров (3A/AIQ). В образе предусмотрен скрипт подготовки, который запускает rkaiq_3A_server и подключает IQ-профиль для сенсора ov5647. После этого пользователь может выполнять любые команды захвата через V4L2.
После запуска ОС необходимо запустить работу сервера rkaiq_3A_server, выполнив служебный скрипт командой:
cam2_isp_prepare
В случае успешного запуска сервера в консоли появится подобный вывод:
cam2_isp_prepare: checking device nodes...
cam2_isp_prepare: IQ link: /etc/iqfiles/m01_b_ov5647 3-0036.json -> /etc/iqfiles/ov5647_rpi-camera-v1_default.json
cam2_isp_prepare: starting rkaiq...
rkaiq-cam2: started (pid 279)
cam2_isp_prepare: waiting for rkaiq init...
cam2_isp_prepare: OK
XCORE:K:cid[1] rk_aiq_uapi_sysctl_init success. iq:/etc/iqfiles//ov5647_rpi-camera-v1_default.json
После перезагрузки устройства сервер снова будет остановлен - при использовании камеры, подключенной к разъему CAM2, необходимо запускать указанный служебный скрипт каждый раз после включения устройства.
Для получения кадров в формате NV12/YUYV используется ISP mainpath. Рекомендуется отбросить несколько первых кадров (--stream-skip), так как экспозиция/баланс белого стабилизируются не мгновенно. Пример команды для захвата:
v4l2-ctl -d /dev/video8 --set-fmt-video=width=640,height=480,pixelformat=NV12 --stream-mmap=4 --stream-skip=10 --stream-count=1 --stream-to=/tmp/cam2_640x480_nv12.raw --stream-poll
Далее кадр можно конвертировать в PNG через встроенный пакет ffmpeg стандартной командой. Например:
ffmpeg -f rawvideo -pixel_format nv12 -video_size 640x480 -i /tmp/cam2_640x480_nv12.raw -frames:v 1 /tmp/cam2.png
Использование двух камер одновременно
Плата ELTAY BB CM4 позволяет подключить две CSI-камеры, однако в текущей аппаратной конфигурации в одной сессии может работать только одна камера — либо CAM1, либо CAM2. Обе камеры аппаратно используют общий сигнал PWDN (power-down), подключённый к одному GPIO. При инициализации драйвер одной из камер эксклюзивно захватывает вывод PWDN, а вторая камера не может получить доступ к линии и не проходит инициализацию.