Difference between revisions of "VEYE CS Camera for Jetson TX2"

From wiki_veye
Jump to navigation Jump to search
 
(161 intermediate revisions by 3 users not shown)
Line 1: Line 1:
 
[[VEYE CS Camera for Jetson TX2/zh|查看中文]]
 
[[VEYE CS Camera for Jetson TX2/zh|查看中文]]
  
'''<big>How to use VEYE and CS series camera module on NVIDIA Jetson TX2,AGX Xavier and Xavier NX</big>'''
+
'''<big>How to use VEYE and CS series camera module on NVIDIA Jetson Nano,TX2,Xavier and Orin</big>'''
  
 
===Overview===
 
===Overview===
This guide shows how to use VEYE and CS series camera modules on Jetson TX2,AGX Xavier and Xavier NX.  Jetson SDK Version is(Jetpack4.2.2,L4T r32.2.1)and(Jetpack4.3,L4Tr32.3.1) and (Jetpack4.4,L4T,r32.4.2). We provide two ways to do so: '''Prebuilt Binaries''' or '''Source Code. Yes, It's Open Source!'''
+
This guide shows how to use VEYE and CS series camera modules on Jetson boards.  Jetson SDK Version is:
  
VEYE and CS series camera modules are STARVIS camera module with ISP functions build in. It output UYVY data using MIPI-CSI2. We provide '''V4L2 interface''' for video streaming apps , and '''Video Control Toolkits (which is Shell Script)''' to control the camera module directly, which is called DRA(Directly Register Access).
+
*Jetpack4.2.2,L4T r32.2.1
===Hardware Setup===
+
*Jetpack4.3,L4T r32.3.1
We have designed a 6cam interposer board  for TX2 devkit and Xavier, It support up to 6 cameras at the same time.
+
*Jetpack4.4,L4T r32.4.3
[[File:ADP-N1-6CAM YT0.95-4I.jpg|alt=6cam interposer board connected with 6 cameras|center|thumb|800x800px|6cam interposer board connected with 6 cameras]]
+
*Jetpack4.4.1,L4T r32.4.4
<br />
+
*Jetpack4.5,L4T r32.5
====NVIDIA TX2 Developer Kit====
+
*Jetpack4.5.1,L4T r32.5.1
It is connected as shown in figure:
+
*Jetpack4.6,L4T r32.6.1
[[File:TX2-6CAM-YT2.0-3.5I.jpg|alt=TX2 Devkit 6 cameras connection|center|thumb|800x800px|'''TX2 Devkit 6 cameras connection''']]
 
<br />
 
  
====NVIDIA TX2 AGX Xavier====
+
* Jetpack4.6.1, L4T r32.7.1
[[File:AGX XAVIER 6cam.jpg|alt=Connect VEYE cameras to AGX Xavier|center|thumb|800x800px|Connect VEYE cameras to AGX Xavier (the green interposer board  is temporary,the official version is black. )]]
+
*Jetpack4.6.2,L4T r32.7.2
<br />
+
*Jetpack4.6.3,L4T r32.7.3
====NVIDIA Xavier NX Devkit====
+
*Jetpack4.6.4,L4T r32.7.4
The Xavier NX interface is compatible with raspberry pi and Jetson Nano. The connection mode is shown in figure (TODO):
+
*Jetpack5.0.1DP, L4T r34.1.1
 +
*Jetpack5.0.2, L4T r35.1
 +
*Jetpack5.1,L4T r35.2.1
 +
*Jetpack5.1.1,L4T r35.3.1
 +
*Jetpack5.1.2,L4T r35.4.1
 +
*Jetpack5.1.3,L4T r35.5
 +
*Jetpack6.0,L4T r36.3
  
<br />
+
We provide two ways to do so: '''Prebuilt Binaries''' or '''Source Code. Yes, It's Open Source!'''
===Buruing the prebuilt Image to upgrade Jetson Xavier NX Devkit===
 
You can use the image prebuild by us to upgrade jetson nano system, which will support our camera.
 
  
Using whole prebuilt image
+
VEYE and CS series camera modules are camera module with ISP functions build in. It output UYVY data using MIPI-CSI2. We provide '''V4L2 interface''' for video streaming apps , and '''Video Control Toolkits (which is Shell Script)''' to control the camera module directly, which is called DRA(Directly Register Access).
 +
====Camera module list====
 +
{| class="wikitable"
 +
|+Camera module dirver status list
 +
!Series
 +
!Model
 +
!Status
 +
|-
 +
|VEYE series
 +
| VEYE-MIPI-IMX327S
 +
| Done
 +
|-
 +
|VEYE series
 +
| VEYE-MIPI-IMX385
 +
|Done
 +
|-
 +
|VEYE series
 +
|VEYE-MIPI-IMX462
 +
|Done
 +
|-
 +
|VEYE series
 +
|VEYE-MIPI-IMX335
 +
|Done
 +
|-
 +
|CS series
 +
| CS-MIPI-IMX307
 +
|Done
 +
|-
 +
|CS series
 +
|CS-MIPI-SC132
 +
|Done
 +
|-
 +
|TX2-XAVIER-nCAM Series
 +
|CS-TX2-XAVIER-'''''n'''''CAM
 +
|Done
 +
|}
 +
====How to check the current L4T version====
  
*download :
+
===== Method 1 =====
 +
On Jetson board
  
link:https://pan.baidu.com/s/1sWrcfEOivjuQ7T7P5bVcng
+
<code>cat /etc/nv_tegra_release</code>
  
If Baidu cloud disk download is too slow, you can contact our company customer service ''xumm@csoneplus.com'' to obtain.
+
If it shows:
  
*How to burn
+
<code># R32 (release), REVISION: 4.3......</code>
  
refer to [https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit Official document]
+
It means L4t Version is 32.4.3
===Upgrade Jetson TX2, AGX Xavier and Xavier NX system===
 
====Setting Up the Host PC Environment====
 
  
*Cross-compiling Toolchain
+
===== Method 2 =====
 +
Refer to this [https://pypi.org/project/jetson-stats/ link] to install jetson-stats:
  
Please refer to this [https://docs.nvidia.com/jetson/l4t/index.html#page/Tegra%2520Linux%2520Driver%2520Package%2520Development%2520Guide%2Fxavier_toolchain.html%23wwpID0ESHA link] to install toolchain on your Host PC.
+
<code>jtop</code>
  
*L4T source code and Rootfs
+
===Hardware Setup===
 +
We have designed a 6cam interposer board  for TX2 devkit,Xavier and Orin, It support up to 6 cameras at the same time. 
 +
[[File:ADP-N1-6CAM YT0.95-4I.jpg|alt=6cam interposer board connected with 6 cameras|center|thumb|800x800px|6cam interposer board connected with 6 cameras]]
  
You could use SDK Manager or [https://developer.nvidia.com/embedded/downloads directly download] to get source code.
 
  
Sync code as this if you use SDK Manager:
+
In particular, the VEYE-MIPI-IMX335 must use a 12V DC terminal to provide auxiliary power due to its high power consumption. Refer to [[ADP-N1-V2.0 Adapter Board Data Sheet#Adapter Board Pinlist.EF.BC.88.E6.8E.A5.E5.8F.A3.E5.92.8C.E5.BC.95.E8.84.9A.E8.AF.B4.E6.98.8E.EF.BC.89|J11 of ADP-N1]].
 +
====NVIDIA TX2 Developer Kit====
 +
It is connected as shown in figure:
 +
[[File:TX2-6CAM-YT2.0-3.5I.jpg|alt=TX2 Devkit 6 cameras connection|center|thumb|800x800px|'''TX2 Devkit 6 cameras connection''']]
 +
<br />'''Be sure to screw the ADP adapter board to the bottom board.'''
  
''- Jetpack4.2.2''
+
====NVIDIA AGX Xavier(the same with Orin)====
 +
<br />
 +
[[File:ADP-N1-V2.0 XAVIER 6CAM.jpg|link=http://wiki.veye.cc/index.php/File:ADP-N1-V2.0%20XAVIER%206CAM.jpg|alt=Connect VEYE cameras to AGX Xavier|center|thumb|800x800px|Connect VEYE cameras to AGX Xavier]]
 +
<br />'''Be sure to screw the ADP adapter board to the bottom board to ensure that the adapter plate is installed flat.'''
 +
====NVIDIA Nano ,TX2 NX and Xavier NX Devkit====
 +
The Xavier NX interface is compatible with raspberry pi and Jetson Nano. The connection mode is shown in figure:
 +
[[File:Xavier NX connection with VEYE-MIPI-327.jpg|alt=Xavier NX connection with VEYE-MIPI-327|center|thumb|800x800px|Xavier NX connection with VEYE-MIPI-327]]
 +
<br />
 +
[[File:Xavier NX connection with CS-MIPI-IMX307.jpg|alt=Xavier NX connection with CS-MIPI-IMX307|center|thumb|800x800px|Xavier NX connection with CS-MIPI-IMX307]]
 +
[[File:Jetson nano to Veye327.jpg|link=http://wiki.veye.cc/index.php/File:Jetson%20nano%20to%20Veye327.jpg|alt=Jetson Nano A02 与VEYE模组连接|center|thumb|800x800px|VEYE327 connection with Jetson Nano A02]]
 +
[[File:VEYE camera connection with Orin Nano and Orin NX.jpg|center|thumb|800x800px|VEYE camera  connection with Orin Nano and Orin NX]]
  
<code>./source_sync.sh -t tegra-l4t-r32.2.1</code>
+
=== Upgrade Jetson system ===
 +
This section describes how to upgrade the Jetson system to support MV camera module. For OS update method, please refer to [[How to upgrade the Jetson system to support VEYE cameras|Update Jetson OS]].
 +
===Applications and Test===
 +
====Check system status====
 +
Run the following command to confirm whether the camera is probed.
  
''- Jetpack4.3''
+
*VEYE-MIPI-IMX327S/VEYE-MIPI-IMX462/VEYE-MIPI-IMX385(using VEYE-MIPI-CAM2M dtb)
  
<code>./source_sync.sh -t tegra-l4t-r32.3.1</code>
+
<code>dmesg | grep veye</code>  
  
''- Jetpack4.4''
+
The output message appears as shown below:
  
<code>./source_sync.sh -t tegra-l4t-r32.4.2</code>
+
<code>camera id is veyecam</code>
  
*Setting Up the Environment
+
<code>sensor is IMX327/IMX462/IMX385</code>
  
Assume SDK install directory is <TOPDIR>,source code is in $L4T_DIR/sources directory.
+
<code>subdev veyecam [i2c_bus]-003b bound</code>
  
''- TX2@Jetpack4.2.2''
+
*For CS-MIPI-IMX307
  
<code>export TOP_DIR=/home/xumm/nvidia/nvidia_sdk/JetPack_4.2.2_Linux_GA_P3310/</code>
+
<code>dmesg | grep csx307</code>  
  
''- TX2@Jetpack4.3''
+
The output message appears as shown below.
  
<code>export TOP_DIR=/home/xumm/nvidia/nvidia_sdk/JetPack_4.3_Linux_P3310/</code>
+
<code>Detected CS307 sensor</code>
  
''- AGX XavierJetpack4.2.2''
+
<code>subdev csx307 [i2c_bus]-003b bound</code>
  
<code>export TOP_DIR=/home/xumm/nvidia/nvidia_sdk/JetPack_4.2.2_Linux_GA_P2888/</code>
+
*For CS-MIPI-SC132
  
''- AGX XavierJetpack4.3''
+
<code>dmesg | grep cssc132</code>  
  
<code>export TOP_DIR=/home/xumm/nvidia/nvidia_sdk/JetPack_4.3_Linux_P2888/</code>
+
The output message appears as shown below.
  
- ''Xavier NX Jetpack4.4''
+
<code>subdev cssc132 [i2c_bus]-003b bound</code>
  
<code>export TOP_DIR=/home/xumm/nvidia/nvidia_sdk/JetPack_4.4_DP_Linux_DP_JETSON_XAVIER_NX_DEVKIT</code>
+
*For VEYE-MIPI-IMX335
  
- Common part
+
<code>dmesg | grep imx335</code>
  
<code>export L4T_DIR=$TOP_DIR/Linux_for_Tegra</code>
+
The output message appears as shown below.:
  
<code>export LOCALVERSION=-tegra</code>
+
<code>camera id is VEYE-MIPI-IMX335</code>
  
<code>export LDK_ROOTFS_DIR=$TOP_DIR/Linux_for_Tegra/rootfs</code>
+
<code>subdev veye_imx335 [i2c_bus]-003b bound</code>
  
<code>export ARCH=arm64</code>
+
*Run the following command to check the presence of video node.
  
<code>export CROSS_COMPILE=aarch64-linux-gnu-</code>
+
<code>ls /dev/video*</code>
  
<code>export CROSS32CC=arm-linux-gnueabihf-gcc</code>
+
The output message appears as shown below.
  
<code>export TEGRA_KERNEL_OUT=$L4T_DIR/sources/kernel/out_kernel</code>
+
<code>videoX</code>  
  
<code>export KERNEL_PATH=$L4T_DIR/sources/kernel/out_kernel</code>
+
*For VEYE-MIPI-327(using VEYE-MIPI-327 dtb)
  
<code>export NVIDIA_PATH=$L4T_DIR/sources/kernel/nvidia</code>
+
<code>dmesg | grep veye327</code>  
  
<code>export TX2_DTS_PATH=$L4T_DIR/sources/hardware/nvidia/platform/t18x</code>
+
The output message appears as shown below:
  
<code>export XAVIER_DTS_PATH=$L4T_DIR/sources/hardware/nvidia/platform/t19x</code>
+
<code>Detected VEYE327 sensor</code>
  
<code>cd $L4T_DIR/sources/kernel/kernel-4.9/</code>
+
<code>subdev veye327 [i2c_bus]-003b bound</code>
  
*Build default image, flashing to Jetson Board, prepare L4T environment
+
The [i2c_bus] in the driver prompt message indicates the i2c bus corresponding to this camera.
  
<code>cd $L4T_DIR</code>
+
====Video Stream Toolkits Manual====
 +
The camera appears as /dev/videoX device node,where X is between [0-5].
  
<code>sudo ./apply_binaries.sh</code>  
+
During the Linux boot process, the cameras are detected in the order of i2c bus from smallest to largest. For example, if only one camera is connected, X is 0 regardless of the hardware connection to the location. If 5 cameras are connected, X is reflected as [0-4] according to i2c bus from smallest to largest.
  
''- TX2''
+
In gstreamer command ,v4l2src and nvv4l2camerasrc has a param device=/dev/videoX to identify which camera to use.
 +
=====Gstreamer Usage=====
 +
To install the latest accelerated gstreamer plugins and applications, run the following commands:
  
<code>sudo ./flash.sh jetson-tx2 mmcblk0p1</code>
+
<code>sudo apt-get update</code>
  
''- AGX Xavier''
+
<code>sudo apt-get install nvidia-l4t-gstreamer</code>
  
<code>sudo ./flash.sh jetson-xavier mmcblk0p1</code>
+
<code>sudo ldconfig</code>
  
''- Xavier NX Devkit''
+
<code>rm -rf .cache/gstreamer-1.0/</code>
  
<code>sudo ./flash.sh jetson-xavier-nx-devkit mmcblk0p1</code>
 
====Download out bsp package for Jetson====
 
<code>cd $L4T_DIR</code>
 
  
<code>git clone https://github.com/veyeimaging/nvidia_jetson_veye_bsp<nowiki/>.git</code>
+
<code>export DISPLAY=:0</code>
  
<code>export RELEASE_PACK_DIR=$L4T_DIR/nvidia_jetson_veye_bsp</code>
+
*Preview FHD
=====bsp package includes:=====
 
  
*prebuild linux kernel:Image
+
<code>gst-launch-1.0 nvv4l2camerasrc device=/dev/video0 ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)1920, height=(int)1080" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nv3dsink sync=false</code>
*prebuild dtb for different boards
 
*driver source code
 
*dts source code
 
*i2c toolkits
 
  
====Using prebuild Image and DTB====
+
<code>gst-launch-1.0 nvv4l2camerasrc device=/dev/video0 ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)1920, height=(int)1080" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)NV12" ! nv3dsink sync=false</code>
  
*Installing the Kernel
+
* Preview FHD(using xvimagesink sink if supported)
  
Whether you use a prebuild kernel or you build it yourself
+
<code>export DISPLAY=:0</code>
  
''- TX2''
+
<code>gst-launch-1.0 -e v4l2src io-mode=4 device=/dev/video0 do-timestamp=true ! 'video/x-raw, width=1920, height=1080, framerate=30/1, format=UYVY' ! xvimagesink sync=false</code>
  
copy Image to /boot/ dir on the Jetson TX2 board:
+
*Preview 720p@60 (CS-MIPI-IMX307)
  
<code>sudo cp <path to your Image dir>/Image  /boot/Image -f</code>
+
<code>gst-launch-1.0 nvv4l2camerasrc  ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)1280, height=(int)720, framerate=(fraction)60/1" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nv3dsink sync=false</code>
  
''- AGX Xavier''
+
*Preview 1280*1080@45 (CS-MIPI-SC132)
  
on the Host PC:
+
<code>gst-launch-1.0 nvv4l2camerasrc ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)1280, height=(int)1080, framerate=(fraction)45/1" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nv3dsink sync=false</code>
  
<code>cd $L4T_DIR</code>
+
*Preview 640*480p@130 (CS-MIPI-IMX307)
  
<code>sudo ./flash.sh -k kernel jetson-xavier mmcblk0p1</code>
+
<code>gst-launch-1.0 nvv4l2camerasrc ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)640, height=(int)480, framerate=(fraction)130/1" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nv3dsink sync=false</code>
  
''- Xavier NX''
+
*Preview 2 cameras  1080p HD
  
on the Host PC:
+
<code>WIDTH=960</code>
  
<code>cd $L4T_DIR</code>
+
<code>HEIGHT=540</code>
  
<code>sudo ./flash.sh -k kernel jetson-xavier-nx-devkit mmcblk0p1</code>
+
<code>CAPS="video/x-raw(memory:NVMM),format=(string)UYVY, width=1920, height=1080"</code>
  
*Flashing dtb file
+
<code>gst-launch-1.0 nvcompositor name=comp sink_0::xpos=0 sink_0::ypos=0 sink_0::width=$WIDTH sink_0::height=$HEIGHT sink_1::xpos=$WIDTH sink_1::ypos=0 sink_1::width=$WIDTH sink_1::height=$HEIGHT ! nv3dsink nvv4l2camerasrc device=/dev/video0 ! $CAPS ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420"! comp. nvv4l2camerasrc  device=/dev/video1 ! $CAPS ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420"! comp.</code>
  
Enter the recovery mode,and on the Host PC:
+
*Record FHD in H.264 format to a video file
  
<code>cp <path to your dtb dir>/dtbfilename $L4T_DIR/kernel/dtb/ -f</code>
+
<code>gst-launch-1.0 nvv4l2camerasrc num-buffers=300 ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)1920, height=(int)1080" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)NV12" ! nvv4l2h264enc control-rate=1 bitrate=10000000 ! h264parse ! qtmux ! filesink location=filename.mp4 -e</code>
  
<code>cd $L4T_DIR</code>
+
*Playback of saved video file
  
<code>''- TX2''</code>
+
<code>gst-launch-1.0 filesrc location=filename.mp4 ! qtdemux ! queue ! h264parse ! nvv4l2decoder ! nvoverlaysink -e</code>
  
<code>sudo ./flash.sh -r -k kernel-dtb jetson-tx2 mmcblk0p1</code>
+
*Capturing FHD still image  
  
<code>''- AGX Xavier''</code>
+
<code>gst-launch-1.0 v4l2src num-buffers=1 ! "video/x-raw,format=(string)UYVY, width=(int)1920, height=(int)1080" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nvjpegenc ! filesink location=jpgname.jp</code>
  
<code>sudo ./flash.sh -r -k kernel-dtb jetson-xavier mmcblk0p1</code>
+
===== VEYE-MIPI-IMX335 gstreamer example =====
 +
Since VEYE-MIPI-IMX335 supports only a few specific resolution modes, its driver we use use_sensor_mode_id mode.
 +
{| class="wikitable"
 +
|+VEYE-MIPI-IMX335 mode
 +
!./veye5_mipi_i2c.sh video mode
 +
!v4l2-ctl sensor_mode
 +
!video format
 +
|-
 +
|1
 +
|0
 +
|2592x1944@20fps
 +
|-
 +
|2
 +
|1
 +
|2592x1944@12.5fps
 +
|-
 +
|3
 +
|2
 +
|2560x1440@25fps
 +
|-
 +
|4
 +
|3
 +
|2560x1440@30fps
 +
|}
  
''- AGX Xavier''
+
* prepare
  
<code>sudo ./flash.sh -r -k kernel-dtb jetson-xavier-nx-devkit mmcblk0p1</code>
+
<code>sudo apt-get install v4l-utils</code>
  
Reset Jetson Board after flashing.
+
Refer to the following section and download the veye5_mipi_i2c.sh tool.
====Building from Source====
 
=====Build kernel=====
 
  
*patch code
+
* 2592x1944@20fps mode preview, framerate statistics
  
<code>cp $RELEASE_PACK_DIR/drivers_source/cs_imx307\ veye327/* $NVIDIA_PATH/drivers/media/i2c/</code>
+
<code>v4l2-ctl -d /dev/video0 --set-ctrl sensor_mode=0</code>
  
''- r32.2.1''
+
<code>./veye5_mipi_i2c.sh -w -f videomode -p1 1 -b [busnum]</code>
  
<code>cp $RELEASE_PACK_DIR/drivers_source/kernel_csimx307veye327_config_32.2.1 $L4T_DIR/sources/kernel/kernel-4.9/arch/arm64/configs/tegra_csimx307veye327_defconfig</code>
+
<code>v4l2-ctl -d /dev/video0 --set-ctrl preferred_stride=5376</code>
  
''- r32.3.1''
+
Preview
  
<code>cp $RELEASE_PACK_DIR/drivers_source/kernel_csimx307veye327_config_32.3.1 $L4T_DIR/sources/kernel/kernel-4.9/arch/arm64/configs/tegra_csimx307veye327_defconfig</code>
+
<code>gst-launch-1.0 nvv4l2camerasrc device=/dev/video0 ! "video/x-raw(memory:NVMM), width=(int)2592, height=(int)1944" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nv3dsink sync=false</code>
  
''- r32.4.2''
+
Framerate statistics
  
<code>cp $RELEASE_PACK_DIR/drivers_source/kernel_csimx307veye327_config_32.4.2 $L4T_DIR/sources/kernel/kernel-4.9/arch/arm64/configs/tegra_csimx307veye327_defconfig</code>
+
<code>gst-launch-1.0 nvv4l2camerasrc device=/dev/video0 ! "video/x-raw(memory:NVMM),format=(string)UYVY,width=(int)2592,height=(int)1944" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! fpsdisplaysink video-sink=fakesink -v</code>
  
*build
+
* 2560x1440@30fps mode video encode and capture
  
<code>cd $L4T_DIR/sources/kernel/kernel-4.9/</code>
+
<code>v4l2-ctl -d /dev/video0 --set-ctrl sensor_mode=3</code>
  
<code>make ARCH=arm64 O=$TEGRA_KERNEL_OUT tegra_csimx307veye327_defconfig</code>
+
<code>./veye5_mipi_i2c.sh -w -f videomode -p1 4 -b [busnum]</code>
  
<code>make ARCH=arm64 O=$TEGRA_KERNEL_OUT Image -j4</code>
+
<code>v4l2-ctl -d /dev/video0 --set-ctrl preferred_stride=5120</code>
  
Completed Image file is $TEGRA_KERNEL_OUT/arch/arm64/boot/Image,could be used for Flashing or Upgrading.
+
Video encode
  
Install Image for Flashing:
+
<code>gst-launch-1.0 nvv4l2camerasrc num-buffers=300 ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)2560, height=(int)1440" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)NV12" ! nvv4l2h264enc control-rate=0 bitrate=10000000 ! h264parse ! qtmux ! filesink location=filename.mp4 -e</code>
  
<code>sudo cp $TEGRA_KERNEL_OUT/arch/arm64/boot/Image $L4T_DIR/kernel/ -f</code>
+
Video Replay
=====Build DTS=====
 
  
*patch code
+
<code>gst-launch-1.0 filesrc location=filename.mp4 ! qtdemux ! queue ! h264parse ! nvv4l2decoder ! nv3dsink -e</code>
  
''- Jetson TX2@Jetpack4.2.2''
+
Capture
  
<code>cp $RELEASE_PACK_DIR/TX2/JetPack_4.2.2_Linux_GA_P3310/dts\ dtb/common/t18x/* -r $TX2_DTS_PATH/</code>
+
<code>gst-launch-1.0 v4l2src num-buffers=1 ! "video/x-raw,format=(string)UYVY, width=(int)2560, height=(int)1440" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nvjpegenc ! filesink location=jpgname.jpg</code>
  
For CS-MIPI-IMX307
+
===== Jetson multimedia-api samples =====
 +
The [https://docs.nvidia.com/jetson/l4t-multimedia/index.html Jetson Linux API] is available on the Jetson platform for developers to use. Please refer to the official nVidia documentation for the installation of the jetson_multimedia_api package.
  
<code>cp $RELEASE_PACK_DIR/TX2/JetPack_4.2.2_Linux_GA_P3310/dts\ dtb/CS-MIPI-IMX307/tegra186-quill-p3310-1000-a00-00-base.dts $TX2_DTS_PATH/quill/kernel-dts/</code>
+
For VEYE and CS series cameras, the ISP function is already integrated in the camera, so you cannot use libargus to get data, but can directly use the standard V4L2 interface to get data from the /dev/videoX device file.
  
For VEYE-MIPI-327
+
The following two samples can be run directly.
  
<code>cp $RELEASE_PACK_DIR/TX2/JetPack_4.2.2_Linux_GA_P3310/dts\ dtb/VEYE-MIPI-327/tegra186-quill-p3310-1000-a00-00-base.dts $TX2_DTS_PATH/quill/kernel-dts/</code>
+
====== 12_camera_v4l2_cuda ======
 +
<code>./camera_v4l2_cuda -d /dev/video0 -s 1920x1080 -f UYVY</code>
  
''- TX2@Jetpack4.3''
+
====== v4l2cuda ======
 +
<code>./capture-cuda -d /dev/video0 -f UYVY -m -o out.ppm -s 1920x1080 -c 1</code>
  
<code>cp $RELEASE_PACK_DIR/TX2/JetPack_4.3_Linux_P3310/dts\ dtb/common/t18x/* -r $TX2_DTS_PATH/</code>
+
===== v4l2-ctl Application Examples =====
  
For CS-MIPI-IMX307
+
======install v4l2-utils======
 +
<code>sudo apt-get install v4l-utils</code>
 +
======Configure parameters using v4l2-ctl======
  
<code>cp $RELEASE_PACK_DIR/TX2/JetPack_4.3_Linux_P3310/dts\ dtb/CS-MIPI-IMX307/tegra186-quill-p3310-1000-a00-00-base.dts $TX2_DTS_PATH/quill/kernel-dts/</code>
+
* List the data formats supported by the camera
  
For VEYE-MIPI-327
+
<code>v4l2-ctl -d /dev/video0 --list-formats-ext</code>
  
<code>cp $RELEASE_PACK_DIR/TX2/JetPack_4.3_Linux_P3310/dts\ dtb/VEYE-MIPI-327/tegra186-quill-p3310-1000-a00-00-base.dts $TX2_DTS_PATH/quill/kernel-dts/</code>
+
* Frame rate statistics
  
''- AGX Xavier@Jetpack4.2.2''
+
<code>v4l2-ctl -d /dev/video0  --set-fmt-video=width=1920,height=1080,pixelformat=UYVY--stream-mmap --stream-count=-1 --stream-to=/dev/null</code>
  
<code>cp $RELEASE_PACK_DIR/AGX-Xaviar/JetPack_4.2.2_Linux_GA_P2888/dts\ dtb/common/t19x/* -r $XAVIER_DTS_PATH/</code>
+
* Save image to file
  
For CS-MIPI-IMX307
+
<code>v4l2-ctl -d /dev/video0  --set-fmt-video=width=1920,height=1080,pixelformat=UYVY --stream-mmap --stream-count=1 --stream-to=uyvy-1920x1080.yuv</code>
  
<code>cp $RELEASE_PACK_DIR/AGX-Xaviar/JetPack_4.2.2_Linux_GA_P2888/dts\ dtb/CS-MIPI-IMX307/tegra194-p2888-0001-p2822-0000.dts $TX2_DTS_PATH/galen/kernel-dts/</code>
+
===== yavta =====
  
For VEYE-MIPI-327
+
======install yavta======
 +
<code>git clone <nowiki>https://github.com/veyeimaging/yavta.git</nowiki></code>
  
<code>cp $RELEASE_PACK_DIR/AGX-Xaviar/JetPack_4.2.2_Linux_GA_P2888/dts\ dtb/VEYE-MIPI-327/tegra194-p2888-0001-p2822-0000.dts $TX2_DTS_PATH/galen/kernel-dts/</code>
+
<code>cd yavta;make</code>
  
''- AGX Xavier@Jetpack4.3''
+
====== Save image to file ======
 +
<code>./yavta -c1 -FUYVY-1920x1080.yuv --skip 0 -f UYVY -s 1920x1080 /dev/video0</code>
  
<code>cp $RELEASE_PACK_DIR/AGX-Xaviar/JetPack_4.3_Linux_P2888/dts\ dtb/common/t19x/* -r $XAVIER_DTS_PATH/</code>
+
===== Opencv =====
 +
To import camera data from v4l2 devices to opencv, we provide several samples.
  
For CS-MIPI-IMX307
+
We provide 2 samples [https://github.com/veyeimaging/nvidia_jetson_veye_bsp/tree/master/samples/opencv here].
  
<code>cp $RELEASE_PACK_DIR/AGX-Xaviar/JetPack_4.3_Linux_P2888/dts\ dtb/CS-MIPI-IMX307/tegra194-p2888-0001-p2822-0000.dts $TX2_DTS_PATH/galen/kernel-dts/</code>
+
====Using i2c script to modify camera parameters====
  
For VEYE-MIPI-327
+
*VEYE-MIPI-CAM2M Series(VEYE-MIPI-327、VEYE-MIPI-IMX327S、VEYE-MIPI-IMX462、VEYE-MIPI-IMX385)
  
<code>cp $RELEASE_PACK_DIR/AGX-Xaviar/JetPack_4.3_Linux_P2888/dts\ dtb/VEYE-MIPI-327/tegra194-p2888-0001-p2822-0000.dts $TX2_DTS_PATH/galen/kernel-dts/</code>
+
Video Control Toolkits Manual :[[VEYE-MIPI-290/327 i2c/|VEYE-MIPI-327 I2C]]
  
''- Xavier NX@Jetpack4.4''
+
*CS-MIPI-IMX307和CS-MIPI-SC132
  
<code>cp $RELEASE_PACK_DIR/Xavier-NX/JetPack_4.4_DP_Linux_DP_JETSON_XAVIER_NX_DEVKIT/dts\ dtb/common/t19x/* -r $XAVIER_DTS_PATH/</code>
+
Video Control Toolkits Manual :[[CS-MIPI-X i2c|CS-MIPI-X I2C]]
  
For CS-MIPI-IMX307
+
* VEYE-MIPI-IMX335
  
<code>cp $RELEASE_PACK_DIR/Xavier-NX/JetPack_4.4_DP_Linux_DP_JETSON_XAVIER_NX_DEVKIT/dts\ dtb/CS-MIPI-IMX307/tegra194-p3509-0000-a00.dtsi $TX2_DTS_PATH/jakku/kernel-dts/common/</code>
+
Video Control Toolkits Manual :[[5m mipi i2c user guide|VEYE-MIPI-IMX335 I2C]]
 +
===How to port the driver to a third party board===
  
For VEYE-MIPI-327
+
==== driver porting ====
 +
For Image, we have added functionality to the official standard Image and have not made any deletions. In general, you can use our compiled Image directly. for special cases, please refer to the source code for integration.
  
<code>cp $RELEASE_PACK_DIR/Xavier-NX/JetPack_4.4_DP_Linux_DP_JETSON_XAVIER_NX_DEVKIT/dts\ dtb/VEYE-MIPI-327/tegra194-p3509-0000-a00.dtsi $TX2_DTS_PATH/jakku/kernel-dts/common/</code>
+
For modules it is even easier to just use them. Compiling from source code and is very simple, so I won't go into details here.
  
*build
+
==== dts porting ====
 +
We only provide dtb for some boards of Nano, TX2, Xavier, Orin. For the types not provided, it is necessary to:
  
<code>cd $L4T_DIR/sources/kernel/kernel-4.9/</code>
+
1. get the dts source code of that board.
  
<code>make ARCH=arm64 O=$TEGRA_KERNEL_OUT dtbs</code>
+
2. put our camera related dts to the whole.
  
''- TX2''
+
3. recompile to get the dtb of the corresponding board.
  
<code>cp $TEGRA_KERNEL_OUT/arch/arm64/boot/dts/tegra186-quill-p3310-1000-c03-00-base.dtb $L4T_DIR/kernel/dtb/</code>
+
The operation steps are not complicated, but there are some third-party base board manufacturers do not open dts source code. This will require the cooperation of all parties to do so.
  
''- AGX XAVIER''
+
=== FAQ and bug list ===
  
<code>cp $TEGRA_KERNEL_OUT/arch/arm64/boot/dts/tegra194-p2888-0001-p2822-0000.dtb</code>
+
==== Problem of system update not taking effect on a system with an SSD hard drive ====
 +
If an SSD hard drive is installed in a system and mounted on the / directory, it may cause regular system update operations (Image, ko, dtb) to be completely ineffective.
  
''- XAVIER NX''
+
The reason for this is that the board comes with an eMMC storage device, and the Image, ko, and dtb that take effect during the boot stage are stored in the eMMC.
  
<code>cp $TEGRA_KERNEL_OUT/arch/arm64/boot/dts/tegra194-p3668-all-p3509-0000.dtb  $L4T_DIR/kernel/dtb/</code>
+
After the boot is completed, if the SSD hard drive is mounted on the / directory, it may cause the files stored on the eMMC to be inaccessible.
  
Could be used for Flashing or Upgrading.
+
The solution in this case is to manually mount the ''mmcblk0p1'' partition of the eMMC to a specific directory, and perform all system update operations based on this directory.
===Applications and Test===
 
====Check system status====
 
Run the following command to confirm whether the camera is probed.
 
 
 
*For VEYE-MIPI-327
 
 
 
<code>dmesg | grep veye327</code>  
 
 
 
The output message appears as shown below.:
 
 
 
<code>Detected VEYE327 sensor</code>
 
 
 
<code>subdev veye327 3X-003b bound</code>
 
 
 
此外,检查/dev/videoX设备节点,应当是存在的。
 
 
 
*For CS-MIPI-IMX307
 
 
 
<code>dmesg | grep csx307</code>  
 
 
 
The output message appears as shown below.
 
 
 
<code>Detected CS307 sensor</code>
 
  
<code>subdev csimx307 3X-003b bound</code>
+
==== VEYE cameras on Jetpack5.x ====
 +
Jetpack5.x has more stringent requirements for mipi signals in xavier and orin platforms. VEYE-MIPI-xxx series cameras need firmware hdver>=7 to be perfectly supported.
  
*Run the following command to check the presence of video node.
+
==== CS-MIPI-IMX307 combined with Orin nano and Orin NX Green Screen ====
 
+
When CS-MIPI-IMX307 is powered by the 3.3V mode of the FFC cable, the MIPI receiver state machine of Orin nano and Orin NX (Jetpack5.1.1) will enter an incorrect state.
<code>ls /dev/video*</code>
 
 
 
The output message appears as shown below.
 
 
 
<code>videoX</code>  
 
  
====Video Stream Toolkits Manual====
+
It is recommended to refer to this [[Power supply mode switching|article]] and modify the power supply mode of CS-MIPI-IMX307 to use the 5V power supply mode.
Our camera appears as /dev/videoX device node,where X is between [0-5].
 
  
in gstreamer command ,v4l2src has a param device=/dev/videoX to identify which camera to use.
+
==== Jetpack5.0.1 DP ====
=====Gstreamer Usage=====
+
This version has many bugs, such as not supporting nvv4l2camerasrc, not recommended to use.
  
*Preview FHD(HW accelerated)
+
==== nv3dsink ====
 +
Jetpack 5.x no longer supports nvoverlaysink, use nv3dsink instead.
  
<code>gst-launch-1.0 v4l2src device=/dev/video0 ! "video/x-raw,format=(string)UYVY, width=(int)1920, height=(int)1080" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nvoverlaysink sync=false</code>
+
==== cboot of L4T32.7.2 on Xavier ====
 +
For the Xavier series, there is a bug in the cboot of L4T32.7.2 that must be fixed before the upgrade can be done.
  
*Preview 720p@60 (CS-MIPI-IMX307,HW accelerated)
+
[https://elinux.org/Jetson/L4T/r32.7.x_patches <nowiki>[Cboot] Cboot in 32.7.2 fails to read extlinux.conf</nowiki>]
  
<code>gst-launch-1.0 v4l2src ! "video/x-raw,format=(string)UYVY, width=(int)1280, height=(int)720, framerate=(fraction)60/1" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nvoverlaysink sync=false</code>
+
We compiled the correct version of cboot and put it [https://github.com/veyeimaging/nvidia_jetson_veye_bsp/tree/master/cboot_l4t_32.7.2 here].
  
*Preview 640*480p@130 (CS-MIPI-IMX307,HW accelerated)
+
After downloading, put it in Linux_for_Tegra/bootloader directory and execute the following command on PC to burn cboot.
  
<code>gst-launch-1.0 v4l2src ! "video/x-raw,format=(string)UYVY, width=(int)640, height=(int)480, framerate=(fraction)130/1" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nvoverlaysink sync=false</code>
+
*AGX Xavier
  
*Preview 2 cameras  1080p HD(HW accelerated)
+
<code>sudo ./flash.sh -r -k cpu-bootloader jetson-xavier mmcblk0p1</code>
  
<code>WIDTH=960</code>
+
*Xavier NX
  
<code>HEIGHT=540</code>
+
<code>sudo ./flash.sh -r -k cpu-bootloader jetson-xavier-nx-devkit mmcblk0p1</code>
 +
=== Document History ===
  
<code>CAPS="video/x-raw,format=(string)UYVY, width=1920, height=1080"</code>
+
* 2024-08-06
  
<code>gst-launch-1.0 nvcompositor name=comp sink_0::xpos=0 sink_0::ypos=0 sink_0::width=$WIDTH sink_0::height=$HEIGHT sink_1::xpos=$WIDTH sink_1::ypos=0 sink_1::width=$WIDTH sink_1::height=$HEIGHT ! nvoverlaysink v4l2src device=/dev/video0 ! $CAPS ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420"! comp. v4l2src device=/dev/video1 ! $CAPS ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420"! comp.</code>
+
Make Chapter 3 - Upgrading the Jetson system a separate article.
  
*Record FHD in H.264 format to a video file(HW accelerated)
+
*2024-05-22
  
<code>gst-launch-1.0 v4l2src num-buffers=300 ! "video/x-raw,format=(string)UYVY, width=(int)1920, height=(int)1080" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! omxh264enc qp-range=20,20:20,20:-1,-1 ! matroskamux ! queue ! filesink location=videoname.mkv</code>
+
Add support for Jetpack5.1.3.
  
*Playback of saved video file (HW accelerated)
+
*20230427
  
<code>gst-launch-1.0 filesrc location=videoname.mkv ! matroskademux ! h264parse ! omxh264dec ! nvoverlaysink</code>
+
Add support for Jetpack5.1.1.
  
*Capturing FHD still image  
+
*20230222
  
<code>gst-launch-1.0 v4l2src num-buffers=1 ! "video/x-raw,format=(string)UYVY, width=(int)1920, height=(int)1080" ! jpegenc ! filesink location=jpgname.jpg</code>
+
Add support for Jetpack5.1.
====Video Control Toolkits Manual====
 
  
*i2c bus description:
+
*20220831
  
ADP-N1 has 6 MIPI CSI-2 interface [A-F],the corresponding i2c address is[30-35].
+
Improve the description of VEYE series and MV series under Jetpack 5.0.2.
  
It is also the same as the 3X part of dmesg message:
+
* 20220824
  
<code>subdev veye327 3X-003b bound</code>
+
Add support for Jetpack5.0.2.
  
<code>subdev csimx307 3X-003b bound</code>
+
* 20220720
  
using -b option to identify which bus you want to use.
+
Add multimedia-api samples and v4l2 samples.
  
*VEYE-MIPI-327
+
*20220714
  
Video Control Toolkits Manual :[[VEYE-MIPI-290/327 i2c/|VEYE-MIPI-327 I2C]]
+
Add L4T32.7.2 Note。
  
*CS-MIPI-IMX307
+
* 20220629
  
Video Control Toolkits Manual :[[CS-MIPI-X i2c|CS-MIPI-IMX307 I2C]]
+
Add support for Jetpack 5.0.1DP and tune through AGX-Orin.
===Realtimes RTSO-9001===
 
====Hardware Setup====
 
[[File:CS-MIPI-307 to ruitai 9001tx2.jpg|center|thumb|800x800px|CS-MIPI-IMX307 and RTSO-9001(TX2)|link=http://wiki.veye.cc/index.php/File:CS-MIPI-307_to_ruitai_9001tx2.jpg]]
 
  
 +
* 20220110
  
Matching with Realtimes RTSO-9001, you need to use RTST-RPI adapter board.
+
Add VEYE-MIPI-IMX385 support.
  
Note: the power supply capacity of the MIPI CSI-2 interface of the current version of RTSO-9001 is not enough to support the power requirements of our camera, which requires an additional 5V power supply to the camera. It is not shown in the picture above.
+
* 20220105
====Software bsp====
 
  
*The corresponding directory for Realtimes RTSO-9001, is:
+
Use nvv4l2h264enc instead of omxh264enc in gstreamer command,because omxh264enc  has been deprecated.
  
nvidia_jetson_veye_bsp\TX2\JetPack_4.2.2_Linux_RTSO-9001
+
* 20211025
  
*Subject to the agreement with Ruitai, we do not release the source code
+
Use nvcamerasrc instead of v4l2src in gstreamer command , and the data goes directly into DMA memory.
*Our code have been submitted to Realtimes, and customers are advised to contact Realtimes for a complete version of the supported image.
 
  
 
===References===
 
===References===
 
Jetson start up: https://developer.nvidia.com/embedded/learn/getting-started-jetson
 
Jetson start up: https://developer.nvidia.com/embedded/learn/getting-started-jetson
  
Xavier NX: https://developer.nvidia.com/embedded/learn/get-started-jetson-xavier-nx-devki
+
Jetson Download Center: https://developer.nvidia.com/embedded/downloads
 +
 
 +
Xavier NX: https://developer.nvidia.com/embedded/learn/get-started-jetson-xavier-nx-devkit
  
 
TX2 development kit: https://developer.nvidia.com/embedded/jetson-tx2-developer-kit
 
TX2 development kit: https://developer.nvidia.com/embedded/jetson-tx2-developer-kit
Line 429: Line 485:
 
L4T Doc:  https://docs.nvidia.com/jetson/archives/l4t-archived/l4t-3242/index.htm
 
L4T Doc:  https://docs.nvidia.com/jetson/archives/l4t-archived/l4t-3242/index.htm
  
TX2 user guide: [https://developer.download.nvidia.cn/embedded/L4T/r28_Release_v2.0/GA/Docs/Jetson_TX1_and_TX2_Developer_Kits_User_Guide.pdf?lumI95GW6BEyMmhP1Is8E79OYo105-tpsC2bOVQmBZ6Tw8AkLU4pSDMPCuzOaEonWMiDO2hliXbNvtkH9do81TNIXmLZGGoV7xoEehyEgfc2WO8e0Czz5chLSHoCqIuPLL1 link]
+
TX2 user guide: [https://developer.download.nvidia.cn/embedded/L4T/r28_Release_v2.0/GA/Docs/Jetson_TX1_and_TX2_Developer_Kits_User_Guide.pdf?lumI95GW6BEyMmhP1Is8E79OYo105-tpsC2bOVQmBZ6Tw8AkLU4pSDMPCuzOaEonWMiDO2hliXbNvtkH9do81TNIXmLZGGoV7xoEehyEgfc2WO8e0Czz5chLSHoCqIuPLL1 link]<br />
 
 
Realtimes website:http://www.realtimes.cn/
 
<br />
 

Latest revision as of 14:08, 12 August 2024

查看中文

How to use VEYE and CS series camera module on NVIDIA Jetson Nano,TX2,Xavier and Orin

1 Overview

This guide shows how to use VEYE and CS series camera modules on Jetson boards. Jetson SDK Version is:

  • Jetpack4.2.2,L4T r32.2.1
  • Jetpack4.3,L4T r32.3.1
  • Jetpack4.4,L4T r32.4.3
  • Jetpack4.4.1,L4T r32.4.4
  • Jetpack4.5,L4T r32.5
  • Jetpack4.5.1,L4T r32.5.1
  • Jetpack4.6,L4T r32.6.1
  • Jetpack4.6.1, L4T r32.7.1
  • Jetpack4.6.2,L4T r32.7.2
  • Jetpack4.6.3,L4T r32.7.3
  • Jetpack4.6.4,L4T r32.7.4
  • Jetpack5.0.1DP, L4T r34.1.1
  • Jetpack5.0.2, L4T r35.1
  • Jetpack5.1,L4T r35.2.1
  • Jetpack5.1.1,L4T r35.3.1
  • Jetpack5.1.2,L4T r35.4.1
  • Jetpack5.1.3,L4T r35.5
  • Jetpack6.0,L4T r36.3

We provide two ways to do so: Prebuilt Binaries or Source Code. Yes, It's Open Source!

VEYE and CS series camera modules are camera module with ISP functions build in. It output UYVY data using MIPI-CSI2. We provide V4L2 interface for video streaming apps , and Video Control Toolkits (which is Shell Script) to control the camera module directly, which is called DRA(Directly Register Access).

1.1 Camera module list

Camera module dirver status list
Series Model Status
VEYE series VEYE-MIPI-IMX327S Done
VEYE series VEYE-MIPI-IMX385 Done
VEYE series VEYE-MIPI-IMX462 Done
VEYE series VEYE-MIPI-IMX335 Done
CS series CS-MIPI-IMX307 Done
CS series CS-MIPI-SC132 Done
TX2-XAVIER-nCAM Series CS-TX2-XAVIER-nCAM Done

1.2 How to check the current L4T version

1.2.1 Method 1

On Jetson board

cat /etc/nv_tegra_release

If it shows:

# R32 (release), REVISION: 4.3......

It means L4t Version is 32.4.3

1.2.2 Method 2

Refer to this link to install jetson-stats:

jtop

2 Hardware Setup

We have designed a 6cam interposer board for TX2 devkit,Xavier and Orin, It support up to 6 cameras at the same time.

6cam interposer board connected with 6 cameras
6cam interposer board connected with 6 cameras


In particular, the VEYE-MIPI-IMX335 must use a 12V DC terminal to provide auxiliary power due to its high power consumption. Refer to J11 of ADP-N1.

2.1 NVIDIA TX2 Developer Kit

It is connected as shown in figure:

TX2 Devkit 6 cameras connection
TX2 Devkit 6 cameras connection


Be sure to screw the ADP adapter board to the bottom board.

2.2 NVIDIA AGX Xavier(the same with Orin)


Connect VEYE cameras to AGX Xavier
Connect VEYE cameras to AGX Xavier


Be sure to screw the ADP adapter board to the bottom board to ensure that the adapter plate is installed flat.

2.3 NVIDIA Nano ,TX2 NX and Xavier NX Devkit

The Xavier NX interface is compatible with raspberry pi and Jetson Nano. The connection mode is shown in figure:

Xavier NX connection with VEYE-MIPI-327
Xavier NX connection with VEYE-MIPI-327


Xavier NX connection with CS-MIPI-IMX307
Xavier NX connection with CS-MIPI-IMX307
Jetson Nano A02 与VEYE模组连接
VEYE327 connection with Jetson Nano A02
VEYE camera  connection with Orin Nano and Orin NX

3 Upgrade Jetson system

This section describes how to upgrade the Jetson system to support MV camera module. For OS update method, please refer to Update Jetson OS.

4 Applications and Test

4.1 Check system status

Run the following command to confirm whether the camera is probed.

  • VEYE-MIPI-IMX327S/VEYE-MIPI-IMX462/VEYE-MIPI-IMX385(using VEYE-MIPI-CAM2M dtb)

dmesg | grep veye  

The output message appears as shown below:

camera id is veyecam

sensor is IMX327/IMX462/IMX385

subdev veyecam [i2c_bus]-003b bound

  • For CS-MIPI-IMX307

dmesg | grep csx307  

The output message appears as shown below.:

Detected CS307 sensor

subdev csx307 [i2c_bus]-003b bound

  • For CS-MIPI-SC132

dmesg | grep cssc132  

The output message appears as shown below.:

subdev cssc132 [i2c_bus]-003b bound

  • For VEYE-MIPI-IMX335

dmesg | grep imx335

The output message appears as shown below.:

camera id is VEYE-MIPI-IMX335

subdev veye_imx335 [i2c_bus]-003b bound

  • Run the following command to check the presence of video node.

ls /dev/video*

The output message appears as shown below.

videoX  

  • For VEYE-MIPI-327(using VEYE-MIPI-327 dtb)

dmesg | grep veye327  

The output message appears as shown below:

Detected VEYE327 sensor

subdev veye327 [i2c_bus]-003b bound

The [i2c_bus] in the driver prompt message indicates the i2c bus corresponding to this camera.

4.2 Video Stream Toolkits Manual

The camera appears as /dev/videoX device node,where X is between [0-5].

During the Linux boot process, the cameras are detected in the order of i2c bus from smallest to largest. For example, if only one camera is connected, X is 0 regardless of the hardware connection to the location. If 5 cameras are connected, X is reflected as [0-4] according to i2c bus from smallest to largest.

In gstreamer command ,v4l2src and nvv4l2camerasrc has a param device=/dev/videoX to identify which camera to use.

4.2.1 Gstreamer Usage

To install the latest accelerated gstreamer plugins and applications, run the following commands:

sudo apt-get update

sudo apt-get install nvidia-l4t-gstreamer

sudo ldconfig

rm -rf .cache/gstreamer-1.0/


export DISPLAY=:0

  • Preview FHD

gst-launch-1.0 nvv4l2camerasrc device=/dev/video0 ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)1920, height=(int)1080" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nv3dsink sync=false

gst-launch-1.0 nvv4l2camerasrc device=/dev/video0 ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)1920, height=(int)1080" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)NV12" ! nv3dsink sync=false

  • Preview FHD(using xvimagesink sink if supported)

export DISPLAY=:0

gst-launch-1.0 -e v4l2src io-mode=4 device=/dev/video0 do-timestamp=true ! 'video/x-raw, width=1920, height=1080, framerate=30/1, format=UYVY' ! xvimagesink sync=false

  • Preview 720p@60 (CS-MIPI-IMX307)

gst-launch-1.0 nvv4l2camerasrc ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)1280, height=(int)720, framerate=(fraction)60/1" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nv3dsink sync=false

  • Preview 1280*1080@45 (CS-MIPI-SC132)

gst-launch-1.0 nvv4l2camerasrc ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)1280, height=(int)1080, framerate=(fraction)45/1" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nv3dsink sync=false

  • Preview 640*480p@130 (CS-MIPI-IMX307)

gst-launch-1.0 nvv4l2camerasrc ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)640, height=(int)480, framerate=(fraction)130/1" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nv3dsink sync=false

  • Preview 2 cameras 1080p HD

WIDTH=960

HEIGHT=540

CAPS="video/x-raw(memory:NVMM),format=(string)UYVY, width=1920, height=1080"

gst-launch-1.0 nvcompositor name=comp sink_0::xpos=0 sink_0::ypos=0 sink_0::width=$WIDTH sink_0::height=$HEIGHT sink_1::xpos=$WIDTH sink_1::ypos=0 sink_1::width=$WIDTH sink_1::height=$HEIGHT ! nv3dsink nvv4l2camerasrc device=/dev/video0 ! $CAPS ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420"! comp. nvv4l2camerasrc device=/dev/video1 ! $CAPS ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420"! comp.

  • Record FHD in H.264 format to a video file

gst-launch-1.0 nvv4l2camerasrc num-buffers=300 ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)1920, height=(int)1080" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)NV12" ! nvv4l2h264enc control-rate=1 bitrate=10000000 ! h264parse ! qtmux ! filesink location=filename.mp4 -e

  • Playback of saved video file

gst-launch-1.0 filesrc location=filename.mp4 ! qtdemux ! queue ! h264parse ! nvv4l2decoder ! nvoverlaysink -e

  • Capturing FHD still image  

gst-launch-1.0 v4l2src num-buffers=1 ! "video/x-raw,format=(string)UYVY, width=(int)1920, height=(int)1080" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nvjpegenc ! filesink location=jpgname.jp

4.2.2 VEYE-MIPI-IMX335 gstreamer example

Since VEYE-MIPI-IMX335 supports only a few specific resolution modes, its driver we use use_sensor_mode_id mode.

VEYE-MIPI-IMX335 mode
./veye5_mipi_i2c.sh video mode v4l2-ctl sensor_mode video format
1 0 2592x1944@20fps
2 1 2592x1944@12.5fps
3 2 2560x1440@25fps
4 3 2560x1440@30fps
  • prepare

sudo apt-get install v4l-utils

Refer to the following section and download the veye5_mipi_i2c.sh tool.

  • 2592x1944@20fps mode preview, framerate statistics

v4l2-ctl -d /dev/video0 --set-ctrl sensor_mode=0

./veye5_mipi_i2c.sh -w -f videomode -p1 1 -b [busnum]

v4l2-ctl -d /dev/video0 --set-ctrl preferred_stride=5376

Preview

gst-launch-1.0 nvv4l2camerasrc device=/dev/video0 ! "video/x-raw(memory:NVMM), width=(int)2592, height=(int)1944" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nv3dsink sync=false

Framerate statistics

gst-launch-1.0 nvv4l2camerasrc device=/dev/video0 ! "video/x-raw(memory:NVMM),format=(string)UYVY,width=(int)2592,height=(int)1944" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! fpsdisplaysink video-sink=fakesink -v

  • 2560x1440@30fps mode video encode and capture

v4l2-ctl -d /dev/video0 --set-ctrl sensor_mode=3

./veye5_mipi_i2c.sh -w -f videomode -p1 4 -b [busnum]

v4l2-ctl -d /dev/video0 --set-ctrl preferred_stride=5120

Video encode

gst-launch-1.0 nvv4l2camerasrc num-buffers=300 ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)2560, height=(int)1440" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)NV12" ! nvv4l2h264enc control-rate=0 bitrate=10000000 ! h264parse ! qtmux ! filesink location=filename.mp4 -e

Video Replay

gst-launch-1.0 filesrc location=filename.mp4 ! qtdemux ! queue ! h264parse ! nvv4l2decoder ! nv3dsink -e

Capture

gst-launch-1.0 v4l2src num-buffers=1 ! "video/x-raw,format=(string)UYVY, width=(int)2560, height=(int)1440" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nvjpegenc ! filesink location=jpgname.jpg

4.2.3 Jetson multimedia-api samples

The Jetson Linux API is available on the Jetson platform for developers to use. Please refer to the official nVidia documentation for the installation of the jetson_multimedia_api package.

For VEYE and CS series cameras, the ISP function is already integrated in the camera, so you cannot use libargus to get data, but can directly use the standard V4L2 interface to get data from the /dev/videoX device file.

The following two samples can be run directly.

4.2.3.1 12_camera_v4l2_cuda

./camera_v4l2_cuda -d /dev/video0 -s 1920x1080 -f UYVY

4.2.3.2 v4l2cuda

./capture-cuda -d /dev/video0 -f UYVY -m -o out.ppm -s 1920x1080 -c 1

4.2.4 v4l2-ctl Application Examples
4.2.4.1 install v4l2-utils

sudo apt-get install v4l-utils

4.2.4.2 Configure parameters using v4l2-ctl
  • List the data formats supported by the camera

v4l2-ctl -d /dev/video0 --list-formats-ext

  • Frame rate statistics

v4l2-ctl -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat=UYVY--stream-mmap --stream-count=-1 --stream-to=/dev/null

  • Save image to file

v4l2-ctl -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat=UYVY --stream-mmap --stream-count=1 --stream-to=uyvy-1920x1080.yuv

4.2.5 yavta
4.2.5.1 install yavta

git clone https://github.com/veyeimaging/yavta.git

cd yavta;make

4.2.5.2 Save image to file

./yavta -c1 -FUYVY-1920x1080.yuv --skip 0 -f UYVY -s 1920x1080 /dev/video0

4.2.6 Opencv

To import camera data from v4l2 devices to opencv, we provide several samples.

We provide 2 samples here.

4.3 Using i2c script to modify camera parameters

  • VEYE-MIPI-CAM2M Series(VEYE-MIPI-327、VEYE-MIPI-IMX327S、VEYE-MIPI-IMX462、VEYE-MIPI-IMX385)

Video Control Toolkits Manual :VEYE-MIPI-327 I2C

  • CS-MIPI-IMX307和CS-MIPI-SC132

Video Control Toolkits Manual :CS-MIPI-X I2C

  • VEYE-MIPI-IMX335

Video Control Toolkits Manual :VEYE-MIPI-IMX335 I2C

5 How to port the driver to a third party board

5.1 driver porting

For Image, we have added functionality to the official standard Image and have not made any deletions. In general, you can use our compiled Image directly. for special cases, please refer to the source code for integration.

For modules it is even easier to just use them. Compiling from source code and is very simple, so I won't go into details here.

5.2 dts porting

We only provide dtb for some boards of Nano, TX2, Xavier, Orin. For the types not provided, it is necessary to:

1. get the dts source code of that board.

2. put our camera related dts to the whole.

3. recompile to get the dtb of the corresponding board.

The operation steps are not complicated, but there are some third-party base board manufacturers do not open dts source code. This will require the cooperation of all parties to do so.

6 FAQ and bug list

6.1 Problem of system update not taking effect on a system with an SSD hard drive

If an SSD hard drive is installed in a system and mounted on the / directory, it may cause regular system update operations (Image, ko, dtb) to be completely ineffective.

The reason for this is that the board comes with an eMMC storage device, and the Image, ko, and dtb that take effect during the boot stage are stored in the eMMC.

After the boot is completed, if the SSD hard drive is mounted on the / directory, it may cause the files stored on the eMMC to be inaccessible.

The solution in this case is to manually mount the mmcblk0p1 partition of the eMMC to a specific directory, and perform all system update operations based on this directory.

6.2 VEYE cameras on Jetpack5.x

Jetpack5.x has more stringent requirements for mipi signals in xavier and orin platforms. VEYE-MIPI-xxx series cameras need firmware hdver>=7 to be perfectly supported.

6.3 CS-MIPI-IMX307 combined with Orin nano and Orin NX Green Screen

When CS-MIPI-IMX307 is powered by the 3.3V mode of the FFC cable, the MIPI receiver state machine of Orin nano and Orin NX (Jetpack5.1.1) will enter an incorrect state.

It is recommended to refer to this article and modify the power supply mode of CS-MIPI-IMX307 to use the 5V power supply mode.

6.4 Jetpack5.0.1 DP

This version has many bugs, such as not supporting nvv4l2camerasrc, not recommended to use.

6.5 nv3dsink

Jetpack 5.x no longer supports nvoverlaysink, use nv3dsink instead.

6.6 cboot of L4T32.7.2 on Xavier

For the Xavier series, there is a bug in the cboot of L4T32.7.2 that must be fixed before the upgrade can be done.

[Cboot] Cboot in 32.7.2 fails to read extlinux.conf

We compiled the correct version of cboot and put it here.

After downloading, put it in Linux_for_Tegra/bootloader directory and execute the following command on PC to burn cboot.

  • AGX Xavier

sudo ./flash.sh -r -k cpu-bootloader jetson-xavier mmcblk0p1

  • Xavier NX

sudo ./flash.sh -r -k cpu-bootloader jetson-xavier-nx-devkit mmcblk0p1

7 Document History

  • 2024-08-06

Make Chapter 3 - Upgrading the Jetson system a separate article.

  • 2024-05-22

Add support for Jetpack5.1.3.

  • 20230427

Add support for Jetpack5.1.1.

  • 20230222

Add support for Jetpack5.1.

  • 20220831

Improve the description of VEYE series and MV series under Jetpack 5.0.2.

  • 20220824

Add support for Jetpack5.0.2.

  • 20220720

Add multimedia-api samples and v4l2 samples.

  • 20220714

Add L4T32.7.2 Note。

  • 20220629

Add support for Jetpack 5.0.1DP and tune through AGX-Orin.

  • 20220110

Add VEYE-MIPI-IMX385 support.

  • 20220105

Use nvv4l2h264enc instead of omxh264enc in gstreamer command,because omxh264enc has been deprecated.

  • 20211025

Use nvcamerasrc instead of v4l2src in gstreamer command , and the data goes directly into DMA memory.

8 References

Jetson start up: https://developer.nvidia.com/embedded/learn/getting-started-jetson

Jetson Download Center: https://developer.nvidia.com/embedded/downloads

Xavier NX: https://developer.nvidia.com/embedded/learn/get-started-jetson-xavier-nx-devkit

TX2 development kit: https://developer.nvidia.com/embedded/jetson-tx2-developer-kit

SDK Manager: https://docs.nvidia.com/sdk-manager/index.html

L4T Doc: https://docs.nvidia.com/jetson/archives/l4t-archived/l4t-3242/index.htm

TX2 user guide: link