Skip to content

Commit

Permalink
Repair jetson xavier nx picture pure white problem
Browse files Browse the repository at this point in the history
  • Loading branch information
glddiv committed Oct 28, 2020
1 parent 41523d0 commit 5c5e399
Show file tree
Hide file tree
Showing 7 changed files with 895 additions and 1 deletion.
22 changes: 22 additions & 0 deletions Jetson/Jetvariety/example/gstreamer-tools/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,13 @@ class ArducamUtils(object):
v4l2.V4L2_PIX_FMT_SRGGB10:{ "depth":10, "cvt_code": cv2.COLOR_BAYER_BG2BGR, "convert2rgb": 0},
v4l2.V4L2_PIX_FMT_Y10:{ "depth":10, "cvt_code": -1, "convert2rgb": 0},
}
pixfmt_map_xavier_nx = {
v4l2.V4L2_PIX_FMT_SBGGR10:{ "depth":16, "cvt_code": cv2.COLOR_BAYER_RG2BGR, "convert2rgb": 0},
v4l2.V4L2_PIX_FMT_SGBRG10:{ "depth":16, "cvt_code": cv2.COLOR_BAYER_GR2BGR, "convert2rgb": 0},
v4l2.V4L2_PIX_FMT_SGRBG10:{ "depth":16, "cvt_code": cv2.COLOR_BAYER_GB2BGR, "convert2rgb": 0},
v4l2.V4L2_PIX_FMT_SRGGB10:{ "depth":16, "cvt_code": cv2.COLOR_BAYER_BG2BGR, "convert2rgb": 0},
v4l2.V4L2_PIX_FMT_Y10:{ "depth":16, "cvt_code": -1, "convert2rgb": 0},
}

pixfmt_map_raw8 = {
v4l2.V4L2_PIX_FMT_SBGGR8:{ "depth":8, "cvt_code": cv2.COLOR_BAYER_RG2BGR, "convert2rgb": 0},
Expand Down Expand Up @@ -119,6 +126,21 @@ class ArducamUtils(object):
DEVICE_ID = 0x0030

def __init__(self, device_num):
import subprocess
command = ['bash', '-c', 'source scripts/jetson_variables.sh && env']

proc = subprocess.Popen(command, stdout = subprocess.PIPE)
environment_vars = {}
for line in proc.stdout:
(key, _, value) = line.partition(b"=")
environment_vars[key] = value

proc.communicate()

# Jetson Model
if b"Xavier NX" in environment_vars[b"JETSON_TYPE"].strip():
ArducamUtils.pixfmt_map = ArducamUtils.pixfmt_map_xavier_nx

self.vd = open('/dev/video{}'.format(device_num), 'w')
self.refresh()

Expand Down
121 changes: 121 additions & 0 deletions Jetson/Jetvariety/example/scripts/jetson_libraries.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
#!/bin/bash
# This file is part of the jetson_stats package (https://github.com/rbonghi/jetson_stats or http://rnext.it).
# Copyright (c) 2020 Raffaello Bonghi.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.


# Read CUDA version
if [ -f /usr/local/cuda/version.txt ]; then
JETSON_CUDA=$(cat /usr/local/cuda/version.txt | sed 's/\CUDA Version //g')
else
JETSON_CUDA="NOT_INSTALLED"
fi
# Jetson CUDA version
export JETSON_CUDA

# Read from OpenCV if is installed CUDA
opencv_read_cuda()
{
# Red if use CUDA or not
local OPENCV_VERSION_VERBOSE=$(opencv_version --verbose | grep "Use Cuda" )
if [ ! -z "$OPENCV_VERSION_VERBOSE" ]; then
# Read status of CUDA
local OPENCV_CUDA_FLAG=$(echo $OPENCV_VERSION_VERBOSE | cut -f2 -d ':' | cut -f2 -d ' ' )
if [ "$OPENCV_CUDA_FLAG" == "NO" ]; then
# Set NO if cuda is not installed
echo "NO"
else
# Set YES if cuda is installed
echo "YES"
fi
return
fi
# read NVIDIA CUDA version
OPENCV_VERSION_VERBOSE=$(opencv_version --verbose | grep "NVIDIA CUDA" )
if [ ! -z "$OPENCV_VERSION_VERBOSE" ]; then
# get information
local OPENCV_CUDA_FLAG=$(echo $OPENCV_VERSION_VERBOSE | cut -f2 -d ':')
OPENCV_CUDA_FLAG=${OPENCV_CUDA_FLAG//[[:blank:]]/}
# Set YES if cuda is installed
echo "YES"
return
fi
echo "NO"
return
}

if hash opencv_version 2>/dev/null; then
JETSON_OPENCV="$(opencv_version)"
# Read information about cuda status
JETSON_OPENCV_CUDA=$(opencv_read_cuda)
else
JETSON_OPENCV="NOT_INSTALLED"
JETSON_OPENCV_CUDA="NO"
fi
# Opencv variables
export JETSON_OPENCV
export JETSON_OPENCV_CUDA

# Extract cuDNN version
JETSON_CUDNN=$(dpkg -l 2>/dev/null | grep -m1 "libcudnn")
if [ ! -z "$JETSON_CUDNN" ] ; then
JETSON_CUDNN=$(echo $JETSON_CUDNN | sed 's/.*libcudnn[0-9] \([^ ]*\).*/\1/' | cut -d '-' -f1 )
else
JETSON_CUDNN="NOT_INSTALLED"
fi
# Export NVIDIA CuDNN Library
export JETSON_CUDNN

# Extract TensorRT version
JETSON_TENSORRT=$(dpkg -l 2>/dev/null | grep -m1 " tensorrt ")
if [ ! -z "$JETSON_TENSORRT" ] ; then
JETSON_TENSORRT=$(echo $JETSON_TENSORRT | sed 's/.*tensorrt \([^ ]*\).*/\1/' | cut -d '-' -f1 )
else
JETSON_TENSORRT="NOT_INSTALLED"
fi
# Export NVIDIA CuDNN TensorRT
export JETSON_TENSORRT

# Extract Visionworks version
JETSON_VISIONWORKS=$(dpkg -l 2>/dev/null | grep -m1 "libvisionworks")
if [ ! -z "$JETSON_VISIONWORKS" ] ; then
JETSON_VISIONWORKS=$(echo $JETSON_VISIONWORKS | sed 's/.*libvisionworks \([^ ]*\).*/\1/' )
else
JETSON_VISIONWORKS="NOT_INSTALLED"
fi
# Export NVIDIA CuDNN VisionWorks
export JETSON_VISIONWORKS

# Extract VPI
JETSON_VPI=$(dpkg -l 2>/dev/null | grep -m1 "vpi")
if [ ! -z "$JETSON_VPI" ] ; then
JETSON_VPI=$(echo $JETSON_VPI | sed 's/.*vpi \([^ ]*\).*/\1/' )
else
JETSON_VPI="NOT_INSTALLED"
fi
# Export VPI
export JETSON_VPI

# Vulkan
JETSON_VULKAN_INFO=$(which vulkaninfo)
if [ ! -z $JETSON_VULKAN_INFO ] ; then
JETSON_VULKAN_INFO=$($JETSON_VULKAN_INFO | grep -m1 "Vulkan Instance Version")
JETSON_VULKAN_INFO=$(echo $JETSON_VULKAN_INFO | sed 's/.*: \([^ ]*\).*/\1/' )
else
JETSON_VULKAN_INFO="NOT_INSTALLED"
fi
# Export VPI
export JETSON_VULKAN_INFO
#EOF
238 changes: 238 additions & 0 deletions Jetson/Jetvariety/example/scripts/jetson_variables.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,238 @@
#!/bin/bash
# This file is part of the jetson_stats package (https://github.com/rbonghi/jetson_stats or http://rnext.it).
# Copyright (c) 2020 Raffaello Bonghi.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.


# TODO Add enviroments variables:
# - UID -> https://devtalk.nvidia.com/default/topic/996988/jetson-tk1/chip-uid/post/5100481/#5100481
# - GCID, BOARD, EABI

###########################
#### JETPACK DETECTION ####
###########################
# Write version of jetpack installed
# https://developer.nvidia.com/embedded/jetpack-archive
jetson_jetpack()
{
local JETSON_L4T=$1
local JETSON_JETPACK=""
case $JETSON_L4T in
"32.4.3") JETSON_JETPACK="4.4" ;;
"32.4.2") JETSON_JETPACK="4.4 DP" ;;
"32.3.1") JETSON_JETPACK="4.3" ;;
"32.2.3") JETSON_JETPACK="4.2.3" ;;
"32.2.1") JETSON_JETPACK="4.2.2" ;;
"32.2.0" | "32.2") JETSON_JETPACK="4.2.1" ;;
"32.1.0" | "32.1") JETSON_JETPACK="4.2" ;;
"31.1.0" | "31.1") JETSON_JETPACK="4.1.1" ;;
"31.0.2") JETSON_JETPACK="4.1" ;;
"31.0.1") JETSON_JETPACK="4.0" ;;
"28.2.1") JETSON_JETPACK="3.3 | 3.2.1" ;;
"28.2.0" | "28.2") JETSON_JETPACK="3.2" ;;
"28.1.0" | "28.1") JETSON_JETPACK="3.1" ;;
"27.1.0" | "27.1") JETSON_JETPACK="3.0" ;;
"24.2.1") JETSON_JETPACK="3.0 | 2.3.1" ;;
"24.2.0" | "24.2") JETSON_JETPACK="2.3" ;;
"24.1.0" | "24.1") JETSON_JETPACK="2.2.1 | 2.2" ;;
"23.2.0" | "23.2") JETSON_JETPACK="2.1" ;;
"23.1.0" | "23.1") JETSON_JETPACK="2.0" ;;
"21.5.0" | "21.5") JETSON_JETPACK="2.3.1 | 2.3" ;;
"21.4.0" | "21.4") JETSON_JETPACK="2.2 | 2.1 | 2.0 | 1.2 DP" ;;
"21.3.0" | "21.3") JETSON_JETPACK="1.1 DP" ;;
"21.2.0" | "21.2") JETSON_JETPACK="1.0 DP" ;;
*) JETSON_JETPACK="UNKNOWN" ;;
esac
# return type jetpack
echo $JETSON_JETPACK
}

###########################
#### BOARD DETECTION ####
###########################
# Detection NVIDIA Jetson
# Jetson TK1 can be detected with chip id
# Reference:
# 1. https://docs.nvidia.com/jetson/l4t/index.html (Devices Supported by This Document)
# 2. https://github.com/rbonghi/jetson_stats/issues/48
# 3. https://github.com/rbonghi/jetson_stats/issues/57
jetson_board()
{
local JETSON_CHIP_ID=$1
local JETSON_BOARD=$2
local JETSON_TYPE=""
# Detection jetson board
case $JETSON_BOARD in
*2180*) JETSON_TYPE="TX1" ;;
P3310*) JETSON_TYPE="TX2" ;;
P3489-0080*) JETSON_TYPE="TX2 4GB" ;;
P3489*) JETSON_TYPE="TX2i" ;;
P2888-0006*) JETSON_TYPE="AGX Xavier [8GB]" ;;
P2888-0001*|P2888-0004*) JETSON_TYPE="AGX Xavier [16GB]" ;;
P2888*) JETSON_TYPE="AGX Xavier [32GB]" ;;
P3448-0002*) JETSON_TYPE="Nano" ;;
P3448*) JETSON_TYPE="Nano (Developer Kit Version)" ;;
P3668-0001*) JETSON_TYPE="Xavier NX" ;;
P3668*) JETSON_TYPE="Xavier NX (Developer Kit Version)" ;;
*) JETSON_TYPE="" ;;
esac
# if JETSON_TYPE empty, check CHIP_ID for jetson TK1
if [ -z "$JETSON_TYPE" ] ; then
if [ "$JETSON_CHIP_ID" == "64" ] ; then
JETSON_TYPE="TK1"
fi
fi
# Return board name
echo $JETSON_TYPE
}
###########################

# Extract jetson chip id
JETSON_CHIP_ID=""
if [ -f /sys/module/tegra_fuse/parameters/tegra_chip_id ]; then
JETSON_CHIP_ID=$(cat /sys/module/tegra_fuse/parameters/tegra_chip_id)
fi
# Ectract type board
JETSON_SOC=""
if [ -f /proc/device-tree/compatible ]; then
# Extract the last part of name
JETSON_SOC=$(tr -d '\0' < /proc/device-tree/compatible | sed -e 's/.*,//')
fi
# Extract boardids if exists
JETSON_BOARDIDS=""
if [ -f /proc/device-tree/nvidia,boardids ]; then
JETSON_BOARDIDS=$(tr -d '\0' < /proc/device-tree/nvidia,boardids)
fi

# Code name
JETSON_CODENAME=""
JETSON_TYPE="UNKNOWN"
JETSON_MODULE="UNKNOWN"
JETSON_BOARD="UNKNOWN"
list_hw_boards()
{
# Extract from DTS the name of the boards available
# Reference:
# 1. https://unix.stackexchange.com/questions/251013/bash-regex-capture-group
# 2. https://unix.stackexchange.com/questions/144298/delete-the-last-character-of-a-string-using-string-manipulation-in-shell-script
local s=$1
local regex='p([0-9-]+)' # Equivalent to p([\d-]*-)
while [[ $s =~ $regex ]]; do
local board_name=$(echo "P${BASH_REMATCH[1]::-1}")
#echo $board_name
# Load jetson type
JETSON_TYPE=$(jetson_board $JETSON_CHIP_ID $board_name)
# If jetson type is not empty the module name is the same
if [ ! -z "$JETSON_TYPE" ] ; then
JETSON_MODULE=$board_name
echo "JETSON_TYPE=\"$JETSON_TYPE\""
echo "JETSON_MODULE=\"$JETSON_MODULE\""
else
JETSON_BOARD=$board_name
echo "JETSON_BOARD=\"$JETSON_BOARD\""
fi
# Find next match
s=${s#*"${BASH_REMATCH[1]}"}
done
}
# Read DTS file
# 1. https://devtalk.nvidia.com/default/topic/1071080/jetson-nano/best-way-to-check-which-tegra-board/
# 2. https://devtalk.nvidia.com/default/topic/1014424/jetson-tx2/identifying-tx1-and-tx2-at-runtime/
# 3. https://devtalk.nvidia.com/default/topic/996988/jetson-tk1/chip-uid/post/5100481/#5100481
if [ -f /proc/device-tree/nvidia,dtsfilename ]; then
# ..<something>/hardware/nvidia/platform/t210/porg/kernel-dts/tegra210-p3448-0000-p3449-0000-b00.dts
# The last third is the codename of the board
JETSON_CODENAME=$(tr -d '\0' < /proc/device-tree/nvidia,dtsfilename)
JETSON_CODENAME=$(echo ${JETSON_CODENAME#*"/hardware/nvidia/platform/"} | tr '/' '\n' | head -2 | tail -1 )
# The basename extract the board type
JETSON_DTS="$(tr -d '\0' < /proc/device-tree/nvidia,dtsfilename | sed 's/.*\///')"
# List of all boards
eval $(list_hw_boards "$JETSON_DTS")
fi

# Print description
JETSON_MACHINE=""
if [ ! -z "$JETSON_TYPE" ] ; then
JETSON_MACHINE="NVIDIA Jetson $JETSON_TYPE"
fi
# Export variables
export JETSON_CHIP_ID
export JETSON_SOC
export JETSON_BOARDIDS
export JETSON_CODENAME
export JETSON_MODULE
export JETSON_BOARD
export JETSON_TYPE
export JETSON_MACHINE

# Write CUDA architecture
# https://developer.nvidia.com/cuda-gpus
# https://devtalk.nvidia.com/default/topic/988317/jetson-tx1/what-should-be-the-value-of-cuda_arch_bin/
case $JETSON_TYPE in
*Xavier*) JETSON_CUDA_ARCH_BIN="7.2" ;;
TX2*) JETSON_CUDA_ARCH_BIN="6.2" ;;
TX1* | Nano*) JETSON_CUDA_ARCH_BIN="5.3" ;;
TK1) JETSON_CUDA_ARCH_BIN="3.2" ;;
* ) JETSON_CUDA_ARCH_BIN="NONE" ;;
esac
# Export Jetson CUDA ARCHITECTURE
export JETSON_CUDA_ARCH_BIN

# Serial number
# https://devtalk.nvidia.com/default/topic/1055507/jetson-nano/nano-serial-number-/
JETSON_SERIAL_NUMBER=""
if [ -f /sys/firmware/devicetree/base/serial-number ]; then
JETSON_SERIAL_NUMBER=$(tr -d '\0' </sys/firmware/devicetree/base/serial-number)
fi
# Export NVIDIA Serial Number
export JETSON_SERIAL_NUMBER

# NVIDIA Jetson version
# reference https://devtalk.nvidia.com/default/topic/860092/jetson-tk1/how-do-i-know-what-version-of-l4t-my-jetson-tk1-is-running-/
# https://stackoverflow.com/questions/16817646/extract-version-number-from-a-string
# https://askubuntu.com/questions/319307/reliably-check-if-a-package-is-installed-or-not
# https://github.com/dusty-nv/jetson-inference/blob/7e81381a96c1ac5f57f1728afbfdec7f1bfeffc2/tools/install-pytorch.sh#L296
if [ -f /etc/nv_tegra_release ]; then
# L4T string
# First line on /etc/nv_tegra_release
# - "# R28 (release), REVISION: 2.1, GCID: 11272647, BOARD: t186ref, EABI: aarch64, DATE: Thu May 17 07:29:06 UTC 2018"
JETSON_L4T_STRING=$(head -n 1 /etc/nv_tegra_release)
# Load release and revision
JETSON_L4T_RELEASE=$(echo $JETSON_L4T_STRING | cut -f 2 -d ' ' | grep -Po '(?<=R)[^;]+')
JETSON_L4T_REVISION=$(echo $JETSON_L4T_STRING | cut -f 2 -d ',' | grep -Po '(?<=REVISION: )[^;]+')
elif dpkg --get-selections | grep -q "^nvidia-l4t-core[[:space:]]*install$"; then
# Read version
JETSON_L4T_STRING=$(dpkg-query --showformat='${Version}' --show nvidia-l4t-core)
# extract version
JETSON_L4T_ARRAY=$(echo $JETSON_L4T_STRING | cut -f 1 -d '-')
# Load release and revision
JETSON_L4T_RELEASE=$(echo $JETSON_L4T_ARRAY | cut -f 1 -d '.')
JETSON_L4T_REVISION=${JETSON_L4T_ARRAY#"$JETSON_L4T_RELEASE."}
else
# Load release and revision
JETSON_L4T_RELEASE="N"
JETSON_L4T_REVISION="N.N"
fi
# Write Jetson description
JETSON_L4T="$JETSON_L4T_RELEASE.$JETSON_L4T_REVISION"
# Export Release L4T
export JETSON_L4T_RELEASE
export JETSON_L4T_REVISION
export JETSON_L4T

JETSON_JETPACK=$(jetson_jetpack $JETSON_L4T)
# Export Jetson Jetpack installed
export JETSON_JETPACK
# EOF

0 comments on commit 5c5e399

Please sign in to comment.