Jetson 플랫폼에서 카메라 브링업을 진행하다 V4L2 쪽이 아닌 에러가 발생하면 원인을 알아햐 하는데 원인을 알기 위해서는 Jetson 플랫폼에서 디버깅 방법을 알아야 합니다.
테스트 환경
- Jetpack 5.x
Trace
추적 로그를 활성화시키기 위해 아래 터미널 창을 열어 아래 명령어 입력
echo 1 > /sys/kernel/debug/tracing/tracing_on
echo 30720 > /sys/kernel/debug/tracing/buffer_size_kb
echo 1 > /sys/kernel/debug/tracing/events/tegra_rtcpu/enable
echo 1 > /sys/kernel/debug/tracing/events/freertos/enable
echo 2 > /sys/kernel/debug/camrtc/log-level
echo 1 > /sys/kernel/debug/tracing/events/camera_common/enable
echo > /sys/kernel/debug/tracing/trace
cat /sys/kernel/debug/tracing/trace
이후 또 다른 터미널 창을 열어 카메라를 동작시키면 기존 터미널에서 아래와 같이 로그가 발생한다.
# tracer: nop
#
# entries-in-buffer/entries-written: 63/63 #P:6
#
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
# | | | |||| | |
kworker/1:9-145 [001] .... 203.451341: rtcpu_string: tstamp:7192509887 id:0x04010000 str:"VM0 deactivating."
kworker/1:9-145 [001] .... 205.747299: rtcpu_string: tstamp:7264934208 id:0x04010000 str:"VM0 activating."
kworker/1:9-145 [001] .... 205.747304: rtcpu_vinotify_event: tstamp:7265567958 cch:0 vi:0 tag:VIFALC_TDSTATE channel:0x23 frame:0 vi_tstamp:232482245664 data:0x719e300010000000
kworker/1:9-145 [001] .... 205.747304: rtcpu_vinotify_event: tstamp:7265568220 cch:0 vi:0 tag:VIFALC_TDSTATE channel:0x23 frame:0 vi_tstamp:232482255456 data:0x0000000031000001
kworker/1:9-145 [001] .... 205.747304: rtcpu_vinotify_event: tstamp:7265568514 cch:0 vi:0 tag:VIFALC_TDSTATE channel:0x23 frame:0 vi_tstamp:232482347072 data:0x719e2d0010000000
kworker/1:9-145 [001] .... 205.747304: rtcpu_vinotify_event: tstamp:7265568764 cch:0 vi:0 tag:VIFALC_TDSTATE channel:0x23 frame:0 vi_tstamp:232482356992 data:0x0000000031000002
kworker/1:9-145 [001] .... 205.859296: rtcpu_vinotify_event: tstamp:7267738354 cch:0 vi:0 tag:FS channel:0x00 frame:1 vi_tstamp:232554785056 data:0x0000000100000012
kworker/1:9-145 [001] .... 205.859299: rtcpu_vinotify_event: tstamp:7267738624 cch:0 vi:0 tag:ATOMP_FS channel:0x00 frame:1 vi_tstamp:232554785120 data:0x0000000800000000
kworker/1:9-145 [001] .... 205.859300: rtcpu_vinotify_event: tstamp:7267738912 cch:0 vi:0 tag:CHANSEL_EMBED_SOF channel:0x23 frame:1 vi_tstamp:232554785824 data:0x0000000000000004
kworker/1:9-145 [001] .... 205.859301: rtcpu_vinotify_event: tstamp:7267739157 cch:0 vi:0 tag:CHANSEL_EMBED_EOF channel:0x23 frame:1 vi_tstamp:232554822304 data:0x0000000000010008
kworker/1:9-145 [001] .... 205.859302: rtcpu_vinotify_event: tstamp:7267739436 cch:0 vi:0 tag:ATOMP_EMB_DATA_DONE channel:0x23 frame:1 vi_tstamp:232554823488 data:0x0000000000000000
kworker/1:9-145 [001] .... 205.859302: rtcpu_vinotify_event: tstamp:7267739682 cch:0 vi:0 tag:VIFALC_ACTIONLST channel:0x23 frame:1 vi_tstamp:232554846912 data:0x0000000003020001
kworker/1:9-145 [001] .... 205.859303: rtcpu_vinotify_event: tstamp:7267739960 cch:0 vi:0 tag:CHANSEL_PXL_SOF channel:0x23 frame:1 vi_tstamp:232554840992 data:0x0000000000000001
kworker/1:9-145 [001] .... 205.859304: rtcpu_vinotify_event: tstamp:7267740202 cch:0 vi:0 tag:VIFALC_ACTIONLST channel:0x23 frame:1 vi_tstamp:232554870432 data:0x0000000008020001
kworker/1:9-145 [001] .... 205.859305: rtcpu_vinotify_event: tstamp:7268802881 cch:0 vi:0 tag:CHANSEL_PXL_EOF channel:0x23 frame:1 vi_tstamp:232601417600 data:0x00000000099f0002
kworker/1:9-145 [001] .... 205.859305: rtcpu_vinotify_event: tstamp:7268803130 cch:0 vi:0 tag:FE channel:0x00 frame:1 vi_tstamp:232601418176 data:0x0000000100000022
kworker/1:9-145 [001] .... 205.859306: rtcpu_vinotify_event: tstamp:7268803419 cch:0 vi:0 tag:ATOMP_FE channel:0x00 frame:1 vi_tstamp:232601418240 data:0x0000000800000000
kworker/1:9-145 [001] .... 205.859307: rtcpu_vinotify_event: tstamp:7268803663 cch:0 vi:0 tag:ATOMP_FRAME_DONE channel:0x23 frame:1 vi_tstamp:232601418848 data:0x0000000000000000
kworker/1:9-145 [001] .... 205.859308: rtcpu_vinotify_event: tstamp:7269311979 cch:0 vi:0 tag:VIFALC_ACTIONLST channel:0x23 frame:1 vi_tstamp:232601479040 data:0x0000000002020001
kworker/1:9-145 [001] .... 205.859308: rtcpu_vinotify_event: tstamp:7269312230 cch:0 vi:0 tag:VIFALC_ACTIONLST channel:0x23 frame:1 vi_tstamp:232601495712 data:0x0000000000020001
위 로그는 카메라가 정상 동작 시 나오는 로그로 vi:0 인 것은 CAM0 포트를 나타 낸다.
tag | vistamp | data | desc |
FS | 232554785056 | 0x0000000100000012 | CSIMUX가 프레임 시작 패킷을 감지 |
ATOMP_FS | 232554785120 | 0x00000000800000000 | ATOMP, FS 발행 |
CHANSEL_EMBED_SOF | 232554785824 | 0x0000000000000004 | 임베디드 데이터 감지 |
CHANSEL_EMBED_EOF | 232554822304 | 0x0000000000010008 | 임베디드 데이터 2line을 예정대로 캡처 |
ATOMP_EMB_DATA_DONE | 232554823488 | 0x0000000000000000 | ATOMP가 포함된 데이터 캡처 완료를 보고 |
CHANSEL_PXL_SOF | 232554840992 | 0x0000000000000001 | 0line 눈으로 픽셀 데이터 시작을 감지 |
CHANSEL_PXL_EOF | 232601417600 | 0x00000000099f0002 | 0x99f=2463line에서 픽셀 데이터 종료 감지 |
FE | 232601418176 | 0x0000000100000022 | CSIMUX가 Frame end packet을 감지 |
ATOMP_FE | 232601418240 | 0x00000000800000000 | ATOMP, FrameEnd 발행 |
ATOMP_FRAME_DONE | 232601418848 | 0x0000000000000000 | ATOMP/OFIF가 메모리로 전송 완료를 보고 |
CSI 수신, 패킷 분석, 데이터 라우팅, 메모리 전송, 완료 알림 등의 일련의 흐름이 있음을 알 수 있다. 또한 이미지 크기는 3280x2464 이므로 EOF가 예상대로 line number로 나와있는 것을 알 수 있다.
이와 같이 Trace 기능을 사용하는 것으로 V4L2나 ArgusAPI에서는 모르는 MIPI의 동작 정보를 알 수 있다.
NOTIFY
NOTIFY는 VI6의 블록 중 하나로 CSIMUX에서 메모리 쓰기까지의 이벤트를 모니터링하고 Falcon에 알림.
이 구현에 관한 정보는 tegra-rtcpu-trace.c 에 쓰여 있습니다. TRM에 명시되어 있는 태그의 종류는 다음과 같으며, tag의 숫자는 문자열로 대체되어 출력된다.
source | event | Desc |
CSIMUX | Frame start/end | A/V 동기화에 사용할 수 있음 FS=tag:0 and FE=tag:1 |
CSIMUX | Frame fault events | 입력 오류가 발생한 경우 FS/FE 이벤트와 동시에 발생할 수 있음 tag:2 |
CSIMUX | Stream fault | 프레임과 연결할 수 없는 입력 오류의 경우 CSIMUX_STREAM=tag:3 |
CHANSEL | {Start, end} of {frame, emb} | frame=tag4, 5 emb=tag:6, 7 |
CHANSEL | Line reached events | line 타이머 조각 tag: 8 |
CHANSEL | Single-channel fault | CHANSEL_FAULT=tag:9 or 10 |
CHANSEL | Many-channel faults | tag: 11-14 |
ATOMP | Surface packer overflow | VI 아키텍처 팀에 문의하십시오. tag: 15 |
ATOMP | {Start, end} of frame | tag: 16, 17 |
ATOMP/OFIF | Frame done / embedded data / PDAF data done | tag:18, 19, 23 |
ATOMP/OFIF | Frame partial completion | tag: 20 |
ATOMP/OFIF | Frame truncated / frame tossed | tag: 21, 22 |
VGPIO | VGPIO Interrupt | tag: 29, 30 |
FML | FM-Lite completion | tag: 31 |
CSIMUX 오류는 주로 비정상적인 센서 출력으로 인해 발생하는 반면, ATOMP 오류는 VI6 구현으로 인해 발생할 가능성이 가장 높다.
센서를 사용하여 개발 중에 정상적인 이미지를 얻을 수 없는 경우 가능성이 가장 높은 오류는 CHANSEL_FAULT이다.
CHASEL_FAULT는 태그의 데이터에 따라 에러 정보를 출력하고, HIGH 16비트 라인을 나타 내고, LOW 16비트 에러 코드를 사용합니다. Jetson 세대에 따라 달라질 가능성도 있으므로 TRM이나 소스 코드도 확인하는 것이 좋다.
CHASEL_FAULT
CHANSEL_FAULT | bit | example | desc |
LINE_NUMBER | 16:31 | 0x00000001 | 0 line에서 SoF 감지 |
DTYPE_MISMATCH | 15 | 0x00018000 | 1line에서 데이터 유형 불일치 |
EMBED_INFRINGE | 14 | 0x00034000 | 3line에서 임베디드 데이터가 예상되지 않은 프레임에서 임베디드 데이터 수신 |
EMBED_LONG_LINE | 13 | 0x00012000 | embed data line이 예상보다 길다. |
EMBED_SPURIOUS | 12 | 0x00011000 | line 시작없이 임베디드 데이터 시작 |
EMBED_RUNAWAY | 11 | 0x00010800 | embed data line 수가 많음 |
EMBED_MISSING_LE | 10 | 0x00010400 | 포함된 데이터의 line end를 찾을 수 없음 |
PIXEL_SHORT_LINE | 9 | 0x00010200 | 예상보다 적은 픽셀 수로 line이 끝났습니다. |
PIXEL_LONG_LINE | 8 | 0x00010100 | line에서 예상보다 많은 픽셀 데이터가 발견되었습니다. |
PIXEL_SPURIOUS | 7 | 0x00010080 | line start packet 없이 데이터 시작 |
PIXEL_RUNAWAY | 6 | 0x00010040 | 픽셀 데이터가 예상보다 많은 line 수를 발견했습니다. |
PIXEL_MISSING_LE | 5 | 0x00010020 | line end를 찾을 수 없음 |
PIXEL_LINE_TIMER | 4 | 0x????0010 | Timer |
EMBED_EOF | 3 | 0x00000008 | 0 line으로 임베디드 데이터 EoF 감지 |
EMBED_SOF | 2 | 0x00000004 | 0 line으로 임베디드 데이터의 SoF 감지 |
PIXEL_EOF | 1 | 0x14600002 | 5216 line에서 EoF 감지 |
PIXEL_SOF | 0 | 0x00000001 | 0 line에서 SoF 감지 |
레지스터 설정과 디바이스 트리 설정에 불일치가 있는 경우는 위에 해당하는 에러가 나오게 된다.
kworker/0:2-1147 [000] .... 636.141074: rtcpu_vinotify_event: tstamp:20541218235 tag:CHANSEL_FAULT channel:0x23 frame:1 vi_tstamp:20541206603 data:0x023c0040
예를 들어 위와 같은 에러가 발생한 경우 bit를 확인해 보면 PIXEL_RUNAWAY 에러가 발생한 것을 알 수 있다.
CHANSEL_FAULT channel:0x023 … data:0x023c0040
(40 = 0100 0000)
bit [6]는 CHANSEL_FAULT : 0100 0000 = 4 -> PIXEL_RUNAWAY를 의미.
PIXEL_RUNAWAY는 VI가 예상보다 많은 줄을 수신한다는 것을 의미하는 것을 의미한다. (프레임이 너무 높음)
일반적인 해결 방법으로는 Device tree 및 드라이버 파일의 해상도가 일치하지 않기 때문에 발생한다. 그렇기 때문에 해상도 속성이 제대로 일치하는지 다시 확인이 필요하다.
추가로 발생하는 에러 중 CHANSEL_NOMATCH 가 있는데, 이 오류는 센서에서 출력하는 데이터 포맷과 Jetson VI 엔진이 예상하는 포맷이 일치하지 않으면 CHANSEL_NOMATCH가 발생할 수 있다.
CHANSEL_NOMATCH
bit 0 | no_match | - | desc |
bit 1-4 | CTYPE | 0x8 | FS (Frame Start) |
0x1 | FE (Frame End) | ||
0x4 | LS (Line Start) | ||
0x2 | LE (Line End) | ||
0x6 | LS_LE (Line Start & Line End) | ||
0x9 | DATA (데이터 패킷) | ||
bit 5-10 | DTYPE | 0x00 | NvCsiDataType_Unspecified |
0x19 | NvCsiDataType_YUV420_10 | ||
0x1A | NvCsiDataType_LEG_YUV420_8 | ||
0x18 | NvCsiDataType_YUV420_8 | ||
0x1C | NvCsiDataType_YUV420CSPS_8 | ||
0x1D | NvCsiDataType_YUV420CSPS_10 | ||
0x1E | NvCsiDataType_YUV422_8 | ||
0x1F | NvCsiDataType_YUV422_10 | ||
0x20 | NvCsiDataType_RGB444 | ||
0x21 | NvCsiDataType_RGB555 | ||
0x22 | NvCsiDataType_RGB565 | ||
0x23 | NvCsiDataType_RGB666 | ||
0x24 | NvCsiDataType_RGB888 | ||
0x28 | NvCsiDataType_RAW6 | ||
0x29 | NvCsiDataType_RAW7 | ||
0x2A | NvCsiDataType_RAW8 | ||
0x2B | NvCsiDataType_RAW10 | ||
0x2C | NvCsiDataType_RAW12 | ||
0x2D | NvCsiDataType_RAW14 | ||
0x2E | NvCsiDataType_RAW16 | ||
0x2F | NvCsiDataType_RAW20 | ||
0x30 | NvCsiDataType_User_1 | ||
0x31 | NvCsiDataType_User_2 | ||
0x32 | NvCsiDataType_User_3 | ||
0x33 | NvCsiDataType_User_4 | ||
0x34 | NvCsiDataType_User_5 | ||
0x35 | NvCsiDataType_User_6 | ||
0x36 | NvCsiDataType_User_7 | ||
0x37 | NvCsiDataType_User_8 | ||
0x40 | NvCsiDataType_Unknown |
kworker/1:7-140 [001] .... 103.731569: rtcpu_vinotify_error: tstamp:4064334189 cch:0 vi:0 tag:CHANSEL_NOMATCH channel:0x01 frame:1 vi_tstamp:130058641472 data:0x00000000000003c9
위 로그를 기준으로 분석해 보면 다음과 같다.
CHANSEL_NOMATCH channel:0x01 … data:0x00000000000003c9
(3c9 = 0011 1100 1001)
bit [0]은 no_match를 의미 : 1 -> 불일치 오류가 발생했음을 나타냅니다.
bit [1-4]는 CTYPE : 0100 = 4 -> LS를 의미.
bit [5-10]은 DTYPE: 11101 = 30 = NvCsiDataType_YUV422_8 -> 예상 형식을 의미.
일반적으로 해결 방법은 Device tree (csi_pixel_bit_depth, pixel_t 속성 등)및 드라이버 파일의 센서의 출력 포맷과 제대로 일치하는지 확인해야 한다.
그 외에도 다양한 에러가 존재하기 때문에 에러가 발생할 시 포럼에 해당 에러를 검색하면 다양한 해결 방법을 확인할 수 있다.
참고 :
https://developer.nvidia.com/downloads/orin-series-soc-technical-reference-manual/
https://elinux.org/Jetson/l4t/Camera_BringUp
'NVIDIA > Jetson' 카테고리의 다른 글
Jetson dynamic overlay (0) | 2024.11.26 |
---|---|
Jetson Fan Control (0) | 2024.11.18 |
libgpiod (0) | 2024.10.06 |
JETSON UEFI DEBUG (0) | 2024.07.15 |
JETPACK 6 Flash (0) | 2024.06.23 |