본문으로 건너뛰기

Camera overlay

중요
  • avs 시리즈는 다양한 add-on board를 지원합니다.
  • 다양한 보드와 카메라를 유연하게 설정하기 위한 안내입니다.
먼저 — 보드가 어느 세대인지 확인하세요 (2026-09 개정)

카메라를 고르는 방식이 3세대(gen3)부터 완전히 바뀌었습니다. 보드에서 한 줄로 갈립니다.

ls /boot/makeoverlay_rootfs
결과세대카메라를 바꾸는 방법
파일이 없다3세대(gen3) — AVS200 r36.4.4-20260914 이후 · AVS300 r39.2.1-20260915 이후jetson-io.py → 아래 3세대 절
파일이 있다2세대 이하 (그 이전 출하분)makeoverlay_rootfs → 아래 2세대 절

🔴 세대를 릴리스 날짜로 짐작하지 마세요. 현장에서 재플래시한 보드는 날짜와 어긋날 수 있습니다. 위 ls 한 줄이 유일하게 믿을 수 있는 판정입니다.

Jetson Orin System​

AVS100, AVS200의 카메라 보드​

  • avs100과 avs200의 add-on board는 호환됩니다.
  • avs100의 경우 Orin NX, nano의 csi port가 부족하여 4ch까지만 지원합니다.
카메라 보드설명
GCAM-R4GMSL 6ch rev4
RGBIR-R1GMSL 6ch + RGB 1ch + IR 1ch

AVS101의 카메라 보드​

카메라 보드설명
GCAM-R1GMSL 6ch

Camera​

제조사모델명해상도이미지 포맷센서ISP
atech solutionacc02ong1920x1080YUVonsemi ar0233geosemi gw5300
atech solutionam03ss-isx0311920x1536YUVsony isx031센서 내장
atech solutionisx031-stereo1920x1536x2YUVsony isx031 stereo센서 내장
atech solutionrgbir1920x1080x2YUV + IRrgbir센서 내장
sensing-worldsg2-imx390c-gw52001920x1080YUVsony imx390geosemi gw5200
sensing-worldsg3s-isx031c1920x1536YUVsony isx031센서 내장
sensing-worldsg8-ox08bc-gw53003840x2160YUVomnivision ox08b40geosemi gw5300
sensing-worldastra-s361920x1536x2YUVsony isx031 stereo센서 내장

Setup Camera Overlay — 2세대 이하 (레거시)​

이 절은 /boot/makeoverlay_rootfs 가 있는 보드에만 해당합니다

gen3 보드(AVS200 r36.4.4-20260914 이후 · AVS300 r39.2.1-20260915 이후)에는 이 파일이 없습니다. 그 보드는 3세대 — jetson-io.py 로 가세요.

avs100,101,200​

중요
  • 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=acc02ong
# CAMERA=am03ss-isx031
# CAMERA=isx031-stereo
# CAMERA=rgbir
# CAMERA=sg8-ox08bc-gw5300
# CAMERA=sg3s-isx031c
# CAMERA=sg2-imx390c-gw5200
# CAMERA=astra-s36


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

3세대(gen3) — jetson-io.py 로 바꿉니다​

3세대부터 카메라는 extlinux.conf 의 OVERLAYS 한 줄로 정해지고, 그 줄을 보드에서 NVIDIA 순정 도구 jetson-io.py 가 고쳐 씁니다. makeoverlay_rootfs 도, device tree 를 손으로 합치는 일도 없습니다.

2세대 이하 (레거시)3세대(gen3)
제어점/boot/makeoverlay_rootfs 의 GCAM_BOARD= · CAMERA=extlinux.conf 의 OVERLAYS 한 줄
바꾸는 도구sudo ./makeoverlay_rootfs (텔레리안 스크립트)jetson-io.py (NVIDIA 순정)
캐리어 설정카메라와 같이 합쳐진다보드 DTB 에 들어가 있다 — 카메라를 바꿔도 안 사라진다
/boot/dtb조합별 병합 DTB 가 여러 개base DTB 1개 + 조합별 .dtbo

메뉴로 고르기​

sudo /opt/nvidia/jetson-io/jetson-io.py
# → Configure for compatible hardware → 카메라 선택
# → Save and reboot to reconfigure pins

명령줄로 고르기​

sudo /opt/nvidia/jetson-io/config-by-hardware.py -l # 고를 수 있는 목록
sudo /opt/nvidia/jetson-io/config-by-hardware.py -n 1="<위 목록의 이름>"
sudo reboot

지금 무엇이 부팅됐는지 확인​

avs-camera show
읽어 두실 것
  • 한 번에 하나만 고릅니다. jetson-io 는 OVERLAYS 줄을 선택한 것으로 덮어씁니다.
  • jetson-io 는 extlinux.conf 에 LABEL JetsonIO 항목을 만들고 DEFAULT 를 그쪽으로 바꿉니다. 출하 구성은 LABEL primary 에 남아 있어 DEFAULT primary 로 고치면 되돌아갑니다.
  • 🔴 /etc/avs-release 의 카메라 값은 굽는 시점의 기본값이지 현재값이 아닙니다. 현재값은 avs-camera show 입니다.
  • 바꾼 뒤에는 보드 전원을 완전히 껐다 켭니다. GMSL 카메라는 부팅할 때만 인식합니다. 보조전원을 쓰는 RGBIR 카메라는 보드와 카메라 보조전원을 동시에 내려야 합니다.
  • 🔴 카메라 벤더가 다르면 GMSL 링크 속도가 다릅니다(예: Sensing ISX031 = 3G, Atech ISX031 = 6G). 이름의 3g/6g 를 잘못 고르면 전 채널이 인식되지 않습니다.

제품별 상세와 고를 수 있는 카메라 목록은 각 플래시 가이드에 있습니다 — AVS200 · AVS300