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

Работа с MIPI CSI камерами

Конфигурация eltay_rm88s_op_tablet_defconfig позволяет работать с MIPI CSI-2 камерами на плате ELTAY RM88S, установленной на Orange Pi CM5 Tablet Base Board.

В текущей сборке проверена работа:

РазъёмСенсорРежим сенсора для полноценной работыISPOverlay
CAM1OV138554224×3136, RAW10rkisp0-vir1/boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-ov13855-cam1.dtbo
CAM2OV56472592×1944, RAW10rkisp1-vir0/boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-ov5647-cam2.dtbo
CAM3OV56472592×1944, RAW10rkisp1-vir1/boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-ov5647-cam3.dtbo

Для полноценной обработки изображения в образе установлен Rockchip RKAIQ:

/usr/bin/rkaiq_3A_server
/usr/lib/librkaiq.so
/etc/iqfiles/ov13855_CMK-OT2016-FV1_default.json
/etc/iqfiles/ov5647_rpi-camera-v1_default.json

rkaiq_3A_server не запускается автоматически. Для разовой работы с камерой его можно запустить вручную после загрузки системы. Если камера используется постоянно, запуск сервера можно добавить в пользовательский init-скрипт или другой механизм автозапуска.

Подключение камеры и выбор overlay​

Камеры следует подключать и отключать только при выключенном питании платы.

В файле /boot/extlinux/extlinux.conf в параметре fdtoverlays через пробел должны быть перечислены overlay-файлы, соответствующие установленным камерам.

Например, только CAM2:

fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-ov5647-cam2.dtbo

Все три камеры:

fdtoverlays /boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-ov13855-cam1.dtbo /boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-ov5647-cam2.dtbo /boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-ov5647-cam3.dtbo

Если в этой же строке используются другие overlay, например LCD, они остаются в fdtoverlays вместе с overlay-файлами для камеры.

После изменения extlinux.conf необходимо перезагрузить устройство.

Определение устройств камеры​

Номера /dev/video*, /dev/media* и /dev/v4l-subdev* не являются постоянными и зависят от набора включённых overlay и порядка регистрации устройств. Для определения видеоустройств выполните:

v4l2-ctl --list-devices

Для захвата обработанного ISP-изображения используется первый /dev/video* из соответствующего блока rkisp_mainpath:

CAM1 -> platform:rkisp0-vir1
CAM2 -> platform:rkisp1-vir0
CAM3 -> platform:rkisp1-vir1

Для определения V4L2 subdevice сенсора нужно просмотреть media graph CIF-устройств:

media-ctl -d /dev/media0 -p
media-ctl -d /dev/media1 -p

В CIF media graph нужно найти entity сенсора и соответствующий ей device node name.

Например, в конфигурации с тремя камерами во время тестирования использовались:

CAM1 / OV13855 -> /dev/v4l-subdev8 -> /dev/video33
CAM2 / OV5647 -> /dev/v4l-subdev2 -> /dev/video42
CAM3 / OV5647 -> /dev/v4l-subdev5 -> /dev/video51

Эти номера являются примером. На конкретной загрузке их необходимо определить командами выше.

2-lane MIPI CSI-2​

Разъёмы CAM2 и CAM3 работают как независимые 2-lane MIPI CSI-2 интерфейсы.

Оба разъёма проверены с OV5647. Они используют разные аппаратные CSI/CIF/ISP маршруты, поэтому для каждого разъёма предусмотрен свой overlay.

Быстрая проверка без RKAIQ​

Для проверки самого подключения камеры, CSI-тракта и ISP запуск rkaiq_3A_server не требуется.

Сначала задайте найденные устройства, например:

SENSOR_DEV=/dev/v4l-subdev2
VIDEO_DEV=/dev/video42

У OV5647 доступны автоматическая экспозиция, усиление и баланс белого на уровне драйвера сенсора. Их можно включить командой:

v4l2-ctl -d "$SENSOR_DEV" --set-ctrl=auto_exposure=0,gain_automatic=1,white_balance_automatic=1

Для данного драйвера auto_exposure=0 соответствует автоматическому режиму.

Для быстрой проверки можно получить кадр 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.raw \
--stream-poll

Ожидаемый размер файла:

460800 байт

Преобразование в PNG:

ffmpeg -y \
-f rawvideo \
-pixel_format nv12 \
-video_size 640x480 \
-i /tmp/camera.raw \
-frames:v 1 \
/tmp/camera.png

В данном режиме настройки Rockchip ISP из IQ-профиля не применяются, поэтому цветопередача, коррекция объектива и другие параметры изображения могут отличаться от оптимальных.

Полноценная работа OV5647 с RKAIQ​

В образе установлен профиль:

/etc/iqfiles/ov5647_rpi-camera-v1_default.json

Проверенный IQ-профиль рассчитан на режим сенсора 2592×1944. Перед запуском RKAIQ необходимо выставить этот режим:

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

После этого запустите сервер:

rm -f /tmp/rkaiq.log
rkaiq_3A_server >/tmp/rkaiq.log 2>&1 &

Сервер автоматически находит активные RKISP media devices и в проверенной конфигурации выбирает для OV5647 профиль:

ov5647_rpi-camera-v1_default.json

Проверить загрузку профиля можно командой:

grep -E 'sysctl_init success|iq:|wait stream start' /tmp/rkaiq.log

После запуска сервера можно начать захват полного кадра:

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/ov5647.raw \
--stream-poll

Ожидаемый размер одного NV12-кадра:

7558272 байт

Преобразование в PNG:

ffmpeg -y \
-f rawvideo \
-pixel_format nv12 \
-video_size 2592x1944 \
-i /tmp/ov5647.raw \
-frames:v 1 \
/tmp/ov5647.png

Профиль ov5647_rpi-camera-v1_default.json содержит LSC-калибровку для 2592x1944. Если перед запуском RKAIQ сенсор оставить в режиме 640×480, в логе появляется:

ALSC:E:can't find 640x480 in lscResName

Если приложению требуется изображение меньшего размера, его можно масштабировать на выходе ISP или средствами приложения, сохраняя штатный режим сенсора 2592×1944.

4-lane MIPI CSI-2​

Разъём CAM1 работает как 4-lane MIPI CSI-2 интерфейс. Проверенный модуль с сенсором OV13855 работает в четырёхлинейном режиме. Для штатного режима сенсора 4224×3136 RAW10 при 30 кадр/с используется скорость MIPI 1080 Мбит/с на каждую линию данных.

Используемый overlay:

/boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-ov13855-cam1.dtbo

Быстрая проверка CAM1 без RKAIQ​

Сначала определите устройства, например:

SENSOR_DEV=/dev/v4l-subdev8
VIDEO_DEV=/dev/video33

Задайте полный режим сенсора:

v4l2-ctl -d "$SENSOR_DEV" --set-subdev-fmt pad=0,width=4224,height=3136,code=SBGGR10_1X10

У используемого драйвера OV13855 нет доступных пользователю автоматических настроек экспозиции, усиления и баланса белого, аналогичных OV5647. Для быстрой проверки параметры экспозиции и усиления можно задавать вручную.

Сначала посмотрите допустимые диапазоны:

v4l2-ctl -d "$SENSOR_DEV" --list-ctrls

Например, для проверки можно установить:

v4l2-ctl -d "$SENSOR_DEV" --set-ctrl=exposure=3000,analogue_gain=512

Конкретные значения зависят от освещения и не являются настройкой для постоянной работы.

Захват полного NV12-кадра:

v4l2-ctl -d "$VIDEO_DEV" \
--set-fmt-video=width=4224,height=3136,pixelformat=NV12 \
--stream-mmap=4 \
--stream-skip=30 \
--stream-count=1 \
--stream-to=/tmp/ov13855.raw \
--stream-poll

Ожидаемый размер:

19869696 байт

Такой способ подходит для проверки, что сенсор, CSI, CIF и ISP работают. Без RKAIQ изображение может быть тёмным и иметь неправильную цветопередачу; это не является признаком неисправности камеры.

Полноценная работа CAM1 с RKAIQ​

Для OV13855 в образе установлен IQ-профиль:

/etc/iqfiles/ov13855_CMK-OT2016-FV1_default.json

Перед запуском сервера выставьте штатный режим сенсора:

v4l2-ctl -d "$SENSOR_DEV" --set-subdev-fmt pad=0,width=4224,height=3136,code=SBGGR10_1X10

Запустите RKAIQ:

rm -f /tmp/rkaiq.log
rkaiq_3A_server >/tmp/rkaiq.log 2>&1 &

Проверить выбранный профиль можно так:

grep -E 'sysctl_init success|iq:|wait stream start' /tmp/rkaiq.log

Для CAM1 ожидается:

ov13855_CMK-OT2016-FV1_default.json

После этого можно запускать поток:

v4l2-ctl -d "$VIDEO_DEV" \
--set-fmt-video=width=4224,height=3136,pixelformat=NV12 \
--stream-mmap=4 \
--stream-skip=60 \
--stream-count=1 \
--stream-to=/tmp/ov13855_aiq.raw \
--stream-poll

Преобразование в PNG:

ffmpeg -y \
-f rawvideo \
-pixel_format nv12 \
-video_size 4224x3136 \
-i /tmp/ov13855_aiq.raw \
-frames:v 1 \
/tmp/ov13855_aiq.png

Одновременная работа нескольких камер​

Проверены следующие варианты одновременной работы камер:

  • одновременная работа CAM2 + CAM3 с двумя OV5647;
  • одновременная работа CAM1 + CAM2 + CAM3;
  • работа всех трёх камер через один процесс rkaiq_3A_server.

Для нескольких камер запускается один rkaiq_3A_server, а не отдельный сервер на каждую камеру. Перед запуском сервера необходимо выставить правильные режимы всех используемых сенсоров:

# Пример. Номера subdevice необходимо определить для текущей загрузки.
CAM1_SENSOR=/dev/v4l-subdev8
CAM2_SENSOR=/dev/v4l-subdev2
CAM3_SENSOR=/dev/v4l-subdev5

v4l2-ctl -d "$CAM1_SENSOR" --set-subdev-fmt pad=0,width=4224,height=3136,code=SBGGR10_1X10

v4l2-ctl -d "$CAM2_SENSOR" --set-subdev-fmt pad=0,width=2592,height=1944,code=SBGGR10_1X10

v4l2-ctl -d "$CAM3_SENSOR" --set-subdev-fmt pad=0,width=2592,height=1944,code=SBGGR10_1X10

Затем запустить сервер:

rkaiq_3A_server >/tmp/rkaiq.log 2>&1 &

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