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
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
|