Работа с MIPI CSI камерами
Конфигурация eltay_rm88s_op_tablet_defconfig позволяет работать с MIPI CSI-2 камерами на плате ELTAY RM88S, установленной на Orange Pi CM5 Tablet Base Board.
В текущей сборке проверена работа:
| Разъём | Сенсор | Режим сенсора для полноценной работы | ISP | Overlay |
|---|---|---|---|---|
CAM1 | OV13855 | 4224×3136, RAW10 | rkisp0-vir1 | /boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-ov13855-cam1.dtbo |
CAM2 | OV5647 | 2592×1944, RAW10 | rkisp1-vir0 | /boot/overlays/rk3588s-eltay-rm88s-on-op-cm5-tablet-ov5647-cam2.dtbo |
CAM3 | OV5647 | 2592×1944, RAW10 | rkisp1-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 &
После этого потоки камер можно запускать независимо друг от друга.