118 lines
4.9 KiB
Bash
118 lines
4.9 KiB
Bash
#!/bin/bash
|
|
WIDTH=$1
|
|
HEIGHT=$2
|
|
FPS=$3
|
|
DEVICE=$4
|
|
CAMERA_WIDTH=640
|
|
CAMERA_HEIGHT=480
|
|
|
|
is_dcmipp_present() {
|
|
DCMIPP_SENSOR="NOTFOUND"
|
|
# on disco board ov5640 camera can be present on csi connector
|
|
for video in $(find /sys/class/video4linux -name "video*" -type l);
|
|
do
|
|
if [ "$(cat $video/name)" = "dcmipp_dump_capture" ]; then
|
|
cd $video/device/
|
|
mediadev=/dev/$(ls -d media*)
|
|
cd -
|
|
for sub in $(find /sys/class/video4linux -name "v4l-subdev*" -type l);
|
|
do
|
|
subdev_name=$(tr -d '\0' < $sub/name | awk '{print $1}')
|
|
if [ "$subdev_name" = "gc2145" ] || [ "$subdev_name" = "ov5640" ]; then
|
|
DCMIPP_SENSOR=$subdev_name
|
|
V4L_DEVICE="$(basename $video)"
|
|
sensorsubdev=$(tr -d '\0' < $sub/name)
|
|
#bridge is connected to output of sensor (":0 [ENABLED" with media-ctl -p)
|
|
bridgesubdev=$(media-ctl -d $mediadev -p -e "$sensorsubdev" | grep ":0 \[ENABLED" | awk -F\" '{print $2}')
|
|
#interface is connected to input of postproc (":1 [ENABLED" with media-ctl -p)
|
|
interfacesubdev=$(media-ctl -d $mediadev -p -e "dcmipp_dump_postproc" | grep ":1 \[ENABLED" | awk -F\" '{print $2}')
|
|
echo "media device: "$mediadev
|
|
echo "video device: "$V4L_DEVICE
|
|
echo "sensor subdev: " $sensorsubdev
|
|
echo "bridge subdev: " $bridgesubdev
|
|
echo "interface subdev: " $interfacesubdev
|
|
return
|
|
fi
|
|
done
|
|
fi
|
|
done
|
|
}
|
|
|
|
get_webcam_device() {
|
|
echo "get_webcam_device function"
|
|
found="NOTFOUND"
|
|
for video in $(find /sys/class/video4linux -name "video*" -type l | sort);
|
|
do
|
|
if [ "$(cat $video/name)" = "dcmipp_dump_capture" ]; then
|
|
found="FOUND"
|
|
else
|
|
V4L_DEVICE="$(basename $video)"
|
|
break;
|
|
fi
|
|
done
|
|
}
|
|
|
|
# ------------------------------
|
|
# main
|
|
# ------------------------------
|
|
|
|
#if a video device is specified in the launch script use it if not search for
|
|
#dcmipp camera of a webcam
|
|
if [ "$DEVICE" != "" ]; then
|
|
DCMIPP_SENSOR="NOTFOUND"
|
|
if [ "$(cat /sys/class/video4linux/$DEVICE/name)" = "dcmipp_dump_capture" ]; then
|
|
cd /sys/class/video4linux/$DEVICE/device/
|
|
mediadev=/dev/$(ls -d media*)
|
|
cd -
|
|
for sub in $(find /sys/class/video4linux -name "v4l-subdev*" -type l);
|
|
do
|
|
subdev_name=$(tr -d '\0' < $sub/name | awk '{print $1}')
|
|
if [ "$subdev_name" = "gc2145" ] || [ "$subdev_name" = "ov5640" ]; then
|
|
DCMIPP_SENSOR=$subdev_name
|
|
echo "DCMIPP_SENSOR="$DCMIPP_SENSOR
|
|
V4L_DEVICE="$(basename $DEVICE)"
|
|
sensorsubdev=$(tr -d '\0' < $sub/name)
|
|
#bridge is connected to output of sensor (":0 [ENABLED" with media-ctl -p)
|
|
bridgesubdev=$(media-ctl -d $mediadev -p -e "$sensorsubdev" | grep ":0 \[ENABLED" | awk -F\" '{print $2}')
|
|
#interface is connected to input of postproc (":1 [ENABLED" with media-ctl -p)
|
|
interfacesubdev=$(media-ctl -d $mediadev -p -e "dcmipp_dump_postproc" | grep ":1 \[ENABLED" | awk -F\" '{print $2}')
|
|
fi
|
|
done
|
|
else
|
|
echo "camera specified not valid ... try to find another camera"
|
|
is_dcmipp_present
|
|
fi
|
|
else
|
|
is_dcmipp_present
|
|
fi
|
|
|
|
if [ "$DCMIPP_SENSOR" != "NOTFOUND" ]; then
|
|
if [ "$DCMIPP_SENSOR" = "gc2145" ]; then
|
|
sensorbuscode_constrain="BE"
|
|
parallelbuscode="RGB565_2X8_BE"
|
|
elif [ "$DCMIPP_SENSOR" = "ov5640" ]; then
|
|
sensorbuscode_constrain="LE"
|
|
parallelbuscode="RGB565_2X8_LE"
|
|
fi
|
|
sensordev=$(media-ctl -d $mediadev -p -e "$sensorsubdev" | grep "node name" | awk -F\name '{print $2}')
|
|
sensorbuscode=`v4l2-ctl --list-subdev-mbus-codes -d $sensordev | grep RGB565 | grep "$sensorbuscode_constrain" | awk -FMEDIA_BUS_FMT_ '{print $2}'| head -n 1`
|
|
echo "sensor mbus-code: "$sensorbuscode
|
|
media-ctl -d $mediadev --set-v4l2 "'$sensorsubdev':0[fmt:$sensorbuscode/${CAMERA_WIDTH}x${CAMERA_HEIGHT}@1/${FPS} field:none]"
|
|
media-ctl -d $mediadev --set-v4l2 "'$bridgesubdev':2[fmt:$sensorbuscode/${CAMERA_WIDTH}x${CAMERA_HEIGHT}]"
|
|
media-ctl -d $mediadev --set-v4l2 "'$interfacesubdev':1[fmt:RGB565_2X8_LE/${CAMERA_WIDTH}x${CAMERA_HEIGHT}]"
|
|
media-ctl -d $mediadev --set-v4l2 "'dcmipp_dump_postproc':1[fmt:RGB565_2X8_LE/${CAMERA_WIDTH}x${CAMERA_HEIGHT}]"
|
|
media-ctl -d $mediadev --set-v4l2 "'dcmipp_dump_postproc':0[compose: (0,0)/${WIDTH}x${HEIGHT}]"
|
|
V4L2_CAPS="video/x-raw,format=RGB16,width=$WIDTH, height=$HEIGHT"
|
|
V4L_OPT=""
|
|
else
|
|
get_webcam_device
|
|
# suppose we have a webcam
|
|
V4L2_CAPS="video/x-raw, width=$WIDTH, height=$HEIGHT"
|
|
V4L_OPT="io-mode=4"
|
|
v4l2-ctl --set-parm=20
|
|
fi
|
|
|
|
echo "V4L_DEVICE="$V4L_DEVICE
|
|
echo "V4L2_CAPS="$V4L2_CAPS
|
|
echo "DCMIPP_SENSOR="$DCMIPP_SENSOR
|