CSI камера на Orange Pi CM5 Base Board
Конфигурация eltay_rm88s_op_baseboard_defconfig позволяет работать с CSI-камерами на плате ELTAY RM88S, установленной на Orange Pi CM5 Base Board.
Работа проверена с камерой на сенсоре OV5647.
На Orange Pi CM5 Base Board доступны четыре разъёма: CAM1, CAM2, CAM3 и CAM4. Для каждого разъёма используется отдельный overlay-файл, так как внутренние аппаратные маршруты камер различаются. С точки зрения пользователя все четыре разъёма работают одинаково: после подключения соответствующего overlay камера становится доступна через V4L2 и Rockchip ISP.
Поддерживаются два варианта работы:
- быстрая проверка камеры без RKAIQ — позволяет убедиться, что камера подключена и передаёт изображение;
- полноценная работа через
rkaiq_3A_server— используется IQ-профиль камеры и выполняются алгоритмы 3A/ISP, обеспечивающие корректную экспозицию, баланс белого и качество изображения.
rkaiq_3A_server и IQ-профиль для OV5647 входят в образ, но сервер не запускается автоматически. Если камера используется постоянно, рекомендуется самостоятельно добавить запуск сервера в свой init-скрипт или приложение.
Подключение камеры и выбор overlay
Камеры следует подключать и отключать только при выключенном питании платы.
В файле /boot/extlinux/extlinux.conf в параметре fdtoverlays должны быть перечислены overlay, соответствующие используемым разъёмам:
| Разъём | Overlay |
|---|---|
CAM1 | /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-ov5647-cam1.dtbo |
CAM2 | /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-ov5647-cam2.dtbo |
CAM3 | /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-ov5647-cam3.dtbo |
CAM4 | /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-ov5647-cam4.dtbo |
Например, для камеры в разъёме CAM2 строка должна выглядеть так:
fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-ov5647-cam2.dtbo
Для одновременной работы нескольких камер нужные overlay-файлы перечисляются в одной строке через пробел. Например, для CAM1 и CAM3:
fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-ov5647-cam1.dtbo /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-ov5647-cam3.dtbo
Для всех четырёх камер:
fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-ov5647-cam1.dtbo /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-ov5647-cam2.dtbo /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-ov5647-cam3.dtbo /boot/overlays/rk3588s-eltay-rm88s-op-baseboard-ov5647-cam4.dtbo
После изменения extlinux.conf необходимо сохранить файл и перезагрузить устройство.
Определение устройств камеры
Номера /dev/video*, /dev/media* и /dev/v4l-subdev* назначаются ядром динамически и зависят от количества включённых камер и порядка регистрации драйверов. Поэтому в программах и инструкциях не следует считать конкретные номера устройств постоянными.
Для просмотра видеоустройств выполните:
v4l2-ctl --list-devices
Для каждой камеры нужно найти соответствующий блок rkisp_mainpath. Первый /dev/video* в этом блоке используется для захвата обработанного ISP-изображения.
Пример:
rkisp_mainpath (platform:rkisp0-vir0):
/dev/video44
/dev/video45
...
В данном примере для захвата используется /dev/video44.
Для определения V4L2 subdevice сенсора нужно просмотреть media graph соответствующего CIF-устройства:
media-ctl -d /dev/mediaX -p
В выводе нужно найти entity, содержащую ov5647, и указанную для неё строку device node name. Например:
- entity 63: m00_b_ov5647 4-0036
device node name /dev/v4l-subdev12
/dev/v4l-subdev* используется для настройки сенсора, а первый /dev/video* в блоке rkisp_mainpath — для получения обработанных кадров.
Далее в примерах используются переменные:
SENSOR_DEV=/dev/v4l-subdevX
VIDEO_DEV=/dev/videoY
Их значения необходимо заменить на номера, найденные на конкретном устройстве.
Быстрая проверка камеры без RKAIQ
Для быстрой проверки аппаратного тракта запуск rkaiq_3A_server не требуется.
В драйвере OV5647 доступны встроенные автоматические настройки сенсора. Их можно включить командой:
v4l2-ctl -d "$SENSOR_DEV" --set-ctrl=auto_exposure=0,gain_automatic=1,white_balance_automatic=1
Для данного драйвера значение auto_exposure=0 соответствует автоматическому режиму.
Проверить установленные значения:
v4l2-ctl -d "$SENSOR_DEV" --get-ctrl=auto_exposure,gain_automatic,white_balance_automatic
Ожидается:
auto_exposure: 0
gain_automatic: 1
white_balance_automatic: 1
После этого можно получить тестовый кадр размером 640 × 480 в формате NV12:
v4l2-ctl -d "$VIDEO_DEV" \
--set-fmt-video=width=640,height=480,pixelformat=NV12 \
--stream-mmap=4 \
--stream-skip=30 \
--stream-count=1 \
--stream-to=/tmp/camera_640x480_nv12.raw \
--stream-poll
Ожидаемый размер файла:
460800 байт
Преобразование тестового кадра в PNG:
ffmpeg -y \
-f rawvideo \
-pixel_format nv12 \
-video_size 640x480 \
-i /tmp/camera_640x480_nv12.raw \
-frames:v 1 \
/tmp/camera.png
Готовое изображение находится в:
/tmp/camera.png
Этот режим предназначен прежде всего для проверки подключения и работоспособности камеры. Встроенные автоматические настройки сенсора не заменяют полноценную настройку изображения через Rockchip AIQ, поэтому яркость, цветопередача и другие параметры изображения могут быть не оптимальными.
Полноценная работа с RKAIQ
Для получения настроенного изображения в образ включены:
/usr/bin/rkaiq_3A_server
/usr/lib/librkaiq.so
/etc/iqfiles/ov5647_rpi-camera-v1_default.json
rkaiq_3A_server выполняет обработку 3A/ISP и автоматически выбирает IQ-профиль для обнаруженного сенсора OV5647.
Для имеющегося IQ-профиля проверен режим сенсора:
OV5647: 2592 × 1944, SBGGR10_1X10
Перед запуском сервера необходимо перевести сенсор в этот режим:
v4l2-ctl -d "$SENSOR_DEV" --set-subdev-fmt pad=0,width=2592,height=1944,code=SBGGR10_1X10
Проверить установленный формат:
v4l2-ctl -d "$SENSOR_DEV" --get-subdev-fmt pad=0
Ожидается:
Width/Height : 2592/1944
Mediabus Code : MEDIA_BUS_FMT_SBGGR10_1X10
Запустить сервер:
rkaiq_3A_server >/tmp/rkaiq.log 2>&1 &
Захват кадра в формате 2592 × 1944, NV12:
v4l2-ctl -d "$VIDEO_DEV" \
--set-fmt-video=width=2592,height=1944,pixelformat=NV12 \
--stream-mmap=4 \
--stream-skip=60 \
--stream-count=1 \
--stream-to=/tmp/camera_2592x1944_nv12.raw \
--stream-poll
Ожидаемый размер файла:
7558272 байт
Преобразование в PNG:
ffmpeg -y \
-f rawvideo \
-pixel_format nv12 \
-video_size 2592x1944 \
-i /tmp/camera_2592x1944_nv12.raw \
-frames:v 1 \
/tmp/camera.png
IQ-профиль ov5647_rpi-camera-v1_default.json содержит калибровку для режима сенсора 2592x1944.
Если перед запуском RKAIQ сам сенсор оставить в режиме 640x480, сервер сообщает:
ALSC:E:can't find 640x480 in lscResName
Одновременная работа нескольких камер
Проверены следующие варианты одновременной работы камер:
CAM1 + CAM3— камеры используют разные физические ISP;CAM1 + CAM2— обе камеры используютISP0;CAM3 + CAM4— обе камеры используютISP1;CAM1 + CAM2 + CAM3 + CAM4.
Для нескольких камер запускается один rkaiq_3A_server, а не отдельный сервер на каждую камеру.
Перед запуском сервера необходимо выставить правильные режимы всех используемых сенсоров, например:
v4l2-ctl -d "$SENSOR1_DEV" --set-subdev-fmt pad=0,width=2592,height=1944,code=SBGGR10_1X10
v4l2-ctl -d "$SENSOR2_DEV" --set-subdev-fmt pad=0,width=2592,height=1944,code=SBGGR10_1X10
Для четырёх камер операция выполняется аналогично для всех четырёх sensor subdevice.
Затем запустить сервер:
rkaiq_3A_server >/tmp/rkaiq.log 2>&1 &
Сервер автоматически обнаруживает активные ISP-тракты и создаёт отдельный AIQ-контекст для каждой камеры. Отдельный экземпляр rkaiq_3A_server для каждого разъёма запускать не требуется.
После этого потоки камер можно запускать независимо друг от друга.