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

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 для каждого разъёма запускать не требуется.

После этого потоки камер можно запускать независимо друг от друга.