Wiki

This version (20 Sep 2023 14:59) was approved by Sergiu Cuciurean.The Previously approved version (11 Sep 2023 10:52) is available.Diff

ZCU102 GMSL User Guide

Development kit contents

2 x FPGA Carrier boards: ZCU102 eval kit

1 x GMSL Deserializer: MAX96724-BAK-EVK

1 x GMSL FMC adapter

2 x 16GB SD cards

1 x SFP+ Ethernet cable

FPGA SD Card Image

The SD-card Image for the Xilinx ZCU102 board can be found here: gmsl_driver.img.xz

After downloading the file, extract the compressed image and write it to the SD-card using Balena Ethcher or Win32-Disk-Imager.

More details on how to extract a compressed image and write it on the SD card on Linux and Windows can be found here: Writing an image onto the SD card


System Setup

The default FMC Vadj on ZCU102 is 1.8V and the MIPI D-PHY requires 1.2V

The following tutorial explains how to use the ZCU102 system controller GUI and configure the Vadj to 1.2V.

Solder a pcb connector on the FMC adapter's J5 and configure the jumpers as the following.

Place a 0 OHM resistor on R88.

GMSL Deserializer Board Setup (outdated)

GMSL Deserializer Board Setup (outdated)

Connect the FMC adapter to the EVAL board and place it on the ZCU102's HPC0 port. With a jumper wire (blue wire in the image below) connect the GMSL deserializer board MFP8 pin to the PMOD 0, PIN 1.

Insert the SD-card into the Xilinx ZCU102 board and connect the GMSL deserializer board USB cable to a PC.


Move the i2c switch in the OFF position on the GMSL deserializer board.

Power-up the ZCU102 and check if a new COM port appears in Device Manager.

Configure the GMSL video pipeline using the GMSL GUI tool and the GMSL config files

In the uC information area, press on “Release Port” and “Connect port”

The corresponding COM port should appear in the dropdown bar. Now load the config files from the “File” tab → Load (.cpp) file.

Now load the files in the following order:

  1. Tier4-ISX021-4CH-pipe.cpp
  2. Tier4-ISX021-MAX9295_80.cpp
  3. Tier4-ISX021-MAX9295_84.cpp
  4. Tier4-ISX021-MAX9295_C0.cpp
  5. Tier4-ISX021-MAX9295_C4.cpp

Move back the i2c switches in the ON state


ZCU102 FPGA Board Setup

Connect the Deserializer and the FMC adapter to ZCU102 FMC HPC1 connector.

 Status of the Adapter and D-Phy (still LEDs)

Attach to the serial terminal using the first USB com port that appears after connecting the ZCU102's USB, with a baud rate of 115200.

Connect an ethernet cable to the ZCU102 RJ45 port

Or connect the cable to the SFP0 port

#Configure the interface
#In this case we use ZCU102's SFP0
$ ls -l /sys/class/net/
total 0
lrwxrwxrwx 1 root root 0 Mar 20 16:32 can0 -> ../../devices/platform/axi/ff070000.can/net/can0
lrwxrwxrwx 1 root root 0 Mar 20 16:32 eth0 -> ../../devices/platform/axi/a0000000.ethernet/net/eth0
lrwxrwxrwx 1 root root 0 Mar 20 16:32 eth1 -> ../../devices/platform/axi/a0000000.ethernet/net/eth1
lrwxrwxrwx 1 root root 0 Mar 20 16:32 eth2 -> ../../devices/platform/axi/ff0e0000.ethernet/net/eth2
lrwxrwxrwx 1 root root 0 Mar 20 16:32 lo -> ../../devices/virtual/net/lo
lrwxrwxrwx 1 root root 0 Mar 20 16:32 sit0 -> ../../devices/virtual/net/sit0
Both server and client should have the same MTU
#Set the MTU and ip
$ sudo ip link set mtu 9000 dev eth1 up
$ sudo ip addr add 192.168.5.1/24 dev eth1
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0
3: can0: <NOARP,ECHO> mtu 16 qdisc noop state DOWN group default qlen 10
    link/can 
5: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
    link/ether 96:e8:9a:83:fc:f6 brd ff:ff:ff:ff:ff:ff
6: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000
    link/ether 8e:2e:6e:7d:a8:f2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.5.1/24 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::8c2e:6eff:fe7d:a8f2/64 scope link 
       valid_lft forever preferred_lft forever
7: eth2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
    link/ether e2:43:6c:e2:ae:42 brd ff:ff:ff:ff:ff:ff
Ubuntu credentials user:analog/pass:analog
#Configure the video pipeline and the cameras (invalid argument messages can be ignored)
$ cd /home/analog/Workspace/ZCU102
$ ./media_cfg.sh
 
#Start streaming to another host
$ cd /home/analog/Workspace/gstreamer
$ ./server.sh **[IP of the viewing station]**
$ ./server.sh 192.168.5.2

Now the streams are running on ports 5004 to 5007, depending on the configured number of cameras


Displaying the Video

On the receiving side, G-streamer must be installed

Now open 4 instances of g-streamer for each port(5004-5007)

(Click) On another ZCU102

(Click) On another ZCU102

$ gst-launch-1.0 udpsrc caps=“application/x-rtp, sampling=YCbCr-4:2:2, depth=(string)8, width=(string)1920, height=(string )1080” port=“5004” ! rtpvrawdepay ! videoconvert ! autovideosink

$ gst-launch-1.0 udpsrc caps=“application/x-rtp, sampling=YCbCr-4:2:2, depth=(string)8, width=(string)1920, height=(string )1080” port=“5005” ! rtpvrawdepay ! videoconvert ! autovideosink

$ gst-launch-1.0 udpsrc caps=“application/x-rtp, sampling=YCbCr-4:2:2, depth=(string)8, width=(string)1920, height=(string )1080” port=“5006” ! rtpvrawdepay ! videoconvert ! autovideosink

$ gst-launch-1.0 udpsrc caps=“application/x-rtp, sampling=YCbCr-4:2:2, depth=(string)8, width=(string)1920, height=(string )1080” port=“5007” ! rtpvrawdepay ! videoconvert ! autovideosink

(Click) On x86 workstation

(Click) On x86 workstation

$ gst-launch-1.0 udpsrc caps=“application/x-rtp, sampling=YCbCr-4:2:2, depth=(string)8, width=(string)1920, height=(string )1080” port=“5004” ! rtpvrawdepay ! videoconvert ! fpsdisplaysink video-sink=xvimagesink text-overlay=true sync=false

$ gst-launch-1.0 udpsrc caps=“application/x-rtp, sampling=YCbCr-4:2:2, depth=(string)8, width=(string)1920, height=(string )1080” port=“5005” ! rtpvrawdepay ! videoconvert ! fpsdisplaysink video-sink=xvimagesink text-overlay=true sync=false

$ gst-launch-1.0 udpsrc caps=“application/x-rtp, sampling=YCbCr-4:2:2, depth=(string)8, width=(string)1920, height=(string )1080” port=“5006” ! rtpvrawdepay ! videoconvert ! fpsdisplaysink video-sink=xvimagesink text-overlay=true sync=false

$ gst-launch-1.0 udpsrc caps=“application/x-rtp, sampling=YCbCr-4:2:2, depth=(string)8, width=(string)1920, height=(string )1080” port=“5007” ! rtpvrawdepay ! videoconvert ! fpsdisplaysink video-sink=xvimagesink text-overlay=true sync=false


Configure the system for a different number of cameras

Copy the devicetree from the folder that matches the number of connected cameras

$ sudo mount /dev/mmcblk0p1 /mnt
$ cd /mnt
$ ls ZCU102/device_tree/
   tier4_1cam  tier4_2cam  tier4_3cam  tier4_4cam
$ sudo cp ZCU102/device_tree/tier4_2cam/system.dtb .
$ sudo reboot
playground/gmsl-zcu102-guide.txt · Last modified: 20 Sep 2023 14:56 by Sergiu Cuciurean