Camera overlay

Important

  • avs 시리즈는 다양한 add-on board를 지원합니다.

  • 다양한 보드와 카메라를 유연하게 설정하기 위한 안내입니다.

Jetson Orin System

AVS100, AVS200의 카메라 보드

  • avs100과 avs200의 add-on board는 호환됩니다.

  • avs100의 경우 Orin NX, nano의 csi port가 부족하여 4ch까지만 지원합니다.

카메라 보드

설명

GCAM-R4

GMSL 6ch rev4

RGBIR-R1

GMSL 6ch + RGB 1ch + IR 1ch

AVS101의 카메라 보드

카메라 보드

설명

GCAM-R1

GMSL 6ch

Camera

제조사

모델명

해상도

이미지 포맷

센서

ISP

atech solution

acc02ong

1920x1080

YUV

onsemi ar0233

geosemi gw5300

sensing-world

sg2-imx390c

1920x1080

YUV

sony imx390

geosemi gw5300

sensing-world

sg3s-isx031c

1920x1536

YUV

sony isx031

센서 내장

sensing-world

sg8-ox08bc

3840x2160

YUV

omnivision ox08b40

geosemi gw5300

Setup Camera Overlay

Important

  • device tree를 avs, add-on board, camera에 맞게 overlay 설정을 해줘야 카메라가 동작합니다.

  • /boot/makeoverlay_rootfs의 상단의 주석을 조합에 맞게 해제하세요

    • 예를 들어 GCAM-R4를 사용하고 sensing-world의 sg3s-isx031c 카메라를 사용하는 경우 아래와 같이 주석을 해제합니다.

      GCAM_BOARD=gcam-r4
      CAMERA=sg3s-isx031c
      
  • /boot/makeoverlay_rootfs

#!/bin/bash

# select cam board
# GCAM_BOARD=gcam-r3
# GCAM_BOARD=gcam-r4
# GCAM_BOARD=gcam-rgbir-r1
# GCAM_BOARD=gcam-r1

# select camera
# CAMERA=isx031c-rgbir-keti
# CAMERA=acc02ong
# CAMERA=rgbir
# CAMERA=sg8-ox08bc-gw5300
# CAMERA=sg3s-isx031c
# CAMERA=sg2-imx390c-gw5200
# CAMERA=dummy


COMPATIBLE=$(cat /proc/device-tree/compatible)

if [[ "$COMPATIBLE" == *"avs101"* ]]; then
    TARGET_PREFIX=avs101
elif [[ "$COMPATIBLE" == *"avs100"* ]]; then
    TARGET_PREFIX=avs100
elif [[ "$COMPATIBLE" == *"avs200"* ]]; then
    TARGET_PREFIX=avs200
else
    echo "Error: No target prefix found"
    exit 1
fi

IFS=' ' read -ra DATA <<< $(i2ctransfer -f -y 0 w1@0x50 0 r256)

if [ -z $DATA ];then
    echo "can't access"
    exit 1
fi

get_hex_to_dec()
{
    array=$@
    result=0
    ITER=0
    for i in ${array[@]}
    do
        val=$( printf "%d" ${i} )
        result=$(( result + (val<<(ITER*8)) ))
        ITER=$( expr $ITER + 1 )
    done
    DIGIT=$(( ITER * 2))
    case $DIGIT in
        2)
        result=$( printf "0x%02x" $result  )
        ;;
        4)
        result=$( printf "0x%04x" $result  )
        ;;
        6|8)
        result=$( printf "0x%08x" $result  )
        ;;
        *)
        echo digit error
        ;;
    esac
}

get_hex_to_dec ${DATA[0]} ${DATA[1]}

SOC_VERSION=$result

PARTNUM=$( echo ${DATA[@]:0x14:22} | xxd -r -p )
echo PARTNUM = $PARTNUM

SERIAL=$( echo ${DATA[@]:0x4a:13} | xxd -r -p )
echo SERIAL $SERIAL

PART_ARRAY=$( echo $PARTNUM | tr "-" "\n" )
IFS='- ' read -ra PART_ARRAY <<< $PARTNUM

MODULE_ID=${PART_ARRAY[1]:1}
SKU=${PART_ARRAY[2]}
FAB=${PART_ARRAY[3]}
REV=${PART_ARRAY[4]}

case $MODULE_ID in
    3701)
    case $SKU in
        0000)
        MODULE="AGX Orin"
        TARGET=avs200-agx-orin-64g
        ;;
        0004)
        MODULE="AGX Orin 32GB"
        TARGET=avs200-agx-orin-32g
        ;;
        0005)
        MODULE="AGX Orin 64GB"
        TARGET=avs200-agx-orin-64g
        ;;
        0008)
        MODULE="AGX Orin Industrial"
        TARGET=avs200-agx-orin-industrial
        ;;
    esac
    ;;
    3767)
    case $SKU in
        0000)
        MODULE="Orin NX 16GB"
        TARGET=$TARGET_PREFIX-orinnx-16g
        ;;
        0001)
        MODULE="Orin NX 8GB"
        TARGET=$TARGET_PREFIX-orinnx-8g
        ;;
        0003|0005)
        MODULE="Orin Nano 8GB"
        TARGET=$TARGET_PREFIX-orinnano-8g
        ;;
        0004)
        MODULE="Orin Nano 4GB"
        TARGET=$TARGET_PREFIX-orinnano-4g
        ;;
    esac
    ;;
esac

# echo module : $MODULE
# echo sku : $SKU
# echo fab : $FAB
# echo rev : $REV

FS_DEV=$(df -h / | grep "^/dev" | awk '{print $1}')

if [[ $FS_DEV = *"nvme"* ]];then
    FS_DEV=nvme
elif [[ $FS_DEV = *"mmcblk"* ]];then
    FS_DEV=emmc
else
    FS_DEV=unknown
fi

echo filesystem: $FS_DEV

if [[ $TARGET = "avs200-agx-orin"* ]]; then
    PREFIX=avs200
    EXT_LINUX_SRC="extlinux.conf.$PREFIX""_$FS_DEV.overlay"
elif [[ $TARGET = "avs100-orin"* ]]; then
    PREFIX=avs100
    EXT_LINUX_SRC="extlinux.conf.$PREFIX.overlay"
elif [[ $TARGET = "avs101-orin"* ]]; then
    PREFIX=avs101
    EXT_LINUX_SRC="extlinux.conf.$PREFIX.overlay"
fi
echo "target : $TARGET"

DTB_PATH=/boot
BOARD_DTB=$DTB_PATH/$TARGET.dtb
OUTPUT_DTB=$DTB_PATH/dtb/$TARGET-overlay.dtb

GCAM_DTB=$DTB_PATH/$PREFIX-$GCAM_BOARD-overlay.dtbo
CAMERA_DTB=$DTB_PATH/$PREFIX-$CAMERA-overlay.dtbo

OVERLAY_DTB_FILES=(
    tegra234-carveouts.dtbo
    tegra-optee.dtbo
    # tegra234-dcb-p3767-0000-hdmi.dtbo
)

OVERLAY_DTB_PATH=""

for OVERLAY_DTB_FILE in ${OVERLAY_DTB_FILES[@]}; do
    OVERLAY_DTB_PATH+="$DTB_PATH/$OVERLAY_DTB_FILE "
done
echo "additional overlay : $OVERLAY_DTB_PATH"

echo "board : $BOARD_DTB"
echo "gcam : $GCAM_DTB"
echo "camera : $CAMERA_DTB"
echo "overlay : $OUTPUT_DTB"
fdtoverlay -i $BOARD_DTB -o $OUTPUT_DTB $GCAM_DTB $CAMERA_DTB $OVERLAY_DTB_PATH 

if [[ ! -f $OUTPUT_DTB ]]; then
    echo "$OUTPUT_DTB is not exists."
    exit
fi

EXT_LINUX_SRC="/boot/$EXT_LINUX_SRC"

if [[ ! -f $EXT_LINUX_SRC ]]; then
    echo "$EXT_LINUX_SRC is not exists."
    exit
fi

# FDT 경로를 overlay dtb로 변경
sudo sed -i "s|FDT .*|FDT $OUTPUT_DTB|" $EXT_LINUX_SRC


DIFF_RESULT=$(diff $EXT_LINUX_SRC /boot/extlinux/extlinux.conf -q)

if [[ $DIFF_RESULT = *"differ"* ]]; then
    echo "extlinux.conf is updated."
    sudo mv /boot/extlinux/extlinux.conf /boot/extlinux/extlinux.conf.overlay_backup
    sudo cp $EXT_LINUX_SRC /boot/extlinux/extlinux.conf
else
    echo "extlinux.conf is already updated."
fi

echo "Done. reboot"

run

  • 아래 명령을 수행하고 재부팅 후 /dev/video* 장치들이 보이면 성공입니다.

cd /boot
sudo ./makeoverlay_rootfs
sudo reboot now