You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

115 lines
4.0 KiB

#!/bin/bash
# file: rs_ipu6_d457_bind.sh
# This script used for binding media links of v4l2 subdevice entities
# The configuration we had is DS5 mux and IPU6 entities.
# _______ _______ _______ _______ _________
# |depth|->| mux |->|CSI-2|->|BESOC|->|capture|
# |_____| |_____| |_____| |_____| |_______|
#
# Full graph can be viewed on http://magjac.com/graphviz-visual-editor/
# media graph links can be generated by running 'media-ctl --print-dot'
#
# Dependency: v4l-utils
v4l2_util=$(which v4l2-ctl)
media_util=$(which media-ctl)
if [ -z ${v4l2_util} ]; then
echo "v4l2-ctl not found, install with: sudo apt install v4l-utils"
exit 1
fi
# enable metadata capture nodes for default
metadata_enabled=1
while [[ $# -gt 0 ]]; do
case $1 in
-q|--quiet)
quiet=1
shift
;;
-m|--mux)
shift
mux_param=$1
shift
;;
-n|--no-metadata)
metadata_enabled=0
shift
;;
-h|--help)
echo "-q -m -n -h"
;;
*)
quiet=0
shift
;;
esac
done
# mapping for DS5 mux entity to IPU6 BE SOC entity matching.
declare -A media_mux_capture_link=( [a]='' [b]='1 ' [c]='2 ' [d]='3 ' [e]='' [f]='1 ' [g]='2 ' [h]='3 ')
# mapping for DS5 mux entity to IPU6 CSI-2 entity matching.
declare -A media_mux_csi2_link=( [a]=0 [b]=1 [c]=2 [d]=3 [e]=0 [f]=1 [g]=2 [h]=3)
# all available DS5 muxes, each one represent physically connected camera.
# muxes a, b, c, d usually single link cameras
# muxes e, f, g, h is aggregated link cameras, 'a' coupled to 'e'
mux_list=${mux_param:-'a b c d e f g h'}
# Find media device.
# For case with usb camera plugged in during the boot,
# usb media controller will occupy index 0
mdev=$(${v4l2_util} --list-devices | grep -A1 ipu6 | grep media)
[[ -z "${mdev}" ]] && exit 0
media_ctl_cmd="${media_util} -d ${mdev}"
#media-ctl -r # <- this can be used to clean-up all bindings from media controller
# cache media-ctl output
dot=$($media_ctl_cmd --print-dot)
# DS5 MUX. Can be {a, b, c, d} + Aggregated {e, f, g, h}.
for mux in $mux_list; do
is_mux=$(echo "${dot}" | grep "DS5 mux ${mux}")
# skip for non-existing muxes
[[ -z $is_mux ]] && continue;
[[ $quiet -eq 0 ]] && echo -n "Bind DS5 mux ${mux} .. "
csi2_be_soc="CSI2 BE SOC ${media_mux_csi2_link[${mux}]}"
csi2="CSI-2 ${media_mux_csi2_link[${mux}]}"
# capture pad
be_soc_cap="BE SOC ${media_mux_capture_link[${mux}]}capture"
cap_pad=0
# bind (enable) link CSI-2 pad 1 to BE-SOC pad 0
$media_ctl_cmd -v -l "\"Intel IPU6 ${csi2}\":1 -> \"Intel IPU6 ${csi2_be_soc}\":0[1]" 1>/dev/null
# bind (enable) link DS5 mux pad 0 to CSI-2 pad 0
$media_ctl_cmd -v -l "\"DS5 mux ${mux}\":0 -> \"Intel IPU6 ${csi2}\":0[1]" 1>/dev/null
# for DS5 aggregated mux (above d) - use BE-SOC capture pads with offset 6
# this offset used as capture sensor set - dept+md,rgb+md,ir,imu = 6
cap_pad=0
if [ "${mux}" \> "d" ]; then
cap_pad=6
fi
# DEPTH video streaming node
$media_ctl_cmd -v -l "\"Intel IPU6 ${csi2_be_soc}\":$((${cap_pad}+1)) -> \"Intel IPU6 ${be_soc_cap} $((${cap_pad}+0))\":0[5]" 1>/dev/null
# DEPTH metadata node
if [[ $metadata_enabled -eq 1 ]]; then
$media_ctl_cmd -v -l "\"Intel IPU6 ${csi2_be_soc}\":$((${cap_pad}+2)) -> \"Intel IPU6 ${be_soc_cap} $((${cap_pad}+1))\":0[5]" 1>/dev/null
fi
# RGB link video streaming node
$media_ctl_cmd -v -l "\"Intel IPU6 ${csi2_be_soc}\":$((${cap_pad}+3)) -> \"Intel IPU6 ${be_soc_cap} $((${cap_pad}+2))\":0[5]" 1>/dev/null
# RGB metadata node
if [[ $metadata_enabled -eq 1 ]]; then
$media_ctl_cmd -v -l "\"Intel IPU6 ${csi2_be_soc}\":$((${cap_pad}+4)) -> \"Intel IPU6 ${be_soc_cap} $((${cap_pad}+3))\":0[5]" 1>/dev/null
fi
# IR link video streaming node
$media_ctl_cmd -v -l "\"Intel IPU6 ${csi2_be_soc}\":$((${cap_pad}+5)) -> \"Intel IPU6 ${be_soc_cap} $((${cap_pad}+4))\":0[5]" 1>/dev/null
# IMU link streaming node
$media_ctl_cmd -v -l "\"Intel IPU6 ${csi2_be_soc}\":$((${cap_pad}+6)) -> \"Intel IPU6 ${be_soc_cap} $((${cap_pad}+5))\":0[5]" 1>/dev/null
done